aboutsummaryrefslogtreecommitdiff
path: root/arch/x86/entry/entry_fred.c
diff options
context:
space:
mode:
authorGravatar Xin Li <xin3.li@intel.com> 2023-12-05 02:50:20 -0800
committerGravatar Borislav Petkov (AMD) <bp@alien8.de> 2024-01-31 22:03:16 +0100
commit2e670358ec1829238c99fbff178e285d3eb43ef1 (patch)
tree23bb9894cd59296e66a6a8d99e945d3e7860803b /arch/x86/entry/entry_fred.c
parentx86/entry/calling: Allow PUSH_AND_CLEAR_REGS being used beyond actual entry code (diff)
downloadlinux-2e670358ec1829238c99fbff178e285d3eb43ef1.tar.gz
linux-2e670358ec1829238c99fbff178e285d3eb43ef1.tar.bz2
linux-2e670358ec1829238c99fbff178e285d3eb43ef1.zip
x86/entry: Add fred_entry_from_kvm() for VMX to handle IRQ/NMI
In IRQ/NMI induced VM exits, KVM VMX needs to execute the respective handlers, which requires the software to create a FRED stack frame, and use it to invoke the handlers. Add fred_irq_entry_from_kvm() for this job. Export fred_entry_from_kvm() because VMX can be compiled as a module. Suggested-by: Sean Christopherson <seanjc@google.com> Suggested-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Xin Li <xin3.li@intel.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Tested-by: Shan Kang <shan.kang@intel.com> Link: https://lore.kernel.org/r/20231205105030.8698-32-xin3.li@intel.com
Diffstat (limited to 'arch/x86/entry/entry_fred.c')
-rw-r--r--arch/x86/entry/entry_fred.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/x86/entry/entry_fred.c b/arch/x86/entry/entry_fred.c
index 3be0269bc0d4..6ecc08b6d72a 100644
--- a/arch/x86/entry/entry_fred.c
+++ b/arch/x86/entry/entry_fred.c
@@ -257,3 +257,17 @@ __visible noinstr void fred_entry_from_kernel(struct pt_regs *regs)
return fred_bad_type(regs, error_code);
}
+
+#if IS_ENABLED(CONFIG_KVM_INTEL)
+__visible noinstr void __fred_entry_from_kvm(struct pt_regs *regs)
+{
+ switch (regs->fred_ss.type) {
+ case EVENT_TYPE_EXTINT:
+ return fred_extint(regs);
+ case EVENT_TYPE_NMI:
+ return fred_exc_nmi(regs);
+ default:
+ WARN_ON_ONCE(1);
+ }
+}
+#endif