summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Yang <James.Yang@freescale.com>2013-06-24 23:31:44 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-07-17 19:44:15 (GMT)
commita624f772e194e3dac47adbb62edf9a006457890e (patch)
tree69df124ba4be2882bfa3695becab08c73279727a
parent72069100dda80a8430d31f3bede5c0952a54bbe1 (diff)
downloadlinux-fsl-qoriq-a624f772e194e3dac47adbb62edf9a006457890e.tar.xz
Fix string emulation for 32-bit process on ppc64
String instruction emulation would erroneously result in a segfault if the upper bits of the EA are set and is so high that it fails access check. Truncate the EA to 32 bits if the process is 32-bit. Signed-off-by: James Yang <James.Yang@freescale.com> Change-Id: Ib2eb9aa3a712f25124680d0f164c3a392e5401a7 Reviewed-on: http://git.am.freescale.net:8181/3052 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
-rw-r--r--arch/powerpc/kernel/traps.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index dce1bea..c72e7e9 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -840,6 +840,10 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
u8 val;
u32 shift = 8 * (3 - (pos & 0x3));
+ /* if process is 32-bit, clear upper 32 bits of EA */
+ if ((regs->msr & MSR_64BIT) == 0)
+ EA &= 0xFFFFFFFF;
+
switch ((instword & PPC_INST_STRING_MASK)) {
case PPC_INST_LSWX:
case PPC_INST_LSWI: