1 /* Common tests */
2 {
3 	"map_kptr: BPF_ST imm != 0",
4 	.insns = {
5 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
6 	BPF_LD_MAP_FD(BPF_REG_6, 0),
7 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
8 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
9 	BPF_MOV64_IMM(BPF_REG_0, 0),
10 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
11 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
12 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
13 	BPF_EXIT_INSN(),
14 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 1),
15 	BPF_EXIT_INSN(),
16 	},
17 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
18 	.fixup_map_kptr = { 1 },
19 	.result = REJECT,
20 	.errstr = "BPF_ST imm must be 0 when storing to kptr at off=0",
21 },
22 {
23 	"map_kptr: size != bpf_size_to_bytes(BPF_DW)",
24 	.insns = {
25 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
26 	BPF_LD_MAP_FD(BPF_REG_6, 0),
27 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
28 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
29 	BPF_MOV64_IMM(BPF_REG_0, 0),
30 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
31 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
32 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
33 	BPF_EXIT_INSN(),
34 	BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0),
35 	BPF_EXIT_INSN(),
36 	},
37 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
38 	.fixup_map_kptr = { 1 },
39 	.result = REJECT,
40 	.errstr = "kptr access size must be BPF_DW",
41 },
42 {
43 	"map_kptr: map_value non-const var_off",
44 	.insns = {
45 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
46 	BPF_LD_MAP_FD(BPF_REG_6, 0),
47 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
48 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
49 	BPF_MOV64_IMM(BPF_REG_0, 0),
50 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
51 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
52 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
53 	BPF_EXIT_INSN(),
54 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
55 	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
56 	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
57 	BPF_EXIT_INSN(),
58 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
59 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
60 	BPF_EXIT_INSN(),
61 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
62 	BPF_EXIT_INSN(),
63 	BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
64 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0),
65 	BPF_EXIT_INSN(),
66 	},
67 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
68 	.fixup_map_kptr = { 1 },
69 	.result = REJECT,
70 	.errstr = "kptr access cannot have variable offset",
71 },
72 {
73 	"map_kptr: bpf_kptr_xchg non-const var_off",
74 	.insns = {
75 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
76 	BPF_LD_MAP_FD(BPF_REG_6, 0),
77 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
78 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
79 	BPF_MOV64_IMM(BPF_REG_0, 0),
80 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
81 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
82 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
83 	BPF_EXIT_INSN(),
84 	BPF_MOV64_REG(BPF_REG_3, BPF_REG_0),
85 	BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0),
86 	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
87 	BPF_EXIT_INSN(),
88 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_2, 0),
89 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
90 	BPF_EXIT_INSN(),
91 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
92 	BPF_EXIT_INSN(),
93 	BPF_ALU64_REG(BPF_ADD, BPF_REG_3, BPF_REG_2),
94 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_3),
95 	BPF_MOV64_IMM(BPF_REG_2, 0),
96 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
97 	BPF_EXIT_INSN(),
98 	},
99 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
100 	.fixup_map_kptr = { 1 },
101 	.result = REJECT,
102 	.errstr = "R1 doesn't have constant offset. kptr has to be at the constant offset",
103 },
104 {
105 	"map_kptr: unaligned boundary load/store",
106 	.insns = {
107 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
108 	BPF_LD_MAP_FD(BPF_REG_6, 0),
109 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
110 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
111 	BPF_MOV64_IMM(BPF_REG_0, 0),
112 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
113 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
114 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
115 	BPF_EXIT_INSN(),
116 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 7),
117 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0),
118 	BPF_EXIT_INSN(),
119 	},
120 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
121 	.fixup_map_kptr = { 1 },
122 	.result = REJECT,
123 	.errstr = "kptr access misaligned expected=0 off=7",
124 },
125 {
126 	"map_kptr: reject var_off != 0",
127 	.insns = {
128 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
129 	BPF_LD_MAP_FD(BPF_REG_6, 0),
130 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
131 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
132 	BPF_MOV64_IMM(BPF_REG_0, 0),
133 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
134 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
135 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
136 	BPF_EXIT_INSN(),
137 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
138 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
139 	BPF_EXIT_INSN(),
140 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 0),
141 	BPF_JMP_IMM(BPF_JLE, BPF_REG_2, 4, 1),
142 	BPF_EXIT_INSN(),
143 	BPF_JMP_IMM(BPF_JGE, BPF_REG_2, 0, 1),
144 	BPF_EXIT_INSN(),
145 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
146 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
147 	BPF_EXIT_INSN(),
148 	},
149 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
150 	.fixup_map_kptr = { 1 },
151 	.result = REJECT,
152 	.errstr = "variable untrusted_ptr_ access var_off=(0x0; 0x7) disallowed",
153 },
154 /* Tests for unreferened PTR_TO_BTF_ID */
155 {
156 	"map_kptr: unref: reject btf_struct_ids_match == false",
157 	.insns = {
158 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
159 	BPF_LD_MAP_FD(BPF_REG_6, 0),
160 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
161 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
162 	BPF_MOV64_IMM(BPF_REG_0, 0),
163 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
164 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
165 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
166 	BPF_EXIT_INSN(),
167 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 0),
168 	BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1),
169 	BPF_EXIT_INSN(),
170 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 4),
171 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0),
172 	BPF_EXIT_INSN(),
173 	},
174 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
175 	.fixup_map_kptr = { 1 },
176 	.result = REJECT,
177 	.errstr = "invalid kptr access, R1 type=untrusted_ptr_prog_test_ref_kfunc expected=ptr_prog_test",
178 },
179 {
180 	"map_kptr: unref: loaded pointer marked as untrusted",
181 	.insns = {
182 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
183 	BPF_LD_MAP_FD(BPF_REG_6, 0),
184 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
185 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
186 	BPF_MOV64_IMM(BPF_REG_0, 0),
187 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
188 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
189 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
190 	BPF_EXIT_INSN(),
191 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
192 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 0),
193 	BPF_EXIT_INSN(),
194 	},
195 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
196 	.fixup_map_kptr = { 1 },
197 	.result = REJECT,
198 	.errstr = "R0 invalid mem access 'untrusted_ptr_or_null_'",
199 },
200 {
201 	"map_kptr: unref: correct in kernel type size",
202 	.insns = {
203 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
204 	BPF_LD_MAP_FD(BPF_REG_6, 0),
205 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
206 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
207 	BPF_MOV64_IMM(BPF_REG_0, 0),
208 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
209 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
210 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
211 	BPF_EXIT_INSN(),
212 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
213 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
214 	BPF_EXIT_INSN(),
215 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 32),
216 	BPF_EXIT_INSN(),
217 	},
218 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
219 	.fixup_map_kptr = { 1 },
220 	.result = REJECT,
221 	.errstr = "access beyond struct prog_test_ref_kfunc at off 32 size 8",
222 },
223 {
224 	"map_kptr: unref: inherit PTR_UNTRUSTED on struct walk",
225 	.insns = {
226 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
227 	BPF_LD_MAP_FD(BPF_REG_6, 0),
228 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
229 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
230 	BPF_MOV64_IMM(BPF_REG_0, 0),
231 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
232 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
233 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
234 	BPF_EXIT_INSN(),
235 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
236 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
237 	BPF_EXIT_INSN(),
238 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 16),
239 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
240 	BPF_EXIT_INSN(),
241 	},
242 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
243 	.fixup_map_kptr = { 1 },
244 	.result = REJECT,
245 	.errstr = "R1 type=untrusted_ptr_ expected=percpu_ptr_",
246 },
247 {
248 	"map_kptr: unref: no reference state created",
249 	.insns = {
250 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
251 	BPF_LD_MAP_FD(BPF_REG_6, 0),
252 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
253 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
254 	BPF_MOV64_IMM(BPF_REG_0, 0),
255 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
256 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
257 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
258 	BPF_EXIT_INSN(),
259 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_0, 0),
260 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
261 	BPF_EXIT_INSN(),
262 	BPF_EXIT_INSN(),
263 	},
264 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
265 	.fixup_map_kptr = { 1 },
266 	.result = ACCEPT,
267 },
268 {
269 	"map_kptr: unref: bpf_kptr_xchg rejected",
270 	.insns = {
271 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
272 	BPF_LD_MAP_FD(BPF_REG_6, 0),
273 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
274 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
275 	BPF_MOV64_IMM(BPF_REG_0, 0),
276 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
277 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
278 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
279 	BPF_EXIT_INSN(),
280 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
281 	BPF_MOV64_IMM(BPF_REG_2, 0),
282 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
283 	BPF_MOV64_IMM(BPF_REG_0, 0),
284 	BPF_EXIT_INSN(),
285 	},
286 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
287 	.fixup_map_kptr = { 1 },
288 	.result = REJECT,
289 	.errstr = "off=0 kptr isn't referenced kptr",
290 },
291 {
292 	"map_kptr: unref: bpf_kfunc_call_test_kptr_get rejected",
293 	.insns = {
294 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
295 	BPF_LD_MAP_FD(BPF_REG_6, 0),
296 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
297 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
298 	BPF_MOV64_IMM(BPF_REG_0, 0),
299 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
300 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
301 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
302 	BPF_EXIT_INSN(),
303 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
304 	BPF_MOV64_IMM(BPF_REG_2, 0),
305 	BPF_MOV64_IMM(BPF_REG_3, 0),
306 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
307 	BPF_MOV64_IMM(BPF_REG_0, 0),
308 	BPF_EXIT_INSN(),
309 	},
310 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
311 	.fixup_map_kptr = { 1 },
312 	.result = REJECT,
313 	.errstr = "arg#0 no referenced kptr at map value offset=0",
314 	.fixup_kfunc_btf_id = {
315 		{ "bpf_kfunc_call_test_kptr_get", 13 },
316 	}
317 },
318 /* Tests for referenced PTR_TO_BTF_ID */
319 {
320 	"map_kptr: ref: loaded pointer marked as untrusted",
321 	.insns = {
322 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
323 	BPF_LD_MAP_FD(BPF_REG_6, 0),
324 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
325 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
326 	BPF_MOV64_IMM(BPF_REG_0, 0),
327 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
328 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
329 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
330 	BPF_EXIT_INSN(),
331 	BPF_MOV64_IMM(BPF_REG_1, 0),
332 	BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, 8),
333 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_this_cpu_ptr),
334 	BPF_EXIT_INSN(),
335 	},
336 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
337 	.fixup_map_kptr = { 1 },
338 	.result = REJECT,
339 	.errstr = "R1 type=untrusted_ptr_or_null_ expected=percpu_ptr_",
340 },
341 {
342 	"map_kptr: ref: reject off != 0",
343 	.insns = {
344 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
345 	BPF_LD_MAP_FD(BPF_REG_6, 0),
346 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
347 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
348 	BPF_MOV64_IMM(BPF_REG_0, 0),
349 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
350 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
351 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
352 	BPF_EXIT_INSN(),
353 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
354 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
355 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
356 	BPF_MOV64_IMM(BPF_REG_2, 0),
357 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
358 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
359 	BPF_EXIT_INSN(),
360 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
361 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
362 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
363 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
364 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
365 	BPF_EXIT_INSN(),
366 	},
367 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
368 	.fixup_map_kptr = { 1 },
369 	.result = REJECT,
370 	.errstr = "invalid kptr access, R2 type=ptr_prog_test_ref_kfunc expected=ptr_prog_test_member",
371 },
372 {
373 	"map_kptr: ref: reference state created and released on xchg",
374 	.insns = {
375 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
376 	BPF_LD_MAP_FD(BPF_REG_6, 0),
377 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
378 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
379 	BPF_MOV64_IMM(BPF_REG_0, 0),
380 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
381 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
382 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
383 	BPF_EXIT_INSN(),
384 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8),
385 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_0),
386 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_10),
387 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8),
388 	BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0),
389 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, BPF_PSEUDO_KFUNC_CALL, 0, 0),
390 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
391 	BPF_EXIT_INSN(),
392 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_7),
393 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
394 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_kptr_xchg),
395 	BPF_MOV64_IMM(BPF_REG_0, 0),
396 	BPF_EXIT_INSN(),
397 	},
398 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
399 	.fixup_map_kptr = { 1 },
400 	.result = REJECT,
401 	.errstr = "Unreleased reference id=5 alloc_insn=20",
402 	.fixup_kfunc_btf_id = {
403 		{ "bpf_kfunc_call_test_acquire", 15 },
404 	}
405 },
406 {
407 	"map_kptr: ref: reject STX",
408 	.insns = {
409 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
410 	BPF_LD_MAP_FD(BPF_REG_6, 0),
411 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
412 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
413 	BPF_MOV64_IMM(BPF_REG_0, 0),
414 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
415 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
416 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
417 	BPF_EXIT_INSN(),
418 	BPF_MOV64_REG(BPF_REG_1, 0),
419 	BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 8),
420 	BPF_EXIT_INSN(),
421 	},
422 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
423 	.fixup_map_kptr = { 1 },
424 	.result = REJECT,
425 	.errstr = "store to referenced kptr disallowed",
426 },
427 {
428 	"map_kptr: ref: reject ST",
429 	.insns = {
430 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
431 	BPF_LD_MAP_FD(BPF_REG_6, 0),
432 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
433 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
434 	BPF_MOV64_IMM(BPF_REG_0, 0),
435 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
436 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
437 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
438 	BPF_EXIT_INSN(),
439 	BPF_ST_MEM(BPF_DW, BPF_REG_0, 8, 0),
440 	BPF_EXIT_INSN(),
441 	},
442 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
443 	.fixup_map_kptr = { 1 },
444 	.result = REJECT,
445 	.errstr = "store to referenced kptr disallowed",
446 },
447 {
448 	"map_kptr: reject helper access to kptr",
449 	.insns = {
450 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
451 	BPF_LD_MAP_FD(BPF_REG_6, 0),
452 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
453 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4),
454 	BPF_MOV64_IMM(BPF_REG_0, 0),
455 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
456 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
457 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
458 	BPF_EXIT_INSN(),
459 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_6),
460 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 2),
461 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_0),
462 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_delete_elem),
463 	BPF_EXIT_INSN(),
464 	},
465 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
466 	.fixup_map_kptr = { 1 },
467 	.result = REJECT,
468 	.errstr = "kptr cannot be accessed indirectly by helper",
469 },
470