From: Keir Fraser Date: Wed, 16 Dec 2009 12:23:21 +0000 (+0000) Subject: HVM RDTSCP fixes X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~12893 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5a396b13fd70696a6e62eca387d4e4b51dbb6853;p=xen.git HVM RDTSCP fixes - 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 --- diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c index 7a5ec1910b..13b3c78fa0 100644 --- a/tools/libxc/xc_cpuid_x86.c +++ b/tools/libxc/xc_cpuid_x86.c @@ -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; } diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 3dbada3c5b..9f302e8cb2 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -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; }