From: Andy Lutomirski <luto@kernel.org>
To: X86 ML <x86@kernel.org>
Cc: Borislav Petkov <bpetkov@suse.de>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Brian Gerst <brgerst@gmail.com>,
Dave Hansen <dave.hansen@intel.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Andy Lutomirski <luto@kernel.org>
Subject: [PATCH 03/18] x86/asm/64: Move SWAPGS into the common iret-to-usermode path
Date: Thu, 26 Oct 2017 01:26:35 -0700 [thread overview]
Message-ID: <bde55d05e79031dfd2a5dd40e1c02e35f090b5d4.1509006199.git.luto@kernel.org> (raw)
In-Reply-To: <cover.1509006199.git.luto@kernel.org>
In-Reply-To: <cover.1509006199.git.luto@kernel.org>
All of the code paths that ended up doing IRET to usermode did
SWAPGS immediately beforehand. Move the SWAPGS into the common
code.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
arch/x86/entry/entry_64.S | 26 ++++++++++----------------
arch/x86/entry/entry_64_compat.S | 3 +--
2 files changed, 11 insertions(+), 18 deletions(-)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 493e5e234d36..1909a4e42b81 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -254,7 +254,7 @@ return_from_SYSCALL_64:
movq RCX(%rsp), %rcx
movq RIP(%rsp), %r11
cmpq %rcx, %r11 /* RCX == RIP */
- jne opportunistic_sysret_failed
+ jne swapgs_restore_regs_and_return_to_usermode
/*
* On Intel CPUs, SYSRET with non-canonical RCX/RIP will #GP
@@ -272,14 +272,14 @@ return_from_SYSCALL_64:
/* If this changed %rcx, it was not canonical */
cmpq %rcx, %r11
- jne opportunistic_sysret_failed
+ jne swapgs_restore_regs_and_return_to_usermode
cmpq $__USER_CS, CS(%rsp) /* CS must match SYSRET */
- jne opportunistic_sysret_failed
+ jne swapgs_restore_regs_and_return_to_usermode
movq R11(%rsp), %r11
cmpq %r11, EFLAGS(%rsp) /* R11 == RFLAGS */
- jne opportunistic_sysret_failed
+ jne swapgs_restore_regs_and_return_to_usermode
/*
* SYSCALL clears RF when it saves RFLAGS in R11 and SYSRET cannot
@@ -300,12 +300,12 @@ return_from_SYSCALL_64:
* would never get past 'stuck_here'.
*/
testq $(X86_EFLAGS_RF|X86_EFLAGS_TF), %r11
- jnz opportunistic_sysret_failed
+ jnz swapgs_restore_regs_and_return_to_usermode
/* nothing to check for RSP */
cmpq $__USER_DS, SS(%rsp) /* SS must match SYSRET */
- jne opportunistic_sysret_failed
+ jne swapgs_restore_regs_and_return_to_usermode
/*
* We win! This label is here just for ease of understanding
@@ -318,10 +318,6 @@ syscall_return_via_sysret:
movq RSP(%rsp), %rsp
UNWIND_HINT_EMPTY
USERGS_SYSRET64
-
-opportunistic_sysret_failed:
- SWAPGS
- jmp restore_regs_and_return_to_usermode
END(entry_SYSCALL_64)
ENTRY(stub_ptregs_64)
@@ -422,8 +418,7 @@ ENTRY(ret_from_fork)
movq %rsp, %rdi
call syscall_return_slowpath /* returns with IRQs disabled */
TRACE_IRQS_ON /* user mode is traced as IRQS on */
- SWAPGS
- jmp restore_regs_and_return_to_usermode
+ jmp swapgs_restore_regs_and_return_to_usermode
1:
/* kernel thread */
@@ -611,15 +606,15 @@ GLOBAL(retint_user)
mov %rsp,%rdi
call prepare_exit_to_usermode
TRACE_IRQS_IRETQ
- SWAPGS
-GLOBAL(restore_regs_and_return_to_usermode)
+GLOBAL(swapgs_restore_regs_and_return_to_usermode)
#ifdef CONFIG_DEBUG_ENTRY
testl $3, CS(%rsp)
jnz 1f
ud2
1:
#endif
+ SWAPGS
RESTORE_EXTRA_REGS
RESTORE_C_REGS
REMOVE_PT_GPREGS_FROM_STACK 8
@@ -1340,8 +1335,7 @@ ENTRY(nmi)
* Return back to user mode. We must *not* do the normal exit
* work, because we don't want to enable interrupts.
*/
- SWAPGS
- jmp restore_regs_and_return_to_usermode
+ jmp swapgs_restore_regs_and_return_to_usermode
.Lnmi_from_kernel:
/*
diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
index 9ca014a99968..932b96ce1b06 100644
--- a/arch/x86/entry/entry_64_compat.S
+++ b/arch/x86/entry/entry_64_compat.S
@@ -336,8 +336,7 @@ ENTRY(entry_INT80_compat)
/* Go back to user mode. */
TRACE_IRQS_ON
- SWAPGS
- jmp restore_regs_and_return_to_usermode
+ jmp swapgs_restore_regs_and_return_to_usermode
END(entry_INT80_compat)
ENTRY(stub32_clone)
--
2.13.6
next prev parent reply other threads:[~2017-10-26 8:27 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-26 8:26 [PATCH 00/18] Pile o' entry/exit/sp0 changes Andy Lutomirski
2017-10-26 8:26 ` [PATCH 01/18] x86/asm/64: Remove the restore_c_regs_and_iret label Andy Lutomirski
2017-10-26 15:07 ` Borislav Petkov
2017-11-10 6:08 ` [01/18] " kemi
2017-10-26 8:26 ` [PATCH 02/18] x86/asm/64: Split the iret-to-user and iret-to-kernel paths Andy Lutomirski
2017-10-27 18:05 ` Dave Hansen
2017-11-01 11:34 ` Andy Lutomirski
2017-10-27 20:04 ` Borislav Petkov
2017-11-01 11:32 ` Andy Lutomirski
2017-10-26 8:26 ` Andy Lutomirski [this message]
2017-10-26 13:52 ` [PATCH 03/18] x86/asm/64: Move SWAPGS into the common iret-to-usermode path Brian Gerst
2017-10-26 14:13 ` Dave Hansen
2017-10-26 14:28 ` Borislav Petkov
2017-10-27 15:44 ` Andy Lutomirski
2017-10-27 18:08 ` Dave Hansen
2017-10-26 8:26 ` [PATCH 04/18] x86/asm/64: Simplify reg restore code in the standard IRET paths Andy Lutomirski
2017-10-26 8:26 ` [PATCH 05/18] x86/asm/64: Shrink paranoid_exit_restore and make labels local Andy Lutomirski
2017-10-27 20:07 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 06/18] x86/asm/64: Use pop instead of movq in syscall_return_via_sysret Andy Lutomirski
2017-10-27 20:11 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 07/18] x86/asm/64: Merge the fast and slow SYSRET paths Andy Lutomirski
2017-10-27 20:11 ` Borislav Petkov
2017-11-01 11:29 ` Andy Lutomirski
2017-11-01 12:35 ` Borislav Petkov
2017-11-01 17:26 ` Thomas Gleixner
2017-11-01 17:25 ` Brian Gerst
2017-11-01 20:35 ` Andy Lutomirski
2017-10-26 8:26 ` [PATCH 08/18] xen: add xen nmi trap entry Andy Lutomirski
2017-10-26 8:26 ` [PATCH 09/18] x86/asm/64: De-Xen-ify our NMI code Andy Lutomirski
2017-10-26 8:41 ` Juergen Gross
2017-10-27 20:11 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 10/18] x86/asm/32: Pull MSR_IA32_SYSENTER_CS update code out of native_load_sp0() Andy Lutomirski
2017-10-26 18:00 ` Brian Gerst
2017-10-27 13:51 ` Thomas Gleixner
2017-10-27 15:50 ` Andy Lutomirski
2017-10-27 20:11 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 11/18] x86/asm/64: Pass sp0 directly to load_sp0() Andy Lutomirski
2017-10-27 20:12 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 12/18] x86/asm: Add task_top_of_stack() to find the top of a task's stack Andy Lutomirski
2017-10-26 8:26 ` [PATCH 13/18] x86/xen/64: Clean up SP code in cpu_initialize_context() Andy Lutomirski
2017-10-26 8:43 ` Juergen Gross
2017-10-26 8:26 ` [PATCH 14/18] x86/boot/64: Stop initializing TSS.sp0 at boot Andy Lutomirski
2017-10-27 18:21 ` Dave Hansen
2017-10-28 8:10 ` Andy Lutomirski
2017-10-26 8:26 ` [PATCH 15/18] x86/asm/64: Remove all remaining direct thread_struct::sp0 reads Andy Lutomirski
2017-11-01 10:08 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 16/18] x86/boot/32: Fix cpu_current_top_of_stack initialization at boot Andy Lutomirski
2017-11-01 10:18 ` Borislav Petkov
2017-10-26 8:26 ` [PATCH 17/18] x86/asm/64: Remove thread_struct::sp0 Andy Lutomirski
2017-10-28 0:52 ` Brian Gerst
2017-11-01 10:23 ` Borislav Petkov
2017-11-01 10:40 ` Andy Lutomirski
2017-10-26 8:26 ` [PATCH 18/18] x86/traps: Use a new on_thread_stack() helper to clean up an assertion Andy Lutomirski
2017-11-01 10:31 ` Borislav Petkov
2017-11-01 10:45 ` Andy Lutomirski
2017-10-26 15:55 ` [PATCH 00/18] Pile o' entry/exit/sp0 changes Linus Torvalds
2017-10-28 7:31 ` Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bde55d05e79031dfd2a5dd40e1c02e35f090b5d4.1509006199.git.luto@kernel.org \
--to=luto@kernel.org \
--cc=bpetkov@suse.de \
--cc=brgerst@gmail.com \
--cc=dave.hansen@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome