lkml.org 
[lkml]   [2021]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 3/5] powerpc/inst: Define ppc_inst_t as u32 on PPC32
    Date
    Unlike PPC64 ABI, PPC32 uses the stack to pass a parameter defined
    as a struct, even when the struct has a single simple element.

    To avoid that, define ppc_inst_t as u32 on PPC32.

    Keep it as 'struct ppc_inst' when __CHECKER__ is defined so that
    sparse can perform type checking.

    Also revert commit 511eea5e2ccd ("powerpc/kprobes: Fix Oops by passing
    ppc_inst as a pointer to emulate_step() on ppc32") as now the
    instruction to be emulated is passed as a register to emulate_step().

    Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    ---
    v2: Make it work with kprobes
    ---
    arch/powerpc/include/asm/inst.h | 15 +++++++++++++--
    arch/powerpc/kernel/optprobes.c | 8 ++------
    2 files changed, 15 insertions(+), 8 deletions(-)

    diff --git a/arch/powerpc/include/asm/inst.h b/arch/powerpc/include/asm/inst.h
    index 055de1fa5d46..5c503816ebc0 100644
    --- a/arch/powerpc/include/asm/inst.h
    +++ b/arch/powerpc/include/asm/inst.h
    @@ -34,6 +34,7 @@
    * Instruction data type for POWER
    */

    +#if defined(CONFIG_PPC64) || defined(__CHECKER__)
    typedef struct {
    u32 val;
    #ifdef CONFIG_PPC64
    @@ -46,13 +47,23 @@ static inline u32 ppc_inst_val(ppc_inst_t x)
    return x.val;
    }

    +#define ppc_inst(x) ((ppc_inst_t){ .val = (x) })
    +
    +#else
    +typedef u32 ppc_inst_t;
    +
    +static inline u32 ppc_inst_val(ppc_inst_t x)
    +{
    + return x;
    +}
    +#define ppc_inst(x) (x)
    +#endif
    +
    static inline int ppc_inst_primary_opcode(ppc_inst_t x)
    {
    return ppc_inst_val(x) >> 26;
    }

    -#define ppc_inst(x) ((ppc_inst_t){ .val = (x) })
    -
    #ifdef CONFIG_PPC64
    #define ppc_inst_prefix(x, y) ((ppc_inst_t){ .val = (x), .suffix = (y) })

    diff --git a/arch/powerpc/kernel/optprobes.c b/arch/powerpc/kernel/optprobes.c
    index 378db980ded3..3b1c2236cbee 100644
    --- a/arch/powerpc/kernel/optprobes.c
    +++ b/arch/powerpc/kernel/optprobes.c
    @@ -228,12 +228,8 @@ int arch_prepare_optimized_kprobe(struct optimized_kprobe *op, struct kprobe *p)
    /*
    * 3. load instruction to be emulated into relevant register, and
    */
    - if (IS_ENABLED(CONFIG_PPC64)) {
    - temp = ppc_inst_read(p->ainsn.insn);
    - patch_imm_load_insns(ppc_inst_as_ulong(temp), 4, buff + TMPL_INSN_IDX);
    - } else {
    - patch_imm_load_insns((unsigned long)p->ainsn.insn, 4, buff + TMPL_INSN_IDX);
    - }
    + temp = ppc_inst_read(p->ainsn.insn);
    + patch_imm_load_insns(ppc_inst_as_ulong(temp), 4, buff + TMPL_INSN_IDX);

    /*
    * 4. branch back from trampoline
    --
    2.33.1
    \
     
     \ /
      Last update: 2021-11-29 12:58    [W:6.652 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site