Skip to content

Commit 4549c3e

Browse files
rnavmpe
authored andcommitted
powerpc/lib: Add helper to check if offset is within conditional branch range
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 <[email protected]> Reviewed-by: Christophe Leroy <[email protected]> Acked-by: Song Liu <[email protected]> Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/442b69a34ced32ca346a0d9a855f3f6cfdbbbd41.1633464148.git.naveen.n.rao@linux.vnet.ibm.com
1 parent 23c216b commit 4549c3e

File tree

3 files changed

+8
-7
lines changed

3 files changed

+8
-7
lines changed

arch/powerpc/include/asm/code-patching.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define BRANCH_ABSOLUTE 0x2
2424

2525
bool is_offset_in_branch_range(long offset);
26+
bool is_offset_in_cond_branch_range(long offset);
2627
int create_branch(struct ppc_inst *instr, const u32 *addr,
2728
unsigned long target, int flags);
2829
int create_cond_branch(struct ppc_inst *instr, const u32 *addr,

arch/powerpc/lib/code-patching.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,11 @@ bool is_offset_in_branch_range(long offset)
228228
return (offset >= -0x2000000 && offset <= 0x1fffffc && !(offset & 0x3));
229229
}
230230

231+
bool is_offset_in_cond_branch_range(long offset)
232+
{
233+
return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3);
234+
}
235+
231236
/*
232237
* Helper to check if a given instruction is a conditional branch
233238
* Derived from the conditional checks in analyse_instr()
@@ -280,7 +285,7 @@ int create_cond_branch(struct ppc_inst *instr, const u32 *addr,
280285
offset = offset - (unsigned long)addr;
281286

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

286291
/* Mask out the flags and target, so they don't step on each other. */

arch/powerpc/net/bpf_jit.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,6 @@
7878
#define PPC_FUNC_ADDR(d,i) do { PPC_LI32(d, i); } while(0)
7979
#endif
8080

81-
static inline bool is_nearbranch(int offset)
82-
{
83-
return (offset < 32768) && (offset >= -32768);
84-
}
85-
8681
/*
8782
* The fly in the ointment of code size changing from pass to pass is
8883
* avoided by padding the short branch case with a NOP. If code size differs
@@ -91,7 +86,7 @@ static inline bool is_nearbranch(int offset)
9186
* state.
9287
*/
9388
#define PPC_BCC(cond, dest) do { \
94-
if (is_nearbranch((dest) - (ctx->idx * 4))) { \
89+
if (is_offset_in_cond_branch_range((long)(dest) - (ctx->idx * 4))) { \
9590
PPC_BCC_SHORT(cond, dest); \
9691
EMIT(PPC_RAW_NOP()); \
9792
} else { \

0 commit comments

Comments
 (0)