aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2016-07-14 16:22:56 -0400
committerIngo Molnar <mingo@kernel.org>2016-07-15 04:26:28 -0400
commitdfa9a942fd7951c8f333cf3f377dde51ebd21685 (patch)
tree32640327703e2908e9bd782c19a04f698718c5a5
parent2deb4be28077638591fe5fc593b7f8aabc140f42 (diff)
x86/uaccess: Move thread_info::uaccess_err and thread_info::sig_on_uaccess_err to thread_struct
struct thread_info is a legacy mess. To prepare for its partial removal, move the uaccess control fields out -- they're straightforward. Signed-off-by: Andy Lutomirski <luto@kernel.org> 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: Josh Poimboeuf <jpoimboe@redhat.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/d0ac4d01c8e4d4d756264604e47445d5acc7900e.1468527351.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/entry/vsyscall/vsyscall_64.c6
-rw-r--r--arch/x86/include/asm/processor.h3
-rw-r--r--arch/x86/include/asm/thread_info.h2
-rw-r--r--arch/x86/include/asm/uaccess.h4
-rw-r--r--arch/x86/mm/extable.c2
-rw-r--r--arch/x86/mm/fault.c2
6 files changed, 10 insertions, 9 deletions
diff --git a/arch/x86/entry/vsyscall/vsyscall_64.c b/arch/x86/entry/vsyscall/vsyscall_64.c
index 174c2549939d..3aba2b043050 100644
--- a/arch/x86/entry/vsyscall/vsyscall_64.c
+++ b/arch/x86/entry/vsyscall/vsyscall_64.c
@@ -221,8 +221,8 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
221 * With a real vsyscall, page faults cause SIGSEGV. We want to 221 * With a real vsyscall, page faults cause SIGSEGV. We want to
222 * preserve that behavior to make writing exploits harder. 222 * preserve that behavior to make writing exploits harder.
223 */ 223 */
224 prev_sig_on_uaccess_error = current_thread_info()->sig_on_uaccess_error; 224 prev_sig_on_uaccess_error = current->thread.sig_on_uaccess_error;
225 current_thread_info()->sig_on_uaccess_error = 1; 225 current->thread.sig_on_uaccess_error = 1;
226 226
227 ret = -EFAULT; 227 ret = -EFAULT;
228 switch (vsyscall_nr) { 228 switch (vsyscall_nr) {
@@ -243,7 +243,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
243 break; 243 break;
244 } 244 }
245 245
246 current_thread_info()->sig_on_uaccess_error = prev_sig_on_uaccess_error; 246 current->thread.sig_on_uaccess_error = prev_sig_on_uaccess_error;
247 247
248check_fault: 248check_fault:
249 if (ret == -EFAULT) { 249 if (ret == -EFAULT) {
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 62c6cc3cc5d3..f53ae57bd985 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -419,6 +419,9 @@ struct thread_struct {
419 /* Max allowed port in the bitmap, in bytes: */ 419 /* Max allowed port in the bitmap, in bytes: */
420 unsigned io_bitmap_max; 420 unsigned io_bitmap_max;
421 421
422 unsigned int sig_on_uaccess_error:1;
423 unsigned int uaccess_err:1; /* uaccess failed */
424
422 /* Floating point and extended processor state */ 425 /* Floating point and extended processor state */
423 struct fpu fpu; 426 struct fpu fpu;
424 /* 427 /*
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
index 30c133ac05cd..7c47bb659ecd 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -58,8 +58,6 @@ struct thread_info {
58 __u32 status; /* thread synchronous flags */ 58 __u32 status; /* thread synchronous flags */
59 __u32 cpu; /* current CPU */ 59 __u32 cpu; /* current CPU */
60 mm_segment_t addr_limit; 60 mm_segment_t addr_limit;
61 unsigned int sig_on_uaccess_error:1;
62 unsigned int uaccess_err:1; /* uaccess failed */
63}; 61};
64 62
65#define INIT_THREAD_INFO(tsk) \ 63#define INIT_THREAD_INFO(tsk) \
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index d40ec723f799..8f66e5655c23 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -487,13 +487,13 @@ struct __large_struct { unsigned long buf[100]; };
487 * uaccess_try and catch 487 * uaccess_try and catch
488 */ 488 */
489#define uaccess_try do { \ 489#define uaccess_try do { \
490 current_thread_info()->uaccess_err = 0; \ 490 current->thread.uaccess_err = 0; \
491 __uaccess_begin(); \ 491 __uaccess_begin(); \
492 barrier(); 492 barrier();
493 493
494#define uaccess_catch(err) \ 494#define uaccess_catch(err) \
495 __uaccess_end(); \ 495 __uaccess_end(); \
496 (err) |= (current_thread_info()->uaccess_err ? -EFAULT : 0); \ 496 (err) |= (current->thread.uaccess_err ? -EFAULT : 0); \
497} while (0) 497} while (0)
498 498
499/** 499/**
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 4bb53b89f3c5..0f90cc218d04 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -37,7 +37,7 @@ bool ex_handler_ext(const struct exception_table_entry *fixup,
37 struct pt_regs *regs, int trapnr) 37 struct pt_regs *regs, int trapnr)
38{ 38{
39 /* Special hack for uaccess_err */ 39 /* Special hack for uaccess_err */
40 current_thread_info()->uaccess_err = 1; 40 current->thread.uaccess_err = 1;
41 regs->ip = ex_fixup_addr(fixup); 41 regs->ip = ex_fixup_addr(fixup);
42 return true; 42 return true;
43} 43}
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index ca44e2e7fd00..69be03d4aca6 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -737,7 +737,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
737 * In this case we need to make sure we're not recursively 737 * In this case we need to make sure we're not recursively
738 * faulting through the emulate_vsyscall() logic. 738 * faulting through the emulate_vsyscall() logic.
739 */ 739 */
740 if (current_thread_info()->sig_on_uaccess_error && signal) { 740 if (current->thread.sig_on_uaccess_error && signal) {
741 tsk->thread.trap_nr = X86_TRAP_PF; 741 tsk->thread.trap_nr = X86_TRAP_PF;
742 tsk->thread.error_code = error_code | PF_USER; 742 tsk->thread.error_code = error_code | PF_USER;
743 tsk->thread.cr2 = address; 743 tsk->thread.cr2 = address;