diff options
author | Xin Li <xin3.li@intel.com> | 2023-12-05 02:50:16 -0800 |
---|---|---|
committer | Borislav Petkov (AMD) <bp@alien8.de> | 2024-01-31 22:02:36 +0100 |
commit | 8f4a29b0e8a40d865040800684d7ff4141c1394f (patch) | |
tree | 1b46363c8f5cdae85a010cb946586ef821cd73f0 /arch/x86/entry | |
parent | x86/fred: FRED entry/exit and dispatch code (diff) | |
download | linux-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.c | 14 |
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; |