x86/entry: Convert Debug exception to IDTENTRY_DB
Convert #DB to IDTENTRY_ERRORCODE: - Implement the C entry point with DEFINE_IDTENTRY_DB - Emit the ASM stub with DECLARE_IDTENTRY - Remove the ASM idtentry in 64bit - Remove the open coded ASM entry code in 32bit - Fixup the XEN/PV code - Remove the old prototypes No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lkml.kernel.org/r/20200505135314.900297476@linutronix.de
This commit is contained in:
		
							parent
							
								
									9f58fdde95
								
							
						
					
					
						commit
						2bbc68f837
					
				| @ -1488,16 +1488,6 @@ ret_to_user: | ||||
| 	jmp	restore_all_switch_stack | ||||
| SYM_CODE_END(handle_exception) | ||||
| 
 | ||||
| SYM_CODE_START(debug) | ||||
| 	/* | ||||
| 	 * Entry from sysenter is now handled in common_exception | ||||
| 	 */ | ||||
| 	ASM_CLAC | ||||
| 	pushl	$0 | ||||
| 	pushl	$do_debug | ||||
| 	jmp	common_exception | ||||
| SYM_CODE_END(debug) | ||||
| 
 | ||||
| SYM_CODE_START(double_fault) | ||||
| 1: | ||||
| 	/* | ||||
|  | ||||
| @ -1074,12 +1074,10 @@ apicinterrupt IRQ_WORK_VECTOR			irq_work_interrupt		smp_irq_work_interrupt | ||||
| 
 | ||||
| idtentry	X86_TRAP_PF		page_fault		do_page_fault			has_error_code=1 | ||||
| 
 | ||||
| idtentry_mce_db	X86_TRAP_DB		debug			do_debug | ||||
| idtentry_df	X86_TRAP_DF		double_fault		do_double_fault | ||||
| 
 | ||||
| #ifdef CONFIG_XEN_PV | ||||
| idtentry	512 /* dummy */		hypervisor_callback	xen_do_hypervisor_callback	has_error_code=0 | ||||
| idtentry	X86_TRAP_DB		xendebug		do_debug			has_error_code=0 | ||||
| #endif | ||||
| 
 | ||||
| /* | ||||
|  | ||||
| @ -262,4 +262,8 @@ DECLARE_IDTENTRY_MCE(X86_TRAP_MC,	exc_machine_check); | ||||
| DECLARE_IDTENTRY_NMI(X86_TRAP_NMI,	exc_nmi); | ||||
| DECLARE_IDTENTRY_XEN(X86_TRAP_NMI,	nmi); | ||||
| 
 | ||||
| /* #DB */ | ||||
| DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB,	exc_debug); | ||||
| DECLARE_IDTENTRY_XEN(X86_TRAP_DB,	debug); | ||||
| 
 | ||||
| #endif | ||||
|  | ||||
| @ -11,7 +11,6 @@ | ||||
| 
 | ||||
| #define dotraplinkage __visible | ||||
| 
 | ||||
| asmlinkage void debug(void); | ||||
| #ifdef CONFIG_X86_64 | ||||
| asmlinkage void double_fault(void); | ||||
| #endif | ||||
| @ -19,12 +18,10 @@ asmlinkage void page_fault(void); | ||||
| asmlinkage void async_page_fault(void); | ||||
| 
 | ||||
| #if defined(CONFIG_X86_64) && defined(CONFIG_XEN_PV) | ||||
| asmlinkage void xen_xendebug(void); | ||||
| asmlinkage void xen_double_fault(void); | ||||
| asmlinkage void xen_page_fault(void); | ||||
| #endif | ||||
| 
 | ||||
| dotraplinkage void do_debug(struct pt_regs *regs, long error_code); | ||||
| dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code, unsigned long cr2); | ||||
| dotraplinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, unsigned long address); | ||||
| 
 | ||||
|  | ||||
| @ -59,7 +59,7 @@ static bool idt_setup_done __initdata; | ||||
|  * stacks work only after cpu_init(). | ||||
|  */ | ||||
| static const __initconst struct idt_data early_idts[] = { | ||||
| 	INTG(X86_TRAP_DB,		debug), | ||||
| 	INTG(X86_TRAP_DB,		asm_exc_debug), | ||||
| 	SYSG(X86_TRAP_BP,		asm_exc_int3), | ||||
| #ifdef CONFIG_X86_32 | ||||
| 	INTG(X86_TRAP_PF,		page_fault), | ||||
| @ -93,7 +93,7 @@ static const __initconst struct idt_data def_idts[] = { | ||||
| #else | ||||
| 	INTG(X86_TRAP_DF,		double_fault), | ||||
| #endif | ||||
| 	INTG(X86_TRAP_DB,		debug), | ||||
| 	INTG(X86_TRAP_DB,		asm_exc_debug), | ||||
| 
 | ||||
| #ifdef CONFIG_X86_MCE | ||||
| 	INTG(X86_TRAP_MC,		asm_exc_machine_check), | ||||
| @ -164,7 +164,7 @@ static const __initconst struct idt_data early_pf_idts[] = { | ||||
|  * stack set to DEFAULT_STACK (0). Required for NMI trap handling. | ||||
|  */ | ||||
| static const __initconst struct idt_data dbg_idts[] = { | ||||
| 	INTG(X86_TRAP_DB,	debug), | ||||
| 	INTG(X86_TRAP_DB,		asm_exc_debug), | ||||
| }; | ||||
| #endif | ||||
| 
 | ||||
| @ -185,7 +185,7 @@ gate_desc debug_idt_table[IDT_ENTRIES] __page_aligned_bss; | ||||
|  * cpu_init() when the TSS has been initialized. | ||||
|  */ | ||||
| static const __initconst struct idt_data ist_idts[] = { | ||||
| 	ISTG(X86_TRAP_DB,	debug,			IST_INDEX_DB), | ||||
| 	ISTG(X86_TRAP_DB,	asm_exc_debug,		IST_INDEX_DB), | ||||
| 	ISTG(X86_TRAP_NMI,	asm_exc_nmi,		IST_INDEX_NMI), | ||||
| 	ISTG(X86_TRAP_DF,	double_fault,		IST_INDEX_DF), | ||||
| #ifdef CONFIG_X86_MCE | ||||
|  | ||||
| @ -775,7 +775,7 @@ static __always_inline void debug_exit(unsigned long dr7) | ||||
|  * | ||||
|  * May run on IST stack. | ||||
|  */ | ||||
| dotraplinkage void do_debug(struct pt_regs *regs, long error_code) | ||||
| DEFINE_IDTENTRY_DEBUG(exc_debug) | ||||
| { | ||||
| 	struct task_struct *tsk = current; | ||||
| 	unsigned long dr6, dr7; | ||||
| @ -784,7 +784,10 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) | ||||
| 
 | ||||
| 	debug_enter(&dr6, &dr7); | ||||
| 
 | ||||
| 	nmi_enter(); | ||||
| 	if (user_mode(regs)) | ||||
| 		idtentry_enter(regs); | ||||
| 	else | ||||
| 		nmi_enter(); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * The SDM says "The processor clears the BTF flag when it | ||||
| @ -821,7 +824,7 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) | ||||
| 		goto exit; | ||||
| #endif | ||||
| 
 | ||||
| 	if (notify_die(DIE_DEBUG, "debug", regs, (long)&dr6, error_code, | ||||
| 	if (notify_die(DIE_DEBUG, "debug", regs, (long)&dr6, 0, | ||||
| 		       SIGTRAP) == NOTIFY_STOP) | ||||
| 		goto exit; | ||||
| 
 | ||||
| @ -835,8 +838,8 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) | ||||
| 	cond_local_irq_enable(regs); | ||||
| 
 | ||||
| 	if (v8086_mode(regs)) { | ||||
| 		handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, | ||||
| 					X86_TRAP_DB); | ||||
| 		handle_vm86_trap((struct kernel_vm86_regs *) regs, 0, | ||||
| 				 X86_TRAP_DB); | ||||
| 		cond_local_irq_disable(regs); | ||||
| 		debug_stack_usage_dec(); | ||||
| 		goto exit; | ||||
| @ -855,15 +858,17 @@ dotraplinkage void do_debug(struct pt_regs *regs, long error_code) | ||||
| 	} | ||||
| 	si_code = get_si_code(tsk->thread.debugreg6); | ||||
| 	if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) | ||||
| 		send_sigtrap(regs, error_code, si_code); | ||||
| 		send_sigtrap(regs, 0, si_code); | ||||
| 	cond_local_irq_disable(regs); | ||||
| 	debug_stack_usage_dec(); | ||||
| 
 | ||||
| exit: | ||||
| 	nmi_exit(); | ||||
| 	if (user_mode(regs)) | ||||
| 		idtentry_exit(regs); | ||||
| 	else | ||||
| 		nmi_exit(); | ||||
| 	debug_exit(dr7); | ||||
| } | ||||
| NOKPROBE_SYMBOL(do_debug); | ||||
| 
 | ||||
| /*
 | ||||
|  * Note that we play around with the 'TS' bit in an attempt to get | ||||
|  | ||||
| @ -615,7 +615,7 @@ struct trap_array_entry { | ||||
| 	.ist_okay	= ist_ok } | ||||
| 
 | ||||
| static struct trap_array_entry trap_array[] = { | ||||
| 	{ debug,                       xen_xendebug,                    true }, | ||||
| 	TRAP_ENTRY_REDIR(exc_debug, exc_xendebug,	true  ), | ||||
| 	{ double_fault,                xen_double_fault,                true }, | ||||
| #ifdef CONFIG_X86_MCE | ||||
| 	TRAP_ENTRY(exc_machine_check,			true  ), | ||||
|  | ||||
| @ -29,8 +29,8 @@ _ASM_NOKPROBE(xen_\name) | ||||
| .endm | ||||
| 
 | ||||
| xen_pv_trap asm_exc_divide_error | ||||
| xen_pv_trap debug | ||||
| xen_pv_trap xendebug | ||||
| xen_pv_trap asm_exc_debug | ||||
| xen_pv_trap asm_exc_xendebug | ||||
| xen_pv_trap asm_exc_int3 | ||||
| xen_pv_trap asm_exc_xennmi | ||||
| xen_pv_trap asm_exc_overflow | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user