lkml.org 
[lkml]   [2017]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 04/20] x86/asm/64: Simplify reg restore code in the standard IRET paths
    Date
    The old code restored all the registers with movq instead of pop.
    In theory, this was done because some CPUs have higher movq
    throughput, but any gain there would be tiny and is almost certainly
    outweighed by the higher text size.

    This saves 96 bytes of text.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    ---
    arch/x86/entry/calling.h | 21 +++++++++++++++++++++
    arch/x86/entry/entry_64.S | 12 ++++++------
    2 files changed, 27 insertions(+), 6 deletions(-)

    diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h
    index 640aafebdc00..0b9dd8123701 100644
    --- a/arch/x86/entry/calling.h
    +++ b/arch/x86/entry/calling.h
    @@ -151,6 +151,27 @@ For 32-bit we have the following conventions - kernel is built with
    UNWIND_HINT_REGS offset=\offset extra=0
    .endm

    + .macro POP_EXTRA_REGS
    + popq %r15
    + popq %r14
    + popq %r13
    + popq %r12
    + popq %rbp
    + popq %rbx
    + .endm
    +
    + .macro POP_C_REGS
    + popq %r11
    + popq %r10
    + popq %r9
    + popq %r8
    + popq %rax
    + popq %rcx
    + popq %rdx
    + popq %rsi
    + popq %rdi
    + .endm
    +
    .macro RESTORE_C_REGS_HELPER rstor_rax=1, rstor_rcx=1, rstor_r11=1, rstor_r8910=1, rstor_rdx=1
    .if \rstor_r11
    movq 6*8(%rsp), %r11
    diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
    index 9bfa34c3b6b5..36a2a8b6ec99 100644
    --- a/arch/x86/entry/entry_64.S
    +++ b/arch/x86/entry/entry_64.S
    @@ -618,9 +618,9 @@ GLOBAL(swapgs_restore_regs_and_return_to_usermode)
    1:
    #endif
    SWAPGS
    - RESTORE_EXTRA_REGS
    - RESTORE_C_REGS
    - REMOVE_PT_GPREGS_FROM_STACK 8
    + POP_EXTRA_REGS
    + POP_C_REGS
    + addq $8, %rsp /* skip regs->orig_ax */
    INTERRUPT_RETURN


    @@ -650,9 +650,9 @@ GLOBAL(restore_regs_and_return_to_kernel)
    ud2
    1:
    #endif
    - RESTORE_EXTRA_REGS
    - RESTORE_C_REGS
    - REMOVE_PT_GPREGS_FROM_STACK 8
    + POP_EXTRA_REGS
    + POP_C_REGS
    + addq $8, %rsp /* skip regs->orig_ax */
    INTERRUPT_RETURN

    ENTRY(native_iret)
    --
    2.13.6
    \
     
     \ /
      Last update: 2017-11-02 09:10    [W:4.100 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site