KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest
commit f4b027c5c8199abd4fb6f00d67d380548dbfdfa8 upstream.
Override the Processor Trace (PT) interrupt handler for guest mode if and
only if PT is configured for host+guest mode, i.e. is being used
independently by both host and guest. If PT is configured for system
mode, the host fully controls PT and must handle all events.
Fixes: 8479e04e7d
("KVM: x86: Inject PMI for KVM guest")
Reported-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Reported-by: Artem Kashkanov <artem.kashkanov@intel.com>
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20211111020738.2512932-4-seanjc@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
723acd75a0
commit
413b427f5f
@@ -1306,6 +1306,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);
|
||||
|
||||
struct kvm_x86_ops *runtime_ops;
|
||||
};
|
||||
|
@@ -7915,6 +7915,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,
|
||||
|
||||
.runtime_ops = &vmx_x86_ops,
|
||||
};
|
||||
|
@@ -7882,7 +7882,7 @@ static struct perf_guest_info_callbacks kvm_guest_cbs = {
|
||||
.is_in_guest = kvm_is_in_guest,
|
||||
.is_user_mode = kvm_is_user_mode,
|
||||
.get_guest_ip = kvm_get_guest_ip,
|
||||
.handle_intel_pt_intr = kvm_handle_intel_pt_intr,
|
||||
.handle_intel_pt_intr = NULL,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
@@ -8005,6 +8005,8 @@ int kvm_arch_init(void *opaque)
|
||||
PT_PRESENT_MASK, 0, sme_me_mask);
|
||||
kvm_timer_init();
|
||||
|
||||
if (ops->intel_pt_intr_in_guest && ops->intel_pt_intr_in_guest())
|
||||
kvm_guest_cbs.handle_intel_pt_intr = kvm_handle_intel_pt_intr;
|
||||
perf_register_guest_info_callbacks(&kvm_guest_cbs);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_XSAVE)) {
|
||||
@@ -8042,6 +8044,7 @@ void kvm_arch_exit(void)
|
||||
#endif
|
||||
kvm_lapic_exit();
|
||||
perf_unregister_guest_info_callbacks(&kvm_guest_cbs);
|
||||
kvm_guest_cbs.handle_intel_pt_intr = NULL;
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
|
||||
cpufreq_unregister_notifier(&kvmclock_cpufreq_notifier_block,
|
||||
|
Reference in New Issue
Block a user