bpf_jit_emit_probe_mem_store() is introduced to emit instructions for
storing memory values depending on the size (byte, halfword,
word, doubleword).

Signed-off-by: Saket Kumar Bhaskar <sk...@linux.ibm.com>
---
 arch/powerpc/net/bpf_jit_comp64.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/arch/powerpc/net/bpf_jit_comp64.c 
b/arch/powerpc/net/bpf_jit_comp64.c
index 025524378443..489de21fe3d6 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -409,6 +409,36 @@ asm (
 "              blr                             ;"
 );
 
+static int bpf_jit_emit_probe_mem_store(struct codegen_context *ctx, u32 
src_reg, s16 off,
+                                       u32 code, u32 *image)
+{
+       u32 tmp1_reg = bpf_to_ppc(TMP_REG_1);
+       u32 tmp2_reg = bpf_to_ppc(TMP_REG_2);
+
+       switch (BPF_SIZE(code)) {
+       case BPF_B:
+               EMIT(PPC_RAW_STB(src_reg, tmp1_reg, off));
+               break;
+       case BPF_H:
+               EMIT(PPC_RAW_STH(src_reg, tmp1_reg, off));
+               break;
+       case BPF_W:
+               EMIT(PPC_RAW_STW(src_reg, tmp1_reg, off));
+               break;
+       case BPF_DW:
+               if (off % 4) {
+                       EMIT(PPC_RAW_LI(tmp2_reg, off));
+                       EMIT(PPC_RAW_STDX(src_reg, tmp1_reg, tmp2_reg));
+               } else {
+                       EMIT(PPC_RAW_STD(src_reg, tmp1_reg, off));
+               }
+               break;
+       default:
+               return -EINVAL;
+       }
+       return 0;
+}
+
 static int emit_atomic_ld_st(const struct bpf_insn insn, struct 
codegen_context *ctx, u32 *image)
 {
        u32 code = insn.code;
-- 
2.43.5


Reply via email to