Re: [77/89] x86: get rid of the insane TIF_ABI_PENDING bit

From: Stefan Bader
Date: Wed Mar 31 2010 - 08:33:28 EST


This is a multi-part message in MIME format.Greg KH wrote:
> 2.6.31-stable review patch. If anyone has any objections, please let us know.
>

This one had a follow up later (patch attached)

Stefan
> ------------------
>
> From: H. Peter Anvin <hpa@xxxxxxxxx>
>
> commit 05d43ed8a89c159ff641d472f970e3f1baa66318 upstream.
>
> 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@xxxxxxxxx>
> Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx>
> Signed-off-by: Stefan Bader <stefan.bader@xxxxxxxxxxxxx>
>
> ---
> arch/x86/ia32/ia32_aout.c | 1 -
> arch/x86/include/asm/elf.h | 10 ++--------
> arch/x86/include/asm/thread_info.h | 2 --
> arch/x86/kernel/process.c | 12 ------------
> arch/x86/kernel/process_64.c | 11 +++++++++++
> 5 files changed, 13 insertions(+), 23 deletions(-)
>
> --- 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
> /* OK, This is the point of no return */
> set_personality(PER_LINUX);
> set_thread_flag(TIF_IA32);
> - clear_thread_flag(TIF_ABI_PENDING);
>
> setup_new_exec(bprm);
>
> --- a/arch/x86/include/asm/elf.h
> +++ b/arch/x86/include/asm/elf.h
> @@ -197,14 +197,8 @@ do { \
> set_fs(USER_DS); \
> } while (0)
>
> -#define COMPAT_SET_PERSONALITY(ex) \
> -do { \
> - if (test_thread_flag(TIF_IA32)) \
> - clear_thread_flag(TIF_ABI_PENDING); \
> - else \
> - set_thread_flag(TIF_ABI_PENDING); \
> - current->personality |= force_personality32; \
> -} while (0)
> +void set_personality_ia32(void);
> +#define COMPAT_SET_PERSONALITY(ex) set_personality_ia32()
>
> #define COMPAT_ELF_PLATFORM ("i686")
>
> --- a/arch/x86/include/asm/thread_info.h
> +++ b/arch/x86/include/asm/thread_info.h
> @@ -86,7 +86,6 @@ struct thread_info {
> #define TIF_NOTSC 16 /* TSC is not accessible in userland */
> #define TIF_IA32 17 /* 32bit process */
> #define TIF_FORK 18 /* ret_from_fork */
> -#define TIF_ABI_PENDING 19
> #define TIF_MEMDIE 20
> #define TIF_DEBUG 21 /* uses debug registers */
> #define TIF_IO_BITMAP 22 /* uses I/O bitmap */
> @@ -110,7 +109,6 @@ struct thread_info {
> #define _TIF_NOTSC (1 << TIF_NOTSC)
> #define _TIF_IA32 (1 << TIF_IA32)
> #define _TIF_FORK (1 << TIF_FORK)
> -#define _TIF_ABI_PENDING (1 << TIF_ABI_PENDING)
> #define _TIF_DEBUG (1 << TIF_DEBUG)
> #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP)
> #define _TIF_FREEZE (1 << TIF_FREEZE)
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -94,18 +94,6 @@ void flush_thread(void)
> {
> struct task_struct *tsk = current;
>
> -#ifdef CONFIG_X86_64
> - if (test_tsk_thread_flag(tsk, TIF_ABI_PENDING)) {
> - clear_tsk_thread_flag(tsk, TIF_ABI_PENDING);
> - if (test_tsk_thread_flag(tsk, TIF_IA32)) {
> - clear_tsk_thread_flag(tsk, TIF_IA32);
> - } else {
> - set_tsk_thread_flag(tsk, TIF_IA32);
> - current_thread_info()->status |= TS_COMPAT;
> - }
> - }
> -#endif
> -
> clear_tsk_thread_flag(tsk, TIF_DEBUG);
>
> tsk->thread.debugreg0 = 0;
> --- a/arch/x86/kernel/process_64.c
> +++ b/arch/x86/kernel/process_64.c
> @@ -534,6 +534,17 @@ sys_clone(unsigned long clone_flags, uns
> return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
> }
>
> +void set_personality_ia32(void)
> +{
> + /* inherit personality from parent */
> +
> + /* Make sure to be in 32bit mode */
> + set_thread_flag(TIF_IA32);
> +
> + /* Prepare the first "return" to user space */
> + current_thread_info()->status |= TS_COMPAT;
> +}
> +
> unsigned long get_wchan(struct task_struct *p)
> {
> unsigned long stack;
>
>