* [PATCH 0/3] Stuff for 4.2 (including a revert)
@ 2015-08-17 19:22 Andy Lutomirski
2015-08-17 19:22 ` [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" Andy Lutomirski
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Andy Lutomirski @ 2015-08-17 19:22 UTC (permalink / raw)
To: security, linux-kernel, x86; +Cc: Andy Lutomirski
Hi all-
Patch 1 is a revert, Cc'd to stable. I haven't tried to write a
real test for the bug, but the code definitely looks buggy. I
intent to fix it for real as part of converting more of the syscall
entry code to C, but this is a better fix for now.
Patch 2 fixes selftests fallout from the sigcontext revert.
Patch 3 is a new test that I thought I added but apparently didn't.
It's probably 4.3 material, but it's related to patch 1, so I'm
sending them together.
Andy Lutomirski (3):
Revert "sched/x86_64: Don't save flags on context switch"
selftests/x86: Disable sigreturn_64
selftests/x86: Add syscall_nt selftest
arch/x86/include/asm/switch_to.h | 12 +++----
tools/testing/selftests/x86/Makefile | 4 +--
tools/testing/selftests/x86/syscall_nt.c | 54 ++++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+), 10 deletions(-)
create mode 100644 tools/testing/selftests/x86/syscall_nt.c
--
2.4.3
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" 2015-08-17 19:22 [PATCH 0/3] Stuff for 4.2 (including a revert) Andy Lutomirski @ 2015-08-17 19:22 ` Andy Lutomirski 2015-08-19 7:09 ` [tip:x86/asm] Revert "sched/x86_64: Don' t " tip-bot for Andy Lutomirski 2015-08-17 19:22 ` [PATCH 2/3] selftests/x86: Disable sigreturn_64 Andy Lutomirski 2015-08-17 19:22 ` [PATCH 3/3] selftests/x86: Add syscall_nt selftest Andy Lutomirski 2 siblings, 1 reply; 7+ messages in thread From: Andy Lutomirski @ 2015-08-17 19:22 UTC (permalink / raw) To: security, linux-kernel, x86; +Cc: Andy Lutomirski This reverts commit 2c7577a7583747c9b71f26dced7f696b739da745. It was a nice speedup. It's also not quite correct: SYSENTER enables interrupts too early. We can re-add this optimization once the SYSENTER code is beaten into shape, which should happen in 4.3 or 4.4. Cc: stable@vger.kernel.org # v3.19 Signed-off-by: Andy Lutomirski <luto@kernel.org> --- arch/x86/include/asm/switch_to.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h index 751bf4b7bf11..d7f3b3b78ac3 100644 --- a/arch/x86/include/asm/switch_to.h +++ b/arch/x86/include/asm/switch_to.h @@ -79,12 +79,12 @@ do { \ #else /* CONFIG_X86_32 */ /* frame pointer must be last for get_wchan */ -#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t" -#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\t" +#define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t" +#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\t" #define __EXTRA_CLOBBER \ , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ - "r12", "r13", "r14", "r15", "flags" + "r12", "r13", "r14", "r15" #ifdef CONFIG_CC_STACKPROTECTOR #define __switch_canary \ @@ -100,11 +100,7 @@ do { \ #define __switch_canary_iparam #endif /* CC_STACKPROTECTOR */ -/* - * There is no need to save or restore flags, because flags are always - * clean in kernel mode, with the possible exception of IOPL. Kernel IOPL - * has no effect. - */ +/* Save restore flags to clear handle leaking NT */ #define switch_to(prev, next, last) \ asm volatile(SAVE_CONTEXT \ "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ -- 2.4.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:x86/asm] Revert "sched/x86_64: Don' t save flags on context switch" 2015-08-17 19:22 ` [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" Andy Lutomirski @ 2015-08-19 7:09 ` tip-bot for Andy Lutomirski 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for Andy Lutomirski @ 2015-08-19 7:09 UTC (permalink / raw) To: linux-tip-commits; +Cc: tglx, peterz, torvalds, luto, hpa, mingo, linux-kernel Commit-ID: 512255a2ad2c832ca7d4de9f31245f73781922d0 Gitweb: http://git.kernel.org/tip/512255a2ad2c832ca7d4de9f31245f73781922d0 Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Mon, 17 Aug 2015 12:22:50 -0700 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 18 Aug 2015 09:39:26 +0200 Revert "sched/x86_64: Don't save flags on context switch" This reverts commit: 2c7577a75837 ("sched/x86_64: Don't save flags on context switch") It was a nice speedup. It's also not quite correct: SYSENTER enables interrupts too early. We can re-add this optimization once the SYSENTER code is beaten into shape, which should happen in 4.3 or 4.4. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: stable@vger.kernel.org # v3.19 Link: http://lkml.kernel.org/r/85f56651f59f76624e80785a8fd3bdfdd089a818.1439838962.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/include/asm/switch_to.h | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h index 751bf4b..d7f3b3b 100644 --- a/arch/x86/include/asm/switch_to.h +++ b/arch/x86/include/asm/switch_to.h @@ -79,12 +79,12 @@ do { \ #else /* CONFIG_X86_32 */ /* frame pointer must be last for get_wchan */ -#define SAVE_CONTEXT "pushq %%rbp ; movq %%rsi,%%rbp\n\t" -#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp\t" +#define SAVE_CONTEXT "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t" +#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\t" #define __EXTRA_CLOBBER \ , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ - "r12", "r13", "r14", "r15", "flags" + "r12", "r13", "r14", "r15" #ifdef CONFIG_CC_STACKPROTECTOR #define __switch_canary \ @@ -100,11 +100,7 @@ do { \ #define __switch_canary_iparam #endif /* CC_STACKPROTECTOR */ -/* - * There is no need to save or restore flags, because flags are always - * clean in kernel mode, with the possible exception of IOPL. Kernel IOPL - * has no effect. - */ +/* Save restore flags to clear handle leaking NT */ #define switch_to(prev, next, last) \ asm volatile(SAVE_CONTEXT \ "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/3] selftests/x86: Disable sigreturn_64 2015-08-17 19:22 [PATCH 0/3] Stuff for 4.2 (including a revert) Andy Lutomirski 2015-08-17 19:22 ` [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" Andy Lutomirski @ 2015-08-17 19:22 ` Andy Lutomirski 2015-08-19 7:09 ` [tip:x86/asm] " tip-bot for Andy Lutomirski 2015-08-17 19:22 ` [PATCH 3/3] selftests/x86: Add syscall_nt selftest Andy Lutomirski 2 siblings, 1 reply; 7+ messages in thread From: Andy Lutomirski @ 2015-08-17 19:22 UTC (permalink / raw) To: security, linux-kernel, x86; +Cc: Andy Lutomirski sigreturn_64 was broken by ed596cde9425 ("Revert x86 sigcontext cleanups"). Turn it off until we have a better fix. Signed-off-by: Andy Lutomirski <luto@kernel.org> --- tools/testing/selftests/x86/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index caa60d56d7d1..1cda40be06ca 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -4,8 +4,8 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean -TARGETS_C_BOTHBITS := sigreturn single_step_syscall sysret_ss_attrs -TARGETS_C_32BIT_ONLY := entry_from_vm86 +TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs +TARGETS_C_32BIT_ONLY := entry_from_vm86 sigreturn TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32) -- 2.4.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:x86/asm] selftests/x86: Disable sigreturn_64 2015-08-17 19:22 ` [PATCH 2/3] selftests/x86: Disable sigreturn_64 Andy Lutomirski @ 2015-08-19 7:09 ` tip-bot for Andy Lutomirski 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for Andy Lutomirski @ 2015-08-19 7:09 UTC (permalink / raw) To: linux-tip-commits Cc: torvalds, dvlasenk, linux-kernel, luto, bp, brgerst, luto, tglx, hpa, mingo, shuahkh, peterz Commit-ID: 33f3df41d03879ab86c7f2d650e67b655e0b85c8 Gitweb: http://git.kernel.org/tip/33f3df41d03879ab86c7f2d650e67b655e0b85c8 Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Mon, 17 Aug 2015 12:22:51 -0700 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 18 Aug 2015 09:43:31 +0200 selftests/x86: Disable sigreturn_64 sigreturn_64 was broken by ed596cde9425 ("Revert x86 sigcontext cleanups"). Turn it off until we have a better fix. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Shuah Khan <shuahkh@osg.samsung.com> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/a184e75ff170a0bcd76bf376c41cad2c402fe9f7.1439838962.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- tools/testing/selftests/x86/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index b70da4a..986e7cb 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -4,8 +4,8 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean -TARGETS_C_BOTHBITS := sigreturn single_step_syscall sysret_ss_attrs ldt_gdt -TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault +TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs ldt_gdt +TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault sigreturn TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) BINARIES_32 := $(TARGETS_C_32BIT_ALL:%=%_32) ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] selftests/x86: Add syscall_nt selftest 2015-08-17 19:22 [PATCH 0/3] Stuff for 4.2 (including a revert) Andy Lutomirski 2015-08-17 19:22 ` [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" Andy Lutomirski 2015-08-17 19:22 ` [PATCH 2/3] selftests/x86: Disable sigreturn_64 Andy Lutomirski @ 2015-08-17 19:22 ` Andy Lutomirski 2015-08-19 7:10 ` [tip:x86/asm] " tip-bot for Andy Lutomirski 2 siblings, 1 reply; 7+ messages in thread From: Andy Lutomirski @ 2015-08-17 19:22 UTC (permalink / raw) To: security, linux-kernel, x86; +Cc: Andy Lutomirski I've had this sitting around for a while. Add it to the selftests tree. Far Cry running under Wine depends on this behavior. Signed-off-by: Andy Lutomirski <luto@kernel.org> --- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/syscall_nt.c | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/x86/syscall_nt.c diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index 1cda40be06ca..2221f2ba449d 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -4,7 +4,7 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean -TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs +TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt TARGETS_C_32BIT_ONLY := entry_from_vm86 sigreturn TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) diff --git a/tools/testing/selftests/x86/syscall_nt.c b/tools/testing/selftests/x86/syscall_nt.c new file mode 100644 index 000000000000..60c06af4646a --- /dev/null +++ b/tools/testing/selftests/x86/syscall_nt.c @@ -0,0 +1,54 @@ +/* + * syscall_nt.c - checks syscalls with NT set + * Copyright (c) 2014-2015 Andrew Lutomirski + * + * This program is free software; you can redistribute it and/or modify + * it under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Some obscure user-space code requires the ability to make system calls + * with FLAGS.NT set. Make sure it works. + */ + +#include <stdio.h> +#include <unistd.h> +#include <sys/syscall.h> +#include <asm/processor-flags.h> + +#ifdef __x86_64__ +# define WIDTH "q" +#else +# define WIDTH "l" +#endif + +static unsigned long get_eflags(void) +{ + unsigned long eflags; + asm volatile ("pushf" WIDTH "\n\tpop" WIDTH " %0" : "=rm" (eflags)); + return eflags; +} + +static void set_eflags(unsigned long eflags) +{ + asm volatile ("push" WIDTH " %0\n\tpopf" WIDTH + : : "rm" (eflags) : "flags"); +} + +int main() +{ + printf("[RUN]\tSet NT and issue a syscall\n"); + set_eflags(get_eflags() | X86_EFLAGS_NT); + syscall(SYS_getpid); + if (get_eflags() & X86_EFLAGS_NT) { + printf("[OK]\tThe syscall worked and NT is still set\n"); + return 0; + } else { + printf("[FAIL]\tThe syscall worked but NT was cleared\n"); + return 1; + } +} -- 2.4.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [tip:x86/asm] selftests/x86: Add syscall_nt selftest 2015-08-17 19:22 ` [PATCH 3/3] selftests/x86: Add syscall_nt selftest Andy Lutomirski @ 2015-08-19 7:10 ` tip-bot for Andy Lutomirski 0 siblings, 0 replies; 7+ messages in thread From: tip-bot for Andy Lutomirski @ 2015-08-19 7:10 UTC (permalink / raw) To: linux-tip-commits Cc: bp, shuahkh, tglx, luto, brgerst, dvlasenk, torvalds, linux-kernel, mingo, hpa, luto, peterz Commit-ID: a9c909ce8c7853b4fc16055c50eb50d91e20cb93 Gitweb: http://git.kernel.org/tip/a9c909ce8c7853b4fc16055c50eb50d91e20cb93 Author: Andy Lutomirski <luto@kernel.org> AuthorDate: Mon, 17 Aug 2015 12:22:52 -0700 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Tue, 18 Aug 2015 09:43:38 +0200 selftests/x86: Add syscall_nt selftest I've had this sitting around for a while. Add it to the selftests tree. Far Cry running under Wine depends on this behavior. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Shuah Khan <shuahkh@osg.samsung.com> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/ee4d63799a9e5294b70930618b71d04d2770eb2d.1439838962.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org> --- tools/testing/selftests/x86/Makefile | 2 +- tools/testing/selftests/x86/syscall_nt.c | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile index 986e7cb..29089b2 100644 --- a/tools/testing/selftests/x86/Makefile +++ b/tools/testing/selftests/x86/Makefile @@ -4,7 +4,7 @@ include ../lib.mk .PHONY: all all_32 all_64 warn_32bit_failure clean -TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs ldt_gdt +TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs ldt_gdt syscall_nt TARGETS_C_32BIT_ONLY := entry_from_vm86 syscall_arg_fault sigreturn TARGETS_C_32BIT_ALL := $(TARGETS_C_BOTHBITS) $(TARGETS_C_32BIT_ONLY) diff --git a/tools/testing/selftests/x86/syscall_nt.c b/tools/testing/selftests/x86/syscall_nt.c new file mode 100644 index 0000000..60c06af4 --- /dev/null +++ b/tools/testing/selftests/x86/syscall_nt.c @@ -0,0 +1,54 @@ +/* + * syscall_nt.c - checks syscalls with NT set + * Copyright (c) 2014-2015 Andrew Lutomirski + * + * This program is free software; you can redistribute it and/or modify + * it under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * Some obscure user-space code requires the ability to make system calls + * with FLAGS.NT set. Make sure it works. + */ + +#include <stdio.h> +#include <unistd.h> +#include <sys/syscall.h> +#include <asm/processor-flags.h> + +#ifdef __x86_64__ +# define WIDTH "q" +#else +# define WIDTH "l" +#endif + +static unsigned long get_eflags(void) +{ + unsigned long eflags; + asm volatile ("pushf" WIDTH "\n\tpop" WIDTH " %0" : "=rm" (eflags)); + return eflags; +} + +static void set_eflags(unsigned long eflags) +{ + asm volatile ("push" WIDTH " %0\n\tpopf" WIDTH + : : "rm" (eflags) : "flags"); +} + +int main() +{ + printf("[RUN]\tSet NT and issue a syscall\n"); + set_eflags(get_eflags() | X86_EFLAGS_NT); + syscall(SYS_getpid); + if (get_eflags() & X86_EFLAGS_NT) { + printf("[OK]\tThe syscall worked and NT is still set\n"); + return 0; + } else { + printf("[FAIL]\tThe syscall worked but NT was cleared\n"); + return 1; + } +} ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2015-08-19 7:11 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-08-17 19:22 [PATCH 0/3] Stuff for 4.2 (including a revert) Andy Lutomirski 2015-08-17 19:22 ` [PATCH 1/3] Revert "sched/x86_64: Don't save flags on context switch" Andy Lutomirski 2015-08-19 7:09 ` [tip:x86/asm] Revert "sched/x86_64: Don' t " tip-bot for Andy Lutomirski 2015-08-17 19:22 ` [PATCH 2/3] selftests/x86: Disable sigreturn_64 Andy Lutomirski 2015-08-19 7:09 ` [tip:x86/asm] " tip-bot for Andy Lutomirski 2015-08-17 19:22 ` [PATCH 3/3] selftests/x86: Add syscall_nt selftest Andy Lutomirski 2015-08-19 7:10 ` [tip:x86/asm] " tip-bot for Andy Lutomirski
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