KVM: VMX: Clean up RTIT MAXPHYADDR usage
cover KVM: VMX: Clean up RTIT MAXPHYADDR usage
Stop using cpuid_query_maxphyaddr() for a random RTIT MSR check and unexport said function to discourage future use.
Sean Christopherson (3):
KVM: VMX: Use precomputed MAXPHYADDR for RTIT base MSR check
KVM: VMX: Replace MSR_IA32_RTIT_OUTPUT_BASE_MASK with helper function
KVM: x86: Unexport cpuid_query_maxphyaddr()
arch/x86/kvm/cpuid.c | 1 - arch/x86/kvm/vmx/vmx.c | 11 +++++++---- 2 files changed, 7 insertions(+), 5 deletions(-)
Signature · 1 line
2.26.0
PATCH 1/3 KVM: VMX: Use precomputed MAXPHYADDR for RTIT base MSR check
Use cpuid_maxphyaddr() instead of cpuid_query_maxphyaddr() for the RTIT base MSR check. There is no reason to recompute MAXPHYADDR as the precomputed version is synchronized with CPUID updates, and MSR_IA32_RTIT_OUTPUT_BASE is not written between stuffing CPUID and refreshing vcpu->arch.maxphyaddr.
--- arch/x86/kvm/vmx/vmx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/vmx/vmx.c +1 -1
@@ -146,7 +146,7 @@ module_param_named(preemption_timer, enable_preemption_timer, bool, S_IRUGO); RTIT_STATUS_BYTECNT))#define MSR_IA32_RTIT_OUTPUT_BASE_MASK \ - (~((1UL << cpuid_query_maxphyaddr(vcpu)) - 1) | 0x7f) + (~((1UL << cpuid_maxphyaddr(vcpu)) - 1) | 0x7f)/* * These 2 parameters are used to config the controls for Pause-Loop Exiting:
Signature · 1 line
2.26.0
PATCH 2/3 KVM: VMX: Replace MSR_IA32_RTIT_OUTPUT_BASE_MASK with helper function
In reply to Sean ChristophersonReplace the subtly not-a-constant MSR_IA32_RTIT_OUTPUT_BASE_MASK with a proper helper function to check whether or not the specified base is valid. Blindly referencing the local 'vcpu' is especially nasty.
--- arch/x86/kvm/vmx/vmx.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
arch/x86/kvm/vmx/vmx.c +7 -4
@@ -145,9 +145,6 @@ module_param_named(preemption_timer, enable_preemption_timer, bool, S_IRUGO);RTIT_STATUS_ERROR |RTIT_STATUS_STOPPED | \ RTIT_STATUS_BYTECNT)) -#define MSR_IA32_RTIT_OUTPUT_BASE_MASK \ - (~((1UL << cpuid_maxphyaddr(vcpu)) - 1) | 0x7f) -/* * These 2 parameters are used to config the controls for Pause-Loop Exiting: * ple_gap: upper bound on the amount of time between two successive
@@ -1036,6 +1033,12 @@ static inline bool pt_can_write_msr(struct vcpu_vmx *vmx) !(vmx->pt_desc.guest.ctl &RTIT_CTL_TRACEEN ); } +static inline bool pt_output_base_valid (struct kvm_vcpu *vcpu,u64 base) +{ +/* The base must be 128-byte aligned and a legal physical address. */ +return !(base & (~((1UL <<cpuid_maxphyaddr (vcpu)) -1 ) |0x7f )); +} +static inline void pt_load_msr (struct pt_ctx *ctx,u32 addr_range) {u32 i;
@@ -2193,7 +2196,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) !intel_pt_validate_cap(vmx->pt_desc.caps, PT_CAP_single_range_output))return 1 ; -if (data &MSR_IA32_RTIT_OUTPUT_BASE_MASK ) +if (!pt_output_base_valid (vcpu, data))return 1 ; vmx->pt_desc.guest.output_base = data;break ;
Signature · 1 line
2.26.0
PATCH 3/3 KVM: x86: Unexport cpuid_query_maxphyaddr()
In reply to Sean ChristophersonStop exporting cpuid_query_maxphyaddr() now that it's not being abused by VMX.
--- arch/x86/kvm/cpuid.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/kvm/cpuid.c +0 -1
@@ -188,7 +188,6 @@ int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu) not_found:return 36 ; } -EXPORT_SYMBOL_GPL (cpuid_query_maxphyaddr);/* when an old userspace process fills a new kernel module */ int kvm_vcpu_ioctl_set_cpuid(struct kvm_vcpu *vcpu,
Signature · 1 line
2.26.0