x86/entry/64: Don't use IST entry for #BP stack
There's nothing IST-worthy about #BP/int3. We don't allow kprobes in the small handful of places in the kernel that run at CPL0 with an invalid stack, and 32-bit kernels have used normal interrupt gates for #BP forever. Furthermore, we don't allow kprobes in places that have usergs while in kernel mode, so "paranoid" is also unnecessary. Signed-off-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: stable@vger.kernel.org
This commit is contained in:
parent
06ace26f4e
commit
d8ba61ba58
3 changed files with 9 additions and 10 deletions
|
@ -1138,7 +1138,7 @@ apicinterrupt3 HYPERV_REENLIGHTENMENT_VECTOR \
|
||||||
#endif /* CONFIG_HYPERV */
|
#endif /* CONFIG_HYPERV */
|
||||||
|
|
||||||
idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
|
idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
|
||||||
idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
|
idtentry int3 do_int3 has_error_code=0
|
||||||
idtentry stack_segment do_stack_segment has_error_code=1
|
idtentry stack_segment do_stack_segment has_error_code=1
|
||||||
|
|
||||||
#ifdef CONFIG_XEN
|
#ifdef CONFIG_XEN
|
||||||
|
|
|
@ -160,7 +160,6 @@ static const __initconst struct idt_data early_pf_idts[] = {
|
||||||
*/
|
*/
|
||||||
static const __initconst struct idt_data dbg_idts[] = {
|
static const __initconst struct idt_data dbg_idts[] = {
|
||||||
INTG(X86_TRAP_DB, debug),
|
INTG(X86_TRAP_DB, debug),
|
||||||
INTG(X86_TRAP_BP, int3),
|
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -183,7 +182,6 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss;
|
||||||
static const __initconst struct idt_data ist_idts[] = {
|
static const __initconst struct idt_data ist_idts[] = {
|
||||||
ISTG(X86_TRAP_DB, debug, DEBUG_STACK),
|
ISTG(X86_TRAP_DB, debug, DEBUG_STACK),
|
||||||
ISTG(X86_TRAP_NMI, nmi, NMI_STACK),
|
ISTG(X86_TRAP_NMI, nmi, NMI_STACK),
|
||||||
SISTG(X86_TRAP_BP, int3, DEBUG_STACK),
|
|
||||||
ISTG(X86_TRAP_DF, double_fault, DOUBLEFAULT_STACK),
|
ISTG(X86_TRAP_DF, double_fault, DOUBLEFAULT_STACK),
|
||||||
#ifdef CONFIG_X86_MCE
|
#ifdef CONFIG_X86_MCE
|
||||||
ISTG(X86_TRAP_MC, &machine_check, MCE_STACK),
|
ISTG(X86_TRAP_MC, &machine_check, MCE_STACK),
|
||||||
|
|
|
@ -577,7 +577,6 @@ do_general_protection(struct pt_regs *regs, long error_code)
|
||||||
}
|
}
|
||||||
NOKPROBE_SYMBOL(do_general_protection);
|
NOKPROBE_SYMBOL(do_general_protection);
|
||||||
|
|
||||||
/* May run on IST stack. */
|
|
||||||
dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
|
dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
|
@ -592,6 +591,13 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
|
||||||
if (poke_int3_handler(regs))
|
if (poke_int3_handler(regs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use ist_enter despite the fact that we don't use an IST stack.
|
||||||
|
* We can be called from a kprobe in non-CONTEXT_KERNEL kernel
|
||||||
|
* mode or even during context tracking state changes.
|
||||||
|
*
|
||||||
|
* This means that we can't schedule. That's okay.
|
||||||
|
*/
|
||||||
ist_enter(regs);
|
ist_enter(regs);
|
||||||
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
|
RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
|
||||||
#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
|
#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
|
||||||
|
@ -609,15 +615,10 @@ dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
|
||||||
SIGTRAP) == NOTIFY_STOP)
|
SIGTRAP) == NOTIFY_STOP)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
/*
|
|
||||||
* Let others (NMI) know that the debug stack is in use
|
|
||||||
* as we may switch to the interrupt stack.
|
|
||||||
*/
|
|
||||||
debug_stack_usage_inc();
|
|
||||||
cond_local_irq_enable(regs);
|
cond_local_irq_enable(regs);
|
||||||
do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
|
do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
|
||||||
cond_local_irq_disable(regs);
|
cond_local_irq_disable(regs);
|
||||||
debug_stack_usage_dec();
|
|
||||||
exit:
|
exit:
|
||||||
ist_exit(regs);
|
ist_exit(regs);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue