[PATCH v4 07/11] KVM: VMX: Handle NMI Source report in VM exit

From: Jacob Pan
Date: Tue Jul 09 2024 - 10:35:07 EST


From: Zeng Guang <guang.zeng@xxxxxxxxx>

If the "NMI exiting" VM-execution control is 1, the value of the 16-bit NMI
source vector is saved in the exit-qualification field in the VMCS when VM
exits occur on CPUs that support NMI source.

KVM that is aware of NMI-source reporting will push the bitmask of NMI source
vectors as the exceptoin event data field on the stack for then entry of FRED
exception. Subsequently, the host NMI exception handler is invoked which
will process NMI source information in the event data. This operation is
independent of vCPU FRED enabling status.

Signed-off-by: Zeng Guang <guang.zeng@xxxxxxxxx>
Signed-off-by: Jacob Pan <jacob.jun.pan@xxxxxxxxxxxxxxx>
---
arch/x86/kvm/vmx/vmx.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 4e7b36081b76..6719c598fa5f 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -7331,10 +7331,15 @@ static noinstr void vmx_vcpu_enter_exit(struct kvm_vcpu *vcpu,
if ((u16)vmx->exit_reason.basic == EXIT_REASON_EXCEPTION_NMI &&
is_nmi(vmx_get_intr_info(vcpu))) {
kvm_before_interrupt(vcpu, KVM_HANDLING_NMI);
- if (cpu_feature_enabled(X86_FEATURE_FRED))
- fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR, 0);
- else
+ if (cpu_feature_enabled(X86_FEATURE_FRED)) {
+ unsigned long edata = 0;
+
+ if (cpu_feature_enabled(X86_FEATURE_NMI_SOURCE))
+ edata = vmx_get_exit_qual(vcpu);
+ fred_entry_from_kvm(EVENT_TYPE_NMI, NMI_VECTOR, edata);
+ } else {
vmx_do_nmi_irqoff();
+ }
kvm_after_interrupt(vcpu);
}

--
2.25.1