blrl corrupts the link stack. Instead use bctrl when making function
calls from BPF programs.

Reported-by: Anton Blanchard <an...@ozlabs.org>
Signed-off-by: Naveen N. Rao <naveen.n....@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/ppc-opcode.h |  1 +
 arch/powerpc/net/bpf_jit_comp32.c     |  4 ++--
 arch/powerpc/net/bpf_jit_comp64.c     | 12 ++++++------
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/include/asm/ppc-opcode.h 
b/arch/powerpc/include/asm/ppc-opcode.h
index ac41776661e963..1abacb8417d562 100644
--- a/arch/powerpc/include/asm/ppc-opcode.h
+++ b/arch/powerpc/include/asm/ppc-opcode.h
@@ -451,6 +451,7 @@
 #define PPC_RAW_MTLR(r)                        (0x7c0803a6 | ___PPC_RT(r))
 #define PPC_RAW_MFLR(t)                        (PPC_INST_MFLR | ___PPC_RT(t))
 #define PPC_RAW_BCTR()                 (PPC_INST_BCTR)
+#define PPC_RAW_BCTRL()                        (PPC_INST_BCTRL)
 #define PPC_RAW_MTCTR(r)               (PPC_INST_MTCTR | ___PPC_RT(r))
 #define PPC_RAW_ADDI(d, a, i)          (PPC_INST_ADDI | ___PPC_RT(d) | 
___PPC_RA(a) | IMM_L(i))
 #define PPC_RAW_LI(r, i)               PPC_RAW_ADDI(r, 0, i)
diff --git a/arch/powerpc/net/bpf_jit_comp32.c 
b/arch/powerpc/net/bpf_jit_comp32.c
index bbb16099e8c7fa..40ab50bea61c02 100644
--- a/arch/powerpc/net/bpf_jit_comp32.c
+++ b/arch/powerpc/net/bpf_jit_comp32.c
@@ -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(__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());
+               EMIT(PPC_RAW_MTCTR(__REG_R0));
+               EMIT(PPC_RAW_BCTRL());
        }
 }
 
diff --git a/arch/powerpc/net/bpf_jit_comp64.c 
b/arch/powerpc/net/bpf_jit_comp64.c
index 57a8c1153851a0..ae9a6532be6ad4 100644
--- a/arch/powerpc/net/bpf_jit_comp64.c
+++ b/arch/powerpc/net/bpf_jit_comp64.c
@@ -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)

base-commit: 112f47a1484ddca610b70cbe4a99f0d0f1701daf
-- 
2.31.1

Reply via email to