From mboxrd@z Thu Jan 1 00:00:00 1970 From: Arun Sharma Subject: [PATCH] sysenter-msr.patch Date: Tue, 14 Jun 2005 15:51:56 -0700 Message-ID: <20050614225156.GA17720@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ian Pratt , Keir Fraser Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Handle MSR reads/writes to sysenter related MSRs. Signed-off-by: Xiaofeng Ling Signed-off-by: Chengyuan Li Signed-off-by: Arun Sharma --- a/xen/arch/x86/vmx.c Tue Jun 14 21:00:58 2005 +++ b/xen/arch/x86/vmx.c Tue Jun 14 15:46:17 2005 @@ -1009,10 +1009,50 @@ 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", + (unsigned long)regs->ecx, (unsigned long)regs->eax, + (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); @@ -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;