| From e148bd17f48bd17fca2f4f089ec879fa6e47e34c Mon Sep 17 00:00:00 2001 |
| From: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> |
| Date: Tue, 14 Feb 2017 14:46:42 +0530 |
| Subject: powerpc: Emulation support for load/store instructions on LE |
| |
| From: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> |
| |
| commit e148bd17f48bd17fca2f4f089ec879fa6e47e34c upstream. |
| |
| emulate_step() uses a number of underlying kernel functions that were |
| initially not enabled for LE. This has been rectified since. So, fix |
| emulate_step() for LE for the corresponding instructions. |
| |
| Reported-by: Anton Blanchard <anton@samba.org> |
| Signed-off-by: Ravi Bangoria <ravi.bangoria@linux.vnet.ibm.com> |
| Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/lib/sstep.c | 20 -------------------- |
| 1 file changed, 20 deletions(-) |
| |
| --- a/arch/powerpc/lib/sstep.c |
| +++ b/arch/powerpc/lib/sstep.c |
| @@ -1807,8 +1807,6 @@ int __kprobes emulate_step(struct pt_reg |
| goto instr_done; |
| |
| case LARX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| if (op.ea & (size - 1)) |
| break; /* can't handle misaligned */ |
| err = -EFAULT; |
| @@ -1832,8 +1830,6 @@ int __kprobes emulate_step(struct pt_reg |
| goto ldst_done; |
| |
| case STCX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| if (op.ea & (size - 1)) |
| break; /* can't handle misaligned */ |
| err = -EFAULT; |
| @@ -1859,8 +1855,6 @@ int __kprobes emulate_step(struct pt_reg |
| goto ldst_done; |
| |
| case LOAD: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| err = read_mem(®s->gpr[op.reg], op.ea, size, regs); |
| if (!err) { |
| if (op.type & SIGNEXT) |
| @@ -1872,8 +1866,6 @@ int __kprobes emulate_step(struct pt_reg |
| |
| #ifdef CONFIG_PPC_FPU |
| case LOAD_FP: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| if (size == 4) |
| err = do_fp_load(op.reg, do_lfs, op.ea, size, regs); |
| else |
| @@ -1882,15 +1874,11 @@ int __kprobes emulate_step(struct pt_reg |
| #endif |
| #ifdef CONFIG_ALTIVEC |
| case LOAD_VMX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| err = do_vec_load(op.reg, do_lvx, op.ea & ~0xfUL, regs); |
| goto ldst_done; |
| #endif |
| #ifdef CONFIG_VSX |
| case LOAD_VSX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| err = do_vsx_load(op.reg, do_lxvd2x, op.ea, regs); |
| goto ldst_done; |
| #endif |
| @@ -1913,8 +1901,6 @@ int __kprobes emulate_step(struct pt_reg |
| goto instr_done; |
| |
| case STORE: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| if ((op.type & UPDATE) && size == sizeof(long) && |
| op.reg == 1 && op.update_reg == 1 && |
| !(regs->msr & MSR_PR) && |
| @@ -1927,8 +1913,6 @@ int __kprobes emulate_step(struct pt_reg |
| |
| #ifdef CONFIG_PPC_FPU |
| case STORE_FP: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| if (size == 4) |
| err = do_fp_store(op.reg, do_stfs, op.ea, size, regs); |
| else |
| @@ -1937,15 +1921,11 @@ int __kprobes emulate_step(struct pt_reg |
| #endif |
| #ifdef CONFIG_ALTIVEC |
| case STORE_VMX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| err = do_vec_store(op.reg, do_stvx, op.ea & ~0xfUL, regs); |
| goto ldst_done; |
| #endif |
| #ifdef CONFIG_VSX |
| case STORE_VSX: |
| - if (regs->msr & MSR_LE) |
| - return 0; |
| err = do_vsx_store(op.reg, do_stxvd2x, op.ea, regs); |
| goto ldst_done; |
| #endif |