powerpc/bpf: Use bctrl for making function calls
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Wed, 9 Jun 2021 09:00:24 +0000 (14:30 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 25 Jun 2021 04:47:19 +0000 (14:47 +1000)
blrl corrupts the link stack. Instead use bctrl when making function
calls from BPF programs.

Reported-by: Anton Blanchard <anton@ozlabs.org>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210609090024.1446800-1-naveen.n.rao@linux.vnet.ibm.com
arch/powerpc/net/bpf_jit_comp32.c
arch/powerpc/net/bpf_jit_comp64.c

index 92e17fbaaabb2040b2d62620f42ca5a6ef7e7a4b..cbe5b399ed869dc9e547bbf406168f9c6c37b6ad 100644 (file)
@@ -195,8 +195,8 @@ void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 fun
                /* Load function address into r0 */
                EMIT(PPC_RAW_LIS(_R0, IMM_H(func)));
                EMIT(PPC_RAW_ORI(_R0, _R0, IMM_L(func)));
-               EMIT(PPC_RAW_MTLR(_R0));
-               EMIT(PPC_RAW_BLRL());
+               EMIT(PPC_RAW_MTCTR(_R0));
+               EMIT(PPC_RAW_BCTRL());
        }
 }
 
index 7ec9c852f105e1ca2ac2367d525351b62afca6d7..5cad5b5a7e97745b19391a2df0f803dc360bc0ac 100644 (file)
@@ -153,8 +153,8 @@ static void bpf_jit_emit_func_call_hlp(u32 *image, struct codegen_context *ctx,
        PPC_LI64(b2p[TMP_REG_2], func);
        /* Load actual entry point from function descriptor */
        PPC_BPF_LL(b2p[TMP_REG_1], b2p[TMP_REG_2], 0);
-       /* ... and move it to LR */
-       EMIT(PPC_RAW_MTLR(b2p[TMP_REG_1]));
+       /* ... and move it to CTR */
+       EMIT(PPC_RAW_MTCTR(b2p[TMP_REG_1]));
        /*
         * Load TOC from function descriptor at offset 8.
         * We can clobber r2 since we get called through a
@@ -165,9 +165,9 @@ static void bpf_jit_emit_func_call_hlp(u32 *image, struct codegen_context *ctx,
 #else
        /* We can clobber r12 */
        PPC_FUNC_ADDR(12, func);
-       EMIT(PPC_RAW_MTLR(12));
+       EMIT(PPC_RAW_MTCTR(12));
 #endif
-       EMIT(PPC_RAW_BLRL());
+       EMIT(PPC_RAW_BCTRL());
 }
 
 void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func)
@@ -202,8 +202,8 @@ void bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 fun
        PPC_BPF_LL(12, 12, 0);
 #endif
 
-       EMIT(PPC_RAW_MTLR(12));
-       EMIT(PPC_RAW_BLRL());
+       EMIT(PPC_RAW_MTCTR(12));
+       EMIT(PPC_RAW_BCTRL());
 }
 
 static void bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 out)