1f8acfdd0SEduard Zingerman #define BTF_TYPES \
2f8acfdd0SEduard Zingerman 	.btf_strings = "\0int\0i\0ctx\0callback\0main\0", \
3f8acfdd0SEduard Zingerman 	.btf_types = { \
4f8acfdd0SEduard Zingerman 	/* 1: int   */ BTF_TYPE_INT_ENC(1, BTF_INT_SIGNED, 0, 32, 4), \
5f8acfdd0SEduard Zingerman 	/* 2: int*  */ BTF_PTR_ENC(1), \
6f8acfdd0SEduard Zingerman 	/* 3: void* */ BTF_PTR_ENC(0), \
7f8acfdd0SEduard Zingerman 	/* 4: int __(void*) */ BTF_FUNC_PROTO_ENC(1, 1), \
8f8acfdd0SEduard Zingerman 		BTF_FUNC_PROTO_ARG_ENC(7, 3), \
9f8acfdd0SEduard Zingerman 	/* 5: int __(int, int*) */ BTF_FUNC_PROTO_ENC(1, 2), \
10f8acfdd0SEduard Zingerman 		BTF_FUNC_PROTO_ARG_ENC(5, 1), \
11f8acfdd0SEduard Zingerman 		BTF_FUNC_PROTO_ARG_ENC(7, 2), \
12f8acfdd0SEduard Zingerman 	/* 6: main      */ BTF_FUNC_ENC(20, 4), \
13f8acfdd0SEduard Zingerman 	/* 7: callback  */ BTF_FUNC_ENC(11, 5), \
14f8acfdd0SEduard Zingerman 	BTF_END_RAW \
15f8acfdd0SEduard Zingerman 	}
16f8acfdd0SEduard Zingerman 
17f8acfdd0SEduard Zingerman #define MAIN_TYPE	6
18f8acfdd0SEduard Zingerman #define CALLBACK_TYPE	7
19f8acfdd0SEduard Zingerman 
20f8acfdd0SEduard Zingerman /* can't use BPF_CALL_REL, jit_subprogs adjusts IMM & OFF
21f8acfdd0SEduard Zingerman  * fields for pseudo calls
22f8acfdd0SEduard Zingerman  */
23f8acfdd0SEduard Zingerman #define PSEUDO_CALL_INSN() \
24f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_CALL, \
25f8acfdd0SEduard Zingerman 		     INSN_OFF_MASK, INSN_IMM_MASK)
26f8acfdd0SEduard Zingerman 
27f8acfdd0SEduard Zingerman /* can't use BPF_FUNC_loop constant,
28f8acfdd0SEduard Zingerman  * do_mix_fixups adjusts the IMM field
29f8acfdd0SEduard Zingerman  */
30f8acfdd0SEduard Zingerman #define HELPER_CALL_INSN() \
31f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, INSN_OFF_MASK, INSN_IMM_MASK)
32f8acfdd0SEduard Zingerman 
33f8acfdd0SEduard Zingerman {
34f8acfdd0SEduard Zingerman 	"inline simple bpf_loop call",
35f8acfdd0SEduard Zingerman 	.insns = {
36f8acfdd0SEduard Zingerman 	/* main */
37f8acfdd0SEduard Zingerman 	/* force verifier state branching to verify logic on first and
38f8acfdd0SEduard Zingerman 	 * subsequent bpf_loop insn processing steps
39f8acfdd0SEduard Zingerman 	 */
40f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
41f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 777, 2),
42f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
43f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
44f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 2),
45f8acfdd0SEduard Zingerman 
46f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 6),
47f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
48f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
49f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
50f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
51f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
52f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
53f8acfdd0SEduard Zingerman 	/* callback */
54f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
55f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
56f8acfdd0SEduard Zingerman 	},
57f8acfdd0SEduard Zingerman 	.expected_insns = { PSEUDO_CALL_INSN() },
58f8acfdd0SEduard Zingerman 	.unexpected_insns = { HELPER_CALL_INSN() },
59f8acfdd0SEduard Zingerman 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
60*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
61f8acfdd0SEduard Zingerman 	.result = ACCEPT,
62f8acfdd0SEduard Zingerman 	.runs = 0,
63f8acfdd0SEduard Zingerman 	.func_info = { { 0, MAIN_TYPE }, { 12, CALLBACK_TYPE } },
64f8acfdd0SEduard Zingerman 	.func_info_cnt = 2,
65f8acfdd0SEduard Zingerman 	BTF_TYPES
66f8acfdd0SEduard Zingerman },
67f8acfdd0SEduard Zingerman {
68f8acfdd0SEduard Zingerman 	"don't inline bpf_loop call, flags non-zero",
69f8acfdd0SEduard Zingerman 	.insns = {
70f8acfdd0SEduard Zingerman 	/* main */
71f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
72f8acfdd0SEduard Zingerman 	BPF_ALU64_REG(BPF_MOV, BPF_REG_6, BPF_REG_0),
73f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
74f8acfdd0SEduard Zingerman 	BPF_ALU64_REG(BPF_MOV, BPF_REG_7, BPF_REG_0),
75f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JNE, BPF_REG_6, 0, 9),
76f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
77f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0, 0),
78f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
79f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 7),
80f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
81f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
82f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
83f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
84f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
85f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 1),
86f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JA, 0, 0, -10),
87f8acfdd0SEduard Zingerman 	/* callback */
88f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
89f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
90f8acfdd0SEduard Zingerman 	},
91f8acfdd0SEduard Zingerman 	.expected_insns = { HELPER_CALL_INSN() },
92f8acfdd0SEduard Zingerman 	.unexpected_insns = { PSEUDO_CALL_INSN() },
93f8acfdd0SEduard Zingerman 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
94*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
95f8acfdd0SEduard Zingerman 	.result = ACCEPT,
96f8acfdd0SEduard Zingerman 	.runs = 0,
97f8acfdd0SEduard Zingerman 	.func_info = { { 0, MAIN_TYPE }, { 16, CALLBACK_TYPE } },
98f8acfdd0SEduard Zingerman 	.func_info_cnt = 2,
99f8acfdd0SEduard Zingerman 	BTF_TYPES
100f8acfdd0SEduard Zingerman },
101f8acfdd0SEduard Zingerman {
102f8acfdd0SEduard Zingerman 	"don't inline bpf_loop call, callback non-constant",
103f8acfdd0SEduard Zingerman 	.insns = {
104f8acfdd0SEduard Zingerman 	/* main */
105f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_jiffies64),
106f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 777, 4), /* pick a random callback */
107f8acfdd0SEduard Zingerman 
108f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
109f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 10),
110f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
111f8acfdd0SEduard Zingerman 	BPF_JMP_IMM(BPF_JA, 0, 0, 3),
112f8acfdd0SEduard Zingerman 
113f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
114f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 8),
115f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
116f8acfdd0SEduard Zingerman 
117f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
118f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
119f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
120f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
121f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
122f8acfdd0SEduard Zingerman 	/* callback */
123f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
124f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
125f8acfdd0SEduard Zingerman 	/* callback #2 */
126f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
127f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
128f8acfdd0SEduard Zingerman 	},
129f8acfdd0SEduard Zingerman 	.expected_insns = { HELPER_CALL_INSN() },
130f8acfdd0SEduard Zingerman 	.unexpected_insns = { PSEUDO_CALL_INSN() },
131f8acfdd0SEduard Zingerman 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
132*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
133f8acfdd0SEduard Zingerman 	.result = ACCEPT,
134f8acfdd0SEduard Zingerman 	.runs = 0,
135f8acfdd0SEduard Zingerman 	.func_info = {
136f8acfdd0SEduard Zingerman 		{ 0, MAIN_TYPE },
137f8acfdd0SEduard Zingerman 		{ 14, CALLBACK_TYPE },
138f8acfdd0SEduard Zingerman 		{ 16, CALLBACK_TYPE }
139f8acfdd0SEduard Zingerman 	},
140f8acfdd0SEduard Zingerman 	.func_info_cnt = 3,
141f8acfdd0SEduard Zingerman 	BTF_TYPES
142f8acfdd0SEduard Zingerman },
143f8acfdd0SEduard Zingerman {
144f8acfdd0SEduard Zingerman 	"bpf_loop_inline and a dead func",
145f8acfdd0SEduard Zingerman 	.insns = {
146f8acfdd0SEduard Zingerman 	/* main */
147f8acfdd0SEduard Zingerman 
148f8acfdd0SEduard Zingerman 	/* A reference to callback #1 to make verifier count it as a func.
149f8acfdd0SEduard Zingerman 	 * This reference is overwritten below and callback #1 is dead.
150f8acfdd0SEduard Zingerman 	 */
151f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 9),
152f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
153f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
154f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 8),
155f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
156f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
157f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
158f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
159f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
160f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
161f8acfdd0SEduard Zingerman 	/* callback */
162f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
163f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
164f8acfdd0SEduard Zingerman 	/* callback #2 */
165f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
166f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
167f8acfdd0SEduard Zingerman 	},
168f8acfdd0SEduard Zingerman 	.expected_insns = { PSEUDO_CALL_INSN() },
169f8acfdd0SEduard Zingerman 	.unexpected_insns = { HELPER_CALL_INSN() },
170f8acfdd0SEduard Zingerman 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
171*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
172f8acfdd0SEduard Zingerman 	.result = ACCEPT,
173f8acfdd0SEduard Zingerman 	.runs = 0,
174f8acfdd0SEduard Zingerman 	.func_info = {
175f8acfdd0SEduard Zingerman 		{ 0, MAIN_TYPE },
176f8acfdd0SEduard Zingerman 		{ 10, CALLBACK_TYPE },
177f8acfdd0SEduard Zingerman 		{ 12, CALLBACK_TYPE }
178f8acfdd0SEduard Zingerman 	},
179f8acfdd0SEduard Zingerman 	.func_info_cnt = 3,
180f8acfdd0SEduard Zingerman 	BTF_TYPES
181f8acfdd0SEduard Zingerman },
182f8acfdd0SEduard Zingerman {
183f8acfdd0SEduard Zingerman 	"bpf_loop_inline stack locations for loop vars",
184f8acfdd0SEduard Zingerman 	.insns = {
185f8acfdd0SEduard Zingerman 	/* main */
186f8acfdd0SEduard Zingerman 	BPF_ST_MEM(BPF_W, BPF_REG_10, -12, 0x77),
187f8acfdd0SEduard Zingerman 	/* bpf_loop call #1 */
188f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 1),
189f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 22),
190f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
191f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
192f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
193f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
194f8acfdd0SEduard Zingerman 	/* bpf_loop call #2 */
195f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 2),
196f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 16),
197f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
198f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
199f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
200f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
201f8acfdd0SEduard Zingerman 	/* call func and exit */
202f8acfdd0SEduard Zingerman 	BPF_CALL_REL(2),
203f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
204f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
205f8acfdd0SEduard Zingerman 	/* func */
206f8acfdd0SEduard Zingerman 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -32, 0x55),
207f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_1, 2),
208f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_LD | BPF_IMM | BPF_DW, BPF_REG_2, BPF_PSEUDO_FUNC, 0, 6),
209f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(0, 0, 0, 0, 0),
210f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_3, 0),
211f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_4, 0),
212f8acfdd0SEduard Zingerman 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_loop),
213f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 0),
214f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
215f8acfdd0SEduard Zingerman 	/* callback */
216f8acfdd0SEduard Zingerman 	BPF_ALU64_IMM(BPF_MOV, BPF_REG_0, 1),
217f8acfdd0SEduard Zingerman 	BPF_EXIT_INSN(),
218f8acfdd0SEduard Zingerman 	},
219f8acfdd0SEduard Zingerman 	.expected_insns = {
220f8acfdd0SEduard Zingerman 	BPF_ST_MEM(BPF_W, BPF_REG_10, -12, 0x77),
221f8acfdd0SEduard Zingerman 	SKIP_INSNS(),
222f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -40),
223f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -32),
224f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -24),
225f8acfdd0SEduard Zingerman 	SKIP_INSNS(),
226f8acfdd0SEduard Zingerman 	/* offsets are the same as in the first call */
227f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -40),
228f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -32),
229f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -24),
230f8acfdd0SEduard Zingerman 	SKIP_INSNS(),
231f8acfdd0SEduard Zingerman 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -32, 0x55),
232f8acfdd0SEduard Zingerman 	SKIP_INSNS(),
233f8acfdd0SEduard Zingerman 	/* offsets differ from main because of different offset
234f8acfdd0SEduard Zingerman 	 * in BPF_ST_MEM instruction
235f8acfdd0SEduard Zingerman 	 */
236f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_6, -56),
237f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_7, -48),
238f8acfdd0SEduard Zingerman 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_8, -40),
239f8acfdd0SEduard Zingerman 	},
240f8acfdd0SEduard Zingerman 	.unexpected_insns = { HELPER_CALL_INSN() },
241f8acfdd0SEduard Zingerman 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
242*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
243f8acfdd0SEduard Zingerman 	.result = ACCEPT,
244f8acfdd0SEduard Zingerman 	.func_info = {
245f8acfdd0SEduard Zingerman 		{ 0, MAIN_TYPE },
246f8acfdd0SEduard Zingerman 		{ 16, MAIN_TYPE },
247f8acfdd0SEduard Zingerman 		{ 25, CALLBACK_TYPE },
248f8acfdd0SEduard Zingerman 	},
249f8acfdd0SEduard Zingerman 	.func_info_cnt = 3,
250f8acfdd0SEduard Zingerman 	BTF_TYPES
251f8acfdd0SEduard Zingerman },
25241188e9eSEduard Zingerman {
25341188e9eSEduard Zingerman 	"inline bpf_loop call in a big program",
25441188e9eSEduard Zingerman 	.insns = {},
25541188e9eSEduard Zingerman 	.fill_helper = bpf_fill_big_prog_with_loop_1,
25641188e9eSEduard Zingerman 	.expected_insns = { PSEUDO_CALL_INSN() },
25741188e9eSEduard Zingerman 	.unexpected_insns = { HELPER_CALL_INSN() },
25841188e9eSEduard Zingerman 	.result = ACCEPT,
259e3fa4735SKumar Kartikeya Dwivedi 	.prog_type = BPF_PROG_TYPE_TRACEPOINT,
260*0b50478fSTiezhu Yang 	.flags = F_NEEDS_JIT_ENABLED,
26141188e9eSEduard Zingerman 	.func_info = { { 0, MAIN_TYPE }, { 16, CALLBACK_TYPE } },
26241188e9eSEduard Zingerman 	.func_info_cnt = 2,
26341188e9eSEduard Zingerman 	BTF_TYPES
26441188e9eSEduard Zingerman },
265f8acfdd0SEduard Zingerman 
266f8acfdd0SEduard Zingerman #undef HELPER_CALL_INSN
267f8acfdd0SEduard Zingerman #undef PSEUDO_CALL_INSN
268f8acfdd0SEduard Zingerman #undef CALLBACK_TYPE
269f8acfdd0SEduard Zingerman #undef MAIN_TYPE
270f8acfdd0SEduard Zingerman #undef BTF_TYPES
271