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

Configure Feed

Select the types of activity you want to include in your feed.

x86: get rid of the insane TIF_ABI_PENDING bit

Now that the previous commit made it possible to do the personality
setting at the point of no return, we do just that for ELF binaries.
And suddenly all the reasons for that insane TIF_ABI_PENDING bit go
away, and we can just make SET_PERSONALITY() just do the obvious thing
for a 32-bit compat process.

Everything becomes much more straightforward this way.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: stable@kernel.org
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

H. Peter Anvin and committed by
Linus Torvalds
05d43ed8 221af7f8

+13 -23
-1
arch/x86/ia32/ia32_aout.c
··· 311 311 /* OK, This is the point of no return */ 312 312 set_personality(PER_LINUX); 313 313 set_thread_flag(TIF_IA32); 314 - clear_thread_flag(TIF_ABI_PENDING); 315 314 316 315 setup_new_exec(bprm); 317 316
+2 -8
arch/x86/include/asm/elf.h
··· 181 181 void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); 182 182 #define compat_start_thread start_thread_ia32 183 183 184 - #define COMPAT_SET_PERSONALITY(ex) \ 185 - do { \ 186 - if (test_thread_flag(TIF_IA32)) \ 187 - clear_thread_flag(TIF_ABI_PENDING); \ 188 - else \ 189 - set_thread_flag(TIF_ABI_PENDING); \ 190 - current->personality |= force_personality32; \ 191 - } while (0) 184 + void set_personality_ia32(void); 185 + #define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() 192 186 193 187 #define COMPAT_ELF_PLATFORM ("i686") 194 188
-2
arch/x86/include/asm/thread_info.h
··· 87 87 #define TIF_NOTSC 16 /* TSC is not accessible in userland */ 88 88 #define TIF_IA32 17 /* 32bit process */ 89 89 #define TIF_FORK 18 /* ret_from_fork */ 90 - #define TIF_ABI_PENDING 19 91 90 #define TIF_MEMDIE 20 92 91 #define TIF_DEBUG 21 /* uses debug registers */ 93 92 #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ ··· 111 112 #define _TIF_NOTSC (1 << TIF_NOTSC) 112 113 #define _TIF_IA32 (1 << TIF_IA32) 113 114 #define _TIF_FORK (1 << TIF_FORK) 114 - #define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) 115 115 #define _TIF_DEBUG (1 << TIF_DEBUG) 116 116 #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) 117 117 #define _TIF_FREEZE (1 << TIF_FREEZE)
-12
arch/x86/kernel/process.c
··· 115 115 { 116 116 struct task_struct *tsk = current; 117 117 118 - #ifdef CONFIG_X86_64 119 - if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) { 120 - clear_tsk_thread_flag(tsk, TIF_ABI_PENDING); 121 - if (test_tsk_thread_flag(tsk, TIF_IA32)) { 122 - clear_tsk_thread_flag(tsk, TIF_IA32); 123 - } else { 124 - set_tsk_thread_flag(tsk, TIF_IA32); 125 - current_thread_info()->status |= TS_COMPAT; 126 - } 127 - } 128 - #endif 129 - 130 118 flush_ptrace_hw_breakpoint(tsk); 131 119 memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); 132 120 /*
+11
arch/x86/kernel/process_64.c
··· 521 521 current->personality &= ~READ_IMPLIES_EXEC; 522 522 } 523 523 524 + void set_personality_ia32(void) 525 + { 526 + /* inherit personality from parent */ 527 + 528 + /* Make sure to be in 32bit mode */ 529 + set_thread_flag(TIF_IA32); 530 + 531 + /* Prepare the first "return" to user space */ 532 + current_thread_info()->status |= TS_COMPAT; 533 + } 534 + 524 535 unsigned long get_wchan(struct task_struct *p) 525 536 { 526 537 unsigned long stack;