mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
powerpc/ebpf32: Use standard function call for functions within 32M distance
If the target of a function call is within 32 Mbytes distance, use a standard function call with 'bl' instead of the 'lis/ori/mtlr/blrl' sequence. In the first pass, no memory has been allocated yet and the code position is not known yet (image pointer is NULL). This pass is there to calculate the amount of memory to allocate for the EBPF code, so assume the 4 instructions sequence is required, so that enough memory is allocated. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/74944a1e3e5cfecc141e440a6ccd37920e186b70.1618227846.git.christophe.leroy@csgroup.eu
This commit is contained in:
parent
e7de0023e1
commit
ee7c3ec3b4
@ -265,6 +265,7 @@
|
|||||||
#define PPC_INST_ORI 0x60000000
|
#define PPC_INST_ORI 0x60000000
|
||||||
#define PPC_INST_ORIS 0x64000000
|
#define PPC_INST_ORIS 0x64000000
|
||||||
#define PPC_INST_BRANCH 0x48000000
|
#define PPC_INST_BRANCH 0x48000000
|
||||||
|
#define PPC_INST_BL 0x48000001
|
||||||
#define PPC_INST_BRANCH_COND 0x40800000
|
#define PPC_INST_BRANCH_COND 0x40800000
|
||||||
|
|
||||||
/* Prefixes */
|
/* Prefixes */
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
/* Long jump; (unconditional 'branch') */
|
/* Long jump; (unconditional 'branch') */
|
||||||
#define PPC_JMP(dest) EMIT(PPC_INST_BRANCH | \
|
#define PPC_JMP(dest) EMIT(PPC_INST_BRANCH | \
|
||||||
(((dest) - (ctx->idx * 4)) & 0x03fffffc))
|
(((dest) - (ctx->idx * 4)) & 0x03fffffc))
|
||||||
|
/* blr; (unconditional 'branch' with link) to absolute address */
|
||||||
|
#define PPC_BL_ABS(dest) EMIT(PPC_INST_BL | \
|
||||||
|
(((dest) - (unsigned long)(image + ctx->idx)) & 0x03fffffc))
|
||||||
/* "cond" here covers BO:BI fields. */
|
/* "cond" here covers BO:BI fields. */
|
||||||
#define PPC_BCC_SHORT(cond, dest) EMIT(PPC_INST_BRANCH_COND | \
|
#define PPC_BCC_SHORT(cond, dest) EMIT(PPC_INST_BRANCH_COND | \
|
||||||
(((cond) & 0x3ff) << 16) | \
|
(((cond) & 0x3ff) << 16) | \
|
||||||
|
@ -187,11 +187,17 @@ void bpf_jit_build_epilogue(u32 *image, struct codegen_context *ctx)
|
|||||||
|
|
||||||
void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func)
|
void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func)
|
||||||
{
|
{
|
||||||
/* Load function address into r0 */
|
s32 rel = (s32)func - (s32)(image + ctx->idx);
|
||||||
EMIT(PPC_RAW_LIS(__REG_R0, IMM_H(func)));
|
|
||||||
EMIT(PPC_RAW_ORI(__REG_R0, __REG_R0, IMM_L(func)));
|
if (image && rel < 0x2000000 && rel >= -0x2000000) {
|
||||||
EMIT(PPC_RAW_MTLR(__REG_R0));
|
PPC_BL_ABS(func);
|
||||||
EMIT(PPC_RAW_BLRL());
|
} else {
|
||||||
|
/* Load function address into r0 */
|
||||||
|
EMIT(PPC_RAW_LIS(__REG_R0, IMM_H(func)));
|
||||||
|
EMIT(PPC_RAW_ORI(__REG_R0, __REG_R0, IMM_L(func)));
|
||||||
|
EMIT(PPC_RAW_MTLR(__REG_R0));
|
||||||
|
EMIT(PPC_RAW_BLRL());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
|
static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)
|
||||||
|
Loading…
Reference in New Issue
Block a user