Commit 375906f8 authored by Stephen Wilson's avatar Stephen Wilson Committed by Al Viro

x86: mark associated mm when running a task in 32 bit compatibility mode

This patch simply follows the same practice as for setting the TIF_IA32 flag.
In particular, an mm is marked as holding 32-bit tasks when a 32-bit binary is
exec'ed.  Both ELF and a.out formats are updated.
Signed-off-by: default avatarStephen Wilson <wilsons@start.ca>
Reviewed-by: default avatarMichel Lespinasse <walken@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c2ef45df
...@@ -298,6 +298,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs) ...@@ -298,6 +298,7 @@ static int load_aout_binary(struct linux_binprm *bprm, struct pt_regs *regs)
/* OK, This is the point of no return */ /* OK, This is the point of no return */
set_personality(PER_LINUX); set_personality(PER_LINUX);
set_thread_flag(TIF_IA32); set_thread_flag(TIF_IA32);
current->mm->context.ia32_compat = 1;
setup_new_exec(bprm); setup_new_exec(bprm);
......
...@@ -501,6 +501,10 @@ void set_personality_64bit(void) ...@@ -501,6 +501,10 @@ void set_personality_64bit(void)
/* Make sure to be in 64bit mode */ /* Make sure to be in 64bit mode */
clear_thread_flag(TIF_IA32); clear_thread_flag(TIF_IA32);
/* Ensure the corresponding mm is not marked. */
if (current->mm)
current->mm->context.ia32_compat = 0;
/* TBD: overwrites user setup. Should have two bits. /* TBD: overwrites user setup. Should have two bits.
But 64bit processes have always behaved this way, But 64bit processes have always behaved this way,
so it's not too bad. The main problem is just that so it's not too bad. The main problem is just that
...@@ -516,6 +520,10 @@ void set_personality_ia32(void) ...@@ -516,6 +520,10 @@ void set_personality_ia32(void)
set_thread_flag(TIF_IA32); set_thread_flag(TIF_IA32);
current->personality |= force_personality32; current->personality |= force_personality32;
/* Mark the associated mm as containing 32-bit tasks. */
if (current->mm)
current->mm->context.ia32_compat = 1;
/* Prepare the first "return" to user space */ /* Prepare the first "return" to user space */
current_thread_info()->status |= TS_COMPAT; current_thread_info()->status |= TS_COMPAT;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment