lkml.org 
[lkml]   [2023]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v5 03/34] x86/traps: add install_system_interrupt_handler()
    Date
    Some kernel components install system interrupt handlers into the IDT,
    and we need to do the same for system_interrupt_handlers. A new function
    install_system_interrupt_handler() is added to install a system interrupt
    handler into both the IDT and system_interrupt_handlers.

    Tested-by: Shan Kang <shan.kang@intel.com>
    Signed-off-by: Xin Li <xin3.li@intel.com>
    ---
    arch/x86/include/asm/traps.h | 2 ++
    arch/x86/kernel/cpu/acrn.c | 7 +++++--
    arch/x86/kernel/cpu/mshyperv.c | 22 ++++++++++++++--------
    arch/x86/kernel/kvm.c | 4 +++-
    arch/x86/kernel/traps.c | 8 ++++++++
    drivers/xen/events/events_base.c | 5 ++++-
    6 files changed, 36 insertions(+), 12 deletions(-)

    diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h
    index 28c8ba5fd81c..46f5e4e2a346 100644
    --- a/arch/x86/include/asm/traps.h
    +++ b/arch/x86/include/asm/traps.h
    @@ -41,6 +41,8 @@ void math_emulate(struct math_emu_info *);

    bool fault_in_kernel_space(unsigned long address);

    +void install_system_interrupt_handler(unsigned int n, const void *asm_addr, const void *addr);
    +
    #ifdef CONFIG_VMAP_STACK
    void __noreturn handle_stack_overflow(struct pt_regs *regs,
    unsigned long fault_address,
    diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c
    index 485441b7f030..9351bf183a9e 100644
    --- a/arch/x86/kernel/cpu/acrn.c
    +++ b/arch/x86/kernel/cpu/acrn.c
    @@ -18,6 +18,7 @@
    #include <asm/hypervisor.h>
    #include <asm/idtentry.h>
    #include <asm/irq_regs.h>
    +#include <asm/traps.h>

    static u32 __init acrn_detect(void)
    {
    @@ -26,8 +27,10 @@ static u32 __init acrn_detect(void)

    static void __init acrn_init_platform(void)
    {
    - /* Setup the IDT for ACRN hypervisor callback */
    - alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_acrn_hv_callback);
    + /* Install system interrupt handler for ACRN hypervisor callback */
    + install_system_interrupt_handler(HYPERVISOR_CALLBACK_VECTOR,
    + asm_sysvec_acrn_hv_callback,
    + sysvec_acrn_hv_callback);

    x86_platform.calibrate_tsc = acrn_get_tsc_khz;
    x86_platform.calibrate_cpu = acrn_get_tsc_khz;
    diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
    index f36dc2f796c5..63282f4bfdcd 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -29,6 +29,7 @@
    #include <asm/i8259.h>
    #include <asm/apic.h>
    #include <asm/timer.h>
    +#include <asm/traps.h>
    #include <asm/reboot.h>
    #include <asm/nmi.h>
    #include <clocksource/hyperv_timer.h>
    @@ -487,19 +488,24 @@ static void __init ms_hyperv_init_platform(void)
    */
    x86_platform.apic_post_init = hyperv_init;
    hyperv_setup_mmu_ops();
    - /* Setup the IDT for hypervisor callback */
    - alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_hyperv_callback);

    - /* Setup the IDT for reenlightenment notifications */
    + /* Install system interrupt handler for hypervisor callback */
    + install_system_interrupt_handler(HYPERVISOR_CALLBACK_VECTOR,
    + asm_sysvec_hyperv_callback,
    + sysvec_hyperv_callback);
    +
    + /* Install system interrupt handler for reenlightenment notifications */
    if (ms_hyperv.features & HV_ACCESS_REENLIGHTENMENT) {
    - alloc_intr_gate(HYPERV_REENLIGHTENMENT_VECTOR,
    - asm_sysvec_hyperv_reenlightenment);
    + install_system_interrupt_handler(HYPERV_REENLIGHTENMENT_VECTOR,
    + asm_sysvec_hyperv_reenlightenment,
    + sysvec_hyperv_reenlightenment);
    }

    - /* Setup the IDT for stimer0 */
    + /* Install system interrupt handler for stimer0 */
    if (ms_hyperv.misc_features & HV_STIMER_DIRECT_MODE_AVAILABLE) {
    - alloc_intr_gate(HYPERV_STIMER0_VECTOR,
    - asm_sysvec_hyperv_stimer0);
    + install_system_interrupt_handler(HYPERV_STIMER0_VECTOR,
    + asm_sysvec_hyperv_stimer0,
    + sysvec_hyperv_stimer0);
    }

    # ifdef CONFIG_SMP
    diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
    index 1cceac5984da..5c684df6de7a 100644
    --- a/arch/x86/kernel/kvm.c
    +++ b/arch/x86/kernel/kvm.c
    @@ -829,7 +829,9 @@ static void __init kvm_guest_init(void)

    if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF_INT) && kvmapf) {
    static_branch_enable(&kvm_async_pf_enabled);
    - alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_kvm_asyncpf_interrupt);
    + install_system_interrupt_handler(HYPERVISOR_CALLBACK_VECTOR,
    + asm_sysvec_kvm_asyncpf_interrupt,
    + sysvec_kvm_asyncpf_interrupt);
    }

    #ifdef CONFIG_SMP
    diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
    index e4bdebdf05dd..c0f7666140da 100644
    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -1491,6 +1491,14 @@ static system_interrupt_handler system_interrupt_handlers[NR_SYSTEM_VECTORS] = {

    #undef SYSV

    +void __init install_system_interrupt_handler(unsigned int n, const void *asm_addr, const void *addr)
    +{
    + BUG_ON(n < FIRST_SYSTEM_VECTOR);
    +
    + system_interrupt_handlers[n - FIRST_SYSTEM_VECTOR] = (system_interrupt_handler)addr;
    + alloc_intr_gate(n, asm_addr);
    +}
    +
    void __init trap_init(void)
    {
    /* Init cpu_entry_area before IST entries are set up */
    diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
    index c7715f8bd452..cf1a5ca3bf62 100644
    --- a/drivers/xen/events/events_base.c
    +++ b/drivers/xen/events/events_base.c
    @@ -45,6 +45,7 @@
    #include <asm/irq.h>
    #include <asm/io_apic.h>
    #include <asm/i8259.h>
    +#include <asm/traps.h>
    #include <asm/xen/cpuid.h>
    #include <asm/xen/pci.h>
    #endif
    @@ -2249,7 +2250,9 @@ static __init void xen_alloc_callback_vector(void)
    return;

    pr_info("Xen HVM callback vector for event delivery is enabled\n");
    - alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_xen_hvm_callback);
    + install_system_interrupt_handler(HYPERVISOR_CALLBACK_VECTOR,
    + asm_sysvec_xen_hvm_callback,
    + sysvec_xen_hvm_callback);
    }
    #else
    void xen_setup_callback_vector(void) {}
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-27 00:46    [W:6.019 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site