bpf, tests: Add load store test case for tail call
authorXu Kuohai <xukuohai@huawei.com>
Mon, 21 Mar 2022 15:28:52 +0000 (11:28 -0400)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 31 Mar 2022 22:27:52 +0000 (00:27 +0200)
Add test case to enusre that the caller and callee's fp offsets are
correct during tail call (mainly asserting for arm64 JIT).

Tested on both big-endian and little-endian arm64 qemu, result:

 test_bpf: Summary: 1026 PASSED, 0 FAILED, [1014/1014 JIT'ed]
 test_bpf: test_tail_calls: Summary: 10 PASSED, 0 FAILED, [10/10 JIT'ed]
 test_bpf: test_skb_segment: Summary: 2 PASSED, 0 FAILED

Signed-off-by: Xu Kuohai <xukuohai@huawei.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20220321152852.2334294-6-xukuohai@huawei.com
lib/test_bpf.c

index aa0c7c6..2a7836e 100644 (file)
@@ -14951,6 +14951,36 @@ static struct tail_call_test tail_call_tests[] = {
                .result = 10,
        },
        {
+               "Tail call load/store leaf",
+               .insns = {
+                       BPF_ALU64_IMM(BPF_MOV, R1, 1),
+                       BPF_ALU64_IMM(BPF_MOV, R2, 2),
+                       BPF_ALU64_REG(BPF_MOV, R3, BPF_REG_FP),
+                       BPF_STX_MEM(BPF_DW, R3, R1, -8),
+                       BPF_STX_MEM(BPF_DW, R3, R2, -16),
+                       BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -8),
+                       BPF_JMP_REG(BPF_JNE, R0, R1, 3),
+                       BPF_LDX_MEM(BPF_DW, R0, BPF_REG_FP, -16),
+                       BPF_JMP_REG(BPF_JNE, R0, R2, 1),
+                       BPF_ALU64_IMM(BPF_MOV, R0, 0),
+                       BPF_EXIT_INSN(),
+               },
+               .result = 0,
+               .stack_depth = 32,
+       },
+       {
+               "Tail call load/store",
+               .insns = {
+                       BPF_ALU64_IMM(BPF_MOV, R0, 3),
+                       BPF_STX_MEM(BPF_DW, BPF_REG_FP, R0, -8),
+                       TAIL_CALL(-1),
+                       BPF_ALU64_IMM(BPF_MOV, R0, -1),
+                       BPF_EXIT_INSN(),
+               },
+               .result = 0,
+               .stack_depth = 16,
+       },
+       {
                "Tail call error path, max count reached",
                .insns = {
                        BPF_LDX_MEM(BPF_W, R2, R1, 0),