diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2015-03-09 14:39:23 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2015-03-10 08:56:10 -0400 |
commit | 263042e4630a85e856b4a8cd72f28dab33ef4741 (patch) | |
tree | 268f16dc93d2f111ffd484300042df3bb089e050 /arch/x86/include | |
parent | 616ab249f1e42f6135642183529f910fcedc2642 (diff) |
x86/asm/entry/64: Save user RSP in pt_regs->sp on SYSCALL64 fastpath
Prepare for the removal of 'usersp', by simplifying PER_CPU(old_rsp) usage:
- use it only as temp storage
- store the userspace stack pointer immediately in pt_regs->sp
on syscall entry, instead of using it later, on syscall exit.
- change C code to use pt_regs->sp only, instead of PER_CPU(old_rsp)
and task->thread.usersp.
FIXUP/RESTORE_TOP_OF_STACK are simplified as well.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Cc: Alexei Starovoitov <ast@plumgrid.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Will Drewry <wad@chromium.org>
Link: http://lkml.kernel.org/r/1425926364-9526-4-git-send-email-dvlasenk@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/compat.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/ptrace.h | 8 |
2 files changed, 3 insertions, 7 deletions
diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h index 59c6c401f79f..acdee09228b3 100644 --- a/arch/x86/include/asm/compat.h +++ b/arch/x86/include/asm/compat.h | |||
@@ -301,7 +301,7 @@ static inline void __user *arch_compat_alloc_user_space(long len) | |||
301 | sp = task_pt_regs(current)->sp; | 301 | sp = task_pt_regs(current)->sp; |
302 | } else { | 302 | } else { |
303 | /* -128 for the x32 ABI redzone */ | 303 | /* -128 for the x32 ABI redzone */ |
304 | sp = this_cpu_read(old_rsp) - 128; | 304 | sp = task_pt_regs(current)->sp - 128; |
305 | } | 305 | } |
306 | 306 | ||
307 | return (void __user *)round_down(sp - len, 16); | 307 | return (void __user *)round_down(sp - len, 16); |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 4077d963a1a0..74bb2e0f3030 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
@@ -145,12 +145,8 @@ static inline bool user_64bit_mode(struct pt_regs *regs) | |||
145 | #endif | 145 | #endif |
146 | } | 146 | } |
147 | 147 | ||
148 | #define current_user_stack_pointer() this_cpu_read(old_rsp) | 148 | #define current_user_stack_pointer() current_pt_regs()->sp |
149 | /* ia32 vs. x32 difference */ | 149 | #define compat_user_stack_pointer() current_pt_regs()->sp |
150 | #define compat_user_stack_pointer() \ | ||
151 | (test_thread_flag(TIF_IA32) \ | ||
152 | ? current_pt_regs()->sp \ | ||
153 | : this_cpu_read(old_rsp)) | ||
154 | #endif | 150 | #endif |
155 | 151 | ||
156 | #ifdef CONFIG_X86_32 | 152 | #ifdef CONFIG_X86_32 |