powerpc: Fix string instr. emulation for 32-bit processes on ppc64
authorJames Yang <James.Yang@freescale.com>
Tue, 25 Jun 2013 16:41:05 +0000 (11:41 -0500)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 30 Jun 2013 05:49:40 +0000 (15:49 +1000)
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>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/kernel/traps.c

index 071f6e0..300daf3 100644 (file)
@@ -866,6 +866,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: