Re: [PATCH 2/3] KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest
From: Sean Christopherson <seanjc@google.com>
Date: 2021-08-25 20:09:42
Also in:
kvm, lkml
From: Sean Christopherson <seanjc@google.com>
Date: 2021-08-25 20:09:42
Also in:
kvm, lkml
On Wed, Aug 25, 2021, Sean Christopherson wrote:
On Wed, Aug 25, 2021, Like Xu wrote:quoted
On 24/8/2021 3:37 am, Sean Christopherson wrote:quoted
@@ -11061,6 +11061,8 @@ int kvm_arch_hardware_setup(void *opaque) memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops)); kvm_ops_static_call_update(); + 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;Emm, it's still buggy. The guest "unknown NMI" from the host Intel PT can still be reproduced after the following operation: rmmod kvm_intel modprobe kvm-intel pt_mode=1 ept=1 rmmod kvm_intel modprobe kvm-intel pt_mode=1 ept=0 Since the handle_intel_pt_intr is not reset to NULL in kvm_arch_hardware_unsetup(), and the previous function pointer still exists in the generic KVM data structure.Ooof, good catch. Any preference between nullifying handle_intel_pt_intr in setup() vs. unsetup()? I think I like the idea of "unwinding" during unsetup(), even though it splits the logic a bit.
Never mind, I figured out a way to clean all this up and land the PT interrupt handler in vmx.c where it belongs. Getting there is a bit of a journey, but it's very doable. That means unwinding in unsetup() is the preferred approach, otherwise there would be potential for leaving a dangling pointer if a different vendor module was succesfully loaded.