[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, &regs->eax);
+            regs->edx = 0;
+            break;
+        case MSR_IA32_SYSENTER_ESP:    
+             __vmread(GUEST_SYSENTER_ESP, &regs->eax);
+             regs->edx = 0;
+            break;
+        case MSR_IA32_SYSENTER_EIP:            
+            __vmread(GUEST_SYSENTER_EIP, &regs->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(&regs);
         __get_instruction_length(inst_len);
         __update_guest_eip(inst_len);
         break;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.