diff options
author | Andy Lutomirski <luto@kernel.org> | 2016-07-14 16:22:56 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-07-15 04:26:28 -0400 |
commit | dfa9a942fd7951c8f333cf3f377dde51ebd21685 (patch) | |
tree | 32640327703e2908e9bd782c19a04f698718c5a5 | |
parent | 2deb4be28077638591fe5fc593b7f8aabc140f42 (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.c | 6 | ||||
-rw-r--r-- | arch/x86/include/asm/processor.h | 3 | ||||
-rw-r--r-- | arch/x86/include/asm/thread_info.h | 2 | ||||
-rw-r--r-- | arch/x86/include/asm/uaccess.h | 4 | ||||
-rw-r--r-- | arch/x86/mm/extable.c | 2 | ||||
-rw-r--r-- | arch/x86/mm/fault.c | 2 |
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 | ||
248 | check_fault: | 248 | check_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; |