lkml.org 
[lkml]   [2021]   [Jun]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[GIT pull] x86/irq for v5.14-rc1
    Linus,

    please pull the latest x86/irq branch from:

    git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-irq-2021-06-29

    up to: 056c52f5e824: x86/kexec: Set_[gi]dt() -> native_[gi]dt_invalidate() in machine_kexec_*.c


    X86 interrupt related changes:

    - Consolidate the VECTOR defines and the usage sites.

    - Cleanup GDT/IDT related code and replace open coded ASM with proper
    native helfper functions.

    Thanks,

    tglx

    ------------------>
    H. Peter Anvin (Intel) (5):
    x86/irq: Remove unused vectors defines
    x86/irq: Add and use NR_EXTERNAL_VECTORS and NR_SYSTEM_VECTORS
    x86/idt: Remove address argument from idt_invalidate()
    x86: Add native_[ig]dt_invalidate()
    x86/kexec: Set_[gi]dt() -> native_[gi]dt_invalidate() in machine_kexec_*.c


    arch/x86/include/asm/desc.h | 22 ++++++++++++++++++++-
    arch/x86/include/asm/idtentry.h | 4 ++--
    arch/x86/include/asm/irq_vectors.h | 7 +++++--
    arch/x86/kernel/idt.c | 5 ++---
    arch/x86/kernel/machine_kexec_32.c | 15 ++-------------
    arch/x86/kernel/machine_kexec_64.c | 33 ++------------------------------
    arch/x86/kernel/reboot.c | 2 +-
    tools/arch/x86/include/asm/irq_vectors.h | 7 +++++--
    8 files changed, 40 insertions(+), 55 deletions(-)

    diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
    index 476082a83d1c..400c17862870 100644
    --- a/arch/x86/include/asm/desc.h
    +++ b/arch/x86/include/asm/desc.h
    @@ -224,6 +224,26 @@ static inline void store_idt(struct desc_ptr *dtr)
    asm volatile("sidt %0":"=m" (*dtr));
    }

    +static inline void native_gdt_invalidate(void)
    +{
    + const struct desc_ptr invalid_gdt = {
    + .address = 0,
    + .size = 0
    + };
    +
    + native_load_gdt(&invalid_gdt);
    +}
    +
    +static inline void native_idt_invalidate(void)
    +{
    + const struct desc_ptr invalid_idt = {
    + .address = 0,
    + .size = 0
    + };
    +
    + native_load_idt(&invalid_idt);
    +}
    +
    /*
    * The LTR instruction marks the TSS GDT entry as busy. On 64-bit, the GDT is
    * a read-only remapping. To prevent a page fault, the GDT is switched to the
    @@ -427,6 +447,6 @@ static inline void idt_setup_early_pf(void) { }
    static inline void idt_setup_ist_traps(void) { }
    #endif

    -extern void idt_invalidate(void *addr);
    +extern void idt_invalidate(void);

    #endif /* _ASM_X86_DESC_H */
    diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
    index 73d45b0dfff2..c03a18cac78e 100644
    --- a/arch/x86/include/asm/idtentry.h
    +++ b/arch/x86/include/asm/idtentry.h
    @@ -504,7 +504,7 @@ __visible noinstr void func(struct pt_regs *regs, \
    .align 8
    SYM_CODE_START(irq_entries_start)
    vector=FIRST_EXTERNAL_VECTOR
    - .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
    + .rept NR_EXTERNAL_VECTORS
    UNWIND_HINT_IRET_REGS
    0 :
    .byte 0x6a, vector
    @@ -520,7 +520,7 @@ SYM_CODE_END(irq_entries_start)
    .align 8
    SYM_CODE_START(spurious_entries_start)
    vector=FIRST_SYSTEM_VECTOR
    - .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
    + .rept NR_SYSTEM_VECTORS
    UNWIND_HINT_IRET_REGS
    0 :
    .byte 0x6a, vector
    diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h
    index 889f8b1b5b7f..43dcb9284208 100644
    --- a/arch/x86/include/asm/irq_vectors.h
    +++ b/arch/x86/include/asm/irq_vectors.h
    @@ -26,8 +26,8 @@
    * This file enumerates the exact layout of them:
    */

    +/* This is used as an interrupt vector when programming the APIC. */
    #define NMI_VECTOR 0x02
    -#define MCE_VECTOR 0x12

    /*
    * IDT vectors usable for external interrupt sources start at 0x20.
    @@ -84,7 +84,7 @@
    */
    #define IRQ_WORK_VECTOR 0xf6

    -#define UV_BAU_MESSAGE 0xf5
    +/* 0xf5 - unused, was UV_BAU_MESSAGE */
    #define DEFERRED_ERROR_VECTOR 0xf4

    /* Vector on which hypervisor callbacks will be delivered */
    @@ -114,6 +114,9 @@
    #define FIRST_SYSTEM_VECTOR NR_VECTORS
    #endif

    +#define NR_EXTERNAL_VECTORS (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
    +#define NR_SYSTEM_VECTORS (NR_VECTORS - FIRST_SYSTEM_VECTOR)
    +
    /*
    * Size the maximum number of interrupts.
    *
    diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
    index d552f177eca0..2779f5226dc2 100644
    --- a/arch/x86/kernel/idt.c
    +++ b/arch/x86/kernel/idt.c
    @@ -331,11 +331,10 @@ void __init idt_setup_early_handler(void)

    /**
    * idt_invalidate - Invalidate interrupt descriptor table
    - * @addr: The virtual address of the 'invalid' IDT
    */
    -void idt_invalidate(void *addr)
    +void idt_invalidate(void)
    {
    - struct desc_ptr idt = { .address = (unsigned long) addr, .size = 0 };
    + static const struct desc_ptr idt = { .address = 0, .size = 0 };

    load_idt(&idt);
    }
    diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
    index 64b00b0d7fe8..1b373d79cedc 100644
    --- a/arch/x86/kernel/machine_kexec_32.c
    +++ b/arch/x86/kernel/machine_kexec_32.c
    @@ -23,17 +23,6 @@
    #include <asm/set_memory.h>
    #include <asm/debugreg.h>

    -static void set_gdt(void *newgdt, __u16 limit)
    -{
    - struct desc_ptr curgdt;
    -
    - /* ia32 supports unaligned loads & stores */
    - curgdt.size = limit;
    - curgdt.address = (unsigned long)newgdt;
    -
    - load_gdt(&curgdt);
    -}
    -
    static void load_segments(void)
    {
    #define __STR(X) #X
    @@ -232,8 +221,8 @@ void machine_kexec(struct kimage *image)
    * The gdt & idt are now invalid.
    * If you want to load them you must set up your own idt & gdt.
    */
    - idt_invalidate(phys_to_virt(0));
    - set_gdt(phys_to_virt(0), 0);
    + native_idt_invalidate();
    + native_gdt_invalidate();

    /* now call it */
    image->start = relocate_kernel_ptr((unsigned long)image->head,
    diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
    index c078b0d3ab0e..131f30fdcfbd 100644
    --- a/arch/x86/kernel/machine_kexec_64.c
    +++ b/arch/x86/kernel/machine_kexec_64.c
    @@ -256,35 +256,6 @@ static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
    return init_transition_pgtable(image, level4p);
    }

    -static void set_idt(void *newidt, u16 limit)
    -{
    - struct desc_ptr curidt;
    -
    - /* x86-64 supports unaligned loads & stores */
    - curidt.size = limit;
    - curidt.address = (unsigned long)newidt;
    -
    - __asm__ __volatile__ (
    - "lidtq %0\n"
    - : : "m" (curidt)
    - );
    -};
    -
    -
    -static void set_gdt(void *newgdt, u16 limit)
    -{
    - struct desc_ptr curgdt;
    -
    - /* x86-64 supports unaligned loads & stores */
    - curgdt.size = limit;
    - curgdt.address = (unsigned long)newgdt;
    -
    - __asm__ __volatile__ (
    - "lgdtq %0\n"
    - : : "m" (curgdt)
    - );
    -};
    -
    static void load_segments(void)
    {
    __asm__ __volatile__ (
    @@ -379,8 +350,8 @@ void machine_kexec(struct kimage *image)
    * The gdt & idt are now invalid.
    * If you want to load them you must set up your own idt & gdt.
    */
    - set_gdt(phys_to_virt(0), 0);
    - set_idt(phys_to_virt(0), 0);
    + native_idt_invalidate();
    + native_gdt_invalidate();

    /* now call it */
    image->start = relocate_kernel((unsigned long)image->head,
    diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
    index b29657b76e3f..ebfb91108232 100644
    --- a/arch/x86/kernel/reboot.c
    +++ b/arch/x86/kernel/reboot.c
    @@ -669,7 +669,7 @@ static void native_machine_emergency_restart(void)
    break;

    case BOOT_TRIPLE:
    - idt_invalidate(NULL);
    + idt_invalidate();
    __asm__ __volatile__("int3");

    /* We're probably dead after this, but... */
    diff --git a/tools/arch/x86/include/asm/irq_vectors.h b/tools/arch/x86/include/asm/irq_vectors.h
    index 889f8b1b5b7f..43dcb9284208 100644
    --- a/tools/arch/x86/include/asm/irq_vectors.h
    +++ b/tools/arch/x86/include/asm/irq_vectors.h
    @@ -26,8 +26,8 @@
    * This file enumerates the exact layout of them:
    */

    +/* This is used as an interrupt vector when programming the APIC. */
    #define NMI_VECTOR 0x02
    -#define MCE_VECTOR 0x12

    /*
    * IDT vectors usable for external interrupt sources start at 0x20.
    @@ -84,7 +84,7 @@
    */
    #define IRQ_WORK_VECTOR 0xf6

    -#define UV_BAU_MESSAGE 0xf5
    +/* 0xf5 - unused, was UV_BAU_MESSAGE */
    #define DEFERRED_ERROR_VECTOR 0xf4

    /* Vector on which hypervisor callbacks will be delivered */
    @@ -114,6 +114,9 @@
    #define FIRST_SYSTEM_VECTOR NR_VECTORS
    #endif

    +#define NR_EXTERNAL_VECTORS (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
    +#define NR_SYSTEM_VECTORS (NR_VECTORS - FIRST_SYSTEM_VECTOR)
    +
    /*
    * Size the maximum number of interrupts.
    *
    \
     
     \ /
      Last update: 2021-06-29 16:40    [W:2.473 / U:0.428 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site