aboutsummaryrefslogtreecommitdiff
path: root/arch/x86/entry
diff options
context:
space:
mode:
authorGravatar Xin Li <xin3.li@intel.com> 2023-12-05 02:50:16 -0800
committerGravatar Borislav Petkov (AMD) <bp@alien8.de> 2024-01-31 22:02:36 +0100
commit8f4a29b0e8a40d865040800684d7ff4141c1394f (patch)
tree1b46363c8f5cdae85a010cb946586ef821cd73f0 /arch/x86/entry
parentx86/fred: FRED entry/exit and dispatch code (diff)
downloadlinux-8f4a29b0e8a40d865040800684d7ff4141c1394f.tar.gz
linux-8f4a29b0e8a40d865040800684d7ff4141c1394f.tar.bz2
linux-8f4a29b0e8a40d865040800684d7ff4141c1394f.zip
x86/traps: Add sysvec_install() to install a system interrupt handler
Add sysvec_install() to install a system interrupt handler into the IDT or the FRED system interrupt handler table. 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-28-xin3.li@intel.com
Diffstat (limited to 'arch/x86/entry')
-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 125b62311b31..3be0269bc0d4 100644
--- a/arch/x86/entry/entry_fred.c
+++ b/arch/x86/entry/entry_fred.c
@@ -119,6 +119,20 @@ static idtentry_t sysvec_table[NR_SYSTEM_VECTORS] __ro_after_init = {
SYSVEC(POSTED_INTR_NESTED_VECTOR, kvm_posted_intr_nested_ipi),
};
+static bool fred_setup_done __initdata;
+
+void __init fred_install_sysvec(unsigned int sysvec, idtentry_t handler)
+{
+ if (WARN_ON_ONCE(sysvec < FIRST_SYSTEM_VECTOR))
+ return;
+
+ if (WARN_ON_ONCE(fred_setup_done))
+ return;
+
+ if (!WARN_ON_ONCE(sysvec_table[sysvec - FIRST_SYSTEM_VECTOR]))
+ sysvec_table[sysvec - FIRST_SYSTEM_VECTOR] = handler;
+}
+
static noinstr void fred_extint(struct pt_regs *regs)
{
unsigned int vector = regs->fred_ss.vector;