On Wed, Sep 06, 2017 at 02:36:49PM -0700, Andy Lutomirski wrote:
> 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 <[email protected]>
> ---
>  arch/x86/entry/calling.h  |  9 +++++++++
>  arch/x86/entry/entry_64.S | 28 ++++++++++++++++++++++------
>  2 files changed, 31 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h
> index 05ed3d393da7..0a2c73fe2cfc 100644
> --- a/arch/x86/entry/calling.h
> +++ b/arch/x86/entry/calling.h
> @@ -147,6 +147,15 @@ For 32-bit we have the following conventions - kernel is 
> built with
>       movq 5*8+\offset(%rsp), %rbx
>       .endm
>  
> +     .macro POP_EXTRA_REGS
> +     popq %r15
> +     popq %r14
> +     popq %r13
> +     popq %r12
> +     popq %rbp
> +     popq %rbx
> +     .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 2cd01ed9cd59..7f1a83b17b4a 100644
> --- a/arch/x86/entry/entry_64.S
> +++ b/arch/x86/entry/entry_64.S
> @@ -521,9 +521,17 @@ GLOBAL(retint_user)
>  
>  GLOBAL(swapgs_restore_regs_and_return_to_usermode)
>       SWAPGS
> -     RESTORE_EXTRA_REGS
> -     RESTORE_C_REGS
> -     REMOVE_PT_GPREGS_FROM_STACK 8
> +     POP_EXTRA_REGS
> +     popq    %r11
> +     popq    %r10
> +     popq    %r9
> +     popq    %r8
> +     popq    %rax
> +     popq    %rcx
> +     popq    %rdx
> +     popq    %rsi
> +     popq    %rdi
> +     addq    $8, %rsp
>       INTERRUPT_RETURN
>  
>  
> @@ -546,9 +554,17 @@ retint_kernel:
>       TRACE_IRQS_IRETQ
>  
>  GLOBAL(restore_regs_and_return_to_kernel)
> -     RESTORE_EXTRA_REGS
> -     RESTORE_C_REGS
> -     REMOVE_PT_GPREGS_FROM_STACK 8
> +     POP_EXTRA_REGS
> +     popq    %r11
> +     popq    %r10
> +     popq    %r9
> +     popq    %r8
> +     popq    %rax
> +     popq    %rcx
> +     popq    %rdx
> +     popq    %rsi
> +     popq    %rdi
> +     addq    $8, %rsp
>       INTERRUPT_RETURN

Any reason why these aren't in a POP_C_REGS macro?  I think that would
make it easier to verify correctness when reading the code.

-- 
Josh

Reply via email to