Commit 3ffdfdce authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/entry: Move paranoid irq tracing out of ASM code



The last step to remove the irq tracing cruft from ASM. Ignore #DF as the
maschine is going to die anyway.

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/20200521202120.414043330@linutronix.de
parent 9628f26b
Loading
Loading
Loading
Loading
+0 −13
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
 *
 * Some macro usage:
 * - SYM_FUNC_START/END:Define functions in the symbol table.
 * - TRACE_IRQ_*:	Trace hardirq state for lock debugging.
 * - idtentry:		Define exception entry points.
 */
#include <linux/linkage.h>
@@ -107,11 +106,6 @@ SYM_CODE_END(native_usergs_sysret64)

SYM_CODE_START(entry_SYSCALL_64)
	UNWIND_HINT_EMPTY
	/*
	 * Interrupts are off on entry.
	 * We do not frame this tiny irq-off block with TRACE_IRQS_OFF/ON,
	 * it is too small to ever cause noticeable irq latency.
	 */

	swapgs
	/* tss.sp2 is scratch space. */
@@ -462,8 +456,6 @@ SYM_CODE_START(\asmsym)

	UNWIND_HINT_REGS

	TRACE_IRQS_OFF

	movq	%rsp, %rdi		/* pt_regs pointer */

	.if \vector == X86_TRAP_DB
@@ -881,17 +873,13 @@ SYM_CODE_END(paranoid_entry)
 */
SYM_CODE_START_LOCAL(paranoid_exit)
	UNWIND_HINT_REGS
	DISABLE_INTERRUPTS(CLBR_ANY)
	TRACE_IRQS_OFF
	testl	%ebx, %ebx			/* swapgs needed? */
	jnz	.Lparanoid_exit_no_swapgs
	TRACE_IRQS_IRETQ
	/* Always restore stashed CR3 value (see paranoid_entry) */
	RESTORE_CR3	scratch_reg=%rbx save_reg=%r14
	SWAPGS_UNSAFE_STACK
	jmp	restore_regs_and_return_to_kernel
.Lparanoid_exit_no_swapgs:
	TRACE_IRQS_IRETQ
	/* Always restore stashed CR3 value (see paranoid_entry) */
	RESTORE_CR3	scratch_reg=%rbx save_reg=%r14
	jmp restore_regs_and_return_to_kernel
@@ -1292,7 +1280,6 @@ end_repeat_nmi:
	call	paranoid_entry
	UNWIND_HINT_REGS

	/* paranoidentry exc_nmi(), 0; without TRACE_IRQS_OFF */
	movq	%rsp, %rdi
	movq	$-1, %rsi
	call	exc_nmi
+3 −0
Original line number Diff line number Diff line
@@ -1922,7 +1922,10 @@ static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
	 * that out because it's an indirect call. Annotate it.
	 */
	instrumentation_begin();
	trace_hardirqs_off_prepare();
	machine_check_vector(regs);
	if (regs->flags & X86_EFLAGS_IF)
		trace_hardirqs_on_prepare();
	instrumentation_end();
	nmi_exit();
}
+3 −0
Original line number Diff line number Diff line
@@ -330,6 +330,7 @@ static noinstr void default_do_nmi(struct pt_regs *regs)
	__this_cpu_write(last_nmi_rip, regs->ip);

	instrumentation_begin();
	trace_hardirqs_off_prepare();

	handled = nmi_handle(NMI_LOCAL, regs);
	__this_cpu_add(nmi_stats.normal, handled);
@@ -416,6 +417,8 @@ static noinstr void default_do_nmi(struct pt_regs *regs)
		unknown_nmi_error(reason, regs);

out:
	if (regs->flags & X86_EFLAGS_IF)
		trace_hardirqs_on_prepare();
	instrumentation_end();
}

+11 −0
Original line number Diff line number Diff line
@@ -634,8 +634,11 @@ DEFINE_IDTENTRY_RAW(exc_int3)
	} else {
		nmi_enter();
		instrumentation_begin();
		trace_hardirqs_off_prepare();
		if (!do_int3(regs))
			die("int3", regs, 0);
		if (regs->flags & X86_EFLAGS_IF)
			trace_hardirqs_on_prepare();
		instrumentation_end();
		nmi_exit();
	}
@@ -850,6 +853,10 @@ static __always_inline void exc_debug_kernel(struct pt_regs *regs,
					     unsigned long dr6)
{
	nmi_enter();
	instrumentation_begin();
	trace_hardirqs_off_prepare();
	instrumentation_end();

	/*
	 * The SDM says "The processor clears the BTF flag when it
	 * generates a debug exception."  Clear TIF_BLOCKSTEP to keep
@@ -871,6 +878,10 @@ static __always_inline void exc_debug_kernel(struct pt_regs *regs,
	if (dr6)
		handle_debug(regs, dr6, false);

	instrumentation_begin();
	if (regs->flags & X86_EFLAGS_IF)
		trace_hardirqs_on_prepare();
	instrumentation_end();
	nmi_exit();
}