bpf powerpc: refactor JIT compiler code
authorHari Bathini <hbathini@linux.ibm.com>
Tue, 12 Oct 2021 12:30:51 +0000 (18:00 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 25 Nov 2021 00:25:31 +0000 (11:25 +1100)
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
arch/powerpc/net/bpf_jit_comp32.c
arch/powerpc/net/bpf_jit_comp64.c

index 903f945..8b2ac1c 100644 (file)
@@ -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_h = src_reg - 1;
                u32 tmp_reg = bpf_to_ppc(ctx, TMP_REG);
+               u32 size = BPF_SIZE(code);
                s16 off = insn[i].off;
                s32 imm = insn[i].imm;
                bool func_addr_fixed;
@@ -812,23 +813,27 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
                 * BPF_LDX
                 */
                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) */
-                       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) */
-                       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) */
-                       EMIT(PPC_RAW_LWZ(dst_reg_h, src_reg, off));
-                       EMIT(PPC_RAW_LWZ(dst_reg, src_reg, off + 4));
+                       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:
+                               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;
 
                /*
index b25bf9b..ad852f1 100644 (file)
@@ -311,6 +311,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context *
                u32 code = insn[i].code;
                u32 dst_reg = b2p[insn[i].dst_reg];
                u32 src_reg = b2p[insn[i].src_reg];
+               u32 size = BPF_SIZE(code);
                s16 off = insn[i].off;
                s32 imm = insn[i].imm;
                bool func_addr_fixed;
@@ -778,25 +779,29 @@ emit_clear:
                 */
                /* dst = *(u8 *)(ul) (src + off) */
                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) */
                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) */
                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) */
                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;
 
                /*