> 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(®s, vector); > + } else > + vmx_do_interrupt_irqoff(gate_offset(desc)); > kvm_after_interrupt(vcpu); > > vcpu->arch.at_instruction_boundary = true; > -- > 2.34.1