xref: /netbsd-src/tests/lib/libbpfjit/t_bpfjit.c (revision aad9773e38ed2370a628a6416e098f9008fc10a7)
1 /*	$NetBSD: t_bpfjit.c,v 1.8 2014/11/20 11:08:29 alnsn Exp $ */
2 
3 /*-
4  * Copyright (c) 2011-2012, 2014 Alexander Nasonov.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
22  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 __RCSID("$NetBSD: t_bpfjit.c,v 1.8 2014/11/20 11:08:29 alnsn Exp $");
34 
35 #include <atf-c.h>
36 #include <stdint.h>
37 #include <string.h>
38 
39 #include <net/bpf.h>
40 #include <net/bpfjit.h>
41 
42 static uint8_t deadbeef_at_5[16] = {
43 	0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
44 };
45 
46 static inline
47 unsigned int jitcall(bpfjit_func_t fn,
48     const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
49 {
50 	bpf_args_t args;
51 
52 	args.pkt = pkt;
53 	args.wirelen = wirelen;
54 	args.buflen = buflen;
55 
56 	return fn(NULL, &args);
57 }
58 
59 ATF_TC(libbpfjit_empty);
60 ATF_TC_HEAD(libbpfjit_empty, tc)
61 {
62 	atf_tc_set_md_var(tc, "descr",
63 	    "Test that JIT compilation of an empty bpf program fails");
64 }
65 
66 ATF_TC_BODY(libbpfjit_empty, tc)
67 {
68 	struct bpf_insn dummy;
69 
70 	ATF_CHECK(bpfjit_generate_code(NULL, &dummy, 0) == NULL);
71 }
72 
73 ATF_TC(libbpfjit_alu_add_k);
74 ATF_TC_HEAD(libbpfjit_alu_add_k, tc)
75 {
76 	atf_tc_set_md_var(tc, "descr",
77 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
78 }
79 
80 ATF_TC_BODY(libbpfjit_alu_add_k, tc)
81 {
82 	static struct bpf_insn insns[] = {
83 		BPF_STMT(BPF_LD+BPF_IMM, 3),
84 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
85 		BPF_STMT(BPF_RET+BPF_A, 0)
86 	};
87 
88 	bpfjit_func_t code;
89 	uint8_t pkt[1]; /* the program doesn't read any data */
90 
91 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
92 
93 	ATF_CHECK(bpf_validate(insns, insn_count));
94 
95 	code = bpfjit_generate_code(NULL, insns, insn_count);
96 	ATF_REQUIRE(code != NULL);
97 
98 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
99 
100 	bpfjit_free_code(code);
101 }
102 
103 ATF_TC(libbpfjit_alu_sub_k);
104 ATF_TC_HEAD(libbpfjit_alu_sub_k, tc)
105 {
106 	atf_tc_set_md_var(tc, "descr",
107 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
108 }
109 
110 ATF_TC_BODY(libbpfjit_alu_sub_k, tc)
111 {
112 	static struct bpf_insn insns[] = {
113 		BPF_STMT(BPF_LD+BPF_IMM, 1),
114 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
115 		BPF_STMT(BPF_RET+BPF_A, 0)
116 	};
117 
118 	bpfjit_func_t code;
119 	uint8_t pkt[1]; /* the program doesn't read any data */
120 
121 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
122 
123 	ATF_CHECK(bpf_validate(insns, insn_count));
124 
125 	code = bpfjit_generate_code(NULL, insns, insn_count);
126 	ATF_REQUIRE(code != NULL);
127 
128 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
129 
130 	bpfjit_free_code(code);
131 }
132 
133 ATF_TC(libbpfjit_alu_mul_k);
134 ATF_TC_HEAD(libbpfjit_alu_mul_k, tc)
135 {
136 	atf_tc_set_md_var(tc, "descr",
137 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
138 }
139 
140 ATF_TC_BODY(libbpfjit_alu_mul_k, tc)
141 {
142 	static struct bpf_insn insns[] = {
143 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
144 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
145 		BPF_STMT(BPF_RET+BPF_A, 0)
146 	};
147 
148 	bpfjit_func_t code;
149 	uint8_t pkt[1]; /* the program doesn't read any data */
150 
151 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
152 
153 	ATF_CHECK(bpf_validate(insns, insn_count));
154 
155 	code = bpfjit_generate_code(NULL, insns, insn_count);
156 	ATF_REQUIRE(code != NULL);
157 
158 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
159 
160 	bpfjit_free_code(code);
161 }
162 
163 ATF_TC(libbpfjit_alu_div0_k);
164 ATF_TC_HEAD(libbpfjit_alu_div0_k, tc)
165 {
166 	atf_tc_set_md_var(tc, "descr",
167 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
168 }
169 
170 ATF_TC_BODY(libbpfjit_alu_div0_k, tc)
171 {
172 	static struct bpf_insn insns[] = {
173 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
174 		BPF_STMT(BPF_RET+BPF_A, 0)
175 	};
176 
177 	bpfjit_func_t code;
178 	uint8_t pkt[1]; /* the program doesn't read any data */
179 
180 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
181 
182 	//ATF_CHECK(bpf_validate(insns, insn_count));
183 
184 	code = bpfjit_generate_code(NULL, insns, insn_count);
185 	ATF_REQUIRE(code != NULL);
186 
187 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
188 
189 	bpfjit_free_code(code);
190 }
191 
192 ATF_TC(libbpfjit_alu_div1_k);
193 ATF_TC_HEAD(libbpfjit_alu_div1_k, tc)
194 {
195 	atf_tc_set_md_var(tc, "descr",
196 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
197 }
198 
199 ATF_TC_BODY(libbpfjit_alu_div1_k, tc)
200 {
201 	static struct bpf_insn insns[] = {
202 		BPF_STMT(BPF_LD+BPF_IMM, 7),
203 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
204 		BPF_STMT(BPF_RET+BPF_A, 0)
205 	};
206 
207 	bpfjit_func_t code;
208 	uint8_t pkt[1]; /* the program doesn't read any data */
209 
210 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
211 
212 	ATF_CHECK(bpf_validate(insns, insn_count));
213 
214 	code = bpfjit_generate_code(NULL, insns, insn_count);
215 	ATF_REQUIRE(code != NULL);
216 
217 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
218 
219 	bpfjit_free_code(code);
220 }
221 
222 ATF_TC(libbpfjit_alu_div2_k);
223 ATF_TC_HEAD(libbpfjit_alu_div2_k, tc)
224 {
225 	atf_tc_set_md_var(tc, "descr",
226 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
227 }
228 
229 ATF_TC_BODY(libbpfjit_alu_div2_k, tc)
230 {
231 	static struct bpf_insn insns[] = {
232 		BPF_STMT(BPF_LD+BPF_IMM, 7),
233 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
234 		BPF_STMT(BPF_RET+BPF_A, 0)
235 	};
236 
237 	bpfjit_func_t code;
238 	uint8_t pkt[1]; /* the program doesn't read any data */
239 
240 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
241 
242 	ATF_CHECK(bpf_validate(insns, insn_count));
243 
244 	code = bpfjit_generate_code(NULL, insns, insn_count);
245 	ATF_REQUIRE(code != NULL);
246 
247 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
248 
249 	bpfjit_free_code(code);
250 }
251 
252 ATF_TC(libbpfjit_alu_div4_k);
253 ATF_TC_HEAD(libbpfjit_alu_div4_k, tc)
254 {
255 	atf_tc_set_md_var(tc, "descr",
256 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
257 }
258 
259 ATF_TC_BODY(libbpfjit_alu_div4_k, tc)
260 {
261 	static struct bpf_insn insns[] = {
262 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
263 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
264 		BPF_STMT(BPF_RET+BPF_A, 0)
265 	};
266 
267 	bpfjit_func_t code;
268 	uint8_t pkt[1]; /* the program doesn't read any data */
269 
270 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
271 
272 	ATF_CHECK(bpf_validate(insns, insn_count));
273 
274 	code = bpfjit_generate_code(NULL, insns, insn_count);
275 	ATF_REQUIRE(code != NULL);
276 
277 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
278 
279 	bpfjit_free_code(code);
280 }
281 
282 ATF_TC(libbpfjit_alu_div10_k);
283 ATF_TC_HEAD(libbpfjit_alu_div10_k, tc)
284 {
285 	atf_tc_set_md_var(tc, "descr",
286 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
287 }
288 
289 ATF_TC_BODY(libbpfjit_alu_div10_k, tc)
290 {
291 	static struct bpf_insn insns[] = {
292 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
293 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
294 		BPF_STMT(BPF_RET+BPF_A, 0)
295 	};
296 
297 	bpfjit_func_t code;
298 	uint8_t pkt[1]; /* the program doesn't read any data */
299 
300 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
301 
302 	ATF_CHECK(bpf_validate(insns, insn_count));
303 
304 	code = bpfjit_generate_code(NULL, insns, insn_count);
305 	ATF_REQUIRE(code != NULL);
306 
307 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
308 
309 	bpfjit_free_code(code);
310 }
311 
312 ATF_TC(libbpfjit_alu_div10000_k);
313 ATF_TC_HEAD(libbpfjit_alu_div10000_k, tc)
314 {
315 	atf_tc_set_md_var(tc, "descr",
316 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
317 }
318 
319 ATF_TC_BODY(libbpfjit_alu_div10000_k, tc)
320 {
321 	static struct bpf_insn insns[] = {
322 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
323 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
324 		BPF_STMT(BPF_RET+BPF_A, 0)
325 	};
326 
327 	bpfjit_func_t code;
328 	uint8_t pkt[1]; /* the program doesn't read any data */
329 
330 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
331 
332 	ATF_CHECK(bpf_validate(insns, insn_count));
333 
334 	code = bpfjit_generate_code(NULL, insns, insn_count);
335 	ATF_REQUIRE(code != NULL);
336 
337 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
338 
339 	bpfjit_free_code(code);
340 }
341 
342 ATF_TC(libbpfjit_alu_div7609801_k);
343 ATF_TC_HEAD(libbpfjit_alu_div7609801_k, tc)
344 {
345 	atf_tc_set_md_var(tc, "descr",
346 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
347 }
348 
349 ATF_TC_BODY(libbpfjit_alu_div7609801_k, tc)
350 {
351 	static struct bpf_insn insns[] = {
352 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
353 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
354 		BPF_STMT(BPF_RET+BPF_A, 0)
355 	};
356 
357 	bpfjit_func_t code;
358 	uint8_t pkt[1]; /* the program doesn't read any data */
359 
360 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
361 
362 	ATF_CHECK(bpf_validate(insns, insn_count));
363 
364 	code = bpfjit_generate_code(NULL, insns, insn_count);
365 	ATF_REQUIRE(code != NULL);
366 
367 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
368 
369 	bpfjit_free_code(code);
370 }
371 
372 ATF_TC(libbpfjit_alu_div80000000_k);
373 ATF_TC_HEAD(libbpfjit_alu_div80000000_k, tc)
374 {
375 	atf_tc_set_md_var(tc, "descr",
376 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
377 }
378 
379 ATF_TC_BODY(libbpfjit_alu_div80000000_k, tc)
380 {
381 	static struct bpf_insn insns[] = {
382 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
383 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
384 		BPF_STMT(BPF_RET+BPF_A, 0)
385 	};
386 
387 	bpfjit_func_t code;
388 	uint8_t pkt[1]; /* the program doesn't read any data */
389 
390 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
391 
392 	ATF_CHECK(bpf_validate(insns, insn_count));
393 
394 	code = bpfjit_generate_code(NULL, insns, insn_count);
395 	ATF_REQUIRE(code != NULL);
396 
397 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
398 
399 	bpfjit_free_code(code);
400 }
401 
402 ATF_TC(libbpfjit_alu_mod0_k);
403 ATF_TC_HEAD(libbpfjit_alu_mod0_k, tc)
404 {
405 	atf_tc_set_md_var(tc, "descr",
406 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0");
407 }
408 
409 ATF_TC_BODY(libbpfjit_alu_mod0_k, tc)
410 {
411 	static struct bpf_insn insns[] = {
412 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0),
413 		BPF_STMT(BPF_RET+BPF_A, 0)
414 	};
415 
416 	bpfjit_func_t code;
417 	uint8_t pkt[1]; /* the program doesn't read any data */
418 
419 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
420 
421 	//ATF_CHECK(bpf_validate(insns, insn_count));
422 
423 	code = bpfjit_generate_code(NULL, insns, insn_count);
424 	ATF_REQUIRE(code != NULL);
425 
426 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
427 
428 	bpfjit_free_code(code);
429 }
430 
431 ATF_TC(libbpfjit_alu_mod1_k);
432 ATF_TC_HEAD(libbpfjit_alu_mod1_k, tc)
433 {
434 	atf_tc_set_md_var(tc, "descr",
435 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1");
436 }
437 
438 ATF_TC_BODY(libbpfjit_alu_mod1_k, tc)
439 {
440 	static struct bpf_insn insns[] = {
441 		BPF_STMT(BPF_LD+BPF_IMM, 7),
442 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1),
443 		BPF_STMT(BPF_RET+BPF_A, 0)
444 	};
445 
446 	bpfjit_func_t code;
447 	uint8_t pkt[1]; /* the program doesn't read any data */
448 
449 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
450 
451 	ATF_CHECK(bpf_validate(insns, insn_count));
452 
453 	code = bpfjit_generate_code(NULL, insns, insn_count);
454 	ATF_REQUIRE(code != NULL);
455 
456 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
457 
458 	bpfjit_free_code(code);
459 }
460 
461 ATF_TC(libbpfjit_alu_mod2_k);
462 ATF_TC_HEAD(libbpfjit_alu_mod2_k, tc)
463 {
464 	atf_tc_set_md_var(tc, "descr",
465 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2");
466 }
467 
468 ATF_TC_BODY(libbpfjit_alu_mod2_k, tc)
469 {
470 	static struct bpf_insn insns[] = {
471 		BPF_STMT(BPF_LD+BPF_IMM, 7),
472 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2),
473 		BPF_STMT(BPF_RET+BPF_A, 0)
474 	};
475 
476 	bpfjit_func_t code;
477 	uint8_t pkt[1]; /* the program doesn't read any data */
478 
479 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
480 
481 	ATF_CHECK(bpf_validate(insns, insn_count));
482 
483 	code = bpfjit_generate_code(NULL, insns, insn_count);
484 	ATF_REQUIRE(code != NULL);
485 
486 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
487 
488 	bpfjit_free_code(code);
489 }
490 
491 ATF_TC(libbpfjit_alu_mod4_k);
492 ATF_TC_HEAD(libbpfjit_alu_mod4_k, tc)
493 {
494 	atf_tc_set_md_var(tc, "descr",
495 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4");
496 }
497 
498 ATF_TC_BODY(libbpfjit_alu_mod4_k, tc)
499 {
500 	static struct bpf_insn insns[] = {
501 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
502 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4),
503 		BPF_STMT(BPF_RET+BPF_A, 0)
504 	};
505 
506 	bpfjit_func_t code;
507 	uint8_t pkt[1]; /* the program doesn't read any data */
508 
509 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
510 
511 	ATF_CHECK(bpf_validate(insns, insn_count));
512 
513 	code = bpfjit_generate_code(NULL, insns, insn_count);
514 	ATF_REQUIRE(code != NULL);
515 
516 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
517 
518 	bpfjit_free_code(code);
519 }
520 
521 ATF_TC(libbpfjit_alu_mod10_k);
522 ATF_TC_HEAD(libbpfjit_alu_mod10_k, tc)
523 {
524 	atf_tc_set_md_var(tc, "descr",
525 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10");
526 }
527 
528 ATF_TC_BODY(libbpfjit_alu_mod10_k, tc)
529 {
530 	static struct bpf_insn insns[] = {
531 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
532 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10),
533 		BPF_STMT(BPF_RET+BPF_A, 0)
534 	};
535 
536 	bpfjit_func_t code;
537 	uint8_t pkt[1]; /* the program doesn't read any data */
538 
539 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
540 
541 	ATF_CHECK(bpf_validate(insns, insn_count));
542 
543 	code = bpfjit_generate_code(NULL, insns, insn_count);
544 	ATF_REQUIRE(code != NULL);
545 
546 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
547 
548 	bpfjit_free_code(code);
549 }
550 
551 ATF_TC(libbpfjit_alu_mod10000_k);
552 ATF_TC_HEAD(libbpfjit_alu_mod10000_k, tc)
553 {
554 	atf_tc_set_md_var(tc, "descr",
555 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10000");
556 }
557 
558 ATF_TC_BODY(libbpfjit_alu_mod10000_k, tc)
559 {
560 	static struct bpf_insn insns[] = {
561 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
562 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10000),
563 		BPF_STMT(BPF_RET+BPF_A, 0)
564 	};
565 
566 	bpfjit_func_t code;
567 	uint8_t pkt[1]; /* the program doesn't read any data */
568 
569 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
570 
571 	ATF_CHECK(bpf_validate(insns, insn_count));
572 
573 	code = bpfjit_generate_code(NULL, insns, insn_count);
574 	ATF_REQUIRE(code != NULL);
575 
576 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
577 
578 	bpfjit_free_code(code);
579 }
580 
581 ATF_TC(libbpfjit_alu_mod7609801_k);
582 ATF_TC_HEAD(libbpfjit_alu_mod7609801_k, tc)
583 {
584 	atf_tc_set_md_var(tc, "descr",
585 	    "Test JIT compilation of BPF_ALU+BPF_mod+BPF_K with k=7609801");
586 }
587 
588 ATF_TC_BODY(libbpfjit_alu_mod7609801_k, tc)
589 {
590 	static struct bpf_insn insns[] = {
591 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
592 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(7609801)),
593 		BPF_STMT(BPF_RET+BPF_A, 0)
594 	};
595 
596 	bpfjit_func_t code;
597 	uint8_t pkt[1]; /* the program doesn't read any data */
598 
599 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
600 
601 	ATF_CHECK(bpf_validate(insns, insn_count));
602 
603 	code = bpfjit_generate_code(NULL, insns, insn_count);
604 	ATF_REQUIRE(code != NULL);
605 
606 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
607 
608 	bpfjit_free_code(code);
609 }
610 
611 ATF_TC(libbpfjit_alu_mod80000000_k);
612 ATF_TC_HEAD(libbpfjit_alu_mod80000000_k, tc)
613 {
614 	atf_tc_set_md_var(tc, "descr",
615 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0x80000000");
616 }
617 
618 ATF_TC_BODY(libbpfjit_alu_mod80000000_k, tc)
619 {
620 	static struct bpf_insn insns[] = {
621 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
622 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(0x80000000)),
623 		BPF_STMT(BPF_RET+BPF_A, 0)
624 	};
625 
626 	bpfjit_func_t code;
627 	uint8_t pkt[1]; /* the program doesn't read any data */
628 
629 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
630 
631 	ATF_CHECK(bpf_validate(insns, insn_count));
632 
633 	code = bpfjit_generate_code(NULL, insns, insn_count);
634 	ATF_REQUIRE(code != NULL);
635 
636 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
637 
638 	bpfjit_free_code(code);
639 }
640 
641 ATF_TC(libbpfjit_alu_and_k);
642 ATF_TC_HEAD(libbpfjit_alu_and_k, tc)
643 {
644 	atf_tc_set_md_var(tc, "descr",
645 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
646 }
647 
648 ATF_TC_BODY(libbpfjit_alu_and_k, tc)
649 {
650 	static struct bpf_insn insns[] = {
651 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
652 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
653 		BPF_STMT(BPF_RET+BPF_A, 0)
654 	};
655 
656 	bpfjit_func_t code;
657 	uint8_t pkt[1]; /* the program doesn't read any data */
658 
659 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
660 
661 	ATF_CHECK(bpf_validate(insns, insn_count));
662 
663 	code = bpfjit_generate_code(NULL, insns, insn_count);
664 	ATF_REQUIRE(code != NULL);
665 
666 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
667 
668 	bpfjit_free_code(code);
669 }
670 
671 ATF_TC(libbpfjit_alu_or_k);
672 ATF_TC_HEAD(libbpfjit_alu_or_k, tc)
673 {
674 	atf_tc_set_md_var(tc, "descr",
675 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
676 }
677 
678 ATF_TC_BODY(libbpfjit_alu_or_k, tc)
679 {
680 	static struct bpf_insn insns[] = {
681 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
682 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
683 		BPF_STMT(BPF_RET+BPF_A, 0)
684 	};
685 
686 	bpfjit_func_t code;
687 	uint8_t pkt[1]; /* the program doesn't read any data */
688 
689 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
690 
691 	ATF_CHECK(bpf_validate(insns, insn_count));
692 
693 	code = bpfjit_generate_code(NULL, insns, insn_count);
694 	ATF_REQUIRE(code != NULL);
695 
696 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
697 
698 	bpfjit_free_code(code);
699 }
700 
701 ATF_TC(libbpfjit_alu_xor_k);
702 ATF_TC_HEAD(libbpfjit_alu_xor_k, tc)
703 {
704 	atf_tc_set_md_var(tc, "descr",
705 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K");
706 }
707 
708 ATF_TC_BODY(libbpfjit_alu_xor_k, tc)
709 {
710 	static struct bpf_insn insns[] = {
711 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
712 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0x0000b1e0),
713 		BPF_STMT(BPF_RET+BPF_A, 0)
714 	};
715 
716 	bpfjit_func_t code;
717 	uint8_t pkt[1]; /* the program doesn't read any data */
718 
719 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
720 
721 	ATF_CHECK(bpf_validate(insns, insn_count));
722 
723 	code = bpfjit_generate_code(NULL, insns, insn_count);
724 	ATF_REQUIRE(code != NULL);
725 
726 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
727 
728 	bpfjit_free_code(code);
729 }
730 
731 ATF_TC(libbpfjit_alu_lsh_k);
732 ATF_TC_HEAD(libbpfjit_alu_lsh_k, tc)
733 {
734 	atf_tc_set_md_var(tc, "descr",
735 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
736 }
737 
738 ATF_TC_BODY(libbpfjit_alu_lsh_k, tc)
739 {
740 	static struct bpf_insn insns[] = {
741 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
742 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
743 		BPF_STMT(BPF_RET+BPF_A, 0)
744 	};
745 
746 	bpfjit_func_t code;
747 	uint8_t pkt[1]; /* the program doesn't read any data */
748 
749 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
750 
751 	ATF_CHECK(bpf_validate(insns, insn_count));
752 
753 	code = bpfjit_generate_code(NULL, insns, insn_count);
754 	ATF_REQUIRE(code != NULL);
755 
756 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
757 
758 	bpfjit_free_code(code);
759 }
760 
761 ATF_TC(libbpfjit_alu_lsh0_k);
762 ATF_TC_HEAD(libbpfjit_alu_lsh0_k, tc)
763 {
764 	atf_tc_set_md_var(tc, "descr",
765 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
766 }
767 
768 ATF_TC_BODY(libbpfjit_alu_lsh0_k, tc)
769 {
770 	static struct bpf_insn insns[] = {
771 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
772 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
773 		BPF_STMT(BPF_RET+BPF_A, 0)
774 	};
775 
776 	bpfjit_func_t code;
777 	uint8_t pkt[1]; /* the program doesn't read any data */
778 
779 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
780 
781 	ATF_CHECK(bpf_validate(insns, insn_count));
782 
783 	code = bpfjit_generate_code(NULL, insns, insn_count);
784 	ATF_REQUIRE(code != NULL);
785 
786 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
787 
788 	bpfjit_free_code(code);
789 }
790 
791 ATF_TC(libbpfjit_alu_rsh_k);
792 ATF_TC_HEAD(libbpfjit_alu_rsh_k, tc)
793 {
794 	atf_tc_set_md_var(tc, "descr",
795 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
796 }
797 
798 ATF_TC_BODY(libbpfjit_alu_rsh_k, tc)
799 {
800 	static struct bpf_insn insns[] = {
801 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
802 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
803 		BPF_STMT(BPF_RET+BPF_A, 0)
804 	};
805 
806 	bpfjit_func_t code;
807 	uint8_t pkt[1]; /* the program doesn't read any data */
808 
809 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
810 
811 	ATF_CHECK(bpf_validate(insns, insn_count));
812 
813 	code = bpfjit_generate_code(NULL, insns, insn_count);
814 	ATF_REQUIRE(code != NULL);
815 
816 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
817 
818 	bpfjit_free_code(code);
819 }
820 
821 ATF_TC(libbpfjit_alu_rsh0_k);
822 ATF_TC_HEAD(libbpfjit_alu_rsh0_k, tc)
823 {
824 	atf_tc_set_md_var(tc, "descr",
825 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
826 }
827 
828 ATF_TC_BODY(libbpfjit_alu_rsh0_k, tc)
829 {
830 	static struct bpf_insn insns[] = {
831 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
832 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
833 		BPF_STMT(BPF_RET+BPF_A, 0)
834 	};
835 
836 	bpfjit_func_t code;
837 	uint8_t pkt[1]; /* the program doesn't read any data */
838 
839 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
840 
841 	ATF_CHECK(bpf_validate(insns, insn_count));
842 
843 	code = bpfjit_generate_code(NULL, insns, insn_count);
844 	ATF_REQUIRE(code != NULL);
845 
846 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
847 
848 	bpfjit_free_code(code);
849 }
850 
851 ATF_TC(libbpfjit_alu_modulo_k);
852 ATF_TC_HEAD(libbpfjit_alu_modulo_k, tc)
853 {
854 	atf_tc_set_md_var(tc, "descr",
855 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
856 }
857 
858 ATF_TC_BODY(libbpfjit_alu_modulo_k, tc)
859 {
860 	static struct bpf_insn insns[] = {
861 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
862 
863 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
864 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
865 
866 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
867 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
868 
869 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
870 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
871 
872 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
873 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
874 
875 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
876 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
877 
878 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
879 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
880 
881 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
882 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
883 
884 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
885 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
886 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
887 
888 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
889 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
890 
891 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
892 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
893 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
894 
895 		BPF_STMT(BPF_RET+BPF_A, 0)
896 	};
897 
898 	bpfjit_func_t code;
899 	uint8_t pkt[1]; /* the program doesn't read any data */
900 
901 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
902 
903 	ATF_CHECK(bpf_validate(insns, insn_count));
904 
905 	code = bpfjit_generate_code(NULL, insns, insn_count);
906 	ATF_REQUIRE(code != NULL);
907 
908 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
909 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
910 
911 
912 	bpfjit_free_code(code);
913 }
914 
915 ATF_TC(libbpfjit_alu_add_x);
916 ATF_TC_HEAD(libbpfjit_alu_add_x, tc)
917 {
918 	atf_tc_set_md_var(tc, "descr",
919 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
920 }
921 
922 ATF_TC_BODY(libbpfjit_alu_add_x, tc)
923 {
924 	static struct bpf_insn insns[] = {
925 		BPF_STMT(BPF_LD+BPF_IMM, 3),
926 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
927 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
928 		BPF_STMT(BPF_RET+BPF_A, 0)
929 	};
930 
931 	bpfjit_func_t code;
932 	uint8_t pkt[1]; /* the program doesn't read any data */
933 
934 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
935 
936 	ATF_CHECK(bpf_validate(insns, insn_count));
937 
938 	code = bpfjit_generate_code(NULL, insns, insn_count);
939 	ATF_REQUIRE(code != NULL);
940 
941 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
942 
943 	bpfjit_free_code(code);
944 }
945 
946 ATF_TC(libbpfjit_alu_sub_x);
947 ATF_TC_HEAD(libbpfjit_alu_sub_x, tc)
948 {
949 	atf_tc_set_md_var(tc, "descr",
950 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
951 }
952 
953 ATF_TC_BODY(libbpfjit_alu_sub_x, tc)
954 {
955 	static struct bpf_insn insns[] = {
956 		BPF_STMT(BPF_LD+BPF_IMM, 1),
957 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
958 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
959 		BPF_STMT(BPF_RET+BPF_A, 0)
960 	};
961 
962 	bpfjit_func_t code;
963 	uint8_t pkt[1]; /* the program doesn't read any data */
964 
965 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
966 
967 	ATF_CHECK(bpf_validate(insns, insn_count));
968 
969 	code = bpfjit_generate_code(NULL, insns, insn_count);
970 	ATF_REQUIRE(code != NULL);
971 
972 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
973 
974 	bpfjit_free_code(code);
975 }
976 
977 ATF_TC(libbpfjit_alu_mul_x);
978 ATF_TC_HEAD(libbpfjit_alu_mul_x, tc)
979 {
980 	atf_tc_set_md_var(tc, "descr",
981 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
982 }
983 
984 ATF_TC_BODY(libbpfjit_alu_mul_x, tc)
985 {
986 	static struct bpf_insn insns[] = {
987 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
988 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
989 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
990 		BPF_STMT(BPF_RET+BPF_A, 0)
991 	};
992 
993 	bpfjit_func_t code;
994 	uint8_t pkt[1]; /* the program doesn't read any data */
995 
996 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
997 
998 	ATF_CHECK(bpf_validate(insns, insn_count));
999 
1000 	code = bpfjit_generate_code(NULL, insns, insn_count);
1001 	ATF_REQUIRE(code != NULL);
1002 
1003 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
1004 
1005 	bpfjit_free_code(code);
1006 }
1007 
1008 ATF_TC(libbpfjit_alu_div0_x);
1009 ATF_TC_HEAD(libbpfjit_alu_div0_x, tc)
1010 {
1011 	atf_tc_set_md_var(tc, "descr",
1012 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
1013 }
1014 
1015 ATF_TC_BODY(libbpfjit_alu_div0_x, tc)
1016 {
1017 	static struct bpf_insn insns[] = {
1018 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1019 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1020 		BPF_STMT(BPF_RET+BPF_A, 0)
1021 	};
1022 
1023 	bpfjit_func_t code;
1024 	uint8_t pkt[1]; /* the program doesn't read any data */
1025 
1026 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1027 
1028 	ATF_CHECK(bpf_validate(insns, insn_count));
1029 
1030 	code = bpfjit_generate_code(NULL, insns, insn_count);
1031 	ATF_REQUIRE(code != NULL);
1032 
1033 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1034 
1035 	bpfjit_free_code(code);
1036 }
1037 
1038 ATF_TC(libbpfjit_alu_div1_x);
1039 ATF_TC_HEAD(libbpfjit_alu_div1_x, tc)
1040 {
1041 	atf_tc_set_md_var(tc, "descr",
1042 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
1043 }
1044 
1045 ATF_TC_BODY(libbpfjit_alu_div1_x, tc)
1046 {
1047 	static struct bpf_insn insns[] = {
1048 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1049 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1050 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1051 		BPF_STMT(BPF_RET+BPF_A, 0)
1052 	};
1053 
1054 	bpfjit_func_t code;
1055 	uint8_t pkt[1]; /* the program doesn't read any data */
1056 
1057 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1058 
1059 	ATF_CHECK(bpf_validate(insns, insn_count));
1060 
1061 	code = bpfjit_generate_code(NULL, insns, insn_count);
1062 	ATF_REQUIRE(code != NULL);
1063 
1064 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1065 
1066 	bpfjit_free_code(code);
1067 }
1068 
1069 ATF_TC(libbpfjit_alu_div2_x);
1070 ATF_TC_HEAD(libbpfjit_alu_div2_x, tc)
1071 {
1072 	atf_tc_set_md_var(tc, "descr",
1073 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
1074 }
1075 
1076 ATF_TC_BODY(libbpfjit_alu_div2_x, tc)
1077 {
1078 	static struct bpf_insn insns[] = {
1079 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1080 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1081 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1082 		BPF_STMT(BPF_RET+BPF_A, 0)
1083 	};
1084 
1085 	bpfjit_func_t code;
1086 	uint8_t pkt[1]; /* the program doesn't read any data */
1087 
1088 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1089 
1090 	ATF_CHECK(bpf_validate(insns, insn_count));
1091 
1092 	code = bpfjit_generate_code(NULL, insns, insn_count);
1093 	ATF_REQUIRE(code != NULL);
1094 
1095 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
1096 
1097 	bpfjit_free_code(code);
1098 }
1099 
1100 ATF_TC(libbpfjit_alu_div4_x);
1101 ATF_TC_HEAD(libbpfjit_alu_div4_x, tc)
1102 {
1103 	atf_tc_set_md_var(tc, "descr",
1104 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
1105 }
1106 
1107 ATF_TC_BODY(libbpfjit_alu_div4_x, tc)
1108 {
1109 	static struct bpf_insn insns[] = {
1110 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1111 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1112 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1113 		BPF_STMT(BPF_RET+BPF_A, 0)
1114 	};
1115 
1116 	bpfjit_func_t code;
1117 	uint8_t pkt[1]; /* the program doesn't read any data */
1118 
1119 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1120 
1121 	ATF_CHECK(bpf_validate(insns, insn_count));
1122 
1123 	code = bpfjit_generate_code(NULL, insns, insn_count);
1124 	ATF_REQUIRE(code != NULL);
1125 
1126 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
1127 
1128 	bpfjit_free_code(code);
1129 }
1130 
1131 ATF_TC(libbpfjit_alu_div10_x);
1132 ATF_TC_HEAD(libbpfjit_alu_div10_x, tc)
1133 {
1134 	atf_tc_set_md_var(tc, "descr",
1135 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
1136 }
1137 
1138 ATF_TC_BODY(libbpfjit_alu_div10_x, tc)
1139 {
1140 	static struct bpf_insn insns[] = {
1141 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1142 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1143 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1144 		BPF_STMT(BPF_RET+BPF_A, 0)
1145 	};
1146 
1147 	bpfjit_func_t code;
1148 	uint8_t pkt[1]; /* the program doesn't read any data */
1149 
1150 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1151 
1152 	ATF_CHECK(bpf_validate(insns, insn_count));
1153 
1154 	code = bpfjit_generate_code(NULL, insns, insn_count);
1155 	ATF_REQUIRE(code != NULL);
1156 
1157 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
1158 
1159 	bpfjit_free_code(code);
1160 }
1161 
1162 ATF_TC(libbpfjit_alu_div10000_x);
1163 ATF_TC_HEAD(libbpfjit_alu_div10000_x, tc)
1164 {
1165 	atf_tc_set_md_var(tc, "descr",
1166 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
1167 }
1168 
1169 ATF_TC_BODY(libbpfjit_alu_div10000_x, tc)
1170 {
1171 	static struct bpf_insn insns[] = {
1172 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1173 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1174 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1175 		BPF_STMT(BPF_RET+BPF_A, 0)
1176 	};
1177 
1178 	bpfjit_func_t code;
1179 	uint8_t pkt[1]; /* the program doesn't read any data */
1180 
1181 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1182 
1183 	ATF_CHECK(bpf_validate(insns, insn_count));
1184 
1185 	code = bpfjit_generate_code(NULL, insns, insn_count);
1186 	ATF_REQUIRE(code != NULL);
1187 
1188 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
1189 
1190 	bpfjit_free_code(code);
1191 }
1192 
1193 ATF_TC(libbpfjit_alu_div7609801_x);
1194 ATF_TC_HEAD(libbpfjit_alu_div7609801_x, tc)
1195 {
1196 	atf_tc_set_md_var(tc, "descr",
1197 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
1198 }
1199 
1200 ATF_TC_BODY(libbpfjit_alu_div7609801_x, tc)
1201 {
1202 	static struct bpf_insn insns[] = {
1203 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1204 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1205 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1206 		BPF_STMT(BPF_RET+BPF_A, 0)
1207 	};
1208 
1209 	bpfjit_func_t code;
1210 	uint8_t pkt[1]; /* the program doesn't read any data */
1211 
1212 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1213 
1214 	ATF_CHECK(bpf_validate(insns, insn_count));
1215 
1216 	code = bpfjit_generate_code(NULL, insns, insn_count);
1217 	ATF_REQUIRE(code != NULL);
1218 
1219 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
1220 
1221 	bpfjit_free_code(code);
1222 }
1223 
1224 ATF_TC(libbpfjit_alu_div80000000_x);
1225 ATF_TC_HEAD(libbpfjit_alu_div80000000_x, tc)
1226 {
1227 	atf_tc_set_md_var(tc, "descr",
1228 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
1229 }
1230 
1231 ATF_TC_BODY(libbpfjit_alu_div80000000_x, tc)
1232 {
1233 	static struct bpf_insn insns[] = {
1234 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1235 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1236 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1237 		BPF_STMT(BPF_RET+BPF_A, 0)
1238 	};
1239 
1240 	bpfjit_func_t code;
1241 	uint8_t pkt[1]; /* the program doesn't read any data */
1242 
1243 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1244 
1245 	ATF_CHECK(bpf_validate(insns, insn_count));
1246 
1247 	code = bpfjit_generate_code(NULL, insns, insn_count);
1248 	ATF_REQUIRE(code != NULL);
1249 
1250 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1251 
1252 	bpfjit_free_code(code);
1253 }
1254 
1255 ATF_TC(libbpfjit_alu_mod0_x);
1256 ATF_TC_HEAD(libbpfjit_alu_mod0_x, tc)
1257 {
1258 	atf_tc_set_md_var(tc, "descr",
1259 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0");
1260 }
1261 
1262 ATF_TC_BODY(libbpfjit_alu_mod0_x, tc)
1263 {
1264 	static struct bpf_insn insns[] = {
1265 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1266 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1267 		BPF_STMT(BPF_RET+BPF_A, 0)
1268 	};
1269 
1270 	bpfjit_func_t code;
1271 	uint8_t pkt[1]; /* the program doesn't read any data */
1272 
1273 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1274 
1275 	ATF_CHECK(bpf_validate(insns, insn_count));
1276 
1277 	code = bpfjit_generate_code(NULL, insns, insn_count);
1278 	ATF_REQUIRE(code != NULL);
1279 
1280 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1281 
1282 	bpfjit_free_code(code);
1283 }
1284 
1285 ATF_TC(libbpfjit_alu_mod1_x);
1286 ATF_TC_HEAD(libbpfjit_alu_mod1_x, tc)
1287 {
1288 	atf_tc_set_md_var(tc, "descr",
1289 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=1");
1290 }
1291 
1292 ATF_TC_BODY(libbpfjit_alu_mod1_x, tc)
1293 {
1294 	static struct bpf_insn insns[] = {
1295 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1296 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1297 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1298 		BPF_STMT(BPF_RET+BPF_A, 0)
1299 	};
1300 
1301 	bpfjit_func_t code;
1302 	uint8_t pkt[1]; /* the program doesn't read any data */
1303 
1304 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1305 
1306 	ATF_CHECK(bpf_validate(insns, insn_count));
1307 
1308 	code = bpfjit_generate_code(NULL, insns, insn_count);
1309 	ATF_REQUIRE(code != NULL);
1310 
1311 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1312 
1313 	bpfjit_free_code(code);
1314 }
1315 
1316 ATF_TC(libbpfjit_alu_mod2_x);
1317 ATF_TC_HEAD(libbpfjit_alu_mod2_x, tc)
1318 {
1319 	atf_tc_set_md_var(tc, "descr",
1320 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=2");
1321 }
1322 
1323 ATF_TC_BODY(libbpfjit_alu_mod2_x, tc)
1324 {
1325 	static struct bpf_insn insns[] = {
1326 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1327 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1328 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1329 		BPF_STMT(BPF_RET+BPF_A, 0)
1330 	};
1331 
1332 	bpfjit_func_t code;
1333 	uint8_t pkt[1]; /* the program doesn't read any data */
1334 
1335 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1336 
1337 	ATF_CHECK(bpf_validate(insns, insn_count));
1338 
1339 	code = bpfjit_generate_code(NULL, insns, insn_count);
1340 	ATF_REQUIRE(code != NULL);
1341 
1342 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1343 
1344 	bpfjit_free_code(code);
1345 }
1346 
1347 ATF_TC(libbpfjit_alu_mod4_x);
1348 ATF_TC_HEAD(libbpfjit_alu_mod4_x, tc)
1349 {
1350 	atf_tc_set_md_var(tc, "descr",
1351 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=4");
1352 }
1353 
1354 ATF_TC_BODY(libbpfjit_alu_mod4_x, tc)
1355 {
1356 	static struct bpf_insn insns[] = {
1357 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1358 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1359 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1360 		BPF_STMT(BPF_RET+BPF_A, 0)
1361 	};
1362 
1363 	bpfjit_func_t code;
1364 	uint8_t pkt[1]; /* the program doesn't read any data */
1365 
1366 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1367 
1368 	ATF_CHECK(bpf_validate(insns, insn_count));
1369 
1370 	code = bpfjit_generate_code(NULL, insns, insn_count);
1371 	ATF_REQUIRE(code != NULL);
1372 
1373 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
1374 
1375 	bpfjit_free_code(code);
1376 }
1377 
1378 ATF_TC(libbpfjit_alu_mod10_x);
1379 ATF_TC_HEAD(libbpfjit_alu_mod10_x, tc)
1380 {
1381 	atf_tc_set_md_var(tc, "descr",
1382 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10");
1383 }
1384 
1385 ATF_TC_BODY(libbpfjit_alu_mod10_x, tc)
1386 {
1387 	static struct bpf_insn insns[] = {
1388 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1389 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1390 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1391 		BPF_STMT(BPF_RET+BPF_A, 0)
1392 	};
1393 
1394 	bpfjit_func_t code;
1395 	uint8_t pkt[1]; /* the program doesn't read any data */
1396 
1397 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1398 
1399 	ATF_CHECK(bpf_validate(insns, insn_count));
1400 
1401 	code = bpfjit_generate_code(NULL, insns, insn_count);
1402 	ATF_REQUIRE(code != NULL);
1403 
1404 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
1405 
1406 	bpfjit_free_code(code);
1407 }
1408 
1409 ATF_TC(libbpfjit_alu_mod10000_x);
1410 ATF_TC_HEAD(libbpfjit_alu_mod10000_x, tc)
1411 {
1412 	atf_tc_set_md_var(tc, "descr",
1413 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10000");
1414 }
1415 
1416 ATF_TC_BODY(libbpfjit_alu_mod10000_x, tc)
1417 {
1418 	static struct bpf_insn insns[] = {
1419 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1420 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1421 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1422 		BPF_STMT(BPF_RET+BPF_A, 0)
1423 	};
1424 
1425 	bpfjit_func_t code;
1426 	uint8_t pkt[1]; /* the program doesn't read any data */
1427 
1428 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1429 
1430 	ATF_CHECK(bpf_validate(insns, insn_count));
1431 
1432 	code = bpfjit_generate_code(NULL, insns, insn_count);
1433 	ATF_REQUIRE(code != NULL);
1434 
1435 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
1436 
1437 	bpfjit_free_code(code);
1438 }
1439 
1440 ATF_TC(libbpfjit_alu_mod7609801_x);
1441 ATF_TC_HEAD(libbpfjit_alu_mod7609801_x, tc)
1442 {
1443 	atf_tc_set_md_var(tc, "descr",
1444 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=7609801");
1445 }
1446 
1447 ATF_TC_BODY(libbpfjit_alu_mod7609801_x, tc)
1448 {
1449 	static struct bpf_insn insns[] = {
1450 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1451 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1452 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1453 		BPF_STMT(BPF_RET+BPF_A, 0)
1454 	};
1455 
1456 	bpfjit_func_t code;
1457 	uint8_t pkt[1]; /* the program doesn't read any data */
1458 
1459 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1460 
1461 	ATF_CHECK(bpf_validate(insns, insn_count));
1462 
1463 	code = bpfjit_generate_code(NULL, insns, insn_count);
1464 	ATF_REQUIRE(code != NULL);
1465 
1466 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
1467 
1468 	bpfjit_free_code(code);
1469 }
1470 
1471 ATF_TC(libbpfjit_alu_mod80000000_x);
1472 ATF_TC_HEAD(libbpfjit_alu_mod80000000_x, tc)
1473 {
1474 	atf_tc_set_md_var(tc, "descr",
1475 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0x80000000");
1476 }
1477 
1478 ATF_TC_BODY(libbpfjit_alu_mod80000000_x, tc)
1479 {
1480 	static struct bpf_insn insns[] = {
1481 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1482 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1483 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1484 		BPF_STMT(BPF_RET+BPF_A, 0)
1485 	};
1486 
1487 	bpfjit_func_t code;
1488 	uint8_t pkt[1]; /* the program doesn't read any data */
1489 
1490 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1491 
1492 	ATF_CHECK(bpf_validate(insns, insn_count));
1493 
1494 	code = bpfjit_generate_code(NULL, insns, insn_count);
1495 	ATF_REQUIRE(code != NULL);
1496 
1497 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
1498 
1499 	bpfjit_free_code(code);
1500 }
1501 
1502 ATF_TC(libbpfjit_alu_and_x);
1503 ATF_TC_HEAD(libbpfjit_alu_and_x, tc)
1504 {
1505 	atf_tc_set_md_var(tc, "descr",
1506 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
1507 }
1508 
1509 ATF_TC_BODY(libbpfjit_alu_and_x, tc)
1510 {
1511 	static struct bpf_insn insns[] = {
1512 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
1513 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
1514 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1515 		BPF_STMT(BPF_RET+BPF_A, 0)
1516 	};
1517 
1518 	bpfjit_func_t code;
1519 	uint8_t pkt[1]; /* the program doesn't read any data */
1520 
1521 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1522 
1523 	ATF_CHECK(bpf_validate(insns, insn_count));
1524 
1525 	code = bpfjit_generate_code(NULL, insns, insn_count);
1526 	ATF_REQUIRE(code != NULL);
1527 
1528 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
1529 
1530 	bpfjit_free_code(code);
1531 }
1532 
1533 ATF_TC(libbpfjit_alu_or_x);
1534 ATF_TC_HEAD(libbpfjit_alu_or_x, tc)
1535 {
1536 	atf_tc_set_md_var(tc, "descr",
1537 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1538 }
1539 
1540 ATF_TC_BODY(libbpfjit_alu_or_x, tc)
1541 {
1542 	static struct bpf_insn insns[] = {
1543 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1544 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1545 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1546 		BPF_STMT(BPF_RET+BPF_A, 0)
1547 	};
1548 
1549 	bpfjit_func_t code;
1550 	uint8_t pkt[1]; /* the program doesn't read any data */
1551 
1552 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1553 
1554 	ATF_CHECK(bpf_validate(insns, insn_count));
1555 
1556 	code = bpfjit_generate_code(NULL, insns, insn_count);
1557 	ATF_REQUIRE(code != NULL);
1558 
1559 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1560 
1561 	bpfjit_free_code(code);
1562 }
1563 
1564 ATF_TC(libbpfjit_alu_xor_x);
1565 ATF_TC_HEAD(libbpfjit_alu_xor_x, tc)
1566 {
1567 	atf_tc_set_md_var(tc, "descr",
1568 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X");
1569 }
1570 
1571 ATF_TC_BODY(libbpfjit_alu_xor_x, tc)
1572 {
1573 	static struct bpf_insn insns[] = {
1574 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
1575 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000b1e0),
1576 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0),
1577 		BPF_STMT(BPF_RET+BPF_A, 0)
1578 	};
1579 
1580 	bpfjit_func_t code;
1581 	uint8_t pkt[1]; /* the program doesn't read any data */
1582 
1583 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1584 
1585 	ATF_CHECK(bpf_validate(insns, insn_count));
1586 
1587 	code = bpfjit_generate_code(NULL, insns, insn_count);
1588 	ATF_REQUIRE(code != NULL);
1589 
1590 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1591 
1592 	bpfjit_free_code(code);
1593 }
1594 
1595 ATF_TC(libbpfjit_alu_lsh_x);
1596 ATF_TC_HEAD(libbpfjit_alu_lsh_x, tc)
1597 {
1598 	atf_tc_set_md_var(tc, "descr",
1599 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1600 }
1601 
1602 ATF_TC_BODY(libbpfjit_alu_lsh_x, tc)
1603 {
1604 	static struct bpf_insn insns[] = {
1605 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1606 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1607 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1608 		BPF_STMT(BPF_RET+BPF_A, 0)
1609 	};
1610 
1611 	bpfjit_func_t code;
1612 	uint8_t pkt[1]; /* the program doesn't read any data */
1613 
1614 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1615 
1616 	ATF_CHECK(bpf_validate(insns, insn_count));
1617 
1618 	code = bpfjit_generate_code(NULL, insns, insn_count);
1619 	ATF_REQUIRE(code != NULL);
1620 
1621 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
1622 
1623 	bpfjit_free_code(code);
1624 }
1625 
1626 ATF_TC(libbpfjit_alu_lsh0_x);
1627 ATF_TC_HEAD(libbpfjit_alu_lsh0_x, tc)
1628 {
1629 	atf_tc_set_md_var(tc, "descr",
1630 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1631 }
1632 
1633 ATF_TC_BODY(libbpfjit_alu_lsh0_x, tc)
1634 {
1635 	static struct bpf_insn insns[] = {
1636 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1637 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1638 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1639 		BPF_STMT(BPF_RET+BPF_A, 0)
1640 	};
1641 
1642 	bpfjit_func_t code;
1643 	uint8_t pkt[1]; /* the program doesn't read any data */
1644 
1645 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1646 
1647 	ATF_CHECK(bpf_validate(insns, insn_count));
1648 
1649 	code = bpfjit_generate_code(NULL, insns, insn_count);
1650 	ATF_REQUIRE(code != NULL);
1651 
1652 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1653 
1654 	bpfjit_free_code(code);
1655 }
1656 
1657 ATF_TC(libbpfjit_alu_rsh_x);
1658 ATF_TC_HEAD(libbpfjit_alu_rsh_x, tc)
1659 {
1660 	atf_tc_set_md_var(tc, "descr",
1661 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1662 }
1663 
1664 ATF_TC_BODY(libbpfjit_alu_rsh_x, tc)
1665 {
1666 	static struct bpf_insn insns[] = {
1667 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1668 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1669 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1670 		BPF_STMT(BPF_RET+BPF_A, 0)
1671 	};
1672 
1673 	bpfjit_func_t code;
1674 	uint8_t pkt[1]; /* the program doesn't read any data */
1675 
1676 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1677 
1678 	ATF_CHECK(bpf_validate(insns, insn_count));
1679 
1680 	code = bpfjit_generate_code(NULL, insns, insn_count);
1681 	ATF_REQUIRE(code != NULL);
1682 
1683 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
1684 
1685 	bpfjit_free_code(code);
1686 }
1687 
1688 ATF_TC(libbpfjit_alu_rsh0_x);
1689 ATF_TC_HEAD(libbpfjit_alu_rsh0_x, tc)
1690 {
1691 	atf_tc_set_md_var(tc, "descr",
1692 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1693 }
1694 
1695 ATF_TC_BODY(libbpfjit_alu_rsh0_x, tc)
1696 {
1697 	static struct bpf_insn insns[] = {
1698 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1699 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1700 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1701 		BPF_STMT(BPF_RET+BPF_A, 0)
1702 	};
1703 
1704 	bpfjit_func_t code;
1705 	uint8_t pkt[1]; /* the program doesn't read any data */
1706 
1707 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1708 
1709 	ATF_CHECK(bpf_validate(insns, insn_count));
1710 
1711 	code = bpfjit_generate_code(NULL, insns, insn_count);
1712 	ATF_REQUIRE(code != NULL);
1713 
1714 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1715 
1716 	bpfjit_free_code(code);
1717 }
1718 
1719 ATF_TC(libbpfjit_alu_modulo_x);
1720 ATF_TC_HEAD(libbpfjit_alu_modulo_x, tc)
1721 {
1722 	atf_tc_set_md_var(tc, "descr",
1723 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1724 }
1725 
1726 ATF_TC_BODY(libbpfjit_alu_modulo_x, tc)
1727 {
1728 	static struct bpf_insn insns[] = {
1729 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1730 
1731 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1732 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1733 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1734 
1735 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1736 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1737 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1738 
1739 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1740 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1741 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1742 
1743 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1744 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1745 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1746 
1747 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1748 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1749 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1750 
1751 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1752 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1753 
1754 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1755 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1756 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1757 
1758 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1759 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
1760 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1761 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1762 
1763 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1764 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1765 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1766 
1767 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1768 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
1769 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1770 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1771 
1772 		BPF_STMT(BPF_RET+BPF_A, 0)
1773 	};
1774 
1775 	bpfjit_func_t code;
1776 	uint8_t pkt[1]; /* the program doesn't read any data */
1777 
1778 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1779 
1780 	ATF_CHECK(bpf_validate(insns, insn_count));
1781 
1782 	code = bpfjit_generate_code(NULL, insns, insn_count);
1783 	ATF_REQUIRE(code != NULL);
1784 
1785 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1786 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
1787 
1788 
1789 	bpfjit_free_code(code);
1790 }
1791 
1792 ATF_TC(libbpfjit_alu_neg);
1793 ATF_TC_HEAD(libbpfjit_alu_neg, tc)
1794 {
1795 	atf_tc_set_md_var(tc, "descr",
1796 	    "Test JIT compilation of BPF_ALU+BPF_NEG");
1797 }
1798 
1799 ATF_TC_BODY(libbpfjit_alu_neg, tc)
1800 {
1801 	static struct bpf_insn insns[] = {
1802 		BPF_STMT(BPF_LD+BPF_IMM, 777),
1803 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1804 		BPF_STMT(BPF_RET+BPF_A, 0)
1805 	};
1806 
1807 	bpfjit_func_t code;
1808 	uint8_t pkt[1]; /* the program doesn't read any data */
1809 
1810 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1811 
1812 	ATF_CHECK(bpf_validate(insns, insn_count));
1813 
1814 	code = bpfjit_generate_code(NULL, insns, insn_count);
1815 	ATF_REQUIRE(code != NULL);
1816 
1817 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0u-777u);
1818 
1819 	bpfjit_free_code(code);
1820 }
1821 
1822 ATF_TC(libbpfjit_jmp_ja);
1823 ATF_TC_HEAD(libbpfjit_jmp_ja, tc)
1824 {
1825 	atf_tc_set_md_var(tc, "descr",
1826 	    "Test JIT compilation of BPF_JMP+BPF_JA");
1827 }
1828 
1829 ATF_TC_BODY(libbpfjit_jmp_ja, tc)
1830 {
1831 	static struct bpf_insn insns[] = {
1832 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1833 		BPF_STMT(BPF_RET+BPF_K, 0),
1834 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1835 		BPF_STMT(BPF_RET+BPF_K, 1),
1836 		BPF_STMT(BPF_RET+BPF_K, 2),
1837 		BPF_STMT(BPF_RET+BPF_K, 3),
1838 	};
1839 
1840 	bpfjit_func_t code;
1841 	uint8_t pkt[1]; /* the program doesn't read any data */
1842 
1843 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1844 
1845 	ATF_CHECK(bpf_validate(insns, insn_count));
1846 
1847 	code = bpfjit_generate_code(NULL, insns, insn_count);
1848 	ATF_REQUIRE(code != NULL);
1849 
1850 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
1851 
1852 	bpfjit_free_code(code);
1853 }
1854 
1855 ATF_TC(libbpfjit_jmp_jgt_k);
1856 ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
1857 {
1858 	atf_tc_set_md_var(tc, "descr",
1859 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1860 }
1861 
1862 ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
1863 {
1864 	static struct bpf_insn insns[] = {
1865 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1866 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1867 		BPF_STMT(BPF_RET+BPF_K, 0),
1868 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1869 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1870 		BPF_STMT(BPF_RET+BPF_K, 1),
1871 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1872 		BPF_STMT(BPF_RET+BPF_K, 2),
1873 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1874 		BPF_STMT(BPF_RET+BPF_K, 3),
1875 		BPF_STMT(BPF_RET+BPF_K, 4),
1876 		BPF_STMT(BPF_RET+BPF_K, 5),
1877 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1878 		BPF_STMT(BPF_RET+BPF_K, 6),
1879 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1880 		BPF_STMT(BPF_RET+BPF_K, 7),
1881 		BPF_STMT(BPF_RET+BPF_K, 8)
1882 	};
1883 
1884 	bpfjit_func_t code;
1885 	uint8_t pkt[8]; /* the program doesn't read any data */
1886 
1887 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1888 
1889 	ATF_CHECK(bpf_validate(insns, insn_count));
1890 
1891 	code = bpfjit_generate_code(NULL, insns, insn_count);
1892 	ATF_REQUIRE(code != NULL);
1893 
1894 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1895 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1896 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1897 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1898 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1899 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1900 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1901 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1902 
1903 	bpfjit_free_code(code);
1904 }
1905 
1906 ATF_TC(libbpfjit_jmp_jge_k);
1907 ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
1908 {
1909 	atf_tc_set_md_var(tc, "descr",
1910 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1911 }
1912 
1913 ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
1914 {
1915 	static struct bpf_insn insns[] = {
1916 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1917 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1918 		BPF_STMT(BPF_RET+BPF_K, 0),
1919 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1920 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1921 		BPF_STMT(BPF_RET+BPF_K, 1),
1922 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1923 		BPF_STMT(BPF_RET+BPF_K, 2),
1924 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1925 		BPF_STMT(BPF_RET+BPF_K, 3),
1926 		BPF_STMT(BPF_RET+BPF_K, 4),
1927 		BPF_STMT(BPF_RET+BPF_K, 5),
1928 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1929 		BPF_STMT(BPF_RET+BPF_K, 6),
1930 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1931 		BPF_STMT(BPF_RET+BPF_K, 7),
1932 		BPF_STMT(BPF_RET+BPF_K, 8)
1933 	};
1934 
1935 	bpfjit_func_t code;
1936 	uint8_t pkt[8]; /* the program doesn't read any data */
1937 
1938 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1939 
1940 	ATF_CHECK(bpf_validate(insns, insn_count));
1941 
1942 	code = bpfjit_generate_code(NULL, insns, insn_count);
1943 	ATF_REQUIRE(code != NULL);
1944 
1945 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1946 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
1947 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
1948 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
1949 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
1950 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
1951 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
1952 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
1953 
1954 	bpfjit_free_code(code);
1955 }
1956 
1957 ATF_TC(libbpfjit_jmp_jeq_k);
1958 ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
1959 {
1960 	atf_tc_set_md_var(tc, "descr",
1961 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1962 }
1963 
1964 ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
1965 {
1966 	static struct bpf_insn insns[] = {
1967 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1968 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1969 		BPF_STMT(BPF_RET+BPF_K, 0),
1970 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1971 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1972 		BPF_STMT(BPF_RET+BPF_K, 1),
1973 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1974 		BPF_STMT(BPF_RET+BPF_K, 2),
1975 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1976 		BPF_STMT(BPF_RET+BPF_K, 3),
1977 		BPF_STMT(BPF_RET+BPF_K, 4),
1978 		BPF_STMT(BPF_RET+BPF_K, 5),
1979 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1980 		BPF_STMT(BPF_RET+BPF_K, 6),
1981 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1982 		BPF_STMT(BPF_RET+BPF_K, 7),
1983 		BPF_STMT(BPF_RET+BPF_K, 8)
1984 	};
1985 
1986 	bpfjit_func_t code;
1987 	uint8_t pkt[8]; /* the program doesn't read any data */
1988 
1989 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1990 
1991 	ATF_CHECK(bpf_validate(insns, insn_count));
1992 
1993 	code = bpfjit_generate_code(NULL, insns, insn_count);
1994 	ATF_REQUIRE(code != NULL);
1995 
1996 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
1997 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
1998 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
1999 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2000 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2001 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2002 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2003 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2004 
2005 	bpfjit_free_code(code);
2006 }
2007 
2008 ATF_TC(libbpfjit_jmp_jset_k);
2009 ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
2010 {
2011 	atf_tc_set_md_var(tc, "descr",
2012 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
2013 }
2014 
2015 ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
2016 {
2017 	static struct bpf_insn insns[] = {
2018 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2019 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
2020 		BPF_STMT(BPF_RET+BPF_K, 0),
2021 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
2022 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
2023 		BPF_STMT(BPF_RET+BPF_K, 1),
2024 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
2025 		BPF_STMT(BPF_RET+BPF_K, 2),
2026 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
2027 		BPF_STMT(BPF_RET+BPF_K, 3),
2028 		BPF_STMT(BPF_RET+BPF_K, 4),
2029 		BPF_STMT(BPF_RET+BPF_K, 5),
2030 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
2031 		BPF_STMT(BPF_RET+BPF_K, 6),
2032 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
2033 		BPF_STMT(BPF_RET+BPF_K, 7),
2034 		BPF_STMT(BPF_RET+BPF_K, 8)
2035 	};
2036 
2037 	bpfjit_func_t code;
2038 	uint8_t pkt[8]; /* the program doesn't read any data */
2039 
2040 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2041 
2042 	ATF_CHECK(bpf_validate(insns, insn_count));
2043 
2044 	code = bpfjit_generate_code(NULL, insns, insn_count);
2045 	ATF_REQUIRE(code != NULL);
2046 
2047 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2048 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2049 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
2050 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2051 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
2052 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2053 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2054 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2055 
2056 	bpfjit_free_code(code);
2057 }
2058 
2059 ATF_TC(libbpfjit_jmp_modulo_k);
2060 ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
2061 {
2062 	atf_tc_set_md_var(tc, "descr",
2063 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
2064 }
2065 
2066 ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
2067 {
2068 	static struct bpf_insn insns[] = {
2069 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
2070 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
2071 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
2072 		BPF_STMT(BPF_RET+BPF_K, 0),
2073 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
2074 		BPF_STMT(BPF_RET+BPF_K, 1),
2075 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
2076 		BPF_STMT(BPF_RET+BPF_K, 2),
2077 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
2078 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
2079 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
2080 		BPF_STMT(BPF_JMP+BPF_JA, 1),
2081 		BPF_STMT(BPF_RET+BPF_K, 3),
2082 
2083 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
2084 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
2085 
2086 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
2087 		BPF_STMT(BPF_RET+BPF_K, 4),
2088 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
2089 		BPF_STMT(BPF_RET+BPF_K, 5),
2090 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
2091 		BPF_STMT(BPF_RET+BPF_K, 6),
2092 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
2093 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
2094 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
2095 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2096 		BPF_STMT(BPF_RET+BPF_K, 7)
2097 	};
2098 
2099 	bpfjit_func_t code;
2100 	uint8_t pkt[1]; /* the program doesn't read any data */
2101 
2102 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2103 
2104 	ATF_CHECK(bpf_validate(insns, insn_count));
2105 
2106 	code = bpfjit_generate_code(NULL, insns, insn_count);
2107 	ATF_REQUIRE(code != NULL);
2108 
2109 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2110 
2111 	bpfjit_free_code(code);
2112 }
2113 
2114 ATF_TC(libbpfjit_jmp_jgt_x);
2115 ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
2116 {
2117 	atf_tc_set_md_var(tc, "descr",
2118 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
2119 }
2120 
2121 ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
2122 {
2123 	static struct bpf_insn insns[] = {
2124 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2125 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2126 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2127 		BPF_STMT(BPF_RET+BPF_K, 0),
2128 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2129 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2130 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2131 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
2132 		BPF_STMT(BPF_RET+BPF_K, 1),
2133 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
2134 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
2135 		BPF_STMT(BPF_RET+BPF_K, 2),
2136 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2137 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
2138 		BPF_STMT(BPF_RET+BPF_K, 3),
2139 		BPF_STMT(BPF_RET+BPF_K, 4),
2140 		BPF_STMT(BPF_RET+BPF_K, 5),
2141 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2142 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
2143 		BPF_STMT(BPF_RET+BPF_K, 6),
2144 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
2145 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
2146 		BPF_STMT(BPF_RET+BPF_K, 7),
2147 		BPF_STMT(BPF_RET+BPF_K, 8)
2148 	};
2149 
2150 	bpfjit_func_t code;
2151 	uint8_t pkt[8]; /* the program doesn't read any data */
2152 
2153 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2154 
2155 	ATF_CHECK(bpf_validate(insns, insn_count));
2156 
2157 	code = bpfjit_generate_code(NULL, insns, insn_count);
2158 	ATF_REQUIRE(code != NULL);
2159 
2160 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2161 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2162 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
2163 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2164 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2165 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2166 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2167 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2168 
2169 	bpfjit_free_code(code);
2170 }
2171 
2172 ATF_TC(libbpfjit_jmp_jge_x);
2173 ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
2174 {
2175 	atf_tc_set_md_var(tc, "descr",
2176 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
2177 }
2178 
2179 ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
2180 {
2181 	static struct bpf_insn insns[] = {
2182 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2183 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2184 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2185 		BPF_STMT(BPF_RET+BPF_K, 0),
2186 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2187 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
2188 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2189 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
2190 		BPF_STMT(BPF_RET+BPF_K, 1),
2191 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2192 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
2193 		BPF_STMT(BPF_RET+BPF_K, 2),
2194 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2195 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
2196 		BPF_STMT(BPF_RET+BPF_K, 3),
2197 		BPF_STMT(BPF_RET+BPF_K, 4),
2198 		BPF_STMT(BPF_RET+BPF_K, 5),
2199 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2200 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
2201 		BPF_STMT(BPF_RET+BPF_K, 6),
2202 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
2203 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
2204 		BPF_STMT(BPF_RET+BPF_K, 7),
2205 		BPF_STMT(BPF_RET+BPF_K, 8)
2206 	};
2207 
2208 	bpfjit_func_t code;
2209 	uint8_t pkt[8]; /* the program doesn't read any data */
2210 
2211 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2212 
2213 	ATF_CHECK(bpf_validate(insns, insn_count));
2214 
2215 	code = bpfjit_generate_code(NULL, insns, insn_count);
2216 	ATF_REQUIRE(code != NULL);
2217 
2218 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2219 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2220 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
2221 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2222 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2223 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2224 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2225 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2226 
2227 	bpfjit_free_code(code);
2228 }
2229 
2230 ATF_TC(libbpfjit_jmp_jeq_x);
2231 ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
2232 {
2233 	atf_tc_set_md_var(tc, "descr",
2234 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
2235 }
2236 
2237 ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
2238 {
2239 	static struct bpf_insn insns[] = {
2240 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2241 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2242 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2243 		BPF_STMT(BPF_RET+BPF_K, 0),
2244 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2245 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
2246 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
2247 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
2248 		BPF_STMT(BPF_RET+BPF_K, 1),
2249 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2250 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
2251 		BPF_STMT(BPF_RET+BPF_K, 2),
2252 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2253 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
2254 		BPF_STMT(BPF_RET+BPF_K, 3),
2255 		BPF_STMT(BPF_RET+BPF_K, 4),
2256 		BPF_STMT(BPF_RET+BPF_K, 5),
2257 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
2258 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
2259 		BPF_STMT(BPF_RET+BPF_K, 6),
2260 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
2261 		BPF_STMT(BPF_RET+BPF_K, 7),
2262 		BPF_STMT(BPF_RET+BPF_K, 8)
2263 	};
2264 
2265 	bpfjit_func_t code;
2266 	uint8_t pkt[8]; /* the program doesn't read any data */
2267 
2268 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2269 
2270 	ATF_CHECK(bpf_validate(insns, insn_count));
2271 
2272 	code = bpfjit_generate_code(NULL, insns, insn_count);
2273 	ATF_REQUIRE(code != NULL);
2274 
2275 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
2276 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
2277 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
2278 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2279 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
2280 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2281 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2282 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2283 
2284 	bpfjit_free_code(code);
2285 }
2286 
2287 ATF_TC(libbpfjit_jmp_jset_x);
2288 ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
2289 {
2290 	atf_tc_set_md_var(tc, "descr",
2291 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
2292 }
2293 
2294 ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
2295 {
2296 	static struct bpf_insn insns[] = {
2297 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2298 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
2299 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
2300 		BPF_STMT(BPF_RET+BPF_K, 0),
2301 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
2302 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
2303 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
2304 		BPF_STMT(BPF_RET+BPF_K, 1),
2305 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2306 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
2307 		BPF_STMT(BPF_RET+BPF_K, 2),
2308 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
2309 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
2310 		BPF_STMT(BPF_RET+BPF_K, 3),
2311 		BPF_STMT(BPF_RET+BPF_K, 4),
2312 		BPF_STMT(BPF_RET+BPF_K, 5),
2313 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
2314 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
2315 		BPF_STMT(BPF_RET+BPF_K, 6),
2316 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
2317 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
2318 		BPF_STMT(BPF_RET+BPF_K, 7),
2319 		BPF_STMT(BPF_RET+BPF_K, 8)
2320 	};
2321 
2322 	bpfjit_func_t code;
2323 	uint8_t pkt[8]; /* the program doesn't read any data */
2324 
2325 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2326 
2327 	ATF_CHECK(bpf_validate(insns, insn_count));
2328 
2329 	code = bpfjit_generate_code(NULL, insns, insn_count);
2330 	ATF_REQUIRE(code != NULL);
2331 
2332 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
2333 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
2334 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
2335 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
2336 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
2337 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
2338 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
2339 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2340 
2341 	bpfjit_free_code(code);
2342 }
2343 
2344 ATF_TC(libbpfjit_jmp_modulo_x);
2345 ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
2346 {
2347 	atf_tc_set_md_var(tc, "descr",
2348 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
2349 }
2350 
2351 ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
2352 {
2353 	static struct bpf_insn insns[] = {
2354 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
2355 		/* FFFFF770 << 4 = FFFFF770 */
2356 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
2357 
2358 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2359 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2360 		BPF_STMT(BPF_RET+BPF_K, 0),
2361 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2362 		BPF_STMT(BPF_RET+BPF_K, 1),
2363 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2364 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2365 		BPF_STMT(BPF_RET+BPF_K, 2),
2366 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2367 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2368 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2369 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2370 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2371 		BPF_STMT(BPF_JMP+BPF_JA, 1),
2372 		BPF_STMT(BPF_RET+BPF_K, 3),
2373 
2374 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
2375 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
2376 
2377 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2378 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2379 		BPF_STMT(BPF_RET+BPF_K, 4),
2380 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2381 		BPF_STMT(BPF_RET+BPF_K, 5),
2382 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2383 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2384 		BPF_STMT(BPF_RET+BPF_K, 6),
2385 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2386 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2387 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2388 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2389 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2390 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2391 		BPF_STMT(BPF_RET+BPF_K, 7)
2392 	};
2393 
2394 	bpfjit_func_t code;
2395 	uint8_t pkt[1]; /* the program doesn't read any data */
2396 
2397 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2398 
2399 	ATF_CHECK(bpf_validate(insns, insn_count));
2400 
2401 	code = bpfjit_generate_code(NULL, insns, insn_count);
2402 	ATF_REQUIRE(code != NULL);
2403 
2404 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2405 
2406 	bpfjit_free_code(code);
2407 }
2408 
2409 ATF_TC(libbpfjit_ld_abs);
2410 ATF_TC_HEAD(libbpfjit_ld_abs, tc)
2411 {
2412 	atf_tc_set_md_var(tc, "descr",
2413 	    "Test JIT compilation of BPF_LD+BPF_ABS");
2414 }
2415 
2416 ATF_TC_BODY(libbpfjit_ld_abs, tc)
2417 {
2418 	static struct bpf_insn insns[3][2] = {
2419 		{
2420 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
2421 			BPF_STMT(BPF_RET+BPF_A, 0)
2422 		},
2423 		{
2424 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
2425 			BPF_STMT(BPF_RET+BPF_A, 0)
2426 		},
2427 		{
2428 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
2429 			BPF_STMT(BPF_RET+BPF_A, 0)
2430 		}
2431 	};
2432 
2433 	static size_t lengths[3] = { 1, 2, 4 };
2434 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
2435 
2436 	size_t i, l;
2437 	uint8_t *pkt = deadbeef_at_5;
2438 	size_t pktsize = sizeof(deadbeef_at_5);
2439 
2440 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2441 
2442 	for (i = 0; i < 3; i++) {
2443 		bpfjit_func_t code;
2444 
2445 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2446 
2447 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2448 		ATF_REQUIRE(code != NULL);
2449 
2450 		for (l = 1; l < 5 + lengths[i]; l++) {
2451 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2452 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2453 		}
2454 
2455 		l = 5 + lengths[i];
2456 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2457 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2458 
2459 		l = pktsize;
2460 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2461 
2462 		bpfjit_free_code(code);
2463 	}
2464 }
2465 
2466 ATF_TC(libbpfjit_ld_abs_k_overflow);
2467 ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
2468 {
2469 	atf_tc_set_md_var(tc, "descr",
2470 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
2471 }
2472 
2473 ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
2474 {
2475 	static struct bpf_insn insns[12][3] = {
2476 		{
2477 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2478 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2479 			BPF_STMT(BPF_RET+BPF_K, 1)
2480 		},
2481 		{
2482 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2483 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2484 			BPF_STMT(BPF_RET+BPF_K, 1)
2485 		},
2486 		{
2487 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2488 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2489 			BPF_STMT(BPF_RET+BPF_K, 1)
2490 		},
2491 		{
2492 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2493 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2494 			BPF_STMT(BPF_RET+BPF_K, 1)
2495 		},
2496 		{
2497 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2498 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2499 			BPF_STMT(BPF_RET+BPF_K, 1)
2500 		},
2501 		{
2502 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2503 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2504 			BPF_STMT(BPF_RET+BPF_K, 1)
2505 		},
2506 		{
2507 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2508 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2509 			BPF_STMT(BPF_RET+BPF_K, 1)
2510 		},
2511 		{
2512 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2513 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2514 			BPF_STMT(BPF_RET+BPF_K, 1)
2515 		},
2516 		{
2517 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2518 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2519 			BPF_STMT(BPF_RET+BPF_K, 1)
2520 		},
2521 		{
2522 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2523 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2524 			BPF_STMT(BPF_RET+BPF_K, 1)
2525 		},
2526 		{
2527 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2528 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2529 			BPF_STMT(BPF_RET+BPF_K, 1)
2530 		},
2531 		{
2532 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2533 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2534 			BPF_STMT(BPF_RET+BPF_K, 1)
2535 		}
2536 	};
2537 
2538 	int i;
2539 	uint8_t pkt[8] = { 0 };
2540 
2541 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2542 
2543 	for (i = 0; i < 3; i++) {
2544 		bpfjit_func_t code;
2545 
2546 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2547 
2548 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2549 		ATF_REQUIRE(code != NULL);
2550 
2551 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2552 
2553 		bpfjit_free_code(code);
2554 	}
2555 }
2556 
2557 ATF_TC(libbpfjit_ld_ind);
2558 ATF_TC_HEAD(libbpfjit_ld_ind, tc)
2559 {
2560 	atf_tc_set_md_var(tc, "descr",
2561 	    "Test JIT compilation of BPF_LD+BPF_IND");
2562 }
2563 
2564 ATF_TC_BODY(libbpfjit_ld_ind, tc)
2565 {
2566 	static struct bpf_insn insns[6][3] = {
2567 		{
2568 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2569 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2570 			BPF_STMT(BPF_RET+BPF_A, 0)
2571 		},
2572 		{
2573 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2574 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2575 			BPF_STMT(BPF_RET+BPF_A, 0)
2576 		},
2577 		{
2578 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2579 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2580 			BPF_STMT(BPF_RET+BPF_A, 0)
2581 		},
2582 		{
2583 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2584 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2585 			BPF_STMT(BPF_RET+BPF_A, 0)
2586 		},
2587 		{
2588 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2589 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2590 			BPF_STMT(BPF_RET+BPF_A, 0)
2591 		},
2592 		{
2593 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2594 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2595 			BPF_STMT(BPF_RET+BPF_A, 0)
2596 		}
2597 	};
2598 
2599 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2600 
2601 	static unsigned int expected[6] = {
2602 		0xde, 0xdead, 0xdeadbeef,
2603 		0xde, 0xdead, 0xdeadbeef
2604 	};
2605 
2606 	size_t i, l;
2607 	uint8_t *pkt = deadbeef_at_5;
2608 	size_t pktsize = sizeof(deadbeef_at_5);
2609 
2610 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2611 
2612 	for (i = 0; i < 3; i++) {
2613 		bpfjit_func_t code;
2614 
2615 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2616 
2617 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2618 		ATF_REQUIRE(code != NULL);
2619 
2620 		for (l = 1; l < 5 + lengths[i]; l++) {
2621 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2622 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2623 		}
2624 
2625 		l = 5 + lengths[i];
2626 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2627 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2628 
2629 		l = pktsize;
2630 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2631 
2632 		bpfjit_free_code(code);
2633 	}
2634 }
2635 
2636 ATF_TC(libbpfjit_ld_ind_k_overflow);
2637 ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
2638 {
2639 	atf_tc_set_md_var(tc, "descr",
2640 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2641 }
2642 
2643 ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
2644 {
2645 	static struct bpf_insn insns[12][3] = {
2646 		{
2647 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2648 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2649 			BPF_STMT(BPF_RET+BPF_K, 1)
2650 		},
2651 		{
2652 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2653 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2654 			BPF_STMT(BPF_RET+BPF_K, 1)
2655 		},
2656 		{
2657 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2658 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2659 			BPF_STMT(BPF_RET+BPF_K, 1)
2660 		},
2661 		{
2662 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2663 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2664 			BPF_STMT(BPF_RET+BPF_K, 1)
2665 		},
2666 		{
2667 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2668 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2669 			BPF_STMT(BPF_RET+BPF_K, 1)
2670 		},
2671 		{
2672 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2673 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2674 			BPF_STMT(BPF_RET+BPF_K, 1)
2675 		},
2676 		{
2677 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2678 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2679 			BPF_STMT(BPF_RET+BPF_K, 1)
2680 		},
2681 		{
2682 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2683 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2684 			BPF_STMT(BPF_RET+BPF_K, 1)
2685 		},
2686 		{
2687 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2688 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2689 			BPF_STMT(BPF_RET+BPF_K, 1)
2690 		},
2691 		{
2692 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2693 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2694 			BPF_STMT(BPF_RET+BPF_K, 1)
2695 		},
2696 		{
2697 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2698 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2699 			BPF_STMT(BPF_RET+BPF_K, 1)
2700 		},
2701 		{
2702 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2703 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2704 			BPF_STMT(BPF_RET+BPF_K, 1)
2705 		}
2706 	};
2707 
2708 	int i;
2709 	uint8_t pkt[8] = { 0 };
2710 
2711 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2712 
2713 	for (i = 0; i < 3; i++) {
2714 		bpfjit_func_t code;
2715 
2716 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2717 
2718 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
2719 		ATF_REQUIRE(code != NULL);
2720 
2721 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2722 
2723 		bpfjit_free_code(code);
2724 	}
2725 }
2726 
2727 ATF_TC(libbpfjit_ld_ind_x_overflow1);
2728 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
2729 {
2730 	atf_tc_set_md_var(tc, "descr",
2731 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2732 }
2733 
2734 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
2735 {
2736 	static struct bpf_insn insns[] = {
2737 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2738 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2739 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2740 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2741 		BPF_STMT(BPF_RET+BPF_A, 0)
2742 	};
2743 
2744 	size_t i;
2745 	bpfjit_func_t code;
2746 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2747 
2748 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2749 
2750 	ATF_CHECK(bpf_validate(insns, insn_count));
2751 
2752 	code = bpfjit_generate_code(NULL, insns, insn_count);
2753 	ATF_REQUIRE(code != NULL);
2754 
2755 	for (i = 1; i <= sizeof(pkt); i++) {
2756 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2757 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2758 	}
2759 
2760 	bpfjit_free_code(code);
2761 }
2762 
2763 ATF_TC(libbpfjit_ld_ind_x_overflow2);
2764 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
2765 {
2766 	atf_tc_set_md_var(tc, "descr",
2767 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2768 }
2769 
2770 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
2771 {
2772 	static struct bpf_insn insns[] = {
2773 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2774 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2775 		BPF_STMT(BPF_ST, 3),
2776 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2777 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2778 		BPF_STMT(BPF_RET+BPF_A, 0)
2779 	};
2780 
2781 	size_t i;
2782 	bpfjit_func_t code;
2783 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2784 
2785 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2786 
2787 	ATF_CHECK(bpf_validate(insns, insn_count));
2788 
2789 	code = bpfjit_generate_code(NULL, insns, insn_count);
2790 	ATF_REQUIRE(code != NULL);
2791 
2792 	for (i = 1; i <= sizeof(pkt); i++) {
2793 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2794 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2795 	}
2796 
2797 	bpfjit_free_code(code);
2798 }
2799 
2800 ATF_TC(libbpfjit_ld_len);
2801 ATF_TC_HEAD(libbpfjit_ld_len, tc)
2802 {
2803 	atf_tc_set_md_var(tc, "descr",
2804 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2805 }
2806 
2807 ATF_TC_BODY(libbpfjit_ld_len, tc)
2808 {
2809 	static struct bpf_insn insns[] = {
2810 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2811 		BPF_STMT(BPF_RET+BPF_A, 0)
2812 	};
2813 
2814 	size_t i;
2815 	bpfjit_func_t code;
2816 	uint8_t pkt[32]; /* the program doesn't read any data */
2817 
2818 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2819 
2820 	ATF_CHECK(bpf_validate(insns, insn_count));
2821 
2822 	code = bpfjit_generate_code(NULL, insns, insn_count);
2823 	ATF_REQUIRE(code != NULL);
2824 
2825 	for (i = 0; i < sizeof(pkt); i++)
2826 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2827 
2828 	bpfjit_free_code(code);
2829 }
2830 
2831 ATF_TC(libbpfjit_ld_imm);
2832 ATF_TC_HEAD(libbpfjit_ld_imm, tc)
2833 {
2834 	atf_tc_set_md_var(tc, "descr",
2835 	    "Test JIT compilation of BPF_LD+BPF_IMM");
2836 }
2837 
2838 ATF_TC_BODY(libbpfjit_ld_imm, tc)
2839 {
2840 	static struct bpf_insn insns[] = {
2841 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2842 		BPF_STMT(BPF_RET+BPF_A, 0)
2843 	};
2844 
2845 	bpfjit_func_t code;
2846 	uint8_t pkt[1]; /* the program doesn't read any data */
2847 
2848 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2849 
2850 	ATF_CHECK(bpf_validate(insns, insn_count));
2851 
2852 	code = bpfjit_generate_code(NULL, insns, insn_count);
2853 	ATF_REQUIRE(code != NULL);
2854 
2855 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2856 
2857 	bpfjit_free_code(code);
2858 }
2859 
2860 ATF_TC(libbpfjit_ldx_imm1);
2861 ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
2862 {
2863 	atf_tc_set_md_var(tc, "descr",
2864 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2865 }
2866 
2867 ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
2868 {
2869 	static struct bpf_insn insns[] = {
2870 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2871 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2872 		BPF_STMT(BPF_RET+BPF_A, 0)
2873 	};
2874 
2875 	bpfjit_func_t code;
2876 	uint8_t pkt[1]; /* the program doesn't read any data */
2877 
2878 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2879 
2880 	ATF_CHECK(bpf_validate(insns, insn_count));
2881 
2882 	code = bpfjit_generate_code(NULL, insns, insn_count);
2883 	ATF_REQUIRE(code != NULL);
2884 
2885 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
2886 
2887 	bpfjit_free_code(code);
2888 }
2889 
2890 ATF_TC(libbpfjit_ldx_imm2);
2891 ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
2892 {
2893 	atf_tc_set_md_var(tc, "descr",
2894 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2895 }
2896 
2897 ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
2898 {
2899 	static struct bpf_insn insns[] = {
2900 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2901 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2902 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2903 		BPF_STMT(BPF_RET+BPF_K, 7),
2904 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2905 	};
2906 
2907 	bpfjit_func_t code;
2908 	uint8_t pkt[1]; /* the program doesn't read any data */
2909 
2910 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2911 
2912 	ATF_CHECK(bpf_validate(insns, insn_count));
2913 
2914 	code = bpfjit_generate_code(NULL, insns, insn_count);
2915 	ATF_REQUIRE(code != NULL);
2916 
2917 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2918 
2919 	bpfjit_free_code(code);
2920 }
2921 
2922 ATF_TC(libbpfjit_ldx_len1);
2923 ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
2924 {
2925 	atf_tc_set_md_var(tc, "descr",
2926 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2927 }
2928 
2929 ATF_TC_BODY(libbpfjit_ldx_len1, tc)
2930 {
2931 	static struct bpf_insn insns[] = {
2932 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2933 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2934 		BPF_STMT(BPF_RET+BPF_A, 0)
2935 	};
2936 
2937 	size_t i;
2938 	bpfjit_func_t code;
2939 	uint8_t pkt[5]; /* the program doesn't read any data */
2940 
2941 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2942 
2943 	ATF_CHECK(bpf_validate(insns, insn_count));
2944 
2945 	code = bpfjit_generate_code(NULL, insns, insn_count);
2946 	ATF_REQUIRE(code != NULL);
2947 
2948 	for (i = 1; i < sizeof(pkt); i++) {
2949 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2950 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2951 	}
2952 
2953 	bpfjit_free_code(code);
2954 }
2955 
2956 ATF_TC(libbpfjit_ldx_len2);
2957 ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
2958 {
2959 	atf_tc_set_md_var(tc, "descr",
2960 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2961 }
2962 
2963 ATF_TC_BODY(libbpfjit_ldx_len2, tc)
2964 {
2965 	static struct bpf_insn insns[] = {
2966 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2967 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2968 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2969 		BPF_STMT(BPF_RET+BPF_K, 7),
2970 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2971 	};
2972 
2973 	bpfjit_func_t code;
2974 	uint8_t pkt[5]; /* the program doesn't read any data */
2975 
2976 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2977 
2978 	ATF_CHECK(bpf_validate(insns, insn_count));
2979 
2980 	code = bpfjit_generate_code(NULL, insns, insn_count);
2981 	ATF_REQUIRE(code != NULL);
2982 
2983 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
2984 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
2985 
2986 	bpfjit_free_code(code);
2987 }
2988 
2989 ATF_TC(libbpfjit_ldx_msh);
2990 ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
2991 {
2992 	atf_tc_set_md_var(tc, "descr",
2993 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
2994 }
2995 
2996 ATF_TC_BODY(libbpfjit_ldx_msh, tc)
2997 {
2998 	static struct bpf_insn insns[] = {
2999 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
3000 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3001 		BPF_STMT(BPF_RET+BPF_A, 0)
3002 	};
3003 
3004 	bpfjit_func_t code;
3005 	uint8_t pkt[2] = { 0, 0x7a };
3006 
3007 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3008 
3009 	ATF_CHECK(bpf_validate(insns, insn_count));
3010 
3011 	code = bpfjit_generate_code(NULL, insns, insn_count);
3012 	ATF_REQUIRE(code != NULL);
3013 
3014 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
3015 
3016 	bpfjit_free_code(code);
3017 }
3018 
3019 ATF_TC(libbpfjit_misc_tax);
3020 ATF_TC_HEAD(libbpfjit_misc_tax, tc)
3021 {
3022 	atf_tc_set_md_var(tc, "descr",
3023 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
3024 }
3025 
3026 ATF_TC_BODY(libbpfjit_misc_tax, tc)
3027 {
3028 	static struct bpf_insn insns[] = {
3029 		BPF_STMT(BPF_LD+BPF_IMM, 3),
3030 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
3031 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
3032 		BPF_STMT(BPF_RET+BPF_A, 0)
3033 	};
3034 
3035 	bpfjit_func_t code;
3036 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
3037 
3038 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3039 
3040 	ATF_CHECK(bpf_validate(insns, insn_count));
3041 
3042 	code = bpfjit_generate_code(NULL, insns, insn_count);
3043 	ATF_REQUIRE(code != NULL);
3044 
3045 	ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
3046 
3047 	bpfjit_free_code(code);
3048 }
3049 
3050 ATF_TC(libbpfjit_misc_txa);
3051 ATF_TC_HEAD(libbpfjit_misc_txa, tc)
3052 {
3053 	atf_tc_set_md_var(tc, "descr",
3054 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
3055 }
3056 
3057 ATF_TC_BODY(libbpfjit_misc_txa, tc)
3058 {
3059 	static struct bpf_insn insns[] = {
3060 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
3061 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
3062 		BPF_STMT(BPF_RET+BPF_A, 0)
3063 	};
3064 
3065 	bpfjit_func_t code;
3066 	uint8_t pkt[1]; /* the program doesn't read any data */
3067 
3068 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3069 
3070 	ATF_CHECK(bpf_validate(insns, insn_count));
3071 
3072 	code = bpfjit_generate_code(NULL, insns, insn_count);
3073 	ATF_REQUIRE(code != NULL);
3074 
3075 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
3076 
3077 	bpfjit_free_code(code);
3078 }
3079 
3080 ATF_TC(libbpfjit_st1);
3081 ATF_TC_HEAD(libbpfjit_st1, tc)
3082 {
3083 	atf_tc_set_md_var(tc, "descr",
3084 	    "Test JIT compilation of BPF_ST");
3085 }
3086 
3087 ATF_TC_BODY(libbpfjit_st1, tc)
3088 {
3089 	static struct bpf_insn insns[] = {
3090 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3091 		BPF_STMT(BPF_ST, 0),
3092 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
3093 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3094 		BPF_STMT(BPF_RET+BPF_A, 0)
3095 	};
3096 
3097 	size_t i;
3098 	bpfjit_func_t code;
3099 	uint8_t pkt[16]; /* the program doesn't read any data */
3100 
3101 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3102 
3103 	ATF_CHECK(bpf_validate(insns, insn_count));
3104 
3105 	code = bpfjit_generate_code(NULL, insns, insn_count);
3106 	ATF_REQUIRE(code != NULL);
3107 
3108 	for (i = 1; i <= sizeof(pkt); i++)
3109 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3110 
3111 	bpfjit_free_code(code);
3112 }
3113 
3114 ATF_TC(libbpfjit_st2);
3115 ATF_TC_HEAD(libbpfjit_st2, tc)
3116 {
3117 	atf_tc_set_md_var(tc, "descr",
3118 	    "Test JIT compilation of BPF_ST");
3119 }
3120 
3121 ATF_TC_BODY(libbpfjit_st2, tc)
3122 {
3123 	static struct bpf_insn insns[] = {
3124 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3125 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3126 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3127 		BPF_STMT(BPF_RET+BPF_A, 0)
3128 	};
3129 
3130 	bpfjit_func_t code;
3131 	uint8_t pkt[1]; /* the program doesn't read any data */
3132 
3133 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3134 
3135 	ATF_CHECK(bpf_validate(insns, insn_count));
3136 
3137 	code = bpfjit_generate_code(NULL, insns, insn_count);
3138 	ATF_REQUIRE(code != NULL);
3139 
3140 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3141 
3142 	bpfjit_free_code(code);
3143 }
3144 
3145 ATF_TC(libbpfjit_st3);
3146 ATF_TC_HEAD(libbpfjit_st3, tc)
3147 {
3148 	atf_tc_set_md_var(tc, "descr",
3149 	    "Test JIT compilation of BPF_ST");
3150 }
3151 
3152 ATF_TC_BODY(libbpfjit_st3, tc)
3153 {
3154 	static struct bpf_insn insns[] = {
3155 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3156 		BPF_STMT(BPF_ST, 0),
3157 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3158 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3159 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3160 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3161 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3162 		BPF_STMT(BPF_RET+BPF_A, 0),
3163 		BPF_STMT(BPF_LD+BPF_MEM, 0),
3164 		BPF_STMT(BPF_RET+BPF_A, 0)
3165 	};
3166 
3167 	bpfjit_func_t code;
3168 	uint8_t pkt[2]; /* the program doesn't read any data */
3169 
3170 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3171 
3172 	ATF_REQUIRE(BPF_MEMWORDS > 1);
3173 
3174 	ATF_CHECK(bpf_validate(insns, insn_count));
3175 
3176 	code = bpfjit_generate_code(NULL, insns, insn_count);
3177 	ATF_REQUIRE(code != NULL);
3178 
3179 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3180 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3181 
3182 	bpfjit_free_code(code);
3183 }
3184 
3185 ATF_TC(libbpfjit_st4);
3186 ATF_TC_HEAD(libbpfjit_st4, tc)
3187 {
3188 	atf_tc_set_md_var(tc, "descr",
3189 	    "Test JIT compilation of BPF_ST");
3190 }
3191 
3192 ATF_TC_BODY(libbpfjit_st4, tc)
3193 {
3194 	static struct bpf_insn insns[] = {
3195 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3196 		BPF_STMT(BPF_ST, 5),
3197 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3198 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3199 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3200 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3201 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3202 		BPF_STMT(BPF_RET+BPF_A, 0),
3203 		BPF_STMT(BPF_LD+BPF_MEM, 5),
3204 		BPF_STMT(BPF_RET+BPF_A, 0)
3205 	};
3206 
3207 	bpfjit_func_t code;
3208 	uint8_t pkt[2]; /* the program doesn't read any data */
3209 
3210 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3211 
3212 	ATF_REQUIRE(BPF_MEMWORDS > 6);
3213 
3214 	ATF_CHECK(bpf_validate(insns, insn_count));
3215 
3216 	code = bpfjit_generate_code(NULL, insns, insn_count);
3217 	ATF_REQUIRE(code != NULL);
3218 
3219 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3220 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3221 
3222 	bpfjit_free_code(code);
3223 }
3224 
3225 ATF_TC(libbpfjit_st5);
3226 ATF_TC_HEAD(libbpfjit_st5, tc)
3227 {
3228 	atf_tc_set_md_var(tc, "descr",
3229 	    "Test JIT compilation of BPF_ST");
3230 }
3231 
3232 ATF_TC_BODY(libbpfjit_st5, tc)
3233 {
3234 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
3235 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3236 
3237 	size_t k;
3238 	bpfjit_func_t code;
3239 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3240 
3241 	memset(insns, 0, sizeof(insns));
3242 
3243 	/* for each k do M[k] = k */
3244 	for (k = 0; k < BPF_MEMWORDS; k++) {
3245 		insns[2*k].code   = BPF_LD+BPF_IMM;
3246 		insns[2*k].k      = 3*k;
3247 		insns[2*k+1].code = BPF_ST;
3248 		insns[2*k+1].k    = k;
3249 	}
3250 
3251 	/* load wirelen into A */
3252 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3253 
3254 	/* for each k, if (A == k + 1) return M[k] */
3255 	for (k = 0; k < BPF_MEMWORDS; k++) {
3256 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3257 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
3258 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
3259 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
3260 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3261 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
3262 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3263 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
3264 	}
3265 
3266 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3267 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
3268 
3269 	ATF_CHECK(bpf_validate(insns, insn_count));
3270 
3271 	code = bpfjit_generate_code(NULL, insns, insn_count);
3272 	ATF_REQUIRE(code != NULL);
3273 
3274 	for (k = 1; k <= sizeof(pkt); k++)
3275 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3276 
3277 	bpfjit_free_code(code);
3278 }
3279 
3280 ATF_TC(libbpfjit_stx1);
3281 ATF_TC_HEAD(libbpfjit_stx1, tc)
3282 {
3283 	atf_tc_set_md_var(tc, "descr",
3284 	    "Test JIT compilation of BPF_STX");
3285 }
3286 
3287 ATF_TC_BODY(libbpfjit_stx1, tc)
3288 {
3289 	static struct bpf_insn insns[] = {
3290 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3291 		BPF_STMT(BPF_STX, 0),
3292 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3293 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3294 		BPF_STMT(BPF_RET+BPF_A, 0)
3295 	};
3296 
3297 	size_t i;
3298 	bpfjit_func_t code;
3299 	uint8_t pkt[16]; /* the program doesn't read any data */
3300 
3301 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3302 
3303 	ATF_CHECK(bpf_validate(insns, insn_count));
3304 
3305 	code = bpfjit_generate_code(NULL, insns, insn_count);
3306 	ATF_REQUIRE(code != NULL);
3307 
3308 	for (i = 1; i <= sizeof(pkt); i++)
3309 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3310 
3311 	bpfjit_free_code(code);
3312 }
3313 
3314 ATF_TC(libbpfjit_stx2);
3315 ATF_TC_HEAD(libbpfjit_stx2, tc)
3316 {
3317 	atf_tc_set_md_var(tc, "descr",
3318 	    "Test JIT compilation of BPF_STX");
3319 }
3320 
3321 ATF_TC_BODY(libbpfjit_stx2, tc)
3322 {
3323 	static struct bpf_insn insns[] = {
3324 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3325 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
3326 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3327 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
3328 		BPF_STMT(BPF_RET+BPF_A, 0)
3329 	};
3330 
3331 	bpfjit_func_t code;
3332 	uint8_t pkt[1]; /* the program doesn't read any data */
3333 
3334 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3335 
3336 	ATF_CHECK(bpf_validate(insns, insn_count));
3337 
3338 	code = bpfjit_generate_code(NULL, insns, insn_count);
3339 	ATF_REQUIRE(code != NULL);
3340 
3341 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3342 
3343 	bpfjit_free_code(code);
3344 }
3345 
3346 ATF_TC(libbpfjit_stx3);
3347 ATF_TC_HEAD(libbpfjit_stx3, tc)
3348 {
3349 	atf_tc_set_md_var(tc, "descr",
3350 	    "Test JIT compilation of BPF_STX");
3351 }
3352 
3353 ATF_TC_BODY(libbpfjit_stx3, tc)
3354 {
3355 	static struct bpf_insn insns[] = {
3356 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3357 		BPF_STMT(BPF_STX, 5),
3358 		BPF_STMT(BPF_STX, 2),
3359 		BPF_STMT(BPF_STX, 3),
3360 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
3361 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3362 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
3363 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3364 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
3365 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3366 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
3367 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3368 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
3369 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3370 		BPF_STMT(BPF_RET+BPF_A, 0)
3371 	};
3372 
3373 	size_t i;
3374 	bpfjit_func_t code;
3375 	uint8_t pkt[16]; /* the program doesn't read any data */
3376 
3377 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3378 
3379 	ATF_CHECK(bpf_validate(insns, insn_count));
3380 
3381 	code = bpfjit_generate_code(NULL, insns, insn_count);
3382 	ATF_REQUIRE(code != NULL);
3383 
3384 	for (i = 1; i <= sizeof(pkt); i++)
3385 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
3386 
3387 	bpfjit_free_code(code);
3388 }
3389 
3390 ATF_TC(libbpfjit_stx4);
3391 ATF_TC_HEAD(libbpfjit_stx4, tc)
3392 {
3393 	atf_tc_set_md_var(tc, "descr",
3394 	    "Test JIT compilation of BPF_STX");
3395 }
3396 
3397 ATF_TC_BODY(libbpfjit_stx4, tc)
3398 {
3399 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
3400 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3401 
3402 	size_t k;
3403 	bpfjit_func_t code;
3404 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3405 
3406 	memset(insns, 0, sizeof(insns));
3407 
3408 	/* for each k do M[k] = k */
3409 	for (k = 0; k < BPF_MEMWORDS; k++) {
3410 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
3411 		insns[2*k].k      = 3*k;
3412 		insns[2*k+1].code = BPF_STX;
3413 		insns[2*k+1].k    = k;
3414 	}
3415 
3416 	/* load wirelen into A */
3417 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3418 
3419 	/* for each k, if (A == k + 1) return M[k] */
3420 	for (k = 0; k < BPF_MEMWORDS; k++) {
3421 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3422 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
3423 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
3424 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
3425 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3426 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
3427 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3428 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
3429 	}
3430 
3431 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3432 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
3433 
3434 	ATF_CHECK(bpf_validate(insns, insn_count));
3435 
3436 	code = bpfjit_generate_code(NULL, insns, insn_count);
3437 	ATF_REQUIRE(code != NULL);
3438 
3439 	for (k = 1; k <= sizeof(pkt); k++)
3440 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3441 
3442 	bpfjit_free_code(code);
3443 }
3444 
3445 ATF_TC(libbpfjit_opt_ld_abs_1);
3446 ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
3447 {
3448 	atf_tc_set_md_var(tc, "descr",
3449 	    "Test JIT compilation with length optimization "
3450 	    "applied to BPF_LD+BPF_ABS");
3451 }
3452 
3453 ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
3454 {
3455 	static struct bpf_insn insns[] = {
3456 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3457 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3458 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3459 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3460 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3461 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3462 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3463 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3464 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3465 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3466 		BPF_STMT(BPF_RET+BPF_K, 0),
3467 	};
3468 
3469 	size_t i, j;
3470 	bpfjit_func_t code;
3471 	uint8_t pkt[2][34] = {
3472 		{
3473 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3474 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3475 			0x80, 0x03, 0x70, 0x0f,
3476 			0x80, 0x03, 0x70, 0x23
3477 		},
3478 		{
3479 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3480 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3481 			0x80, 0x03, 0x70, 0x23,
3482 			0x80, 0x03, 0x70, 0x0f
3483 		}
3484 	};
3485 
3486 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3487 
3488 	ATF_CHECK(bpf_validate(insns, insn_count));
3489 
3490 	code = bpfjit_generate_code(NULL, insns, insn_count);
3491 	ATF_REQUIRE(code != NULL);
3492 
3493 	for (i = 0; i < 2; i++) {
3494 		for (j = 1; j < sizeof(pkt[i]); j++)
3495 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3496 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3497 	}
3498 
3499 	bpfjit_free_code(code);
3500 }
3501 
3502 ATF_TC(libbpfjit_opt_ld_abs_2);
3503 ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
3504 {
3505 	atf_tc_set_md_var(tc, "descr",
3506 	    "Test JIT compilation with length optimization "
3507 	    "applied to BPF_LD+BPF_ABS");
3508 }
3509 
3510 ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
3511 {
3512 	static struct bpf_insn insns[] = {
3513 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3514 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3515 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3516 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3517 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3518 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3519 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3520 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3521 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3522 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3523 		BPF_STMT(BPF_RET+BPF_K, 0),
3524 	};
3525 
3526 	size_t i, j;
3527 	bpfjit_func_t code;
3528 	uint8_t pkt[2][34] = {
3529 		{
3530 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3531 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3532 			0x80, 0x03, 0x70, 0x0f,
3533 			0x80, 0x03, 0x70, 0x23
3534 		},
3535 		{
3536 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3537 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3538 			0x80, 0x03, 0x70, 0x23,
3539 			0x80, 0x03, 0x70, 0x0f
3540 		}
3541 	};
3542 
3543 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3544 
3545 	ATF_CHECK(bpf_validate(insns, insn_count));
3546 
3547 	code = bpfjit_generate_code(NULL, insns, insn_count);
3548 	ATF_REQUIRE(code != NULL);
3549 
3550 	for (i = 0; i < 2; i++) {
3551 		for (j = 1; j < sizeof(pkt[i]); j++)
3552 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3553 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3554 	}
3555 
3556 	bpfjit_free_code(code);
3557 }
3558 
3559 ATF_TC(libbpfjit_opt_ld_abs_3);
3560 ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
3561 {
3562 	atf_tc_set_md_var(tc, "descr",
3563 	    "Test JIT compilation with length optimization "
3564 	    "applied to BPF_LD+BPF_ABS");
3565 }
3566 
3567 ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
3568 {
3569 	static struct bpf_insn insns[] = {
3570 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3571 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3572 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3573 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3574 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3575 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3576 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3577 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3578 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3579 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3580 		BPF_STMT(BPF_RET+BPF_K, 0),
3581 	};
3582 
3583 	size_t i, j;
3584 	bpfjit_func_t code;
3585 	uint8_t pkt[2][34] = {
3586 		{
3587 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3588 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3589 			0x80, 0x03, 0x70, 0x0f,
3590 			0x80, 0x03, 0x70, 0x23
3591 		},
3592 		{
3593 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3594 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3595 			0x80, 0x03, 0x70, 0x23,
3596 			0x80, 0x03, 0x70, 0x0f
3597 		}
3598 	};
3599 
3600 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3601 
3602 	ATF_CHECK(bpf_validate(insns, insn_count));
3603 
3604 	code = bpfjit_generate_code(NULL, insns, insn_count);
3605 	ATF_REQUIRE(code != NULL);
3606 
3607 	for (i = 0; i < 2; i++) {
3608 		for (j = 1; j < sizeof(pkt[i]); j++)
3609 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3610 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3611 	}
3612 
3613 	bpfjit_free_code(code);
3614 }
3615 
3616 ATF_TC(libbpfjit_opt_ld_ind_1);
3617 ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
3618 {
3619 	atf_tc_set_md_var(tc, "descr",
3620 	    "Test JIT compilation with length optimization "
3621 	    "applied to BPF_LD+BPF_IND");
3622 }
3623 
3624 ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
3625 {
3626 	static struct bpf_insn insns[] = {
3627 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3628 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3629 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3630 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3631 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3632 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3633 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3634 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3635 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3636 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3637 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3638 		BPF_STMT(BPF_RET+BPF_K, 0),
3639 	};
3640 
3641 	size_t i, j;
3642 	bpfjit_func_t code;
3643 	uint8_t pkt[2][34] = {
3644 		{
3645 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3646 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3647 			0x80, 0x03, 0x70, 0x0f,
3648 			0x80, 0x03, 0x70, 0x23
3649 		},
3650 		{
3651 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3652 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3653 			0x80, 0x03, 0x70, 0x23,
3654 			0x80, 0x03, 0x70, 0x0f
3655 		}
3656 	};
3657 
3658 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3659 
3660 	ATF_CHECK(bpf_validate(insns, insn_count));
3661 
3662 	code = bpfjit_generate_code(NULL, insns, insn_count);
3663 	ATF_REQUIRE(code != NULL);
3664 
3665 	for (i = 0; i < 2; i++) {
3666 		for (j = 1; j < sizeof(pkt[i]); j++)
3667 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3668 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3669 	}
3670 
3671 	bpfjit_free_code(code);
3672 }
3673 
3674 ATF_TC(libbpfjit_opt_ld_ind_2);
3675 ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
3676 {
3677 	atf_tc_set_md_var(tc, "descr",
3678 	    "Test JIT compilation with length optimization "
3679 	    "applied to BPF_LD+BPF_IND");
3680 }
3681 
3682 ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
3683 {
3684 	static struct bpf_insn insns[] = {
3685 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3686 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3687 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3688 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3689 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3690 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3691 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3692 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3693 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3694 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3695 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3696 		BPF_STMT(BPF_RET+BPF_K, 0),
3697 	};
3698 
3699 	size_t i, j;
3700 	bpfjit_func_t code;
3701 	uint8_t pkt[2][34] = {
3702 		{
3703 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3704 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3705 			0x80, 0x03, 0x70, 0x0f,
3706 			0x80, 0x03, 0x70, 0x23
3707 		},
3708 		{
3709 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3710 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3711 			0x80, 0x03, 0x70, 0x23,
3712 			0x80, 0x03, 0x70, 0x0f
3713 		}
3714 	};
3715 
3716 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3717 
3718 	ATF_CHECK(bpf_validate(insns, insn_count));
3719 
3720 	code = bpfjit_generate_code(NULL, insns, insn_count);
3721 	ATF_REQUIRE(code != NULL);
3722 
3723 	for (i = 0; i < 2; i++) {
3724 		for (j = 1; j < sizeof(pkt[i]); j++)
3725 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3726 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3727 	}
3728 
3729 	bpfjit_free_code(code);
3730 }
3731 
3732 ATF_TC(libbpfjit_opt_ld_ind_3);
3733 ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
3734 {
3735 	atf_tc_set_md_var(tc, "descr",
3736 	    "Test JIT compilation with length optimization "
3737 	    "applied to BPF_LD+BPF_IND");
3738 }
3739 
3740 ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
3741 {
3742 	static struct bpf_insn insns[] = {
3743 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3744 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3745 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3746 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3747 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3748 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3749 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3750 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3751 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3752 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3753 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3754 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3755 		BPF_STMT(BPF_RET+BPF_K, 0),
3756 	};
3757 
3758 	size_t i, j;
3759 	bpfjit_func_t code;
3760 	uint8_t pkt[2][34] = {
3761 		{
3762 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3763 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3764 			0x80, 0x03, 0x70, 0x0f,
3765 			0x80, 0x03, 0x70, 0x23
3766 		},
3767 		{
3768 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3769 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3770 			0x80, 0x03, 0x70, 0x23,
3771 			0x80, 0x03, 0x70, 0x0f
3772 		}
3773 	};
3774 
3775 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3776 
3777 	ATF_CHECK(bpf_validate(insns, insn_count));
3778 
3779 	code = bpfjit_generate_code(NULL, insns, insn_count);
3780 	ATF_REQUIRE(code != NULL);
3781 
3782 	for (i = 0; i < 2; i++) {
3783 		for (j = 1; j < sizeof(pkt[i]); j++)
3784 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3785 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3786 	}
3787 
3788 	bpfjit_free_code(code);
3789 }
3790 
3791 ATF_TC(libbpfjit_opt_ld_ind_4);
3792 ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
3793 {
3794 	atf_tc_set_md_var(tc, "descr",
3795 	    "Test JIT compilation with length optimization "
3796 	    "applied to BPF_LD+BPF_IND");
3797 }
3798 
3799 ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
3800 {
3801 	static struct bpf_insn insns[] = {
3802 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3803 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3804 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3805 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3806 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3807 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3808 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3809 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3810 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3811 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3812 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3813 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3814 		BPF_STMT(BPF_RET+BPF_K, 0),
3815 	};
3816 
3817 	size_t i, j;
3818 	bpfjit_func_t code;
3819 	uint8_t pkt[2][34] = {
3820 		{
3821 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3822 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3823 			0x80, 0x03, 0x70, 0x0f,
3824 			0x80, 0x03, 0x70, 0x23
3825 		},
3826 		{
3827 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3828 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3829 			0x80, 0x03, 0x70, 0x23,
3830 			0x80, 0x03, 0x70, 0x0f
3831 		}
3832 	};
3833 
3834 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3835 
3836 	ATF_CHECK(bpf_validate(insns, insn_count));
3837 
3838 	code = bpfjit_generate_code(NULL, insns, insn_count);
3839 	ATF_REQUIRE(code != NULL);
3840 
3841 	for (i = 0; i < 2; i++) {
3842 		for (j = 1; j < sizeof(pkt[i]); j++)
3843 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3844 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3845 	}
3846 
3847 	bpfjit_free_code(code);
3848 }
3849 
3850 ATF_TC(libbpfjit_abc_ja);
3851 ATF_TC_HEAD(libbpfjit_abc_ja, tc)
3852 {
3853 	atf_tc_set_md_var(tc, "descr",
3854 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
3855 }
3856 
3857 ATF_TC_BODY(libbpfjit_abc_ja, tc)
3858 {
3859 	static struct bpf_insn insns[] = {
3860 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3861 		BPF_STMT(BPF_JMP+BPF_JA, 2),
3862 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3863 		BPF_STMT(BPF_RET+BPF_K, 0),
3864 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3865 		BPF_STMT(BPF_RET+BPF_A, 0),
3866 		BPF_STMT(BPF_RET+BPF_K, 1),
3867 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3868 		BPF_STMT(BPF_RET+BPF_K, 2),
3869 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3870 		BPF_STMT(BPF_RET+BPF_K, 3),
3871 	};
3872 
3873 	bpfjit_func_t code;
3874 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3875 
3876 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3877 
3878 	ATF_CHECK(bpf_validate(insns, insn_count));
3879 
3880 	code = bpfjit_generate_code(NULL, insns, insn_count);
3881 	ATF_REQUIRE(code != NULL);
3882 
3883 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3884 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3885 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3886 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3887 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3888 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3889 
3890 	bpfjit_free_code(code);
3891 }
3892 
3893 ATF_TC(libbpfjit_abc_ja_over);
3894 ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
3895 {
3896 	atf_tc_set_md_var(tc, "descr",
3897 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
3898 }
3899 
3900 ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
3901 {
3902 	static struct bpf_insn insns[] = {
3903 		BPF_STMT(BPF_JMP+BPF_JA, 2),
3904 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
3905 		BPF_STMT(BPF_RET+BPF_K, 0),
3906 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3907 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
3908 		BPF_STMT(BPF_RET+BPF_K, 1),
3909 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
3910 		BPF_STMT(BPF_RET+BPF_K, 2),
3911 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3912 		BPF_STMT(BPF_RET+BPF_K, 3),
3913 	};
3914 
3915 	bpfjit_func_t code;
3916 	uint8_t pkt[1]; /* the program doesn't read any data */
3917 
3918 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3919 
3920 	ATF_CHECK(bpf_validate(insns, insn_count));
3921 
3922 	code = bpfjit_generate_code(NULL, insns, insn_count);
3923 	ATF_REQUIRE(code != NULL);
3924 
3925 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
3926 
3927 	bpfjit_free_code(code);
3928 }
3929 
3930 ATF_TC(libbpfjit_abc_ld_chain);
3931 ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
3932 {
3933 	atf_tc_set_md_var(tc, "descr",
3934 	    "Test ABC optimization of a chain of BPF_LD instructions "
3935 	    "with exits leading to a single BPF_RET");
3936 }
3937 
3938 ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
3939 {
3940 	static struct bpf_insn insns[] = {
3941 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3942 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
3943 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
3944 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
3945 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
3946 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
3947 		BPF_STMT(BPF_RET+BPF_K, 123456789),
3948 		BPF_STMT(BPF_RET+BPF_K, 987654321),
3949 	};
3950 
3951 	bpfjit_func_t code;
3952 	uint8_t pkt[10] = {};
3953 
3954 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3955 
3956 	ATF_CHECK(bpf_validate(insns, insn_count));
3957 
3958 	code = bpfjit_generate_code(NULL, insns, insn_count);
3959 	ATF_REQUIRE(code != NULL);
3960 
3961 	/* Packet is too short. */
3962 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3963 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3964 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3965 
3966 	/* !(pkt[3] == 8) => return 123456789 */
3967 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
3968 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
3969 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3970 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
3971 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
3972 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3973 
3974 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
3975 	pkt[3] = 8;
3976 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3977 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3978 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3979 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3980 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3981 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
3982 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
3983 
3984 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
3985 	pkt[4] = pkt[5] = 1;
3986 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3987 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3988 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3989 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3990 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3991 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
3992 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
3993 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
3994 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
3995 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
3996 
3997 	/* (pkt[6:4] > 6) => too short or return 123456789 */
3998 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
3999 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4000 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4001 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4002 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4003 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4004 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4005 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4006 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4007 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4008 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
4009 
4010 	bpfjit_free_code(code);
4011 }
4012 
4013 ATF_TC(libbpfjit_examples_1);
4014 ATF_TC_HEAD(libbpfjit_examples_1, tc)
4015 {
4016 	atf_tc_set_md_var(tc, "descr",
4017 	    "Test the first example from bpf(4) - "
4018 	    "accept Reverse ARP requests");
4019 }
4020 
4021 ATF_TC_BODY(libbpfjit_examples_1, tc)
4022 {
4023 	/*
4024 	 * The following filter is taken from the Reverse ARP
4025 	 * Daemon. It accepts only Reverse ARP requests.
4026 	 */
4027 	struct bpf_insn insns[] = {
4028 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4029 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
4030 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4031 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
4032 		BPF_STMT(BPF_RET+BPF_K, 42),
4033 		BPF_STMT(BPF_RET+BPF_K, 0),
4034 	};
4035 
4036 	bpfjit_func_t code;
4037 	uint8_t pkt[22] = {};
4038 
4039 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4040 
4041 	ATF_CHECK(bpf_validate(insns, insn_count));
4042 
4043 	code = bpfjit_generate_code(NULL, insns, insn_count);
4044 	ATF_REQUIRE(code != NULL);
4045 
4046 	/* Packet is too short. */
4047 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4048 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4049 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4050 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4051 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4052 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4053 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4054 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4055 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4056 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4057 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4058 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4059 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4060 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4061 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4062 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4063 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4064 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4065 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4066 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4067 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4068 
4069 	/* The packet doesn't match. */
4070 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4071 
4072 	/* Still no match after setting the protocol field. */
4073 	pkt[12] = 0x80; pkt[13] = 0x35;
4074 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4075 
4076 	/* Set RARP message type. */
4077 	pkt[21] = 3;
4078 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
4079 
4080 	/* Packet is too short. */
4081 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4082 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4083 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4084 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4085 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4086 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4087 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4088 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4089 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4090 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4091 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4092 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4093 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4094 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4095 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4096 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4097 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4098 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4099 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4100 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4101 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4102 
4103 	/* Change RARP message type. */
4104 	pkt[20] = 3;
4105 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4106 
4107 	bpfjit_free_code(code);
4108 }
4109 
4110 ATF_TC(libbpfjit_examples_2);
4111 ATF_TC_HEAD(libbpfjit_examples_2, tc)
4112 {
4113 	atf_tc_set_md_var(tc, "descr",
4114 	    "Test the second example from bpf(4) - "
4115 	    "accept IP packets between two specified hosts");
4116 }
4117 
4118 ATF_TC_BODY(libbpfjit_examples_2, tc)
4119 {
4120 	/*
4121 	 * This filter accepts only IP packets between host 128.3.112.15
4122 	 * and 128.3.112.35.
4123 	 */
4124 	static struct bpf_insn insns[] = {
4125 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4126 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
4127 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
4128 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
4129 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4130 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
4131 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
4132 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4133 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
4134 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4135 		BPF_STMT(BPF_RET+BPF_K, 0),
4136 	};
4137 
4138 	bpfjit_func_t code;
4139 	uint8_t pkt[34] = {};
4140 
4141 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4142 
4143 	ATF_CHECK(bpf_validate(insns, insn_count));
4144 
4145 	code = bpfjit_generate_code(NULL, insns, insn_count);
4146 	ATF_REQUIRE(code != NULL);
4147 
4148 	/* Packet is too short. */
4149 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4150 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4151 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4152 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4153 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4154 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4155 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4156 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4157 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4158 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4159 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4160 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4161 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4162 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4163 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4164 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4165 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4166 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4167 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4168 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4169 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4170 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4171 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4172 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4173 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4174 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4175 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4176 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4177 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4178 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4179 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4180 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4181 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4182 
4183 	/* The packet doesn't match. */
4184 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4185 
4186 	/* Still no match after setting the protocol field. */
4187 	pkt[12] = 8;
4188 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4189 
4190 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
4191 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4192 
4193 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
4194 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4195 
4196 	/* Swap the ip addresses. */
4197 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
4198 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4199 
4200 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
4201 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4202 
4203 	/* Packet is too short. */
4204 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4205 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4206 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4207 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4208 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4209 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4210 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4211 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4212 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4213 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4214 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4215 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4216 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4217 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4218 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4219 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4220 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4221 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4222 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4223 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4224 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4225 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4226 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4227 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4228 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4229 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4230 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4231 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4232 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4233 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4234 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4235 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4236 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4237 
4238 	/* Change the protocol field. */
4239 	pkt[13] = 8;
4240 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4241 
4242 	bpfjit_free_code(code);
4243 }
4244 
4245 ATF_TC(libbpfjit_examples_3);
4246 ATF_TC_HEAD(libbpfjit_examples_3, tc)
4247 {
4248 	atf_tc_set_md_var(tc, "descr",
4249 	    "Test the third example from bpf(4) - "
4250 	    "accept TCP finger packets");
4251 }
4252 
4253 ATF_TC_BODY(libbpfjit_examples_3, tc)
4254 {
4255 	/*
4256 	 * This filter returns only TCP finger packets.
4257 	 */
4258 	struct bpf_insn insns[] = {
4259 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4260 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
4261 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
4262 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
4263 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4264 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
4265 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
4266 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
4267 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
4268 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
4269 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
4270 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4271 		BPF_STMT(BPF_RET+BPF_K, 0),
4272 	};
4273 
4274 	bpfjit_func_t code;
4275 	uint8_t pkt[30] = {};
4276 
4277 	/* Set IP fragment offset to non-zero. */
4278 	pkt[20] = 1; pkt[21] = 1;
4279 
4280 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4281 
4282 	ATF_CHECK(bpf_validate(insns, insn_count));
4283 
4284 	code = bpfjit_generate_code(NULL, insns, insn_count);
4285 	ATF_REQUIRE(code != NULL);
4286 
4287 	/* Packet is too short. */
4288 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4289 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4290 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4291 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4292 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4293 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4294 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4295 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4296 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4297 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4298 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4299 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4300 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4301 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4302 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4303 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4304 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4305 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4306 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4307 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4308 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4309 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4310 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4311 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4312 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4313 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4314 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4315 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4316 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4317 
4318 	/* The packet doesn't match. */
4319 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4320 
4321 	/* Still no match after setting the protocol field. */
4322 	pkt[12] = 8;
4323 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4324 
4325 	/* Get one step closer to the match. */
4326 	pkt[23] = 6;
4327 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4328 
4329 	/* Set IP fragment offset to zero. */
4330 	pkt[20] = 0x20; pkt[21] = 0;
4331 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4332 
4333 	/* Set IP header length to 12. */
4334 	pkt[14] = 0xd3;
4335 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4336 
4337 	/* Match one branch of the program. */
4338 	pkt[27] = 79;
4339 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4340 
4341 	/* Match the other branch of the program. */
4342 	pkt[29] = 79; pkt[27] = 0;
4343 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4344 
4345 	/* Packet is too short. */
4346 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4347 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4348 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4349 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4350 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4351 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4352 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4353 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4354 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4355 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4356 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4357 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4358 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4359 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4360 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4361 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4362 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4363 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4364 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4365 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4366 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4367 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4368 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4369 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4370 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4371 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4372 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4373 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4374 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4375 
4376 	/* Set IP header length to 16. Packet is too short. */
4377 	pkt[14] = 4;
4378 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4379 
4380 	bpfjit_free_code(code);
4381 }
4382 
4383 ATF_TC(libbpfjit_cop_no_ctx);
4384 ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
4385 {
4386 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
4387 	    "instruction can't be accepted without a context");
4388 }
4389 
4390 ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
4391 {
4392 	static struct bpf_insn insns[] = {
4393 		BPF_STMT(BPF_MISC+BPF_COP, 0),
4394 		BPF_STMT(BPF_RET+BPF_K, 7)
4395 	};
4396 
4397 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4398 
4399 	ATF_CHECK(!bpf_validate(insns, insn_count));
4400 
4401 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
4402 }
4403 
4404 ATF_TC(libbpfjit_copx_no_ctx);
4405 ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
4406 {
4407 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
4408 	    "instruction can't be accepted without a context");
4409 }
4410 
4411 ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
4412 {
4413 	static struct bpf_insn insns[] = {
4414 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
4415 		BPF_STMT(BPF_RET+BPF_K, 7)
4416 	};
4417 
4418 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4419 
4420 	ATF_CHECK(!bpf_validate(insns, insn_count));
4421 
4422 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
4423 }
4424 
4425 ATF_TP_ADD_TCS(tp)
4426 {
4427 
4428 	/*
4429 	 * For every new test please also add a similar test
4430 	 * to ../../net/bpfjit/t_bpfjit.c
4431 	 */
4432 	ATF_TP_ADD_TC(tp, libbpfjit_empty);
4433 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
4434 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
4435 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
4436 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
4437 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
4438 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
4439 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
4440 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
4441 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
4442 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
4443 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
4444 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
4445 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
4446 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
4447 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
4448 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
4449 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
4450 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
4451 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
4452 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
4453 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
4454 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
4455 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
4456 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
4457 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
4458 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
4459 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
4460 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
4461 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
4462 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
4463 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
4464 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
4465 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
4466 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
4467 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
4468 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
4469 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
4470 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
4471 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
4472 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
4473 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
4474 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
4475 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
4476 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
4477 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
4478 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
4479 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
4480 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
4481 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
4482 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
4483 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
4484 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
4485 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
4486 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
4487 	ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
4488 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
4489 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
4490 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
4491 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
4492 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
4493 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
4494 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
4495 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
4496 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
4497 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
4498 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
4499 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
4500 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
4501 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
4502 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
4503 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
4504 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
4505 	ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
4506 	ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
4507 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
4508 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
4509 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
4510 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
4511 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
4512 	ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
4513 	ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
4514 	ATF_TP_ADD_TC(tp, libbpfjit_st1);
4515 	ATF_TP_ADD_TC(tp, libbpfjit_st2);
4516 	ATF_TP_ADD_TC(tp, libbpfjit_st3);
4517 	ATF_TP_ADD_TC(tp, libbpfjit_st4);
4518 	ATF_TP_ADD_TC(tp, libbpfjit_st5);
4519 	ATF_TP_ADD_TC(tp, libbpfjit_stx1);
4520 	ATF_TP_ADD_TC(tp, libbpfjit_stx2);
4521 	ATF_TP_ADD_TC(tp, libbpfjit_stx3);
4522 	ATF_TP_ADD_TC(tp, libbpfjit_stx4);
4523 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
4524 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
4525 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
4526 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
4527 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
4528 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
4529 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
4530 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
4531 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
4532 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
4533 	ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
4534 	ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
4535 	ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
4536 	ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
4537 	ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
4538 
4539 	return atf_no_error();
4540 }
4541