diff options
| -rw-r--r-- | arch/x86/ia32/ia32_aout.c | 1 | ||||
| -rw-r--r-- | arch/x86/include/asm/elf.h | 10 | ||||
| -rw-r--r-- | arch/x86/include/asm/thread_info.h | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/process.c | 12 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 11 |
5 files changed, 13 insertions, 23 deletions
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index 435d2a5323da..f9f472462753 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -311,7 +311,6 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
| 311 | /* OK, This is the point of no return */ | 311 | /* OK, This is the point of no return */ |
| 312 | set_personality(PER_LINUX); | 312 | set_personality(PER_LINUX); |
| 313 | set_thread_flag(TIF_IA32); | 313 | set_thread_flag(TIF_IA32); |
| 314 | clear_thread_flag(TIF_ABI_PENDING); | ||
| 315 | 314 | ||
| 316 | setup_new_exec(bprm); | 315 | setup_new_exec(bprm); |
| 317 | 316 | ||
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index b4501ee223ad..1994d3f58443 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
| @@ -181,14 +181,8 @@ do { \ | |||
| 181 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); | 181 | void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp); |
| 182 | #define compat_start_thread start_thread_ia32 | 182 | #define compat_start_thread start_thread_ia32 |
| 183 | 183 | ||
| 184 | #define COMPAT_SET_PERSONALITY(ex) \ | 184 | void set_personality_ia32(void); |
| 185 | do { \ | 185 | #define COMPAT_SET_PERSONALITY(ex) set_personality_ia32() |
| 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) | ||
| 192 | 186 | ||
| 193 | #define COMPAT_ELF_PLATFORM ("i686") | 187 | #define COMPAT_ELF_PLATFORM ("i686") |
| 194 | 188 | ||
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index 375c917c37d2..e0d28901e969 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
| @@ -87,7 +87,6 @@ struct thread_info { | |||
| 87 | #define TIF_NOTSC 16 /* TSC is not accessible in userland */ | 87 | #define TIF_NOTSC 16 /* TSC is not accessible in userland */ |
| 88 | #define TIF_IA32 17 /* 32bit process */ | 88 | #define TIF_IA32 17 /* 32bit process */ |
| 89 | #define TIF_FORK 18 /* ret_from_fork */ | 89 | #define TIF_FORK 18 /* ret_from_fork */ |
| 90 | #define TIF_ABI_PENDING 19 | ||
| 91 | #define TIF_MEMDIE 20 | 90 | #define TIF_MEMDIE 20 |
| 92 | #define TIF_DEBUG 21 /* uses debug registers */ | 91 | #define TIF_DEBUG 21 /* uses debug registers */ |
| 93 | #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ | 92 | #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ |
| @@ -112,7 +111,6 @@ struct thread_info { | |||
| 112 | #define _TIF_NOTSC (1 << TIF_NOTSC) | 111 | #define _TIF_NOTSC (1 << TIF_NOTSC) |
| 113 | #define _TIF_IA32 (1 << TIF_IA32) | 112 | #define _TIF_IA32 (1 << TIF_IA32) |
| 114 | #define _TIF_FORK (1 << TIF_FORK) | 113 | #define _TIF_FORK (1 << TIF_FORK) |
| 115 | #define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING) | ||
| 116 | #define _TIF_DEBUG (1 << TIF_DEBUG) | 114 | #define _TIF_DEBUG (1 << TIF_DEBUG) |
| 117 | #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) | 115 | #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) |
| 118 | #define _TIF_FREEZE (1 << TIF_FREEZE) | 116 | #define _TIF_FREEZE (1 << TIF_FREEZE) |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 02c3ee013ccd..c9b3522b6b46 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -115,18 +115,6 @@ void flush_thread(void) | |||
| 115 | { | 115 | { |
| 116 | struct task_struct *tsk = current; | 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 | flush_ptrace_hw_breakpoint(tsk); | 118 | flush_ptrace_hw_breakpoint(tsk); |
| 131 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); | 119 | memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array)); |
| 132 | /* | 120 | /* |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index f9e033150cdf..41a26a82470a 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -521,6 +521,17 @@ void set_personality_64bit(void) | |||
| 521 | current->personality &= ~READ_IMPLIES_EXEC; | 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 | unsigned long get_wchan(struct task_struct *p) | 535 | unsigned long get_wchan(struct task_struct *p) |
| 525 | { | 536 | { |
| 526 | unsigned long stack; | 537 | unsigned long stack; |
