Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andy Lutomirski and committed by
Ingo Molnar
dfa9a942 2deb4be2

+10 -9
+3 -3
arch/x86/entry/vsyscall/vsyscall_64.c
··· 221 221 * With a real vsyscall, page faults cause SIGSEGV. We want to 222 222 * preserve that behavior to make writing exploits harder. 223 223 */ 224 - prev_sig_on_uaccess_error = current_thread_info()->sig_on_uaccess_error; 225 - current_thread_info()->sig_on_uaccess_error = 1; 224 + prev_sig_on_uaccess_error = current->thread.sig_on_uaccess_error; 225 + current->thread.sig_on_uaccess_error = 1; 226 226 227 227 ret = -EFAULT; 228 228 switch (vsyscall_nr) { ··· 243 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 248 check_fault: 249 249 if (ret == -EFAULT) {
+3
arch/x86/include/asm/processor.h
··· 419 419 /* Max allowed port in the bitmap, in bytes: */ 420 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 425 /* Floating point and extended processor state */ 423 426 struct fpu fpu; 424 427 /*
-2
arch/x86/include/asm/thread_info.h
··· 58 58 __u32 status; /* thread synchronous flags */ 59 59 __u32 cpu; /* current CPU */ 60 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 63 #define INIT_THREAD_INFO(tsk) \
+2 -2
arch/x86/include/asm/uaccess.h
··· 487 487 * uaccess_try and catch 488 488 */ 489 489 #define uaccess_try do { \ 490 - current_thread_info()->uaccess_err = 0; \ 490 + current->thread.uaccess_err = 0; \ 491 491 __uaccess_begin(); \ 492 492 barrier(); 493 493 494 494 #define uaccess_catch(err) \ 495 495 __uaccess_end(); \ 496 - (err) |= (current_thread_info()->uaccess_err ? -EFAULT : 0); \ 496 + (err) |= (current->thread.uaccess_err ? -EFAULT : 0); \ 497 497 } while (0) 498 498 499 499 /**
+1 -1
arch/x86/mm/extable.c
··· 37 37 struct pt_regs *regs, int trapnr) 38 38 { 39 39 /* Special hack for uaccess_err */ 40 - current_thread_info()->uaccess_err = 1; 40 + current->thread.uaccess_err = 1; 41 41 regs->ip = ex_fixup_addr(fixup); 42 42 return true; 43 43 }
+1 -1
arch/x86/mm/fault.c
··· 737 737 * In this case we need to make sure we're not recursively 738 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 741 tsk->thread.trap_nr = X86_TRAP_PF; 742 742 tsk->thread.error_code = error_code | PF_USER; 743 743 tsk->thread.cr2 = address;