HVM RDTSCP fixes
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 16 Dec 2009 12:23:21 +0000 (12:23 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 16 Dec 2009 12:23:21 +0000 (12:23 +0000)
 - Put the guest rdtscp cpuid logic in xc_cpuid_x86.c.
 - MSR_TSC_AUX's high 32bit is reserved, so only write the low 32bit.

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
tools/libxc/xc_cpuid_x86.c
xen/arch/x86/hvm/vmx/vmx.c

index 7a5ec1910b5a766e42a8c60283f4c61178227eda..13b3c78fa0da92cccdf2c9957932dd9eae34ea32 100644 (file)
@@ -136,7 +136,8 @@ static void intel_xc_cpuid_policy(
         regs[2] &= (is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0);
         regs[3] &= ((is_pae ? bitmaskof(X86_FEATURE_NX) : 0) |
                     (is_64bit ? bitmaskof(X86_FEATURE_LM) : 0) |
-                    (is_64bit ? bitmaskof(X86_FEATURE_SYSCALL) : 0));
+                    (is_64bit ? bitmaskof(X86_FEATURE_SYSCALL) : 0) |
+                    (is_64bit ? bitmaskof(X86_FEATURE_RDTSCP) : 0));
         break;
     }
 
index 3dbada3c5b7e007702eef9801a8a2d0b6a3e9590..9f302e8cb21d9cc56da11c9dfbc28f02e281fc71 100644 (file)
@@ -292,7 +292,7 @@ static enum handler_return long_mode_do_msr_write(struct cpu_user_regs *regs)
         {
             struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
             guest_state->msrs[VMX_INDEX_MSR_TSC_AUX] = msr_content;
-            wrmsrl(MSR_TSC_AUX, msr_content);
+            wrmsrl(MSR_TSC_AUX, (uint32_t)msr_content);
         }
         else
         {
@@ -333,7 +333,8 @@ static void vmx_restore_host_msrs(void)
     }
 
     if ( cpu_has_rdtscp )
-        wrmsrl(MSR_TSC_AUX, host_msr_state->msrs[VMX_INDEX_MSR_TSC_AUX]);
+        wrmsrl(MSR_TSC_AUX,
+               (uint32_t)host_msr_state->msrs[VMX_INDEX_MSR_TSC_AUX]);
 }
 
 static void vmx_save_guest_msrs(struct vcpu *v)
@@ -383,7 +384,8 @@ static void vmx_restore_guest_msrs(struct vcpu *v)
     }
 
     if ( cpu_has_rdtscp )
-        wrmsrl(MSR_TSC_AUX, guest_msr_state->msrs[VMX_INDEX_MSR_TSC_AUX]);
+        wrmsrl(MSR_TSC_AUX,
+               (uint32_t)guest_msr_state->msrs[VMX_INDEX_MSR_TSC_AUX]);
 }
 
 #else  /* __i386__ */
@@ -627,6 +629,8 @@ static void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
     data->msr_syscall_mask = guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK];
     if ( cpu_has_rdtscp )
         data->msr_tsc_aux = guest_state->msrs[VMX_INDEX_MSR_TSC_AUX];
+    else
+        data->msr_tsc_aux = 0;
 #endif
 
     data->tsc = hvm_get_guest_tsc(v);
@@ -647,6 +651,8 @@ static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
     v->arch.hvm_vmx.shadow_gs = data->shadow_gs;
     if ( cpu_has_rdtscp )
         guest_state->msrs[VMX_INDEX_MSR_TSC_AUX] = data->msr_tsc_aux;
+    else
+        guest_state->msrs[VMX_INDEX_MSR_TSC_AUX] = 0;
 #endif
 
     hvm_set_guest_tsc(v, data->tsc);
@@ -1563,13 +1569,6 @@ static void vmx_cpuid_intercept(
             else
                 *edx &= ~(bitmaskof(X86_FEATURE_SYSCALL));
 
-#ifdef __x86_64__
-            if ( cpu_has_rdtscp )
-                *edx |= bitmaskof(X86_FEATURE_RDTSCP);
-            else
-                *edx &= ~(bitmaskof(X86_FEATURE_RDTSCP));
-#endif
-
             break;
     }