On 31.08.2026 12:46 PM, Saket Kumar Bhaskar wrote:
From: Abhishek Dubey <[email protected]>

Verifier testcase result for tailcalls:

# ./test_progs -t verifier_tailcall

#618/1   verifier_tailcall/invalid map type for tail call:OK

#618/2   verifier_tailcall/invalid map type for tail call @unpriv:OK

#618     verifier_tailcall:OK

#619/1   verifier_tailcall_jit/main:OK

#619     verifier_tailcall_jit:OK

Summary: 2/3 PASSED, 0 SKIPPED, 0 FAILED

Signed-off-by: Abhishek Dubey <[email protected]>
Signed-off-by: Saket Kumar Bhaskar <[email protected]>
Tested-by: Yeswanth Krishna Tellakula <[email protected]>
Tested-by: R Nageswara Sastry <[email protected]>

System: ppc64le LPAR (IBM POWER), Linux 7.3-rc2
---
  .../bpf/progs/verifier_tailcall_jit.c         | 78 +++++++++++++++++++
  1 file changed, 78 insertions(+)

diff --git a/tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c 
b/tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c
index 48fa34d2959f..9880ce4f1931 100644
--- a/tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c
+++ b/tools/testing/selftests/bpf/progs/verifier_tailcall_jit.c
@@ -91,6 +91,84 @@ __jited("       popq    %rax")
  __jited("        jmp     {{.*}}")           /* jump to tail call tgt   */
  __jited("L0:     leave")
  __jited("        {{(retq|jmp     0x)}}")            /* return or jump to 
rethunk */
+__arch_powerpc64
+/* program entry for main(), regular function prologue */
+__jited(" nop")
+__jited("...")                          /* ld 2, 16(13) absent with 
CONFIG_PPC_KERNEL_PCREL */
+__jited(" li 9, 0")
+__jited(" std 9, -8(1)")
+__jited(" mflr 0")
+__jited(" std 0, 16(1)")
+__jited(" stdu 1, {{.*}}(1)")
+/*
+ * load address and call sub() via count register
+ *
+ * Address materialization differs between PCREL and non-PCREL kernels.
+ * Skip the address generation sequence and verify only that the call
+ * target is loaded into CTR before branching.
+ */
+__jited("...")
+__jited("...")
+__jited("...")
+__jited("...")
+__jited("...")
+__jited("...")
+__jited(" mtctr {{.*}}")
+__jited("...")
+__jited(" bctrl")
+__jited(" mr      8, 3")
+__jited(" li 8, 0")
+__jited(" addi 1, 1, {{.*}}")
+__jited(" ld 0, 16(1)")
+__jited(" mtlr 0")
+__jited(" mr      3, 8")
+__jited(" blr")
+__jited("...")
+__jited("func #1")
+/* subprogram entry for sub() */
+__jited(" nop")
+__jited("...")                          /* ld 2, 16(13) absent with 
CONFIG_PPC_KERNEL_PCREL */
+/* tail call prologue for subprogram */
+__jited(" ld 10, 0(1)")
+__jited(" ld 9, -8(10)")
+__jited(" cmpldi  9, 33")
+__jited(" bt      {{.*}}, {{.*}}")
+__jited(" addi 9, 10, -8")
+__jited(" std 9, -8(1)")
+__jited(" lis {{.*}}, {{.*}}")
+__jited(" sldi {{.*}}, {{.*}}, 32")
+__jited(" oris {{.*}}, {{.*}}, {{.*}}")
+__jited(" ori {{.*}}, {{.*}}, {{.*}}")
+__jited(" li {{.*}}, 0")
+__jited(" lwz 9, {{.*}}({{.*}})")
+__jited(" slwi {{.*}}, {{.*}}, 0")
+__jited(" cmplw   {{.*}}, 9")
+__jited(" bf      0, {{.*}}")
+/* bpf_tail_call implementation */
+__jited(" ld 9, -8(1)")
+__jited(" cmpldi  9, 33")
+__jited(" bf      {{.*}}, {{.*}}")
+__jited(" ld 9, 0(9)")
+__jited(" cmpldi  9, 33")
+__jited(" bt      {{.*}}, {{.*}}")
+__jited(" addi 9, 9, 1")
+__jited(" mulli 10, {{.*}}, 8")
+__jited(" add 10, 10, {{.*}}")
+__jited(" ld 10, {{.*}}(10)")
+__jited(" cmpldi  10, 0")
+__jited(" bt      {{.*}}, {{.*}}")
+__jited(" ld 10, {{.*}}(10)")
+__jited(" addi 10, 10, {{.*}}")    /* offset depends on 
CONFIG_PPC_KERNEL_PCREL */
+__jited(" mtctr 10")
+__jited(" ld 10, -8(1)")
+__jited(" cmpldi  10, 33")
+__jited(" bt      {{.*}}, {{.*}}")
+__jited(" addi 10, 1, -8")
+__jited(" std 9, 0(10)")
+__jited(" bctr")
+__jited(" mr      3, 8")
+__jited(" blr")
+
  SEC("tc")
  __naked int main(void)
  {

--
Thanks and Regards
R.Nageswara Sastry


Reply via email to