x86/entry/64: Simplify idtentry a little
authorPeter Zijlstra <peterz@infradead.org>
Thu, 11 Jul 2019 11:40:57 +0000 (13:40 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 17 Jul 2019 21:17:37 +0000 (23:17 +0200)
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
arch/x86/entry/entry_64.S

index 0ea4831..3db5fed 100644 (file)
@@ -864,6 +864,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
@@ -934,47 +980,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
        /*
@@ -983,21 +989,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