RE: [PATCH v4 33/34] KVM: x86/vmx: call external_interrupt() for IRQ reinjection when FRED is enabled

From: Li, Xin3
Date: Mon Mar 06 2023 - 04:32:47 EST



> arch/x86/kvm/vmx/vmx.c | 22 +++++++++++++++++++++-
> 1 file changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index
> bcac3efcde41..30f854015c8c 100644
> --- a/arch/x86/kvm/vmx/vmx.c
> +++ b/arch/x86/kvm/vmx/vmx.c
> @@ -47,6 +47,7 @@
> #include <asm/mshyperv.h>
> #include <asm/mwait.h>
> #include <asm/spec-ctrl.h>
> +#include <asm/traps.h>
> #include <asm/virtext.h>
> #include <asm/vmx.h>
>
> @@ -6923,7 +6924,26 @@ static void handle_external_interrupt_irqoff(struct
> kvm_vcpu *vcpu)
> return;
>
> kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ);
> - vmx_do_interrupt_irqoff(gate_offset(desc));
> + if (cpu_feature_enabled(X86_FEATURE_FRED)) {
> + struct vcpu_vmx *vmx = to_vmx(vcpu);
> + struct pt_regs regs = {};
> +
> + /*
> + * Create an event return stack frame with the
> + * host context immediately after a VM exit.
> + *
> + * All other fields of the pt_regs structure are
> + * cleared to 0.
> + */
> + regs.ssx = __KERNEL_DS;

This breaks i386 build, and should use ss.

> + regs.sp = vmx->loaded_vmcs->host_state.rsp;
> + regs.flags = X86_EFLAGS_FIXED;
> + regs.csx = __KERNEL_CS;

And cs.

> + regs.ip = (unsigned long)vmx_vmexit;
> +
> + external_interrupt(&regs, vector);
> + } else
> + vmx_do_interrupt_irqoff(gate_offset(desc));
> kvm_after_interrupt(vcpu);
>
> vcpu->arch.at_instruction_boundary = true;
> --
> 2.34.1