Commit d2f47dab authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman

powerpc/code-patching: Inline create_branch()

create_branch() is a good candidate for inlining because:
- Flags can be folded in.
- Range tests are likely to be already done.

Hence reducing the create_branch() to only a set of instructions.

So inline it.

It improves ftrace activation by 10%.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/69851cc9a7bf8f03d025e6d29e165f2d0bd3bb6e.1652074503.git.christophe.leroy@csgroup.eu
parent a1facd25
...@@ -51,8 +51,26 @@ static inline bool is_offset_in_cond_branch_range(long offset) ...@@ -51,8 +51,26 @@ static inline bool is_offset_in_cond_branch_range(long offset)
return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3); return offset >= -0x8000 && offset <= 0x7fff && !(offset & 0x3);
} }
int create_branch(ppc_inst_t *instr, const u32 *addr, static inline int create_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags); unsigned long target, int flags)
{
long offset;
*instr = ppc_inst(0);
offset = target;
if (! (flags & BRANCH_ABSOLUTE))
offset = offset - (unsigned long)addr;
/* Check we can represent the target in the instruction format */
if (!is_offset_in_branch_range(offset))
return 1;
/* Mask out the flags and target, so they don't step on each other. */
*instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC));
return 0;
}
int create_cond_branch(ppc_inst_t *instr, const u32 *addr, int create_cond_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags); unsigned long target, int flags);
int patch_branch(u32 *addr, unsigned long target, int flags); int patch_branch(u32 *addr, unsigned long target, int flags);
......
...@@ -236,26 +236,6 @@ bool is_conditional_branch(ppc_inst_t instr) ...@@ -236,26 +236,6 @@ bool is_conditional_branch(ppc_inst_t instr)
} }
NOKPROBE_SYMBOL(is_conditional_branch); NOKPROBE_SYMBOL(is_conditional_branch);
int create_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags)
{
long offset;
*instr = ppc_inst(0);
offset = target;
if (! (flags & BRANCH_ABSOLUTE))
offset = offset - (unsigned long)addr;
/* Check we can represent the target in the instruction format */
if (!is_offset_in_branch_range(offset))
return 1;
/* Mask out the flags and target, so they don't step on each other. */
*instr = ppc_inst(0x48000000 | (flags & 0x3) | (offset & 0x03FFFFFC));
return 0;
}
int create_cond_branch(ppc_inst_t *instr, const u32 *addr, int create_cond_branch(ppc_inst_t *instr, const u32 *addr,
unsigned long target, int flags) unsigned long target, int flags)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment