diff --git a/debian/changelog b/debian/changelog index 1acafc427..865b6537b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ linux-2.6 (3.1.0-1~experimental.2) UNRELEASED; urgency=low [ Ben Hutchings ] * [alpha] wire up accept4 syscall, thanks to Michael Cree * iwlagn: fix modinfo display for 135 ucode (Closes: #647958) + * [powerpc] ptrace: Fix build with gcc 4.6 -- Ben Hutchings Fri, 04 Nov 2011 15:05:47 +0000 diff --git a/debian/patches/bugfix/powerpc/powerpc-ptrace-Fix-build-with-gcc-4.6.patch b/debian/patches/bugfix/powerpc/powerpc-ptrace-Fix-build-with-gcc-4.6.patch new file mode 100644 index 000000000..8133eef43 --- /dev/null +++ b/debian/patches/bugfix/powerpc/powerpc-ptrace-Fix-build-with-gcc-4.6.patch @@ -0,0 +1,66 @@ +From: Benjamin Herrenschmidt +Date: Mon, 26 Sep 2011 19:37:57 +0000 +Subject: [PATCH] powerpc/ptrace: Fix build with gcc 4.6 + +commit e69b742a6793dc5bf16f6eedca534d4bc10d68b2 upstream. + +gcc (rightfully) complains that we are accessing beyond the +end of the fpr array (we do, to access the fpscr). + +The only sane thing to do (whether anything in that code can be +called remotely sane is debatable) is to special case fpscr and +handle it as a separate statement. + +I initially tried to do it it by making the array access conditional +to index < PT_FPSCR and using a 3rd else leg but for some reason gcc +was unable to understand it and still spewed the warning. + +So I ended up with something a tad more intricated but it seems to +build on 32-bit and on 64-bit with and without VSX. + +Signed-off-by: Benjamin Herrenschmidt +--- + arch/powerpc/kernel/ptrace.c | 18 ++++++++++++++---- + 1 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c +index 05b7dd2..18447c4 100644 +--- a/arch/powerpc/kernel/ptrace.c ++++ b/arch/powerpc/kernel/ptrace.c +@@ -1497,9 +1497,14 @@ long arch_ptrace(struct task_struct *child, long request, + if (index < PT_FPR0) { + tmp = ptrace_get_reg(child, (int) index); + } else { ++ unsigned int fpidx = index - PT_FPR0; ++ + flush_fp_to_thread(child); +- tmp = ((unsigned long *)child->thread.fpr) +- [TS_FPRWIDTH * (index - PT_FPR0)]; ++ if (fpidx < (PT_FPSCR - PT_FPR0)) ++ tmp = ((unsigned long *)child->thread.fpr) ++ [fpidx * TS_FPRWIDTH]; ++ else ++ tmp = child->thread.fpscr.val; + } + ret = put_user(tmp, datalp); + break; +@@ -1525,9 +1530,14 @@ long arch_ptrace(struct task_struct *child, long request, + if (index < PT_FPR0) { + ret = ptrace_put_reg(child, index, data); + } else { ++ unsigned int fpidx = index - PT_FPR0; ++ + flush_fp_to_thread(child); +- ((unsigned long *)child->thread.fpr) +- [TS_FPRWIDTH * (index - PT_FPR0)] = data; ++ if (fpidx < (PT_FPSCR - PT_FPR0)) ++ ((unsigned long *)child->thread.fpr) ++ [fpidx * TS_FPRWIDTH] = data; ++ else ++ child->thread.fpscr.val = data; + ret = 0; + } + break; +-- +1.7.7.2 + diff --git a/debian/patches/series/1~experimental.2 b/debian/patches/series/1~experimental.2 index 4589c3d25..43e807308 100644 --- a/debian/patches/series/1~experimental.2 +++ b/debian/patches/series/1~experimental.2 @@ -1,2 +1,3 @@ + bugfix/alpha/alpha-wire-up-accept4-syscall.patch + bugfix/all/iwlagn-fix-modinfo-display-for-135-ucode.patch ++ bugfix/powerpc/powerpc-ptrace-Fix-build-with-gcc-4.6.patch