| From f42d0df86836e55459566a6d760b3cc4debeef0e Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Thu, 11 Jul 2019 13:40:57 +0200 |
| Subject: [PATCH] x86/entry/64: Simplify idtentry a little |
| |
| commit 2fd37912cfb019228bf246215938e6f7619516a2 upstream. |
| |
| There's a bunch of duplication in idtentry, namely the |
| .Lfrom_usermode_switch_stack is a paranoid=0 copy of the normal flow. |
| |
| Make this explicit by creating a idtentry_part helper macro. |
| |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Acked-by: Andy Lutomirski <luto@kernel.org> |
| Cc: bp@alien8.de |
| Cc: torvalds@linux-foundation.org |
| Cc: hpa@zytor.com |
| Cc: dave.hansen@linux.intel.com |
| Cc: jgross@suse.com |
| Cc: zhe.he@windriver.com |
| Cc: joel@joelfernandes.org |
| Cc: devel@etsukata.com |
| Link: https://lkml.kernel.org/r/20190711114336.002429503@infradead.org |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S |
| index 594b2fa7da80..18a80606f157 100644 |
| --- a/arch/x86/entry/entry_64.S |
| +++ b/arch/x86/entry/entry_64.S |
| @@ -866,6 +866,52 @@ apicinterrupt IRQ_WORK_VECTOR irq_work_interrupt smp_irq_work_interrupt |
| */ |
| #define CPU_TSS_IST(x) PER_CPU_VAR(cpu_tss_rw) + (TSS_ist + (x) * 8) |
| |
| +.macro idtentry_part do_sym, has_error_code:req, paranoid:req, shift_ist=-1, ist_offset=0 |
| + |
| + .if \paranoid |
| + call paranoid_entry |
| + /* returned flag: ebx=0: need swapgs on exit, ebx=1: don't need it */ |
| + .else |
| + call error_entry |
| + .endif |
| + UNWIND_HINT_REGS |
| + |
| + .if \paranoid |
| + .if \shift_ist != -1 |
| + TRACE_IRQS_OFF_DEBUG /* reload IDT in case of recursion */ |
| + .else |
| + TRACE_IRQS_OFF |
| + .endif |
| + .endif |
| + |
| + movq %rsp, %rdi /* pt_regs pointer */ |
| + |
| + .if \has_error_code |
| + movq ORIG_RAX(%rsp), %rsi /* get error code */ |
| + movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */ |
| + .else |
| + xorl %esi, %esi /* no error code */ |
| + .endif |
| + |
| + .if \shift_ist != -1 |
| + subq $\ist_offset, CPU_TSS_IST(\shift_ist) |
| + .endif |
| + |
| + call \do_sym |
| + |
| + .if \shift_ist != -1 |
| + addq $\ist_offset, CPU_TSS_IST(\shift_ist) |
| + .endif |
| + |
| + .if \paranoid |
| + /* this procedure expect "no swapgs" flag in ebx */ |
| + jmp paranoid_exit |
| + .else |
| + jmp error_exit |
| + .endif |
| + |
| +.endm |
| + |
| /** |
| * idtentry - Generate an IDT entry stub |
| * @sym: Name of the generated entry point |
| @@ -936,47 +982,7 @@ ENTRY(\sym) |
| .Lfrom_usermode_no_gap_\@: |
| .endif |
| |
| - .if \paranoid |
| - call paranoid_entry |
| - .else |
| - call error_entry |
| - .endif |
| - UNWIND_HINT_REGS |
| - /* returned flag: ebx=0: need swapgs on exit, ebx=1: don't need it */ |
| - |
| - .if \paranoid |
| - .if \shift_ist != -1 |
| - TRACE_IRQS_OFF_DEBUG /* reload IDT in case of recursion */ |
| - .else |
| - TRACE_IRQS_OFF |
| - .endif |
| - .endif |
| - |
| - movq %rsp, %rdi /* pt_regs pointer */ |
| - |
| - .if \has_error_code |
| - movq ORIG_RAX(%rsp), %rsi /* get error code */ |
| - movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */ |
| - .else |
| - xorl %esi, %esi /* no error code */ |
| - .endif |
| - |
| - .if \shift_ist != -1 |
| - subq $\ist_offset, CPU_TSS_IST(\shift_ist) |
| - .endif |
| - |
| - call \do_sym |
| - |
| - .if \shift_ist != -1 |
| - addq $\ist_offset, CPU_TSS_IST(\shift_ist) |
| - .endif |
| - |
| - /* these procedures expect "no swapgs" flag in ebx */ |
| - .if \paranoid |
| - jmp paranoid_exit |
| - .else |
| - jmp error_exit |
| - .endif |
| + idtentry_part \do_sym, \has_error_code, \paranoid, \shift_ist, \ist_offset |
| |
| .if \paranoid == 1 |
| /* |
| @@ -985,21 +991,9 @@ ENTRY(\sym) |
| * run in real process context if user_mode(regs). |
| */ |
| .Lfrom_usermode_switch_stack_\@: |
| - call error_entry |
| - |
| - movq %rsp, %rdi /* pt_regs pointer */ |
| - |
| - .if \has_error_code |
| - movq ORIG_RAX(%rsp), %rsi /* get error code */ |
| - movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */ |
| - .else |
| - xorl %esi, %esi /* no error code */ |
| + idtentry_part \do_sym, \has_error_code, paranoid=0 |
| .endif |
| |
| - call \do_sym |
| - |
| - jmp error_exit |
| - .endif |
| _ASM_NOKPROBE(\sym) |
| END(\sym) |
| .endm |
| -- |
| 2.7.4 |
| |