Messages in this thread Patch in this message | | | Date | Tue, 25 Feb 2020 23:47:24 +0100 | From | Thomas Gleixner <> | Subject | [patch 05/15] x86/entry: Provide IDTEnTRY_SYSVEC |
| |
Provide a IDTENTRY variant for system vectors to consolidate the differnt mechanisms to emit the ASM stubs for 32 an 64 bit.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de> --- arch/x86/entry/entry_32.S | 4 ++++ arch/x86/entry/entry_64.S | 19 +++++++++++++++---- arch/x86/include/asm/idtentry.h | 25 +++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 4 deletions(-)
--- a/arch/x86/entry/entry_32.S +++ b/arch/x86/entry/entry_32.S @@ -1261,6 +1261,10 @@ SYM_CODE_START_LOCAL(asm_\cfunc) SYM_CODE_END(asm_\cfunc) .endm +.macro idtentry_sysvec vector cfunc + idtentry \vector asm_\cfunc \cfunc has_error_code=0 +.endm + /* * Include the defines which emit the idt entries which are shared * shared between 32 and 64 bit. --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -577,6 +577,21 @@ SYM_CODE_END(\asmsym) .endm /* + * System vectors which invoke their handlers directly and are not + * going through the regular common device interrupt handling code. + * + * Stick them all into the irqentry.text section. + */ +#define PUSH_SECTION_IRQENTRY .pushsection .irqentry.text, "ax" +#define POP_SECTION_IRQENTRY .popsection + +.macro idtentry_sysvec vector cfunc + PUSH_SECTION_IRQENTRY + idtentry \vector asm_\cfunc \cfunc has_error_code=0 irq_stack=0 + POP_SECTION_IRQENTRY +.endm + +/* * MCE and DB exceptions */ #define CPU_TSS_IST(x) PER_CPU_VAR(cpu_tss_rw) + (TSS_ist + (x) * 8) @@ -973,10 +988,6 @@ SYM_CODE_END(\sym) _ASM_NOKPROBE(\sym) .endm -/* Make sure APIC interrupt handlers end up in the irqentry section: */ -#define PUSH_SECTION_IRQENTRY .pushsection .irqentry.text, "ax" -#define POP_SECTION_IRQENTRY .popsection - .macro apicinterrupt num sym do_sym PUSH_SECTION_IRQENTRY apicinterrupt3 \num \sym \do_sym --- a/arch/x86/include/asm/idtentry.h +++ b/arch/x86/include/asm/idtentry.h @@ -210,6 +210,27 @@ NOKPROBE_SYMBOL(func); \ \ static __always_inline void __##func(struct pt_regs *regs, \ unsigned long vector) +/** + * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points + * @vector: Vector number (ignored for C) + * @func: Function name of the entry point + * + * Declares three functions: + * - The ASM entry point: asm_##func + * - The XEN PV trap entry point: xen_##func (maybe unused) + * - The C handler called from the ASM entry point + */ +#define DECLARE_IDTENTRY_SYSVEC(vector, func) \ + DECLARE_IDTENTRY(vector, func) + +/** + * DEFINE_IDTENTRY_SYSVEC - Emit code for system vector IDT entry points + * @func: Function name of the entry point + * + * @func is called from ASM entry code with interrupts disabled. + */ +#define DEFINE_IDTENTRY_SYSVEC(func) \ + DEFINE_IDTENTRY(func) #ifdef CONFIG_X86_64 /** @@ -384,6 +405,10 @@ static __always_inline void __##func(str #define DECLARE_IDTENTRY_IRQ(vector, func) \ idtentry_irq vector func +/* System vector entries */ +#define DECLARE_IDTENTRY_SYSVEC(__vector, __func) \ + idtentry_sysvec __vector __func + #ifdef CONFIG_X86_64 # define DECLARE_IDTENTRY_MCE(vector, func) \ idtentry_mce_db vector asm_##func func
| |