[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] vmx realmode: HOST_CR0.TS must be cleared when restoring guest FPU



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1202031059 0
# Node ID aecbf98aa7099458fe6895bbd8f15d506e0901b3
# Parent  39ddd51318e9faa7517b8d3d2a385a19f4d357f7
vmx realmode: HOST_CR0.TS must be cleared when restoring guest FPU
state, otherwise in-Xen CR0.TS value becomes set again on next
vmexit. Then we crash the next time we try to emulate an FPU
instruction.
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/vmx/vmcs.c        |    3 ++-
 xen/arch/x86/hvm/vmx/vmx.c         |   11 +++++++++++
 xen/include/asm-x86/hvm/vmx/cpu.h  |   13 -------------
 xen/include/asm-x86/hvm/vmx/vmcs.h |    2 ++
 4 files changed, 15 insertions(+), 14 deletions(-)

diff -r 39ddd51318e9 -r aecbf98aa709 xen/arch/x86/hvm/vmx/vmcs.c
--- a/xen/arch/x86/hvm/vmx/vmcs.c       Sun Feb 03 09:09:21 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vmcs.c       Sun Feb 03 09:30:59 2008 +0000
@@ -489,7 +489,8 @@ static int construct_vmcs(struct vcpu *v
     __vmwrite(HOST_GS_BASE, 0);
 
     /* Host control registers. */
-    __vmwrite(HOST_CR0, read_cr0() | X86_CR0_TS);
+    v->arch.hvm_vmx.host_cr0 = read_cr0() | X86_CR0_TS;
+    __vmwrite(HOST_CR0, v->arch.hvm_vmx.host_cr0);
     __vmwrite(HOST_CR4, mmu_cr4_features);
 
     /* Host CS:RIP. */
diff -r 39ddd51318e9 -r aecbf98aa709 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Sun Feb 03 09:09:21 2008 +0000
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Sun Feb 03 09:30:59 2008 +0000
@@ -742,6 +742,13 @@ static int vmx_load_vmcs_ctxt(struct vcp
 
 static void vmx_ctxt_switch_from(struct vcpu *v)
 {
+    ASSERT(read_cr0() & X86_CR0_TS);
+    if ( !(v->arch.hvm_vmx.host_cr0 & X86_CR0_TS) )
+    {
+        v->arch.hvm_vmx.host_cr0 |= X86_CR0_TS;
+        __vmwrite(HOST_CR0, v->arch.hvm_vmx.host_cr0);
+    }
+
     vmx_save_guest_msrs(v);
     vmx_restore_host_msrs();
     vmx_save_dr(v);
@@ -1231,6 +1238,10 @@ void vmx_do_no_device_fault(void)
 
     setup_fpu(current);
     __vm_clear_bit(EXCEPTION_BITMAP, TRAP_no_device);
+
+    ASSERT(v->arch.hvm_vmx.host_cr0 & X86_CR0_TS);
+    v->arch.hvm_vmx.host_cr0 &= ~X86_CR0_TS;
+    __vmwrite(HOST_CR0, v->arch.hvm_vmx.host_cr0);
 
     /* Disable TS in guest CR0 unless the guest wants the exception too. */
     if ( !(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS) )
diff -r 39ddd51318e9 -r aecbf98aa709 xen/include/asm-x86/hvm/vmx/cpu.h
--- a/xen/include/asm-x86/hvm/vmx/cpu.h Sun Feb 03 09:09:21 2008 +0000
+++ b/xen/include/asm-x86/hvm/vmx/cpu.h Sun Feb 03 09:30:59 2008 +0000
@@ -19,19 +19,6 @@
 #ifndef __ASM_X86_HVM_VMX_CPU_H__
 #define __ASM_X86_HVM_VMX_CPU_H__
 
-/*
- * Virtual CPU
- */
-struct arch_state_struct {
-    unsigned long       mode_flags; /* vm86, 32-bit, 64-bit, etc. */
-    /* debug registers */
-    /* MSRs */
-};
-
-#define VMX_MF_VM86     0
-#define VMX_MF_32       1
-#define VMX_MF_64       2
-
 #define NUM_CORES_RESET_MASK                 0x00003FFF
 #define NUM_THREADS_RESET_MASK               0xFF00FFFF
 
diff -r 39ddd51318e9 -r aecbf98aa709 xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h        Sun Feb 03 09:09:21 2008 +0000
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h        Sun Feb 03 09:30:59 2008 +0000
@@ -91,6 +91,8 @@ struct arch_vmx_struct {
     struct vmx_msr_entry *msr_area;
     unsigned int         host_msr_count;
     struct vmx_msr_entry *host_msr_area;
+
+    unsigned long        host_cr0;
 
 #ifdef VMXASSIST
     unsigned long        vmxassist_enabled:1;

_______________________________________________
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®.