Remove TIF_ABI_PENDING bit from x86, sparc & powerpc, fixing
32-bit userland/64-bit kernel breakage (Closes: #568416) svn path=/dists/trunk/linux-2.6/; revision=15120
This commit is contained in:
parent
65ee02f46b
commit
0b2c1541cf
|
@ -1,7 +1,12 @@
|
|||
linux-2.6 (2.6.32-8) UNRELEASED; urgency=low
|
||||
|
||||
[ Bastian Blank ]
|
||||
* Don't let default compiler flags escape into build.
|
||||
|
||||
[ dann frazier ]
|
||||
* Remove TIF_ABI_PENDING bit from x86, sparc & powerpc, fixing
|
||||
32-bit userland/64-bit kernel breakage (Closes: #568416)
|
||||
|
||||
-- Bastian Blank <waldi@debian.org> Thu, 04 Feb 2010 12:08:47 +0100
|
||||
|
||||
linux-2.6 (2.6.32-7) unstable; urgency=low
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
From 94f28da8409c6059135e89ac64a0839993124155 Mon Sep 17 00:00:00 2001
|
||||
From: Andreas Schwab <schwab@linux-m68k.org>
|
||||
Date: Sat, 30 Jan 2010 10:20:59 +0000
|
||||
Subject: powerpc: TIF_ABI_PENDING bit removal
|
||||
|
||||
From: Andreas Schwab <schwab@linux-m68k.org>
|
||||
|
||||
commit 94f28da8409c6059135e89ac64a0839993124155 upstream.
|
||||
|
||||
Here are the powerpc bits to remove TIF_ABI_PENDING now that
|
||||
set_personality() is called at the appropriate place in exec.
|
||||
|
||||
Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
|
||||
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
arch/powerpc/include/asm/elf.h | 8 ++------
|
||||
arch/powerpc/include/asm/thread_info.h | 2 --
|
||||
arch/powerpc/kernel/process.c | 12 ------------
|
||||
3 files changed, 2 insertions(+), 20 deletions(-)
|
||||
|
||||
--- a/arch/powerpc/include/asm/elf.h
|
||||
+++ b/arch/powerpc/include/asm/elf.h
|
||||
@@ -236,14 +236,10 @@ typedef elf_vrregset_t elf_fpxregset_t;
|
||||
#ifdef __powerpc64__
|
||||
# define SET_PERSONALITY(ex) \
|
||||
do { \
|
||||
- unsigned long new_flags = 0; \
|
||||
if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
- new_flags = _TIF_32BIT; \
|
||||
- if ((current_thread_info()->flags & _TIF_32BIT) \
|
||||
- != new_flags) \
|
||||
- set_thread_flag(TIF_ABI_PENDING); \
|
||||
+ set_thread_flag(TIF_32BIT); \
|
||||
else \
|
||||
- clear_thread_flag(TIF_ABI_PENDING); \
|
||||
+ clear_thread_flag(TIF_32BIT); \
|
||||
if (personality(current->personality) != PER_LINUX32) \
|
||||
set_personality(PER_LINUX | \
|
||||
(current->personality & (~PER_MASK))); \
|
||||
--- a/arch/powerpc/include/asm/thread_info.h
|
||||
+++ b/arch/powerpc/include/asm/thread_info.h
|
||||
@@ -111,7 +111,6 @@ static inline struct thread_info *curren
|
||||
#define TIF_NOTIFY_RESUME 13 /* callback before returning to user */
|
||||
#define TIF_FREEZE 14 /* Freezing for suspend */
|
||||
#define TIF_RUNLATCH 15 /* Is the runlatch enabled? */
|
||||
-#define TIF_ABI_PENDING 16 /* 32/64 bit switch needed */
|
||||
|
||||
/* as above, but as bit values */
|
||||
#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
|
||||
@@ -129,7 +128,6 @@ static inline struct thread_info *curren
|
||||
#define _TIF_NOTIFY_RESUME (1<<TIF_NOTIFY_RESUME)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
#define _TIF_RUNLATCH (1<<TIF_RUNLATCH)
|
||||
-#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
|
||||
|
||||
#define _TIF_USER_WORK_MASK (_TIF_SIGPENDING | _TIF_NEED_RESCHED | \
|
||||
--- a/arch/powerpc/kernel/process.c
|
||||
+++ b/arch/powerpc/kernel/process.c
|
||||
@@ -554,18 +554,6 @@ void exit_thread(void)
|
||||
|
||||
void flush_thread(void)
|
||||
{
|
||||
-#ifdef CONFIG_PPC64
|
||||
- struct thread_info *t = current_thread_info();
|
||||
-
|
||||
- if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
|
||||
- clear_ti_thread_flag(t, TIF_ABI_PENDING);
|
||||
- if (test_ti_thread_flag(t, TIF_32BIT))
|
||||
- clear_ti_thread_flag(t, TIF_32BIT);
|
||||
- else
|
||||
- set_ti_thread_flag(t, TIF_32BIT);
|
||||
- }
|
||||
-#endif
|
||||
-
|
||||
discard_lazy_cpu_state();
|
||||
|
||||
if (current->thread.dabr) {
|
|
@ -0,0 +1,86 @@
|
|||
From 94673e968cbcce07fa78dac4b0ae05d24b5816e1 Mon Sep 17 00:00:00 2001
|
||||
From: David Miller <davem@davemloft.net>
|
||||
Date: Thu, 28 Jan 2010 21:42:02 -0800
|
||||
Subject: sparc: TIF_ABI_PENDING bit removal
|
||||
|
||||
From: David Miller <davem@davemloft.net>
|
||||
|
||||
commit 94673e968cbcce07fa78dac4b0ae05d24b5816e1 upstream.
|
||||
|
||||
Here are the sparc bits to remove TIF_ABI_PENDING now that
|
||||
set_personality() is called at the appropriate place in exec.
|
||||
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
arch/sparc/include/asm/elf_64.h | 13 +++----------
|
||||
arch/sparc/include/asm/thread_info_64.h | 4 +---
|
||||
arch/sparc/kernel/process_64.c | 8 --------
|
||||
3 files changed, 4 insertions(+), 21 deletions(-)
|
||||
|
||||
--- a/arch/sparc/include/asm/elf_64.h
|
||||
+++ b/arch/sparc/include/asm/elf_64.h
|
||||
@@ -196,17 +196,10 @@ static inline unsigned int sparc64_elf_h
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
-do { unsigned long new_flags = current_thread_info()->flags; \
|
||||
- new_flags &= _TIF_32BIT; \
|
||||
- if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
- new_flags |= _TIF_32BIT; \
|
||||
+do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \
|
||||
+ set_thread_flag(TIF_32BIT); \
|
||||
else \
|
||||
- new_flags &= ~_TIF_32BIT; \
|
||||
- if ((current_thread_info()->flags & _TIF_32BIT) \
|
||||
- != new_flags) \
|
||||
- set_thread_flag(TIF_ABI_PENDING); \
|
||||
- else \
|
||||
- clear_thread_flag(TIF_ABI_PENDING); \
|
||||
+ clear_thread_flag(TIF_32BIT); \
|
||||
/* flush_thread will update pgd cache */ \
|
||||
if (personality(current->personality) != PER_LINUX32) \
|
||||
set_personality(PER_LINUX | \
|
||||
--- a/arch/sparc/include/asm/thread_info_64.h
|
||||
+++ b/arch/sparc/include/asm/thread_info_64.h
|
||||
@@ -227,12 +227,11 @@ register struct thread_info *current_thr
|
||||
/* flag bit 8 is available */
|
||||
#define TIF_SECCOMP 9 /* secure computing */
|
||||
#define TIF_SYSCALL_AUDIT 10 /* syscall auditing active */
|
||||
-/* flag bit 11 is available */
|
||||
/* NOTE: Thread flags >= 12 should be ones we have no interest
|
||||
* in using in assembly, else we can't use the mask as
|
||||
* an immediate value in instructions such as andcc.
|
||||
*/
|
||||
-#define TIF_ABI_PENDING 12
|
||||
+/* flag bit 12 is available */
|
||||
#define TIF_MEMDIE 13
|
||||
#define TIF_POLLING_NRFLAG 14
|
||||
#define TIF_FREEZE 15 /* is freezing for suspend */
|
||||
@@ -246,7 +245,6 @@ register struct thread_info *current_thr
|
||||
#define _TIF_32BIT (1<<TIF_32BIT)
|
||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
||||
-#define _TIF_ABI_PENDING (1<<TIF_ABI_PENDING)
|
||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||
#define _TIF_FREEZE (1<<TIF_FREEZE)
|
||||
|
||||
--- a/arch/sparc/kernel/process_64.c
|
||||
+++ b/arch/sparc/kernel/process_64.c
|
||||
@@ -365,14 +365,6 @@ void flush_thread(void)
|
||||
struct thread_info *t = current_thread_info();
|
||||
struct mm_struct *mm;
|
||||
|
||||
- if (test_ti_thread_flag(t, TIF_ABI_PENDING)) {
|
||||
- clear_ti_thread_flag(t, TIF_ABI_PENDING);
|
||||
- if (test_ti_thread_flag(t, TIF_32BIT))
|
||||
- clear_ti_thread_flag(t, TIF_32BIT);
|
||||
- else
|
||||
- set_ti_thread_flag(t, TIF_32BIT);
|
||||
- }
|
||||
-
|
||||
mm = t->task->mm;
|
||||
if (mm)
|
||||
tsb_context_switch(mm);
|
117
debian/patches/bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch
vendored
Normal file
117
debian/patches/bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch
vendored
Normal file
|
@ -0,0 +1,117 @@
|
|||
From 05d43ed8a89c159ff641d472f970e3f1baa66318 Mon Sep 17 00:00:00 2001
|
||||
From: H. Peter Anvin <hpa@zytor.com>
|
||||
Date: Thu, 28 Jan 2010 22:14:43 -0800
|
||||
Subject: x86: get rid of the insane TIF_ABI_PENDING bit
|
||||
|
||||
From: H. Peter Anvin <hpa@zytor.com>
|
||||
|
||||
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@zytor.com>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||||
|
||||
---
|
||||
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_64.c
|
||||
+++ b/arch/x86/kernel/process_64.c
|
||||
@@ -540,6 +540,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;
|
||||
--- a/arch/x86/kernel/process.c
|
||||
+++ b/arch/x86/kernel/process.c
|
||||
@@ -91,18 +91,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;
|
|
@ -0,0 +1,3 @@
|
|||
+ bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch
|
||||
+ bugfix/powerpc/powerpc-tif_abi_pending-bit-removal.patch
|
||||
+ bugfix/sparc/sparc-tif_abi_pending-bit-removal.patch
|
Loading…
Reference in New Issue