[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [PATCH] sysenter-msr.patch
ChangeSet 1.1736, 2005/06/23 10:50:16+01:00, arun.sharma@xxxxxxxxx [PATCH] sysenter-msr.patch Handle MSR reads/writes to sysenter related MSRs. Signed-off-by: Xiaofeng Ling <xiaofeng.ling@xxxxxxxxx> Signed-off-by: Chengyuan Li <chengyuan.li@xxxxxxxxx> Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx> vmx.c | 48 +++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 43 insertions(+), 5 deletions(-) diff -Nru a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c --- a/xen/arch/x86/vmx.c 2005-06-23 07:06:01 -04:00 +++ b/xen/arch/x86/vmx.c 2005-06-23 07:06:01 -04:00 @@ -1009,8 +1009,23 @@ VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read: ecx=%lx, eax=%lx, edx=%lx", (unsigned long)regs->ecx, (unsigned long)regs->eax, (unsigned long)regs->edx); - - rdmsr(regs->ecx, regs->eax, regs->edx); + switch (regs->ecx) { + case MSR_IA32_SYSENTER_CS: + __vmread(GUEST_SYSENTER_CS, ®s->eax); + regs->edx = 0; + break; + case MSR_IA32_SYSENTER_ESP: + __vmread(GUEST_SYSENTER_ESP, ®s->eax); + regs->edx = 0; + break; + case MSR_IA32_SYSENTER_EIP: + __vmread(GUEST_SYSENTER_EIP, ®s->eax); + regs->edx = 0; + break; + default: + rdmsr(regs->ecx, regs->eax, regs->edx); + break; + } VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_read returns: " "ecx=%lx, eax=%lx, edx=%lx", @@ -1018,6 +1033,31 @@ (unsigned long)regs->edx); } +static inline void vmx_do_msr_write(struct cpu_user_regs *regs) +{ + VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_write: ecx=%lx, eax=%lx, edx=%lx", + (unsigned long)regs->ecx, (unsigned long)regs->eax, + (unsigned long)regs->edx); + switch (regs->ecx) { + case MSR_IA32_SYSENTER_CS: + __vmwrite(GUEST_SYSENTER_CS, regs->eax); + break; + case MSR_IA32_SYSENTER_ESP: + __vmwrite(GUEST_SYSENTER_ESP, regs->eax); + break; + case MSR_IA32_SYSENTER_EIP: + __vmwrite(GUEST_SYSENTER_EIP, regs->eax); + break; + default: + break; + } + + VMX_DBG_LOG(DBG_LEVEL_1, "vmx_do_msr_write returns: " + "ecx=%lx, eax=%lx, edx=%lx", + (unsigned long)regs->ecx, (unsigned long)regs->eax, + (unsigned long)regs->edx); +} + /* * Need to use this exit to reschedule */ @@ -1332,9 +1372,7 @@ break; case EXIT_REASON_MSR_WRITE: __vmread(GUEST_RIP, &eip); - VMX_DBG_LOG(DBG_LEVEL_1, "MSR_WRITE: eip=%lx, eax=%lx, edx=%lx", - eip, (unsigned long)regs.eax, (unsigned long)regs.edx); - /* just ignore this point */ + vmx_do_msr_write(®s); __get_instruction_length(inst_len); __update_guest_eip(inst_len); break; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |