[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] HVM RDTSCP fixes
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1260966201 0 # Node ID 976d679b04fbcf8c64aff958fc0dd9f1ade09250 # Parent 91ec068176323568191f27e6c001085bd2bb242d 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 <dongxiao.xu@xxxxxxxxx> --- tools/libxc/xc_cpuid_x86.c | 3 ++- xen/arch/x86/hvm/vmx/vmx.c | 19 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff -r 91ec06817632 -r 976d679b04fb tools/libxc/xc_cpuid_x86.c --- a/tools/libxc/xc_cpuid_x86.c Wed Dec 16 12:21:43 2009 +0000 +++ b/tools/libxc/xc_cpuid_x86.c Wed Dec 16 12:23:21 2009 +0000 @@ -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 -r 91ec06817632 -r 976d679b04fb xen/arch/x86/hvm/vmx/vmx.c --- a/xen/arch/x86/hvm/vmx/vmx.c Wed Dec 16 12:21:43 2009 +0000 +++ b/xen/arch/x86/hvm/vmx/vmx.c Wed Dec 16 12:23:21 2009 +0000 @@ -292,7 +292,7 @@ static enum handler_return long_mode_do_ { 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(struc } 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 vc 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 vc 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; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |