]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Move Intel Processor Trace interrupt handler to vmx.c
authorSean Christopherson <seanjc@google.com>
Thu, 11 Nov 2021 02:07:34 +0000 (02:07 +0000)
committerPeter Zijlstra <peterz@infradead.org>
Wed, 17 Nov 2021 13:49:10 +0000 (14:49 +0100)
Now that all state needed for VMX's PT interrupt handler is exposed to
vmx.c (specifically the currently running vCPU), move the handler into
vmx.c where it belongs.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20211111020738.2512932-14-seanjc@google.com
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index 89576549b1d5d88c36071412b985131083a12ac8..298224fd60ad1d75763f1b5426192fbaa835c0bf 100644 (file)
@@ -1517,7 +1517,7 @@ struct kvm_x86_init_ops {
        int (*disabled_by_bios)(void);
        int (*check_processor_compatibility)(void);
        int (*hardware_setup)(void);
-       bool (*intel_pt_intr_in_guest)(void);
+       unsigned int (*handle_intel_pt_intr)(void);
 
        struct kvm_x86_ops *runtime_ops;
 };
index a0c24976e6bbd1c8e4f6187abce9391b22be9ad7..b258f90a23b953d527e493900e67d08a0fa5373e 100644 (file)
@@ -7655,6 +7655,20 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
        .vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
 };
 
+static unsigned int vmx_handle_intel_pt_intr(void)
+{
+       struct kvm_vcpu *vcpu = kvm_get_running_vcpu();
+
+       /* '0' on failure so that the !PT case can use a RET0 static call. */
+       if (!kvm_arch_pmi_in_guest(vcpu))
+               return 0;
+
+       kvm_make_request(KVM_REQ_PMI, vcpu);
+       __set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT,
+                 (unsigned long *)&vcpu->arch.pmu.global_status);
+       return 1;
+}
+
 static __init void vmx_setup_user_return_msrs(void)
 {
 
@@ -7681,6 +7695,8 @@ static __init void vmx_setup_user_return_msrs(void)
                kvm_add_user_return_msr(vmx_uret_msrs_list[i]);
 }
 
+static struct kvm_x86_init_ops vmx_init_ops __initdata;
+
 static __init int hardware_setup(void)
 {
        unsigned long host_bndcfgs;
@@ -7839,6 +7855,10 @@ static __init int hardware_setup(void)
                return -EINVAL;
        if (!enable_ept || !cpu_has_vmx_intel_pt())
                pt_mode = PT_MODE_SYSTEM;
+       if (pt_mode == PT_MODE_HOST_GUEST)
+               vmx_init_ops.handle_intel_pt_intr = vmx_handle_intel_pt_intr;
+       else
+               vmx_init_ops.handle_intel_pt_intr = NULL;
 
        setup_default_sgx_lepubkeyhash();
 
@@ -7867,7 +7887,7 @@ static struct kvm_x86_init_ops vmx_init_ops __initdata = {
        .disabled_by_bios = vmx_disabled_by_bios,
        .check_processor_compatibility = vmx_check_processor_compat,
        .hardware_setup = hardware_setup,
-       .intel_pt_intr_in_guest = vmx_pt_mode_is_host_guest,
+       .handle_intel_pt_intr = NULL,
 
        .runtime_ops = &vmx_x86_ops,
 };
index 32cb6f9ca07757d92bb188ad72bb9729568c02a8..4e0ed2fdc2e11a4ce9e61bfde3a3471abbb4cacc 100644 (file)
@@ -8469,20 +8469,6 @@ static void kvm_timer_init(void)
                          kvmclock_cpu_online, kvmclock_cpu_down_prep);
 }
 
-static unsigned int kvm_handle_intel_pt_intr(void)
-{
-       struct kvm_vcpu *vcpu = kvm_get_running_vcpu();
-
-       /* '0' on failure so that the !PT case can use a RET0 static call. */
-       if (!kvm_arch_pmi_in_guest(vcpu))
-               return 0;
-
-       kvm_make_request(KVM_REQ_PMI, vcpu);
-       __set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT,
-                       (unsigned long *)&vcpu->arch.pmu.global_status);
-       return 1;
-}
-
 #ifdef CONFIG_X86_64
 static void pvclock_gtod_update_fn(struct work_struct *work)
 {
@@ -11192,11 +11178,7 @@ int kvm_arch_hardware_setup(void *opaque)
        memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops));
        kvm_ops_static_call_update();
 
-       /* Temporary ugliness. */
-       if (ops->intel_pt_intr_in_guest && ops->intel_pt_intr_in_guest())
-               kvm_register_perf_callbacks(kvm_handle_intel_pt_intr);
-       else
-               kvm_register_perf_callbacks(NULL);
+       kvm_register_perf_callbacks(ops->handle_intel_pt_intr);
 
        if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES))
                supported_xss = 0;