Messages in this thread Patch in this message | | | From | Andy Lutomirski <> | Subject | [PATCH 2/3] x86/entry/64: Teach idtentry to use the IRQ stack | Date | Thu, 23 Jul 2015 15:37:47 -0700 |
| |
We don't specifically need IST for things like kprobes, but we do want to avoid rare, surprising extra stack usage if a kprobe hits with a deep stack.
Teach idtentry to use the IRQ stack for selected entries.
This implementation uses the IRQ stack even if we entered from user mode. This disallows tricks like ist_begin_non_atomic. If we ever need such a trick in one of these entries, we can rework this. For now, let's keep it simple.
Signed-off-by: Andy Lutomirski <luto@kernel.org> --- arch/x86/entry/entry_64.S | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 5f7df8949fa7..ce72beba6045 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -739,13 +739,17 @@ apicinterrupt IRQ_WORK_VECTOR irq_work_interrupt smp_irq_work_interrupt */ #define CPU_TSS_IST(x) PER_CPU_VAR(cpu_tss) + (TSS_ist + ((x) - 1) * 8) -.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1 +.macro idtentry sym do_sym has_error_code:req irqstack=0 paranoid=0 shift_ist=-1 ENTRY(\sym) /* Sanity check */ .if \shift_ist != -1 && \paranoid == 0 .error "using shift_ist requires paranoid=1" .endif + .if \irqstack && \paranoid + .error "using irqstack requires !paranoid" + .endif + ASM_CLAC PARAVIRT_ADJUST_EXCEPTION_FRAME @@ -787,8 +791,16 @@ ENTRY(\sym) subq $EXCEPTION_STKSZ, CPU_TSS_IST(\shift_ist) .endif + .if \irqstack + ENTER_IRQ_STACK old_rsp=%rcx + .endif + call \do_sym + .if \irqstack + LEAVE_IRQ_STACK + .endif + .if \shift_ist != -1 addq $EXCEPTION_STKSZ, CPU_TSS_IST(\shift_ist) .endif -- 2.4.3
| |