132 lines
5.3 KiB
Diff
132 lines
5.3 KiB
Diff
Index: 2007-05-14/xen/arch/x86/hvm/io.c
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/arch/x86/hvm/io.c 2007-08-09 09:57:10.000000000 +0200
|
|
+++ 2007-05-14/xen/arch/x86/hvm/io.c 2007-05-22 13:27:31.000000000 +0200
|
|
@@ -858,6 +858,7 @@ void hvm_io_assist(void)
|
|
}
|
|
|
|
/* Copy register changes back into current guest state. */
|
|
+ regs->eflags &= ~X86_EFLAGS_RF;
|
|
hvm_load_cpu_guest_regs(v, regs);
|
|
memcpy(guest_cpu_user_regs(), regs, HVM_CONTEXT_STACK_BYTES);
|
|
|
|
Index: 2007-05-14/xen/arch/x86/hvm/platform.c
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/arch/x86/hvm/platform.c 2007-08-09 09:57:10.000000000 +0200
|
|
+++ 2007-05-14/xen/arch/x86/hvm/platform.c 2007-05-22 13:13:10.000000000 +0200
|
|
@@ -1065,6 +1065,7 @@ void handle_mmio(unsigned long gpa)
|
|
}
|
|
|
|
regs->eip += inst_len; /* advance %eip */
|
|
+ regs->eflags &= ~X86_EFLAGS_RF;
|
|
|
|
switch ( mmio_op->instr ) {
|
|
case INSTR_MOV:
|
|
@@ -1122,6 +1123,7 @@ void handle_mmio(unsigned long gpa)
|
|
/* IO read --> memory write */
|
|
if ( dir == IOREQ_READ ) errcode |= PFEC_write_access;
|
|
regs->eip -= inst_len; /* do not advance %eip */
|
|
+ regs->eflags |= X86_EFLAGS_RF;
|
|
hvm_inject_exception(TRAP_page_fault, errcode, addr);
|
|
return;
|
|
}
|
|
@@ -1150,6 +1152,7 @@ void handle_mmio(unsigned long gpa)
|
|
/* Failed on the page-spanning copy. Inject PF into
|
|
* the guest for the address where we failed */
|
|
regs->eip -= inst_len; /* do not advance %eip */
|
|
+ regs->eflags |= X86_EFLAGS_RF;
|
|
/* Must set CR2 at the failing address */
|
|
addr += size - rv;
|
|
gdprintk(XENLOG_DEBUG, "Pagefault on non-io side of a "
|
|
Index: 2007-05-14/xen/arch/x86/hvm/vmx/vmx.c
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/arch/x86/hvm/vmx/vmx.c 2007-08-09 09:59:39.000000000 +0200
|
|
+++ 2007-05-14/xen/arch/x86/hvm/vmx/vmx.c 2007-08-09 09:59:50.000000000 +0200
|
|
@@ -1281,10 +1281,13 @@ static int __get_instruction_length(void
|
|
|
|
static void inline __update_guest_eip(unsigned long inst_len)
|
|
{
|
|
- unsigned long current_eip;
|
|
+ unsigned long curr;
|
|
|
|
- current_eip = __vmread(GUEST_RIP);
|
|
- __vmwrite(GUEST_RIP, current_eip + inst_len);
|
|
+ curr = __vmread(GUEST_RIP);
|
|
+ __vmwrite(GUEST_RIP, curr + inst_len);
|
|
+ curr = __vmread(GUEST_RFLAGS);
|
|
+ if (curr & X86_EFLAGS_RF)
|
|
+ __vmwrite(GUEST_RFLAGS, curr & ~X86_EFLAGS_RF);
|
|
__vmwrite(GUEST_INTERRUPTIBILITY_INFO, 0);
|
|
}
|
|
|
|
@@ -1558,7 +1561,7 @@ static void vmx_io_instruction(unsigned
|
|
|
|
/* Copy current guest state into io instruction state structure. */
|
|
memcpy(regs, guest_cpu_user_regs(), HVM_CONTEXT_STACK_BYTES);
|
|
- hvm_store_cpu_guest_regs(current, regs, NULL);
|
|
+ vmx_store_cpu_guest_regs(current, regs, NULL);
|
|
|
|
vm86 = regs->eflags & X86_EFLAGS_VM ? 1 : 0;
|
|
df = regs->eflags & X86_EFLAGS_DF ? 1 : 0;
|
|
@@ -1785,7 +1788,7 @@ static void vmx_world_save(struct vcpu *
|
|
c->eip += __get_instruction_length(); /* Safe: MOV Cn, LMSW, CLTS */
|
|
|
|
c->esp = __vmread(GUEST_RSP);
|
|
- c->eflags = __vmread(GUEST_RFLAGS);
|
|
+ c->eflags = __vmread(GUEST_RFLAGS) & ~X86_EFLAGS_RF;
|
|
|
|
c->cr0 = v->arch.hvm_vmx.cpu_shadow_cr0;
|
|
c->cr3 = v->arch.hvm_vmx.cpu_cr3;
|
|
@@ -2150,7 +2153,6 @@ static int vmx_set_cr0(unsigned long val
|
|
"Enabling CR0.PE at %%eip 0x%lx\n", eip);
|
|
if ( vmx_assist(v, VMX_ASSIST_RESTORE) )
|
|
{
|
|
- eip = __vmread(GUEST_RIP);
|
|
HVM_DBG_LOG(DBG_LEVEL_1,
|
|
"Restoring to %%eip 0x%lx\n", eip);
|
|
return 0; /* do not update eip! */
|
|
Index: 2007-05-14/xen/arch/x86/traps.c
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/arch/x86/traps.c 2007-05-15 15:52:58.000000000 +0200
|
|
+++ 2007-05-14/xen/arch/x86/traps.c 2007-05-22 13:05:28.000000000 +0200
|
|
@@ -608,6 +608,7 @@ static int emulate_forced_invalid_op(str
|
|
regs->ecx = c;
|
|
regs->edx = d;
|
|
regs->eip = eip;
|
|
+ regs->eflags &= ~X86_EFLAGS_RF;
|
|
|
|
return EXCRET_fault_fixed;
|
|
}
|
|
@@ -1807,6 +1808,7 @@ static int emulate_privileged_op(struct
|
|
|
|
done:
|
|
regs->eip = eip;
|
|
+ regs->eflags &= ~X86_EFLAGS_RF;
|
|
return EXCRET_fault_fixed;
|
|
|
|
fail:
|
|
Index: 2007-05-14/xen/arch/x86/x86_emulate.c
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/arch/x86/x86_emulate.c 2007-05-14 14:40:43.000000000 +0200
|
|
+++ 2007-05-14/xen/arch/x86/x86_emulate.c 2007-05-22 13:04:05.000000000 +0200
|
|
@@ -1631,6 +1631,7 @@ x86_emulate(
|
|
}
|
|
|
|
/* Commit shadow register state. */
|
|
+ _regs.eflags &= ~X86_EFLAGS_RF;
|
|
*ctxt->regs = _regs;
|
|
|
|
done:
|
|
Index: 2007-05-14/xen/include/asm-x86/hvm/svm/emulate.h
|
|
===================================================================
|
|
--- 2007-05-14.orig/xen/include/asm-x86/hvm/svm/emulate.h 2007-08-09 09:57:10.000000000 +0200
|
|
+++ 2007-05-14/xen/include/asm-x86/hvm/svm/emulate.h 2007-05-22 13:45:43.000000000 +0200
|
|
@@ -138,6 +138,7 @@ static void inline __update_guest_eip(
|
|
{
|
|
ASSERT(inst_len > 0);
|
|
vmcb->rip += inst_len;
|
|
+ vmcb->rflags &= ~X86_EFLAGS_RF;
|
|
}
|
|
|
|
#endif /* __ASM_X86_HVM_SVM_EMULATE_H__ */
|