lkml.org 
[lkml]   [2020]   [May]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch V4 part 5 25/31] x86/entry: Remove the apic/BUILD interrupt leftovers
    Remove all the code which was there to emit the system vector stubs. All
    users are gone.

    Move the now unused GET_CR2_INTO macro muck to head_64.S where the last
    user is. Fixup the eye hurting comment there while at it.

    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    ---
    arch/x86/entry/calling.h | 20 -----
    arch/x86/entry/entry_32.S | 18 ----
    arch/x86/entry/entry_64.S | 144 --------------------------------------
    arch/x86/include/asm/entry_arch.h | 12 ---
    arch/x86/kernel/head_64.S | 7 +
    5 files changed, 4 insertions(+), 197 deletions(-)

    --- a/arch/x86/entry/calling.h
    +++ b/arch/x86/entry/calling.h
    @@ -349,23 +349,3 @@ For 32-bit we have the following convent
    call stackleak_erase
    #endif
    .endm
    -
    -/*
    - * This does 'call enter_from_user_mode' unless we can avoid it based on
    - * kernel config or using the static jump infrastructure.
    - */
    -.macro CALL_enter_from_user_mode
    -#ifdef CONFIG_CONTEXT_TRACKING
    -#ifdef CONFIG_JUMP_LABEL
    - STATIC_JUMP_IF_FALSE .Lafter_call_\@, context_tracking_key, def=0
    -#endif
    - call enter_from_user_mode
    -.Lafter_call_\@:
    -#endif
    -.endm
    -
    -#ifdef CONFIG_PARAVIRT_XXL
    -#define GET_CR2_INTO(reg) GET_CR2_INTO_AX ; _ASM_MOV %_ASM_AX, reg
    -#else
    -#define GET_CR2_INTO(reg) _ASM_MOV %cr2, reg
    -#endif
    --- a/arch/x86/entry/entry_32.S
    +++ b/arch/x86/entry/entry_32.S
    @@ -1233,24 +1233,6 @@ SYM_FUNC_END(entry_INT80_32)
    #endif
    .endm

    -#define BUILD_INTERRUPT3(name, nr, fn) \
    -SYM_FUNC_START(name) \
    - ASM_CLAC; \
    - pushl $~(nr); \
    - SAVE_ALL switch_stacks=1; \
    - ENCODE_FRAME_POINTER; \
    - TRACE_IRQS_OFF \
    - movl %esp, %eax; \
    - call fn; \
    - jmp ret_from_intr; \
    -SYM_FUNC_END(name)
    -
    -#define BUILD_INTERRUPT(name, nr) \
    - BUILD_INTERRUPT3(name, nr, smp_##name); \
    -
    -/* The include is where all of the SMP etc. interrupts come from */
    -#include <asm/entry_arch.h>
    -
    #ifdef CONFIG_PARAVIRT
    SYM_CODE_START(native_iret)
    iret
    --- a/arch/x86/entry/entry_64.S
    +++ b/arch/x86/entry/entry_64.S
    @@ -659,108 +659,7 @@ SYM_CODE_END(\asmsym)
    */
    #include <asm/idtentry.h>

    -/*
    - * Interrupt entry helper function.
    - *
    - * Entry runs with interrupts off. Stack layout at entry:
    - * +----------------------------------------------------+
    - * | regs->ss |
    - * | regs->rsp |
    - * | regs->eflags |
    - * | regs->cs |
    - * | regs->ip |
    - * +----------------------------------------------------+
    - * | regs->orig_ax = ~(interrupt number) |
    - * +----------------------------------------------------+
    - * | return address |
    - * +----------------------------------------------------+
    - */
    -SYM_CODE_START(interrupt_entry)
    - UNWIND_HINT_FUNC
    - ASM_CLAC
    - cld
    -
    - testb $3, CS-ORIG_RAX+8(%rsp)
    - jz 1f
    - SWAPGS
    - FENCE_SWAPGS_USER_ENTRY
    - /*
    - * Switch to the thread stack. The IRET frame and orig_ax are
    - * on the stack, as well as the return address. RDI..R12 are
    - * not (yet) on the stack and space has not (yet) been
    - * allocated for them.
    - */
    - pushq %rdi
    -
    - /* Need to switch before accessing the thread stack. */
    - SWITCH_TO_KERNEL_CR3 scratch_reg=%rdi
    - movq %rsp, %rdi
    - movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
    -
    - /*
    - * We have RDI, return address, and orig_ax on the stack on
    - * top of the IRET frame. That means offset=24
    - */
    - UNWIND_HINT_IRET_REGS base=%rdi offset=24
    -
    - pushq 7*8(%rdi) /* regs->ss */
    - pushq 6*8(%rdi) /* regs->rsp */
    - pushq 5*8(%rdi) /* regs->eflags */
    - pushq 4*8(%rdi) /* regs->cs */
    - pushq 3*8(%rdi) /* regs->ip */
    - pushq 2*8(%rdi) /* regs->orig_ax */
    - pushq 8(%rdi) /* return address */
    - UNWIND_HINT_FUNC
    -
    - movq (%rdi), %rdi
    - jmp 2f
    -1:
    - FENCE_SWAPGS_KERNEL_ENTRY
    -2:
    - PUSH_AND_CLEAR_REGS save_ret=1
    - ENCODE_FRAME_POINTER 8
    -
    - testb $3, CS+8(%rsp)
    - jz 1f
    -
    - /*
    - * IRQ from user mode.
    - *
    - * We need to tell lockdep that IRQs are off. We can't do this until
    - * we fix gsbase, and we should do it before enter_from_user_mode
    - * (which can take locks). Since TRACE_IRQS_OFF is idempotent,
    - * the simplest way to handle it is to just call it twice if
    - * we enter from user mode. There's no reason to optimize this since
    - * TRACE_IRQS_OFF is a no-op if lockdep is off.
    - */
    - TRACE_IRQS_OFF
    -
    - CALL_enter_from_user_mode
    -
    -1:
    - ENTER_IRQ_STACK old_rsp=%rdi save_ret=1
    - /* We entered an interrupt context - irqs are off: */
    - TRACE_IRQS_OFF
    -
    - ret
    -SYM_CODE_END(interrupt_entry)
    -_ASM_NOKPROBE(interrupt_entry)
    -
    SYM_CODE_START_LOCAL(common_interrupt_return)
    -ret_from_intr:
    - DISABLE_INTERRUPTS(CLBR_ANY)
    - TRACE_IRQS_OFF
    -
    - LEAVE_IRQ_STACK
    -
    - testb $3, CS(%rsp)
    - jz retint_kernel
    -
    - /* Interrupt came from user space */
    -.Lretint_user:
    - mov %rsp,%rdi
    - call prepare_exit_to_usermode
    -
    SYM_INNER_LABEL(swapgs_restore_regs_and_return_to_usermode, SYM_L_GLOBAL)
    #ifdef CONFIG_DEBUG_ENTRY
    /* Assert that pt_regs indicates user mode. */
    @@ -802,23 +701,6 @@ SYM_INNER_LABEL(swapgs_restore_regs_and_
    INTERRUPT_RETURN


    -/* Returning to kernel space */
    -retint_kernel:
    -#ifdef CONFIG_PREEMPTION
    - /* Interrupts are off */
    - /* Check if we need preemption */
    - btl $9, EFLAGS(%rsp) /* were interrupts off? */
    - jnc 1f
    - cmpl $0, PER_CPU_VAR(__preempt_count)
    - jnz 1f
    - call preempt_schedule_irq
    -1:
    -#endif
    - /*
    - * The iretq could re-enable interrupts:
    - */
    - TRACE_IRQS_IRETQ
    -
    SYM_INNER_LABEL(restore_regs_and_return_to_kernel, SYM_L_GLOBAL)
    #ifdef CONFIG_DEBUG_ENTRY
    /* Assert that pt_regs indicates kernel mode. */
    @@ -932,32 +814,6 @@ SYM_CODE_END(common_interrupt_return)
    _ASM_NOKPROBE(common_interrupt_return)

    /*
    - * APIC interrupts.
    - */
    -.macro apicinterrupt3 num sym do_sym
    -SYM_CODE_START(\sym)
    - UNWIND_HINT_IRET_REGS
    - pushq $~(\num)
    -.Lcommon_\sym:
    - call interrupt_entry
    - UNWIND_HINT_REGS indirect=1
    - call \do_sym /* rdi points to pt_regs */
    - jmp ret_from_intr
    -SYM_CODE_END(\sym)
    -_ASM_NOKPROBE(\sym)
    -.endm
    -
    -/* Make sure APIC interrupt handlers end up in the irqentry section: */
    -#define PUSH_SECTION_IRQENTRY .pushsection .irqentry.text, "ax"
    -#define POP_SECTION_IRQENTRY .popsection
    -
    -.macro apicinterrupt num sym do_sym
    -PUSH_SECTION_IRQENTRY
    -apicinterrupt3 \num \sym \do_sym
    -POP_SECTION_IRQENTRY
    -.endm
    -
    -/*
    * Reload gs selector with exception handling
    * edi: new selector
    */
    --- a/arch/x86/include/asm/entry_arch.h
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -/* SPDX-License-Identifier: GPL-2.0 */
    -/*
    - * This file is designed to contain the BUILD_INTERRUPT specifications for
    - * all of the extra named interrupt vectors used by the architecture.
    - * Usually this is the Inter Process Interrupts (IPIs)
    - */
    -
    -/*
    - * The following vectors are part of the Linux architecture, there
    - * is no hardware IRQ pin equivalent for them, they are triggered
    - * through the ICC by us (IPIs)
    - */
    --- a/arch/x86/kernel/head_64.S
    +++ b/arch/x86/kernel/head_64.S
    @@ -29,15 +29,16 @@
    #ifdef CONFIG_PARAVIRT_XXL
    #include <asm/asm-offsets.h>
    #include <asm/paravirt.h>
    +#define GET_CR2_INTO(reg) GET_CR2_INTO_AX ; _ASM_MOV %_ASM_AX, reg
    #else
    #define INTERRUPT_RETURN iretq
    +#define GET_CR2_INTO(reg) _ASM_MOV %cr2, reg
    #endif

    -/* we are not able to switch in one step to the final KERNEL ADDRESS SPACE
    +/*
    + * We are not able to switch in one step to the final KERNEL ADDRESS SPACE
    * because we need identity-mapped pages.
    - *
    */
    -
    #define l4_index(x) (((x) >> 39) & 511)
    #define pud_index(x) (((x) >> PUD_SHIFT) & (PTRS_PER_PUD-1))

    \
     
     \ /
      Last update: 2020-05-05 16:18    [W:2.982 / U:0.508 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site