Re: [PATCH 07/18] x86/asm/64: Merge the fast and slow SYSRET paths

Andy Lutomirski
2017-11-01T11:29:44Z

On Fri, Oct 27, 2017 at 1:11 PM, Borislav Petkov <bp@suse.de> wrote:
> On Thu, Oct 26, 2017 at 01:26:39AM -0700, Andy Lutomirski wrote:
>> They did almost the same thing. Remove a bunch of pointless
>> instructions (mostly hidden in macros) and reduce cognitive load by
>> merging them.
>>
>> Signed-off-by: Andy Lutomirski <luto@kernel.org>
>> ---
>> arch/x86/entry/entry_64.S | 6 +++---
>> 1 file changed, 3 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
>> index 9dafafa3e0ec..c855ee91a3a5 100644
>> --- a/arch/x86/entry/entry_64.S
>> +++ b/arch/x86/entry/entry_64.S
>> @@ -220,10 +220,9 @@ entry_SYSCALL_64_fastpath:
>> TRACE_IRQS_ON /* user mode is traced as IRQs on */
>> movq RIP(%rsp), %rcx
>> movq EFLAGS(%rsp), %r11
>> - RESTORE_C_REGS_EXCEPT_RCX_R11
>> - movq RSP(%rsp), %rsp
>> + addq $6*8, %rsp /* skip extra regs -- they were preserved */
>> UNWIND_HINT_EMPTY
>> - USERGS_SYSRET64
>> + jmp .Lpop_c_regs_except_rcx_r11_and_sysret
>>
>> 1:
>> /*
>> @@ -315,6 +314,7 @@ syscall_return_via_sysret:
>> /* rcx and r11 are already restored (see code above) */
>> UNWIND_HINT_EMPTY
>> POP_EXTRA_REGS
>> +.Lpop_c_regs_except_rcx_r11_and_sysret:
>
> .Lpop_regs_sysret I guess.
>

I'm inclined to leave it. I first wrote it without the long name and
then I had to re-read the code to make sure I got the register state
right. The long name serves as documentation that we need rcx and r11
to have special contents. There's only one place that jumps there and
it's in the same function.