[PATCH 2/3] x86/entry/64: Fix fast-path syscall return register state

From: Andy Lutomirski
Date: Sun Jan 31 2016 - 12:34:25 EST


I was fishing RIP (i.e. RCX) out of pt_regs->cx and RFLAGS (i.e. R11)
out of pt_regs->r11. While it usually worked (pt_regs started out
with cx == ip and r11 == flags), it was very fragile. In particular,
it broke iopl because iopl forgot to mark itself as using ptregs.

Undo that part of the syscall rework. There was no compelling
reason to do it this way. While I'm at it, load RCX and R11 before
the other regs to be a little friendlier to the CPU, as they will be
the first of the reloaded registers to be used.

Fixes: 1e423bff959e x86/entry/64: ("Migrate the 64-bit syscall slow path to C")
Signed-off-by: Andy Lutomirski <luto@xxxxxxxxxx>
---
arch/x86/entry/entry_64.S | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 9f7bb808035e..70eadb0ea5fa 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -212,7 +212,9 @@ entry_SYSCALL_64_fastpath:

LOCKDEP_SYS_EXIT
TRACE_IRQS_ON /* user mode is traced as IRQs on */
- RESTORE_C_REGS
+ movq RIP(%rsp), %rcx
+ movq EFLAGS(%rsp), %r11
+ RESTORE_C_REGS_EXCEPT_RCX_R11
movq RSP(%rsp), %rsp
USERGS_SYSRET64

--
2.5.0