From: James Yang Date: Tue, 25 Jun 2013 16:41:05 +0000 (-0500) Subject: powerpc: Fix string instr. emulation for 32-bit processes on ppc64 X-Git-Tag: v3.11-rc1~94^2~44 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=80aa0fb4940bf8ee52bcb574d74459a7aea45621;p=linux-2.6-block.git powerpc: Fix string instr. emulation for 32-bit processes 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 Signed-off-by: Benjamin Herrenschmidt --- diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 071f6e040eb2..300daf3e7ab0 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -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: