1 {
2 "runtime/jit: tail_call within bounds, prog once",
3 .insns = {
4 BPF_MOV64_IMM(BPF_REG_3, 0),
5 BPF_LD_MAP_FD(BPF_REG_2, 0),
6 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
7 BPF_MOV64_IMM(BPF_REG_0, 1),
8 BPF_EXIT_INSN(),
9 },
10 .fixup_prog1 = { 1 },
11 .result = ACCEPT,
12 .retval = 42,
13 },
14 {
15 "runtime/jit: tail_call within bounds, prog loop",
16 .insns = {
17 BPF_MOV64_IMM(BPF_REG_3, 1),
18 BPF_LD_MAP_FD(BPF_REG_2, 0),
19 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
20 BPF_MOV64_IMM(BPF_REG_0, 1),
21 BPF_EXIT_INSN(),
22 },
23 .fixup_prog1 = { 1 },
24 .result = ACCEPT,
25 .retval = 41,
26 },
27 {
28 "runtime/jit: tail_call within bounds, no prog",
29 .insns = {
30 BPF_MOV64_IMM(BPF_REG_3, 2),
31 BPF_LD_MAP_FD(BPF_REG_2, 0),
32 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
33 BPF_MOV64_IMM(BPF_REG_0, 1),
34 BPF_EXIT_INSN(),
35 },
36 .fixup_prog1 = { 1 },
37 .result = ACCEPT,
38 .retval = 1,
39 },
40 {
41 "runtime/jit: tail_call out of bounds",
42 .insns = {
43 BPF_MOV64_IMM(BPF_REG_3, 256),
44 BPF_LD_MAP_FD(BPF_REG_2, 0),
45 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
46 BPF_MOV64_IMM(BPF_REG_0, 2),
47 BPF_EXIT_INSN(),
48 },
49 .fixup_prog1 = { 1 },
50 .result = ACCEPT,
51 .retval = 2,
52 },
53 {
54 "runtime/jit: pass negative index to tail_call",
55 .insns = {
56 BPF_MOV64_IMM(BPF_REG_3, -1),
57 BPF_LD_MAP_FD(BPF_REG_2, 0),
58 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
59 BPF_MOV64_IMM(BPF_REG_0, 2),
60 BPF_EXIT_INSN(),
61 },
62 .fixup_prog1 = { 1 },
63 .result = ACCEPT,
64 .retval = 2,
65 },
66 {
67 "runtime/jit: pass > 32bit index to tail_call",
68 .insns = {
69 BPF_LD_IMM64(BPF_REG_3, 0x100000000ULL),
70 BPF_LD_MAP_FD(BPF_REG_2, 0),
71 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_tail_call),
72 BPF_MOV64_IMM(BPF_REG_0, 2),
73 BPF_EXIT_INSN(),
74 },
75 .fixup_prog1 = { 2 },
76 .result = ACCEPT,
77 .retval = 42,
78
79 .retval_unpriv = 2,
80 },