From: tip-bot for Andy Lutomirski <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: brgerst@gmail.com, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, bpetkov@suse.de,
tglx@linutronix.de, mingo@kernel.org, luto@kernel.org,
hpa@zytor.com, dave.hansen@intel.com, peterz@infradead.org
Subject: [tip:x86/asm] x86/entry/32: Pull the MSR_IA32_SYSENTER_CS update code out of native_load_sp0()
Date: Thu, 2 Nov 2017 03:53:35 -0700 [thread overview]
Message-ID: <tip-bd7dc5a6afac719d8ce4092391eef2c7e83c2a75@git.kernel.org> (raw)
In-Reply-To: <75cf09fe03ae778532d0ca6c65aa58e66bc2f90c.1509609304.git.luto@kernel.org>
Commit-ID: bd7dc5a6afac719d8ce4092391eef2c7e83c2a75
Gitweb: https://git.kernel.org/tip/bd7dc5a6afac719d8ce4092391eef2c7e83c2a75
Author: Andy Lutomirski <luto@kernel.org>
AuthorDate: Thu, 2 Nov 2017 00:59:09 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Thu, 2 Nov 2017 11:04:43 +0100
x86/entry/32: Pull the MSR_IA32_SYSENTER_CS update code out of native_load_sp0()
This causes the MSR_IA32_SYSENTER_CS write to move out of the
paravirt callback. This shouldn't affect Xen PV: Xen already ignores
MSR_IA32_SYSENTER_ESP writes. In any event, Xen doesn't support
vm86() in a useful way.
Note to any potential backporters: This patch won't break lguest, as
lguest didn't have any SYSENTER support at all.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bpetkov@suse.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/75cf09fe03ae778532d0ca6c65aa58e66bc2f90c.1509609304.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
arch/x86/include/asm/processor.h | 7 -------
arch/x86/include/asm/switch_to.h | 12 ++++++++++++
arch/x86/kernel/process_32.c | 4 +++-
arch/x86/kernel/process_64.c | 2 +-
arch/x86/kernel/vm86_32.c | 6 +++++-
5 files changed, 21 insertions(+), 10 deletions(-)
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index b390ff7..0167e3e 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -520,13 +520,6 @@ static inline void
native_load_sp0(struct tss_struct *tss, struct thread_struct *thread)
{
tss->x86_tss.sp0 = thread->sp0;
-#ifdef CONFIG_X86_32
- /* Only happens when SEP is enabled, no need to test "SEP"arately: */
- if (unlikely(tss->x86_tss.ss1 != thread->sysenter_cs)) {
- tss->x86_tss.ss1 = thread->sysenter_cs;
- wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
- }
-#endif
}
static inline void native_swapgs(void)
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index fcc5cd3..7ae8caf 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -72,4 +72,16 @@ do { \
((last) = __switch_to_asm((prev), (next))); \
} while (0)
+#ifdef CONFIG_X86_32
+static inline void refresh_sysenter_cs(struct thread_struct *thread)
+{
+ /* Only happens when SEP is enabled, no need to test "SEP"arately: */
+ if (unlikely(this_cpu_read(cpu_tss.x86_tss.ss1) == thread->sysenter_cs))
+ return;
+
+ this_cpu_write(cpu_tss.x86_tss.ss1, thread->sysenter_cs);
+ wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
+}
+#endif
+
#endif /* _ASM_X86_SWITCH_TO_H */
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index 1196625..0936ed3 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -284,9 +284,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
/*
* Reload esp0 and cpu_current_top_of_stack. This changes
- * current_thread_info().
+ * current_thread_info(). Refresh the SYSENTER configuration in
+ * case prev or next is vm86.
*/
load_sp0(tss, next);
+ refresh_sysenter_cs(next);
this_cpu_write(cpu_current_top_of_stack,
(unsigned long)task_stack_page(next_p) +
THREAD_SIZE);
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 302e7b2..a6ff6d1 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -464,7 +464,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
*/
this_cpu_write(current_task, next_p);
- /* Reload esp0 and ss1. This changes current_thread_info(). */
+ /* Reload sp0. */
load_sp0(tss, next);
/*
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c
index 7924a53..5bc1c3a 100644
--- a/arch/x86/kernel/vm86_32.c
+++ b/arch/x86/kernel/vm86_32.c
@@ -54,6 +54,7 @@
#include <asm/irq.h>
#include <asm/traps.h>
#include <asm/vm86.h>
+#include <asm/switch_to.h>
/*
* Known problems:
@@ -149,6 +150,7 @@ void save_v86_state(struct kernel_vm86_regs *regs, int retval)
tsk->thread.sp0 = vm86->saved_sp0;
tsk->thread.sysenter_cs = __KERNEL_CS;
load_sp0(tss, &tsk->thread);
+ refresh_sysenter_cs(&tsk->thread);
vm86->saved_sp0 = 0;
put_cpu();
@@ -368,8 +370,10 @@ static long do_sys_vm86(struct vm86plus_struct __user *user_vm86, bool plus)
/* make room for real-mode segments */
tsk->thread.sp0 += 16;
- if (static_cpu_has(X86_FEATURE_SEP))
+ if (static_cpu_has(X86_FEATURE_SEP)) {
tsk->thread.sysenter_cs = 0;
+ refresh_sysenter_cs(&tsk->thread);
+ }
load_sp0(tss, &tsk->thread);
put_cpu();
next prev parent reply other threads:[~2017-11-02 10:58 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-02 7:58 [PATCH v2 00/20] Pile o' entry/exit/sp0 changes Andy Lutomirski
2017-11-02 7:58 ` [PATCH v2 01/20] x86/asm/64: Remove the restore_c_regs_and_iret label Andy Lutomirski
2017-11-02 10:49 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:58 ` [PATCH v2 02/20] x86/asm/64: Split the iret-to-user and iret-to-kernel paths Andy Lutomirski
2017-11-02 10:49 ` [tip:x86/asm] x86/entry/64: Split the IRET-to-user and IRET-to-kernel paths tip-bot for Andy Lutomirski
2017-11-02 10:50 ` [PATCH v2 02/20] x86/asm/64: Split the iret-to-user and iret-to-kernel paths Borislav Petkov
2017-11-02 12:09 ` [PATCH] x86/entry/64: Shorten TEST instructions Borislav Petkov
2017-11-02 12:48 ` [tip:x86/asm] " tip-bot for Borislav Petkov
2017-11-02 7:59 ` [PATCH v2 03/20] x86/asm/64: Move SWAPGS into the common iret-to-usermode path Andy Lutomirski
2017-11-02 10:49 ` [tip:x86/asm] x86/entry/64: Move SWAPGS into the common IRET-to-usermode path tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 04/20] x86/asm/64: Simplify reg restore code in the standard IRET paths Andy Lutomirski
2017-11-02 10:50 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 05/20] x86/asm/64: Shrink paranoid_exit_restore and make labels local Andy Lutomirski
2017-11-02 10:50 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 06/20] x86/asm/64: Use pop instead of movq in syscall_return_via_sysret Andy Lutomirski
2017-11-02 10:51 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 07/20] x86/asm/64: Merge the fast and slow SYSRET paths Andy Lutomirski
2017-11-02 10:51 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 08/20] x86/entry/64: Use POP instead of MOV to restore regs on NMI return Andy Lutomirski
2017-11-02 10:51 ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 09/20] x86/entry/64: Remove the RESTORE_..._REGS infrastructure Andy Lutomirski
2017-11-02 10:52 ` [tip:x86/asm] " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 10/20] xen: add xen nmi trap entry Andy Lutomirski
2017-11-02 10:52 ` [tip:x86/asm] xen, x86/entry/64: Add xen NMI " tip-bot for Juergen Gross
2017-11-02 7:59 ` [PATCH v2 11/20] x86/asm/64: De-Xen-ify our NMI code Andy Lutomirski
2017-11-02 10:53 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 12/20] x86/asm/32: Pull MSR_IA32_SYSENTER_CS update code out of native_load_sp0() Andy Lutomirski
2017-11-02 10:53 ` tip-bot for Andy Lutomirski [this message]
2017-11-02 7:59 ` [PATCH v2 13/20] x86/asm/64: Pass sp0 directly to load_sp0() Andy Lutomirski
2017-11-02 9:48 ` Ingo Molnar
2017-11-02 9:53 ` Ingo Molnar
2017-11-02 10:32 ` Andy Lutomirski
2017-11-02 10:53 ` [tip:x86/asm] x86/entry/64: Pass SP0 " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 14/20] x86/asm: Add task_top_of_stack() to find the top of a task's stack Andy Lutomirski
2017-11-02 10:54 ` [tip:x86/asm] x86/entry: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 15/20] x86/xen/64: Clean up SP code in cpu_initialize_context() Andy Lutomirski
2017-11-02 9:56 ` Juergen Gross
2017-11-02 10:54 ` [tip:x86/asm] x86/xen/64, x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 16/20] x86/boot/64: Stop initializing TSS.sp0 at boot Andy Lutomirski
2017-11-02 10:55 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 17/20] x86/asm/64: Remove all remaining direct thread_struct::sp0 reads Andy Lutomirski
2017-11-02 10:55 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 18/20] x86/boot/32: Fix cpu_current_top_of_stack initialization at boot Andy Lutomirski
2017-11-02 10:56 ` [tip:x86/asm] x86/entry/32: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 19/20] x86/asm/64: Remove thread_struct::sp0 Andy Lutomirski
2017-11-02 10:56 ` [tip:x86/asm] x86/entry/64: " tip-bot for Andy Lutomirski
2017-11-02 7:59 ` [PATCH v2 20/20] x86/traps: Use a new on_thread_stack() helper to clean up an assertion Andy Lutomirski
2017-11-02 10:56 ` [tip:x86/asm] " tip-bot for 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=tip-bd7dc5a6afac719d8ce4092391eef2c7e83c2a75@git.kernel.org \
--to=tipbot@zytor.com \
--cc=bpetkov@suse.de \
--cc=brgerst@gmail.com \
--cc=dave.hansen@intel.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@kernel.org \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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;
as well as URLs for NNTP newsgroup(s).