mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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 */
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_XEN
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,7 +160,6 @@ static const __initconst struct idt_data early_pf_idts[] = {
 | 
			
		|||
 */
 | 
			
		||||
static const __initconst struct idt_data dbg_idts[] = {
 | 
			
		||||
	INTG(X86_TRAP_DB,	debug),
 | 
			
		||||
	INTG(X86_TRAP_BP,	int3),
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +182,6 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss;
 | 
			
		|||
static const __initconst struct idt_data ist_idts[] = {
 | 
			
		||||
	ISTG(X86_TRAP_DB,	debug,		DEBUG_STACK),
 | 
			
		||||
	ISTG(X86_TRAP_NMI,	nmi,		NMI_STACK),
 | 
			
		||||
	SISTG(X86_TRAP_BP,	int3,		DEBUG_STACK),
 | 
			
		||||
	ISTG(X86_TRAP_DF,	double_fault,	DOUBLEFAULT_STACK),
 | 
			
		||||
#ifdef CONFIG_X86_MCE
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
/* May run on IST stack. */
 | 
			
		||||
dotraplinkage void notrace do_int3(struct pt_regs *regs, long error_code)
 | 
			
		||||
{
 | 
			
		||||
#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))
 | 
			
		||||
		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);
 | 
			
		||||
	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
 | 
			
		||||
#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)
 | 
			
		||||
		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);
 | 
			
		||||
	do_trap(X86_TRAP_BP, SIGTRAP, "int3", regs, error_code, NULL);
 | 
			
		||||
	cond_local_irq_disable(regs);
 | 
			
		||||
	debug_stack_usage_dec();
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
	ist_exit(regs);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue