diff options
author | James Yang <James.Yang@freescale.com> | 2013-06-24 23:31:44 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-07-17 19:44:15 (GMT) |
commit | a624f772e194e3dac47adbb62edf9a006457890e (patch) | |
tree | 69df124ba4be2882bfa3695becab08c73279727a /arch | |
parent | 72069100dda80a8430d31f3bede5c0952a54bbe1 (diff) | |
download | linux-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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/traps.c | 4 |
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: |