Commit fa5e5c40 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

x86/entry: Use idtentry for interrupts



Replace the extra interrupt handling code and reuse the existing idtentry
machinery. This moves the irq stack switching on 64-bit from ASM to C code;
32-bit already does the stack switching in C.

This requires to remove HAVE_IRQ_EXIT_ON_IRQ_STACK as the stack switch is
not longer in the low level entry code.

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/20200521202119.078690991@linutronix.de
parent 0bf7c314
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -181,7 +181,6 @@ config X86
	select HAVE_HW_BREAKPOINT
	select HAVE_IDE
	select HAVE_IOREMAP_PROT
	select HAVE_IRQ_EXIT_ON_IRQ_STACK	if X86_64
	select HAVE_IRQ_TIME_ACCOUNTING
	select HAVE_KERNEL_BZIP2
	select HAVE_KERNEL_GZIP
+0 −31
Original line number Diff line number Diff line
@@ -1229,37 +1229,6 @@ SYM_FUNC_END(entry_INT80_32)
#endif
.endm

#ifdef CONFIG_X86_LOCAL_APIC
SYM_CODE_START_LOCAL(common_spurious)
	ASM_CLAC
	SAVE_ALL switch_stacks=1
	ENCODE_FRAME_POINTER
	TRACE_IRQS_OFF
	movl	%esp, %eax
	movl	PT_ORIG_EAX(%esp), %edx		/* get the vector from stack */
	movl	$-1, PT_ORIG_EAX(%esp)		/* no syscall to restart */
	call	smp_spurious_interrupt
	jmp	ret_from_intr
SYM_CODE_END(common_spurious)
#endif

/*
 * the CPU automatically disables interrupts when executing an IRQ vector,
 * so IRQ-flags tracing has to follow that:
 */
	.p2align CONFIG_X86_L1_CACHE_SHIFT
SYM_CODE_START_LOCAL(common_interrupt)
	ASM_CLAC
	SAVE_ALL switch_stacks=1
	ENCODE_FRAME_POINTER
	TRACE_IRQS_OFF
	movl	%esp, %eax
	movl	PT_ORIG_EAX(%esp), %edx		/* get the vector from stack */
	movl	$-1, PT_ORIG_EAX(%esp)		/* no syscall to restart */
	call	do_IRQ
	jmp	ret_from_intr
SYM_CODE_END(common_interrupt)

#define BUILD_INTERRUPT3(name, nr, fn)			\
SYM_FUNC_START(name)					\
	ASM_CLAC;					\
+3 −28
Original line number Diff line number Diff line
@@ -737,32 +737,7 @@ SYM_CODE_START(interrupt_entry)
SYM_CODE_END(interrupt_entry)
_ASM_NOKPROBE(interrupt_entry)


/* Interrupt entry/exit. */

/*
 * The interrupt stubs push vector onto the stack and
 * then jump to common_spurious/interrupt.
 */
SYM_CODE_START_LOCAL(common_spurious)
	call	interrupt_entry
	UNWIND_HINT_REGS indirect=1
	movq	ORIG_RAX(%rdi), %rsi		/* get vector from stack */
	movq	$-1, ORIG_RAX(%rdi)		/* no syscall to restart */
	call	smp_spurious_interrupt		/* rdi points to pt_regs */
	jmp	ret_from_intr
SYM_CODE_END(common_spurious)
_ASM_NOKPROBE(common_spurious)

/* common_interrupt is a hotpath. Align it */
	.p2align CONFIG_X86_L1_CACHE_SHIFT
SYM_CODE_START_LOCAL(common_interrupt)
	call	interrupt_entry
	UNWIND_HINT_REGS indirect=1
	movq	ORIG_RAX(%rdi), %rsi		/* get vector from stack */
	movq	$-1, ORIG_RAX(%rdi)		/* no syscall to restart */
	call	do_IRQ				/* rdi points to pt_regs */
	/* 0(%rsp): old RSP */
SYM_CODE_START_LOCAL(common_interrupt_return)
ret_from_intr:
	DISABLE_INTERRUPTS(CLBR_ANY)
	TRACE_IRQS_OFF
@@ -945,8 +920,8 @@ native_irq_return_ldt:
	 */
	jmp	native_irq_return_iret
#endif
SYM_CODE_END(common_interrupt)
_ASM_NOKPROBE(common_interrupt)
SYM_CODE_END(common_interrupt_return)
_ASM_NOKPROBE(common_interrupt_return)

/*
 * APIC interrupts.
+0 −1
Original line number Diff line number Diff line
@@ -38,7 +38,6 @@ extern asmlinkage void error_interrupt(void);
extern asmlinkage void irq_work_interrupt(void);
extern asmlinkage void uv_bau_message_intr1(void);

extern asmlinkage void spurious_interrupt(void);
extern asmlinkage void spurious_apic_interrupt(void);
extern asmlinkage void thermal_interrupt(void);
extern asmlinkage void reschedule_interrupt(void);
+8 −2
Original line number Diff line number Diff line
@@ -417,7 +417,7 @@ SYM_CODE_START(irq_entries_start)
    .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
	UNWIND_HINT_IRET_REGS
	.byte	0x6a, vector
	jmp	common_interrupt
	jmp	asm_common_interrupt
	nop
	/* Ensure that the above is 8 bytes max */
	. = pos + 8
@@ -434,7 +434,7 @@ SYM_CODE_START(spurious_entries_start)
    .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR)
	UNWIND_HINT_IRET_REGS
	.byte	0x6a, vector
	jmp	common_spurious
	jmp	asm_spurious_interrupt
	nop
	/* Ensure that the above is 8 bytes max */
	. = pos + 8
@@ -506,6 +506,12 @@ DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);
DECLARE_IDTENTRY_XENCB(X86_TRAP_OTHER,	exc_xen_hypervisor_callback);
#endif

/* Device interrupts common/spurious */
DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER,	common_interrupt);
#ifdef CONFIG_X86_LOCAL_APIC
DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER,	spurious_interrupt);
#endif

#undef X86_TRAP_OTHER

#endif
Loading