lkml.org 
[lkml]   [2017]   [Feb]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 1/2] powerpc: Emulation support for load/store instructions on LE
    Date
    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>
    ---
    arch/powerpc/lib/sstep.c | 20 --------------------
    1 file changed, 20 deletions(-)

    diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
    index 06c7e9b..e14a2fb 100644
    --- a/arch/powerpc/lib/sstep.c
    +++ b/arch/powerpc/lib/sstep.c
    @@ -1799,8 +1799,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    goto instr_done;

    case LARX:
    - if (regs->msr & MSR_LE)
    - return 0;
    if (op.ea & (size - 1))
    break; /* can't handle misaligned */
    err = -EFAULT;
    @@ -1824,8 +1822,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    goto ldst_done;

    case STCX:
    - if (regs->msr & MSR_LE)
    - return 0;
    if (op.ea & (size - 1))
    break; /* can't handle misaligned */
    err = -EFAULT;
    @@ -1851,8 +1847,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    goto ldst_done;

    case LOAD:
    - if (regs->msr & MSR_LE)
    - return 0;
    err = read_mem(&regs->gpr[op.reg], op.ea, size, regs);
    if (!err) {
    if (op.type & SIGNEXT)
    @@ -1864,8 +1858,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)

    #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
    @@ -1874,15 +1866,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    #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
    @@ -1905,8 +1893,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    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) &&
    @@ -1919,8 +1905,6 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)

    #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
    @@ -1929,15 +1913,11 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
    #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
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2017-02-14 19:07    [W:4.090 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site