lkml.org 
[lkml]   [2019]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86/entry/64: Simplify idtentry a little
    Commit-ID:  2fd37912cfb019228bf246215938e6f7619516a2
    Gitweb: https://git.kernel.org/tip/2fd37912cfb019228bf246215938e6f7619516a2
    Author: Peter Zijlstra <peterz@infradead.org>
    AuthorDate: Thu, 11 Jul 2019 13:40:57 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Wed, 17 Jul 2019 23:17:37 +0200

    x86/entry/64: Simplify idtentry a little

    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 | 102 ++++++++++++++++++++++------------------------
    1 file changed, 48 insertions(+), 54 deletions(-)

    diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
    index 0ea4831a72a4..3db5fede743b 100644
    --- a/arch/x86/entry/entry_64.S
    +++ b/arch/x86/entry/entry_64.S
    @@ -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
    \
     
     \ /
      Last update: 2019-07-17 23:25    [W:4.562 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site