Messages in this thread | | | Date | Tue, 12 Sep 2017 15:05:45 -0500 | From | Josh Poimboeuf <> | Subject | Re: [RFC 04/17] x86/asm/64: Simplify reg restore code in the standard IRET paths |
| |
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 <luto@kernel.org> > --- > 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
| |