diff --git a/debian/changelog b/debian/changelog index ea597c3d9..3040563c2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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 Thu, 04 Feb 2010 12:08:47 +0100 linux-2.6 (2.6.32-7) unstable; urgency=low diff --git a/debian/patches/bugfix/powerpc/powerpc-tif_abi_pending-bit-removal.patch b/debian/patches/bugfix/powerpc/powerpc-tif_abi_pending-bit-removal.patch new file mode 100644 index 000000000..7412e0f97 --- /dev/null +++ b/debian/patches/bugfix/powerpc/powerpc-tif_abi_pending-bit-removal.patch @@ -0,0 +1,80 @@ +From 94f28da8409c6059135e89ac64a0839993124155 Mon Sep 17 00:00:00 2001 +From: Andreas Schwab +Date: Sat, 30 Jan 2010 10:20:59 +0000 +Subject: powerpc: TIF_ABI_PENDING bit removal + +From: Andreas Schwab + +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 +Signed-off-by: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + 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<thread.dabr) { diff --git a/debian/patches/bugfix/sparc/sparc-tif_abi_pending-bit-removal.patch b/debian/patches/bugfix/sparc/sparc-tif_abi_pending-bit-removal.patch new file mode 100644 index 000000000..a3e6dc34a --- /dev/null +++ b/debian/patches/bugfix/sparc/sparc-tif_abi_pending-bit-removal.patch @@ -0,0 +1,86 @@ +From 94673e968cbcce07fa78dac4b0ae05d24b5816e1 Mon Sep 17 00:00:00 2001 +From: David Miller +Date: Thu, 28 Jan 2010 21:42:02 -0800 +Subject: sparc: TIF_ABI_PENDING bit removal + +From: David Miller + +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 +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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<task->mm; + if (mm) + tsb_context_switch(mm); diff --git a/debian/patches/bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch b/debian/patches/bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch new file mode 100644 index 000000000..bf0a3faca --- /dev/null +++ b/debian/patches/bugfix/x86/x86-get-rid-of-the-insane-tif_abi_pending-bit.patch @@ -0,0 +1,117 @@ +From 05d43ed8a89c159ff641d472f970e3f1baa66318 Mon Sep 17 00:00:00 2001 +From: H. Peter Anvin +Date: Thu, 28 Jan 2010 22:14:43 -0800 +Subject: x86: get rid of the insane TIF_ABI_PENDING bit + +From: H. Peter Anvin + +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 +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/debian/patches/series/8 b/debian/patches/series/8 new file mode 100644 index 000000000..41db08fe7 --- /dev/null +++ b/debian/patches/series/8 @@ -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