bpf powerpc: refactor JIT compiler code
Refactor powerpc LDX JITing code to simplify adding BPF_PROBE_MEM support. Signed-off-by: Hari Bathini <hbathini@linux.ibm.com> Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211012123056.485795-4-hbathini@linux.ibm.com
This commit is contained in:
committed by
Michael Ellerman
parent
04c04205bc
commit
efa95f031b
@@ -284,6 +284,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
|
|||||||
u32 src_reg = bpf_to_ppc(ctx, insn[i].src_reg);
|
u32 src_reg = bpf_to_ppc(ctx, insn[i].src_reg);
|
||||||
u32 src_reg_h = src_reg - 1;
|
u32 src_reg_h = src_reg - 1;
|
||||||
u32 tmp_reg = bpf_to_ppc(ctx, TMP_REG);
|
u32 tmp_reg = bpf_to_ppc(ctx, TMP_REG);
|
||||||
|
u32 size = BPF_SIZE(code);
|
||||||
s16 off = insn[i].off;
|
s16 off = insn[i].off;
|
||||||
s32 imm = insn[i].imm;
|
s32 imm = insn[i].imm;
|
||||||
bool func_addr_fixed;
|
bool func_addr_fixed;
|
||||||
@@ -812,23 +813,27 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
|
|||||||
* BPF_LDX
|
* BPF_LDX
|
||||||
*/
|
*/
|
||||||
case BPF_LDX | BPF_MEM | BPF_B: /* dst = *(u8 *)(ul) (src + off) */
|
case BPF_LDX | BPF_MEM | BPF_B: /* dst = *(u8 *)(ul) (src + off) */
|
||||||
EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
|
|
||||||
if (!fp->aux->verifier_zext)
|
|
||||||
EMIT(PPC_RAW_LI(dst_reg_h, 0));
|
|
||||||
break;
|
|
||||||
case BPF_LDX | BPF_MEM | BPF_H: /* dst = *(u16 *)(ul) (src + off) */
|
case BPF_LDX | BPF_MEM | BPF_H: /* dst = *(u16 *)(ul) (src + off) */
|
||||||
EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
|
|
||||||
if (!fp->aux->verifier_zext)
|
|
||||||
EMIT(PPC_RAW_LI(dst_reg_h, 0));
|
|
||||||
break;
|
|
||||||
case BPF_LDX | BPF_MEM | BPF_W: /* dst = *(u32 *)(ul) (src + off) */
|
case BPF_LDX | BPF_MEM | BPF_W: /* dst = *(u32 *)(ul) (src + off) */
|
||||||
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
|
|
||||||
if (!fp->aux->verifier_zext)
|
|
||||||
EMIT(PPC_RAW_LI(dst_reg_h, 0));
|
|
||||||
break;
|
|
||||||
case BPF_LDX | BPF_MEM | BPF_DW: /* dst = *(u64 *)(ul) (src + off) */
|
case BPF_LDX | BPF_MEM | BPF_DW: /* dst = *(u64 *)(ul) (src + off) */
|
||||||
EMIT(PPC_RAW_LWZ(dst_reg_h, src_reg, off));
|
switch (size) {
|
||||||
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off + 4));
|
case BPF_B:
|
||||||
|
EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_H:
|
||||||
|
EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_W:
|
||||||
|
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_DW:
|
||||||
|
EMIT(PPC_RAW_LWZ(dst_reg_h, src_reg, off));
|
||||||
|
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off + 4));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size != BPF_DW && !fp->aux->verifier_zext)
|
||||||
|
EMIT(PPC_RAW_LI(dst_reg_h, 0));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
|
|||||||
u32 code = insn[i].code;
|
u32 code = insn[i].code;
|
||||||
u32 dst_reg = b2p[insn[i].dst_reg];
|
u32 dst_reg = b2p[insn[i].dst_reg];
|
||||||
u32 src_reg = b2p[insn[i].src_reg];
|
u32 src_reg = b2p[insn[i].src_reg];
|
||||||
|
u32 size = BPF_SIZE(code);
|
||||||
s16 off = insn[i].off;
|
s16 off = insn[i].off;
|
||||||
s32 imm = insn[i].imm;
|
s32 imm = insn[i].imm;
|
||||||
bool func_addr_fixed;
|
bool func_addr_fixed;
|
||||||
@@ -778,25 +779,29 @@ emit_clear:
|
|||||||
*/
|
*/
|
||||||
/* dst = *(u8 *)(ul) (src + off) */
|
/* dst = *(u8 *)(ul) (src + off) */
|
||||||
case BPF_LDX | BPF_MEM | BPF_B:
|
case BPF_LDX | BPF_MEM | BPF_B:
|
||||||
EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
|
|
||||||
if (insn_is_zext(&insn[i + 1]))
|
|
||||||
addrs[++i] = ctx->idx * 4;
|
|
||||||
break;
|
|
||||||
/* dst = *(u16 *)(ul) (src + off) */
|
/* dst = *(u16 *)(ul) (src + off) */
|
||||||
case BPF_LDX | BPF_MEM | BPF_H:
|
case BPF_LDX | BPF_MEM | BPF_H:
|
||||||
EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
|
|
||||||
if (insn_is_zext(&insn[i + 1]))
|
|
||||||
addrs[++i] = ctx->idx * 4;
|
|
||||||
break;
|
|
||||||
/* dst = *(u32 *)(ul) (src + off) */
|
/* dst = *(u32 *)(ul) (src + off) */
|
||||||
case BPF_LDX | BPF_MEM | BPF_W:
|
case BPF_LDX | BPF_MEM | BPF_W:
|
||||||
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
|
|
||||||
if (insn_is_zext(&insn[i + 1]))
|
|
||||||
addrs[++i] = ctx->idx * 4;
|
|
||||||
break;
|
|
||||||
/* dst = *(u64 *)(ul) (src + off) */
|
/* dst = *(u64 *)(ul) (src + off) */
|
||||||
case BPF_LDX | BPF_MEM | BPF_DW:
|
case BPF_LDX | BPF_MEM | BPF_DW:
|
||||||
PPC_BPF_LL(dst_reg, src_reg, off);
|
switch (size) {
|
||||||
|
case BPF_B:
|
||||||
|
EMIT(PPC_RAW_LBZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_H:
|
||||||
|
EMIT(PPC_RAW_LHZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_W:
|
||||||
|
EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off));
|
||||||
|
break;
|
||||||
|
case BPF_DW:
|
||||||
|
PPC_BPF_LL(dst_reg, src_reg, off);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size != BPF_DW && insn_is_zext(&insn[i + 1]))
|
||||||
|
addrs[++i] = ctx->idx * 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user