diff options
author | Anton Blanchard <anton@samba.org> | 2013-09-22 22:04:38 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-10-11 01:48:27 -0400 |
commit | 87fec0514f613f8ac43c01b0bc0bc7072c5d10ae (patch) | |
tree | 9da3fd6e0c527501160535e9095c4596fb4eb056 | |
parent | e156bd8ad76939a9bcd66d85cf06f8cde1fb8030 (diff) |
powerpc: PTRACE_PEEKUSR/PTRACE_POKEUSER of FPR registers in little endian builds
FPRs overlap the high 64bits of the first 32 VSX registers. The
ptrace FP read/write code assumes big endian ordering and grabs
the lowest 64 bits.
Fix this by using the TS_FPR macro which does the right thing.
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r-- | arch/powerpc/kernel/ptrace.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 9a0d24c390a3..8d5d4e921a5e 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -1554,8 +1554,8 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1554 | 1554 | ||
1555 | flush_fp_to_thread(child); | 1555 | flush_fp_to_thread(child); |
1556 | if (fpidx < (PT_FPSCR - PT_FPR0)) | 1556 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
1557 | tmp = ((unsigned long *)child->thread.fpr) | 1557 | memcpy(&tmp, &child->thread.TS_FPR(fpidx), |
1558 | [fpidx * TS_FPRWIDTH]; | 1558 | sizeof(long)); |
1559 | else | 1559 | else |
1560 | tmp = child->thread.fpscr.val; | 1560 | tmp = child->thread.fpscr.val; |
1561 | } | 1561 | } |
@@ -1587,8 +1587,8 @@ long arch_ptrace(struct task_struct *child, long request, | |||
1587 | 1587 | ||
1588 | flush_fp_to_thread(child); | 1588 | flush_fp_to_thread(child); |
1589 | if (fpidx < (PT_FPSCR - PT_FPR0)) | 1589 | if (fpidx < (PT_FPSCR - PT_FPR0)) |
1590 | ((unsigned long *)child->thread.fpr) | 1590 | memcpy(&child->thread.TS_FPR(fpidx), &data, |
1591 | [fpidx * TS_FPRWIDTH] = data; | 1591 | sizeof(long)); |
1592 | else | 1592 | else |
1593 | child->thread.fpscr.val = data; | 1593 | child->thread.fpscr.val = data; |
1594 | ret = 0; | 1594 | ret = 0; |