• Thomas Gleixner's avatar
    x86/entry: Provide helpers for executing on the irqstack · 931b9414
    Thomas Gleixner authored
    Device interrupt handlers and system vector handlers are executed on the
    interrupt stack. The stack switch happens in the low level assembly entry
    code. This conflicts with the efforts to consolidate the exit code in C to
    ensure correctness vs. RCU and tracing.
    
    As there is no way to move #DB away from IST due to the MOV SS issue, the
    requirements vs. #DB and NMI for switching to the interrupt stack do not
    exist anymore. The only requirement is that interrupts are disabled.
    
    That allows the moving of the stack switching to C code, which simplifies the
    entry/exit handling further, because it allows the switching of stacks after
    handling the entry and on exit before handling RCU, returning to usermode and
    kernel preemption in the same way as for regular exceptions.
    
    The initial attempt of having the stack switching in inline ASM caused too
    much headache vs. objtool and the unwinder. After analysing the use cases
    it was agreed on that having the stack switch in ASM for the price of an
    indirect call is acceptable, as the main users are indirect call heavy
    anyway and the few system vectors which are empty shells (scheduler IPI and
    KVM posted interrupt vectors) can run from the regular stack.
    
    Provide helper functions to check whether the interrupt stack is already
    active and whether stack switching is required.
    
    64-bit only for now, as 32-bit has a variant of that already. Once this is
    cleaned up, the two implementations might be consolidated as an additional
    cleanup on top.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Acked-by: default avatarAndy Lutomirski <luto@kernel.org>
    Link: https://lore.kernel.org/r/20200521202117.763775313@linutronix.de
    
    931b9414
entry_64.S 49.2 KB