[powerpc] ptrace: Fix build with gcc 4.6

svn path=/dists/trunk/linux-2.6/; revision=18242
This commit is contained in:
Ben Hutchings 2011-11-11 01:45:03 +00:00
parent 7aa515ffdd
commit 3e1e1a6980
3 changed files with 68 additions and 0 deletions

1
debian/changelog vendored
View File

@ -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 <ben@decadent.org.uk> Fri, 04 Nov 2011 15:05:47 +0000

View File

@ -0,0 +1,66 @@
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
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 <benh@kernel.crashing.org>
---
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

View File

@ -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