lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 342/355] powerpc/lib: Add helper to check if offset is within conditional branch range
    Date
    From: "Naveen N. Rao" <naveen.n.rao@linux.vnet.ibm.com>

    upstream commit 4549c3ea3160fa8b3f37dfe2f957657bb265eda9

    Add a helper to check if a given offset is within the branch range for a
    powerpc conditional branch instruction, and update some sites to use the
    new helper.

    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>
    Acked-by: Song Liu <songliubraving@fb.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/442b69a34ced32ca346a0d9a855f3f6cfdbbbd41.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
    Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/include/asm/code-patching.h | 1 +
    arch/powerpc/lib/code-patching.c | 7 ++++++-
    arch/powerpc/net/bpf_jit.h | 7 +------
    3 files changed, 8 insertions(+), 7 deletions(-)

    --- a/arch/powerpc/include/asm/code-patching.h
    +++ b/arch/powerpc/include/asm/code-patching.h
    @@ -22,6 +22,7 @@
    #define BRANCH_ABSOLUTE 0x2

    bool is_offset_in_branch_range(long offset);
    +bool is_offset_in_cond_branch_range(long offset);
    unsigned int create_branch(const unsigned int *addr,
    unsigned long target, int flags);
    unsigned int create_cond_branch(const unsigned int *addr,
    --- a/arch/powerpc/lib/code-patching.c
    +++ b/arch/powerpc/lib/code-patching.c
    @@ -221,6 +221,11 @@ bool is_offset_in_branch_range(long offs
    return (offset >= -0x2000000 && offset <= 0x1fffffc && !(offset & 0x3));
    }

    +bool is_offset_in_cond_branch_range(long offset)
    +{
    + return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3);
    +}
    +
    /*
    * Helper to check if a given instruction is a conditional branch
    * Derived from the conditional checks in analyse_instr()
    @@ -274,7 +279,7 @@ unsigned int create_cond_branch(const un
    offset = offset - (unsigned long)addr;

    /* Check we can represent the target in the instruction format */
    - if (offset < -0x8000 || offset > 0x7FFF || offset & 0x3)
    + if (!is_offset_in_cond_branch_range(offset))
    return 0;

    /* Mask out the flags and target, so they don't step on each other. */
    --- a/arch/powerpc/net/bpf_jit.h
    +++ b/arch/powerpc/net/bpf_jit.h
    @@ -225,11 +225,6 @@
    #define PPC_FUNC_ADDR(d,i) do { PPC_LI32(d, i); } while(0)
    #endif

    -static inline bool is_nearbranch(int offset)
    -{
    - return (offset < 32768) && (offset >= -32768);
    -}
    -
    /*
    * The fly in the ointment of code size changing from pass to pass is
    * avoided by padding the short branch case with a NOP. If code size differs
    @@ -238,7 +233,7 @@ static inline bool is_nearbranch(int off
    * state.
    */
    #define PPC_BCC(cond, dest) do { \
    - if (is_nearbranch((dest) - (ctx->idx * 4))) { \
    + if (is_offset_in_cond_branch_range((long)(dest) - (ctx->idx * 4))) { \
    PPC_BCC_SHORT(cond, dest); \
    PPC_NOP(); \
    } else { \

    \
     
     \ /
      Last update: 2021-11-16 03:23    [W:4.230 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site