xref: /minix3/tests/lib/libbpfjit/t_bpfjit.c (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1 /*	$NetBSD: t_bpfjit.c,v 1.2 2013/11/15 00:12:45 rmind Exp $ */
2 
3 /*-
4  * Copyright (c) 2011-2012 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.2 2013/11/15 00:12:45 rmind Exp $");
34 
35 #include <atf-c.h>
36 #include <stdint.h>
37 #include <string.h>
38 
39 #define	__BPF_PRIVATE
40 #include <net/bpf.h>
41 #include <net/bpfjit.h>
42 
43 static uint8_t deadbeef_at_5[16] = {
44 	0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
45 };
46 
47 static bpf_ctx_t bc_zeroed;
48 static bpf_ctx_t *bc = &bc_zeroed;
49 
50 ATF_TC(bpfjit_empty);
51 ATF_TC_HEAD(bpfjit_empty, tc)
52 {
53 	atf_tc_set_md_var(tc, "descr",
54 	    "Test that JIT compilation for an empty bpf program fails");
55 }
56 
57 ATF_TC_BODY(bpfjit_empty, tc)
58 {
59 	struct bpf_insn dummy;
60 
61 	ATF_CHECK(bpfjit_generate_code(bc, &dummy, 0) == NULL);
62 }
63 
64 ATF_TC(bpfjit_alu_add_k);
65 ATF_TC_HEAD(bpfjit_alu_add_k, tc)
66 {
67 	atf_tc_set_md_var(tc, "descr",
68 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
69 }
70 
71 ATF_TC_BODY(bpfjit_alu_add_k, tc)
72 {
73 	static struct bpf_insn insns[] = {
74 		BPF_STMT(BPF_LD+BPF_IMM, 3),
75 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
76 		BPF_STMT(BPF_RET+BPF_A, 0)
77 	};
78 
79 	bpfjit_func_t code;
80 	uint8_t pkt[1]; /* the program doesn't read any data */
81 
82 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
83 
84 	ATF_CHECK(bpf_validate(insns, insn_count));
85 
86 	code = bpfjit_generate_code(bc, insns, insn_count);
87 	ATF_REQUIRE(code != NULL);
88 
89 	ATF_CHECK(code(pkt, 1, 1) == 5);
90 
91 	bpfjit_free_code(code);
92 }
93 
94 ATF_TC(bpfjit_alu_sub_k);
95 ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
96 {
97 	atf_tc_set_md_var(tc, "descr",
98 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
99 }
100 
101 ATF_TC_BODY(bpfjit_alu_sub_k, tc)
102 {
103 	static struct bpf_insn insns[] = {
104 		BPF_STMT(BPF_LD+BPF_IMM, 1),
105 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
106 		BPF_STMT(BPF_RET+BPF_A, 0)
107 	};
108 
109 	bpfjit_func_t code;
110 	uint8_t pkt[1]; /* the program doesn't read any data */
111 
112 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
113 
114 	ATF_CHECK(bpf_validate(insns, insn_count));
115 
116 	code = bpfjit_generate_code(bc, insns, insn_count);
117 	ATF_REQUIRE(code != NULL);
118 
119 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
120 
121 	bpfjit_free_code(code);
122 }
123 
124 ATF_TC(bpfjit_alu_mul_k);
125 ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
126 {
127 	atf_tc_set_md_var(tc, "descr",
128 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
129 }
130 
131 ATF_TC_BODY(bpfjit_alu_mul_k, tc)
132 {
133 	static struct bpf_insn insns[] = {
134 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
135 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
136 		BPF_STMT(BPF_RET+BPF_A, 0)
137 	};
138 
139 	bpfjit_func_t code;
140 	uint8_t pkt[1]; /* the program doesn't read any data */
141 
142 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
143 
144 	ATF_CHECK(bpf_validate(insns, insn_count));
145 
146 	code = bpfjit_generate_code(bc, insns, insn_count);
147 	ATF_REQUIRE(code != NULL);
148 
149 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
150 
151 	bpfjit_free_code(code);
152 }
153 
154 ATF_TC(bpfjit_alu_div0_k);
155 ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
156 {
157 	atf_tc_set_md_var(tc, "descr",
158 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
159 }
160 
161 ATF_TC_BODY(bpfjit_alu_div0_k, tc)
162 {
163 	static struct bpf_insn insns[] = {
164 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
165 		BPF_STMT(BPF_RET+BPF_A, 0)
166 	};
167 
168 	bpfjit_func_t code;
169 	uint8_t pkt[1]; /* the program doesn't read any data */
170 
171 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
172 
173 	//ATF_CHECK(bpf_validate(insns, insn_count));
174 
175 	code = bpfjit_generate_code(bc, insns, insn_count);
176 	ATF_REQUIRE(code != NULL);
177 
178 	ATF_CHECK(code(pkt, 1, 1) == 0);
179 
180 	bpfjit_free_code(code);
181 }
182 
183 ATF_TC(bpfjit_alu_div1_k);
184 ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
185 {
186 	atf_tc_set_md_var(tc, "descr",
187 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
188 }
189 
190 ATF_TC_BODY(bpfjit_alu_div1_k, tc)
191 {
192 	static struct bpf_insn insns[] = {
193 		BPF_STMT(BPF_LD+BPF_IMM, 7),
194 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
195 		BPF_STMT(BPF_RET+BPF_A, 0)
196 	};
197 
198 	bpfjit_func_t code;
199 	uint8_t pkt[1]; /* the program doesn't read any data */
200 
201 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
202 
203 	ATF_CHECK(bpf_validate(insns, insn_count));
204 
205 	code = bpfjit_generate_code(bc, insns, insn_count);
206 	ATF_REQUIRE(code != NULL);
207 
208 	ATF_CHECK(code(pkt, 1, 1) == 7);
209 
210 	bpfjit_free_code(code);
211 }
212 
213 ATF_TC(bpfjit_alu_div2_k);
214 ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
215 {
216 	atf_tc_set_md_var(tc, "descr",
217 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
218 }
219 
220 ATF_TC_BODY(bpfjit_alu_div2_k, tc)
221 {
222 	static struct bpf_insn insns[] = {
223 		BPF_STMT(BPF_LD+BPF_IMM, 7),
224 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
225 		BPF_STMT(BPF_RET+BPF_A, 0)
226 	};
227 
228 	bpfjit_func_t code;
229 	uint8_t pkt[1]; /* the program doesn't read any data */
230 
231 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
232 
233 	ATF_CHECK(bpf_validate(insns, insn_count));
234 
235 	code = bpfjit_generate_code(bc, insns, insn_count);
236 	ATF_REQUIRE(code != NULL);
237 
238 	ATF_CHECK(code(pkt, 1, 1) == 3);
239 
240 	bpfjit_free_code(code);
241 }
242 
243 ATF_TC(bpfjit_alu_div4_k);
244 ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
245 {
246 	atf_tc_set_md_var(tc, "descr",
247 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
248 }
249 
250 ATF_TC_BODY(bpfjit_alu_div4_k, tc)
251 {
252 	static struct bpf_insn insns[] = {
253 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
254 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
255 		BPF_STMT(BPF_RET+BPF_A, 0)
256 	};
257 
258 	bpfjit_func_t code;
259 	uint8_t pkt[1]; /* the program doesn't read any data */
260 
261 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
262 
263 	ATF_CHECK(bpf_validate(insns, insn_count));
264 
265 	code = bpfjit_generate_code(bc, insns, insn_count);
266 	ATF_REQUIRE(code != NULL);
267 
268 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
269 
270 	bpfjit_free_code(code);
271 }
272 
273 ATF_TC(bpfjit_alu_div10_k);
274 ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
275 {
276 	atf_tc_set_md_var(tc, "descr",
277 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
278 }
279 
280 ATF_TC_BODY(bpfjit_alu_div10_k, tc)
281 {
282 	static struct bpf_insn insns[] = {
283 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
284 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
285 		BPF_STMT(BPF_RET+BPF_A, 0)
286 	};
287 
288 	bpfjit_func_t code;
289 	uint8_t pkt[1]; /* the program doesn't read any data */
290 
291 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
292 
293 	ATF_CHECK(bpf_validate(insns, insn_count));
294 
295 	code = bpfjit_generate_code(bc, insns, insn_count);
296 	ATF_REQUIRE(code != NULL);
297 
298 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
299 
300 	bpfjit_free_code(code);
301 }
302 
303 ATF_TC(bpfjit_alu_div10000_k);
304 ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
305 {
306 	atf_tc_set_md_var(tc, "descr",
307 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
308 }
309 
310 ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
311 {
312 	static struct bpf_insn insns[] = {
313 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
314 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
315 		BPF_STMT(BPF_RET+BPF_A, 0)
316 	};
317 
318 	bpfjit_func_t code;
319 	uint8_t pkt[1]; /* the program doesn't read any data */
320 
321 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
322 
323 	ATF_CHECK(bpf_validate(insns, insn_count));
324 
325 	code = bpfjit_generate_code(bc, insns, insn_count);
326 	ATF_REQUIRE(code != NULL);
327 
328 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
329 
330 	bpfjit_free_code(code);
331 }
332 
333 ATF_TC(bpfjit_alu_div7609801_k);
334 ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
335 {
336 	atf_tc_set_md_var(tc, "descr",
337 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
338 }
339 
340 ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
341 {
342 	static struct bpf_insn insns[] = {
343 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
344 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
345 		BPF_STMT(BPF_RET+BPF_A, 0)
346 	};
347 
348 	bpfjit_func_t code;
349 	uint8_t pkt[1]; /* the program doesn't read any data */
350 
351 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
352 
353 	ATF_CHECK(bpf_validate(insns, insn_count));
354 
355 	code = bpfjit_generate_code(bc, insns, insn_count);
356 	ATF_REQUIRE(code != NULL);
357 
358 	ATF_CHECK(code(pkt, 1, 1) == 564);
359 
360 	bpfjit_free_code(code);
361 }
362 
363 ATF_TC(bpfjit_alu_div80000000_k);
364 ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
365 {
366 	atf_tc_set_md_var(tc, "descr",
367 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
368 }
369 
370 ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
371 {
372 	static struct bpf_insn insns[] = {
373 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
374 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
375 		BPF_STMT(BPF_RET+BPF_A, 0)
376 	};
377 
378 	bpfjit_func_t code;
379 	uint8_t pkt[1]; /* the program doesn't read any data */
380 
381 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
382 
383 	ATF_CHECK(bpf_validate(insns, insn_count));
384 
385 	code = bpfjit_generate_code(bc, insns, insn_count);
386 	ATF_REQUIRE(code != NULL);
387 
388 	ATF_CHECK(code(pkt, 1, 1) == 1);
389 
390 	bpfjit_free_code(code);
391 }
392 
393 ATF_TC(bpfjit_alu_and_k);
394 ATF_TC_HEAD(bpfjit_alu_and_k, tc)
395 {
396 	atf_tc_set_md_var(tc, "descr",
397 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
398 }
399 
400 ATF_TC_BODY(bpfjit_alu_and_k, tc)
401 {
402 	static struct bpf_insn insns[] = {
403 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
404 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
405 		BPF_STMT(BPF_RET+BPF_A, 0)
406 	};
407 
408 	bpfjit_func_t code;
409 	uint8_t pkt[1]; /* the program doesn't read any data */
410 
411 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
412 
413 	ATF_CHECK(bpf_validate(insns, insn_count));
414 
415 	code = bpfjit_generate_code(bc, insns, insn_count);
416 	ATF_REQUIRE(code != NULL);
417 
418 	ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
419 
420 	bpfjit_free_code(code);
421 }
422 
423 ATF_TC(bpfjit_alu_or_k);
424 ATF_TC_HEAD(bpfjit_alu_or_k, tc)
425 {
426 	atf_tc_set_md_var(tc, "descr",
427 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
428 }
429 
430 ATF_TC_BODY(bpfjit_alu_or_k, tc)
431 {
432 	static struct bpf_insn insns[] = {
433 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
434 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
435 		BPF_STMT(BPF_RET+BPF_A, 0)
436 	};
437 
438 	bpfjit_func_t code;
439 	uint8_t pkt[1]; /* the program doesn't read any data */
440 
441 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
442 
443 	ATF_CHECK(bpf_validate(insns, insn_count));
444 
445 	code = bpfjit_generate_code(bc, insns, insn_count);
446 	ATF_REQUIRE(code != NULL);
447 
448 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
449 
450 	bpfjit_free_code(code);
451 }
452 
453 ATF_TC(bpfjit_alu_lsh_k);
454 ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
455 {
456 	atf_tc_set_md_var(tc, "descr",
457 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
458 }
459 
460 ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
461 {
462 	static struct bpf_insn insns[] = {
463 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
464 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
465 		BPF_STMT(BPF_RET+BPF_A, 0)
466 	};
467 
468 	bpfjit_func_t code;
469 	uint8_t pkt[1]; /* the program doesn't read any data */
470 
471 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
472 
473 	ATF_CHECK(bpf_validate(insns, insn_count));
474 
475 	code = bpfjit_generate_code(bc, insns, insn_count);
476 	ATF_REQUIRE(code != NULL);
477 
478 	ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
479 
480 	bpfjit_free_code(code);
481 }
482 
483 ATF_TC(bpfjit_alu_lsh0_k);
484 ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
485 {
486 	atf_tc_set_md_var(tc, "descr",
487 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
488 }
489 
490 ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
491 {
492 	static struct bpf_insn insns[] = {
493 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
494 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
495 		BPF_STMT(BPF_RET+BPF_A, 0)
496 	};
497 
498 	bpfjit_func_t code;
499 	uint8_t pkt[1]; /* the program doesn't read any data */
500 
501 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
502 
503 	ATF_CHECK(bpf_validate(insns, insn_count));
504 
505 	code = bpfjit_generate_code(bc, insns, insn_count);
506 	ATF_REQUIRE(code != NULL);
507 
508 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
509 
510 	bpfjit_free_code(code);
511 }
512 
513 ATF_TC(bpfjit_alu_rsh_k);
514 ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
515 {
516 	atf_tc_set_md_var(tc, "descr",
517 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
518 }
519 
520 ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
521 {
522 	static struct bpf_insn insns[] = {
523 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
524 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
525 		BPF_STMT(BPF_RET+BPF_A, 0)
526 	};
527 
528 	bpfjit_func_t code;
529 	uint8_t pkt[1]; /* the program doesn't read any data */
530 
531 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
532 
533 	ATF_CHECK(bpf_validate(insns, insn_count));
534 
535 	code = bpfjit_generate_code(bc, insns, insn_count);
536 	ATF_REQUIRE(code != NULL);
537 
538 	ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
539 
540 	bpfjit_free_code(code);
541 }
542 
543 ATF_TC(bpfjit_alu_rsh0_k);
544 ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
545 {
546 	atf_tc_set_md_var(tc, "descr",
547 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
548 }
549 
550 ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
551 {
552 	static struct bpf_insn insns[] = {
553 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
554 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
555 		BPF_STMT(BPF_RET+BPF_A, 0)
556 	};
557 
558 	bpfjit_func_t code;
559 	uint8_t pkt[1]; /* the program doesn't read any data */
560 
561 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
562 
563 	ATF_CHECK(bpf_validate(insns, insn_count));
564 
565 	code = bpfjit_generate_code(bc, insns, insn_count);
566 	ATF_REQUIRE(code != NULL);
567 
568 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
569 
570 	bpfjit_free_code(code);
571 }
572 
573 ATF_TC(bpfjit_alu_modulo_k);
574 ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
575 {
576 	atf_tc_set_md_var(tc, "descr",
577 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
578 }
579 
580 ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
581 {
582 	static struct bpf_insn insns[] = {
583 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
584 
585 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
586 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
587 
588 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
589 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
590 
591 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
592 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
593 
594 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
595 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
596 
597 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
598 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
599 
600 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
601 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
602 
603 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
604 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
605 
606 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
607 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
608 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
609 
610 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
611 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
612 
613 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
614 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
615 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
616 
617 		BPF_STMT(BPF_RET+BPF_A, 0)
618 	};
619 
620 	bpfjit_func_t code;
621 	uint8_t pkt[1]; /* the program doesn't read any data */
622 
623 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
624 
625 	ATF_CHECK(bpf_validate(insns, insn_count));
626 
627 	code = bpfjit_generate_code(bc, insns, insn_count);
628 	ATF_REQUIRE(code != NULL);
629 
630 	ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
631 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
632 
633 
634 	bpfjit_free_code(code);
635 }
636 
637 ATF_TC(bpfjit_alu_add_x);
638 ATF_TC_HEAD(bpfjit_alu_add_x, tc)
639 {
640 	atf_tc_set_md_var(tc, "descr",
641 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
642 }
643 
644 ATF_TC_BODY(bpfjit_alu_add_x, tc)
645 {
646 	static struct bpf_insn insns[] = {
647 		BPF_STMT(BPF_LD+BPF_IMM, 3),
648 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
649 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
650 		BPF_STMT(BPF_RET+BPF_A, 0)
651 	};
652 
653 	bpfjit_func_t code;
654 	uint8_t pkt[1]; /* the program doesn't read any data */
655 
656 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
657 
658 	ATF_CHECK(bpf_validate(insns, insn_count));
659 
660 	code = bpfjit_generate_code(bc, insns, insn_count);
661 	ATF_REQUIRE(code != NULL);
662 
663 	ATF_CHECK(code(pkt, 1, 1) == 5);
664 
665 	bpfjit_free_code(code);
666 }
667 
668 ATF_TC(bpfjit_alu_sub_x);
669 ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
670 {
671 	atf_tc_set_md_var(tc, "descr",
672 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
673 }
674 
675 ATF_TC_BODY(bpfjit_alu_sub_x, tc)
676 {
677 	static struct bpf_insn insns[] = {
678 		BPF_STMT(BPF_LD+BPF_IMM, 1),
679 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
680 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
681 		BPF_STMT(BPF_RET+BPF_A, 0)
682 	};
683 
684 	bpfjit_func_t code;
685 	uint8_t pkt[1]; /* the program doesn't read any data */
686 
687 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
688 
689 	ATF_CHECK(bpf_validate(insns, insn_count));
690 
691 	code = bpfjit_generate_code(bc, insns, insn_count);
692 	ATF_REQUIRE(code != NULL);
693 
694 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
695 
696 	bpfjit_free_code(code);
697 }
698 
699 ATF_TC(bpfjit_alu_mul_x);
700 ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
701 {
702 	atf_tc_set_md_var(tc, "descr",
703 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
704 }
705 
706 ATF_TC_BODY(bpfjit_alu_mul_x, tc)
707 {
708 	static struct bpf_insn insns[] = {
709 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
710 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
711 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
712 		BPF_STMT(BPF_RET+BPF_A, 0)
713 	};
714 
715 	bpfjit_func_t code;
716 	uint8_t pkt[1]; /* the program doesn't read any data */
717 
718 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
719 
720 	ATF_CHECK(bpf_validate(insns, insn_count));
721 
722 	code = bpfjit_generate_code(bc, insns, insn_count);
723 	ATF_REQUIRE(code != NULL);
724 
725 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
726 
727 	bpfjit_free_code(code);
728 }
729 
730 ATF_TC(bpfjit_alu_div0_x);
731 ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
732 {
733 	atf_tc_set_md_var(tc, "descr",
734 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
735 }
736 
737 ATF_TC_BODY(bpfjit_alu_div0_x, tc)
738 {
739 	static struct bpf_insn insns[] = {
740 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
741 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
742 		BPF_STMT(BPF_RET+BPF_A, 0)
743 	};
744 
745 	bpfjit_func_t code;
746 	uint8_t pkt[1]; /* the program doesn't read any data */
747 
748 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
749 
750 	ATF_CHECK(bpf_validate(insns, insn_count));
751 
752 	code = bpfjit_generate_code(bc, insns, insn_count);
753 	ATF_REQUIRE(code != NULL);
754 
755 	ATF_CHECK(code(pkt, 1, 1) == 0);
756 
757 	bpfjit_free_code(code);
758 }
759 
760 ATF_TC(bpfjit_alu_div1_x);
761 ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
762 {
763 	atf_tc_set_md_var(tc, "descr",
764 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
765 }
766 
767 ATF_TC_BODY(bpfjit_alu_div1_x, tc)
768 {
769 	static struct bpf_insn insns[] = {
770 		BPF_STMT(BPF_LD+BPF_IMM, 7),
771 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
772 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 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(bc, insns, insn_count);
784 	ATF_REQUIRE(code != NULL);
785 
786 	ATF_CHECK(code(pkt, 1, 1) == 7);
787 
788 	bpfjit_free_code(code);
789 }
790 
791 ATF_TC(bpfjit_alu_div2_x);
792 ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
793 {
794 	atf_tc_set_md_var(tc, "descr",
795 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
796 }
797 
798 ATF_TC_BODY(bpfjit_alu_div2_x, tc)
799 {
800 	static struct bpf_insn insns[] = {
801 		BPF_STMT(BPF_LD+BPF_IMM, 7),
802 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
803 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
804 		BPF_STMT(BPF_RET+BPF_A, 0)
805 	};
806 
807 	bpfjit_func_t code;
808 	uint8_t pkt[1]; /* the program doesn't read any data */
809 
810 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
811 
812 	ATF_CHECK(bpf_validate(insns, insn_count));
813 
814 	code = bpfjit_generate_code(bc, insns, insn_count);
815 	ATF_REQUIRE(code != NULL);
816 
817 	ATF_CHECK(code(pkt, 1, 1) == 3);
818 
819 	bpfjit_free_code(code);
820 }
821 
822 ATF_TC(bpfjit_alu_div4_x);
823 ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
824 {
825 	atf_tc_set_md_var(tc, "descr",
826 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
827 }
828 
829 ATF_TC_BODY(bpfjit_alu_div4_x, tc)
830 {
831 	static struct bpf_insn insns[] = {
832 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
833 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
834 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
835 		BPF_STMT(BPF_RET+BPF_A, 0)
836 	};
837 
838 	bpfjit_func_t code;
839 	uint8_t pkt[1]; /* the program doesn't read any data */
840 
841 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
842 
843 	ATF_CHECK(bpf_validate(insns, insn_count));
844 
845 	code = bpfjit_generate_code(bc, insns, insn_count);
846 	ATF_REQUIRE(code != NULL);
847 
848 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
849 
850 	bpfjit_free_code(code);
851 }
852 
853 ATF_TC(bpfjit_alu_div10_x);
854 ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
855 {
856 	atf_tc_set_md_var(tc, "descr",
857 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
858 }
859 
860 ATF_TC_BODY(bpfjit_alu_div10_x, tc)
861 {
862 	static struct bpf_insn insns[] = {
863 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
864 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
865 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
866 		BPF_STMT(BPF_RET+BPF_A, 0)
867 	};
868 
869 	bpfjit_func_t code;
870 	uint8_t pkt[1]; /* the program doesn't read any data */
871 
872 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
873 
874 	ATF_CHECK(bpf_validate(insns, insn_count));
875 
876 	code = bpfjit_generate_code(bc, insns, insn_count);
877 	ATF_REQUIRE(code != NULL);
878 
879 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
880 
881 	bpfjit_free_code(code);
882 }
883 
884 ATF_TC(bpfjit_alu_div10000_x);
885 ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
886 {
887 	atf_tc_set_md_var(tc, "descr",
888 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
889 }
890 
891 ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
892 {
893 	static struct bpf_insn insns[] = {
894 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
895 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
896 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
897 		BPF_STMT(BPF_RET+BPF_A, 0)
898 	};
899 
900 	bpfjit_func_t code;
901 	uint8_t pkt[1]; /* the program doesn't read any data */
902 
903 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
904 
905 	ATF_CHECK(bpf_validate(insns, insn_count));
906 
907 	code = bpfjit_generate_code(bc, insns, insn_count);
908 	ATF_REQUIRE(code != NULL);
909 
910 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
911 
912 	bpfjit_free_code(code);
913 }
914 
915 ATF_TC(bpfjit_alu_div7609801_x);
916 ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
917 {
918 	atf_tc_set_md_var(tc, "descr",
919 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
920 }
921 
922 ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
923 {
924 	static struct bpf_insn insns[] = {
925 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
926 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
927 		BPF_STMT(BPF_ALU+BPF_DIV+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(bc, insns, insn_count);
939 	ATF_REQUIRE(code != NULL);
940 
941 	ATF_CHECK(code(pkt, 1, 1) == 564);
942 
943 	bpfjit_free_code(code);
944 }
945 
946 ATF_TC(bpfjit_alu_div80000000_x);
947 ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
948 {
949 	atf_tc_set_md_var(tc, "descr",
950 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
951 }
952 
953 ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
954 {
955 	static struct bpf_insn insns[] = {
956 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
957 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
958 		BPF_STMT(BPF_ALU+BPF_DIV+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(bc, insns, insn_count);
970 	ATF_REQUIRE(code != NULL);
971 
972 	ATF_CHECK(code(pkt, 1, 1) == 1);
973 
974 	bpfjit_free_code(code);
975 }
976 
977 ATF_TC(bpfjit_alu_and_x);
978 ATF_TC_HEAD(bpfjit_alu_and_x, tc)
979 {
980 	atf_tc_set_md_var(tc, "descr",
981 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
982 }
983 
984 ATF_TC_BODY(bpfjit_alu_and_x, tc)
985 {
986 	static struct bpf_insn insns[] = {
987 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
988 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
989 		BPF_STMT(BPF_ALU+BPF_AND+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(bc, insns, insn_count);
1001 	ATF_REQUIRE(code != NULL);
1002 
1003 	ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
1004 
1005 	bpfjit_free_code(code);
1006 }
1007 
1008 ATF_TC(bpfjit_alu_or_x);
1009 ATF_TC_HEAD(bpfjit_alu_or_x, tc)
1010 {
1011 	atf_tc_set_md_var(tc, "descr",
1012 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1013 }
1014 
1015 ATF_TC_BODY(bpfjit_alu_or_x, tc)
1016 {
1017 	static struct bpf_insn insns[] = {
1018 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1019 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1020 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1021 		BPF_STMT(BPF_RET+BPF_A, 0)
1022 	};
1023 
1024 	bpfjit_func_t code;
1025 	uint8_t pkt[1]; /* the program doesn't read any data */
1026 
1027 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1028 
1029 	ATF_CHECK(bpf_validate(insns, insn_count));
1030 
1031 	code = bpfjit_generate_code(bc, insns, insn_count);
1032 	ATF_REQUIRE(code != NULL);
1033 
1034 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1035 
1036 	bpfjit_free_code(code);
1037 }
1038 
1039 ATF_TC(bpfjit_alu_lsh_x);
1040 ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
1041 {
1042 	atf_tc_set_md_var(tc, "descr",
1043 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1044 }
1045 
1046 ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
1047 {
1048 	static struct bpf_insn insns[] = {
1049 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1050 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1051 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1052 		BPF_STMT(BPF_RET+BPF_A, 0)
1053 	};
1054 
1055 	bpfjit_func_t code;
1056 	uint8_t pkt[1]; /* the program doesn't read any data */
1057 
1058 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1059 
1060 	ATF_CHECK(bpf_validate(insns, insn_count));
1061 
1062 	code = bpfjit_generate_code(bc, insns, insn_count);
1063 	ATF_REQUIRE(code != NULL);
1064 
1065 	ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
1066 
1067 	bpfjit_free_code(code);
1068 }
1069 
1070 ATF_TC(bpfjit_alu_lsh0_x);
1071 ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
1072 {
1073 	atf_tc_set_md_var(tc, "descr",
1074 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1075 }
1076 
1077 ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
1078 {
1079 	static struct bpf_insn insns[] = {
1080 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1081 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1082 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1083 		BPF_STMT(BPF_RET+BPF_A, 0)
1084 	};
1085 
1086 	bpfjit_func_t code;
1087 	uint8_t pkt[1]; /* the program doesn't read any data */
1088 
1089 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1090 
1091 	ATF_CHECK(bpf_validate(insns, insn_count));
1092 
1093 	code = bpfjit_generate_code(bc, insns, insn_count);
1094 	ATF_REQUIRE(code != NULL);
1095 
1096 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1097 
1098 	bpfjit_free_code(code);
1099 }
1100 
1101 ATF_TC(bpfjit_alu_rsh_x);
1102 ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
1103 {
1104 	atf_tc_set_md_var(tc, "descr",
1105 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1106 }
1107 
1108 ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
1109 {
1110 	static struct bpf_insn insns[] = {
1111 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1112 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1113 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1114 		BPF_STMT(BPF_RET+BPF_A, 0)
1115 	};
1116 
1117 	bpfjit_func_t code;
1118 	uint8_t pkt[1]; /* the program doesn't read any data */
1119 
1120 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1121 
1122 	ATF_CHECK(bpf_validate(insns, insn_count));
1123 
1124 	code = bpfjit_generate_code(bc, insns, insn_count);
1125 	ATF_REQUIRE(code != NULL);
1126 
1127 	ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
1128 
1129 	bpfjit_free_code(code);
1130 }
1131 
1132 ATF_TC(bpfjit_alu_rsh0_x);
1133 ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
1134 {
1135 	atf_tc_set_md_var(tc, "descr",
1136 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1137 }
1138 
1139 ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
1140 {
1141 	static struct bpf_insn insns[] = {
1142 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1143 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1144 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1145 		BPF_STMT(BPF_RET+BPF_A, 0)
1146 	};
1147 
1148 	bpfjit_func_t code;
1149 	uint8_t pkt[1]; /* the program doesn't read any data */
1150 
1151 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1152 
1153 	ATF_CHECK(bpf_validate(insns, insn_count));
1154 
1155 	code = bpfjit_generate_code(bc, insns, insn_count);
1156 	ATF_REQUIRE(code != NULL);
1157 
1158 	ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1159 
1160 	bpfjit_free_code(code);
1161 }
1162 
1163 ATF_TC(bpfjit_alu_modulo_x);
1164 ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
1165 {
1166 	atf_tc_set_md_var(tc, "descr",
1167 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1168 }
1169 
1170 ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
1171 {
1172 	static struct bpf_insn insns[] = {
1173 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1174 
1175 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1176 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1177 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1178 
1179 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1180 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1181 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1182 
1183 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1184 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1185 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1186 
1187 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1188 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1189 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1190 
1191 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1192 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1193 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1194 
1195 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1196 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1197 
1198 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1199 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1200 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1201 
1202 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1203 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
1204 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1205 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1206 
1207 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1208 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1209 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1210 
1211 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1212 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
1213 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1214 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1215 
1216 		BPF_STMT(BPF_RET+BPF_A, 0)
1217 	};
1218 
1219 	bpfjit_func_t code;
1220 	uint8_t pkt[1]; /* the program doesn't read any data */
1221 
1222 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1223 
1224 	ATF_CHECK(bpf_validate(insns, insn_count));
1225 
1226 	code = bpfjit_generate_code(bc, insns, insn_count);
1227 	ATF_REQUIRE(code != NULL);
1228 
1229 	ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1230 	ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
1231 
1232 
1233 	bpfjit_free_code(code);
1234 }
1235 
1236 ATF_TC(bpfjit_alu_neg);
1237 ATF_TC_HEAD(bpfjit_alu_neg, tc)
1238 {
1239 	atf_tc_set_md_var(tc, "descr",
1240 	    "Test JIT compilation of BPF_ALU+BPF_NEG");
1241 }
1242 
1243 ATF_TC_BODY(bpfjit_alu_neg, tc)
1244 {
1245 	static struct bpf_insn insns[] = {
1246 		BPF_STMT(BPF_LD+BPF_IMM, 777),
1247 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
1248 		BPF_STMT(BPF_RET+BPF_A, 0)
1249 	};
1250 
1251 	bpfjit_func_t code;
1252 	uint8_t pkt[1]; /* the program doesn't read any data */
1253 
1254 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1255 
1256 	ATF_CHECK(bpf_validate(insns, insn_count));
1257 
1258 	code = bpfjit_generate_code(bc, insns, insn_count);
1259 	ATF_REQUIRE(code != NULL);
1260 
1261 	ATF_CHECK(code(pkt, 1, 1) == 0u-777u);
1262 
1263 	bpfjit_free_code(code);
1264 }
1265 
1266 ATF_TC(bpfjit_jmp_ja);
1267 ATF_TC_HEAD(bpfjit_jmp_ja, tc)
1268 {
1269 	atf_tc_set_md_var(tc, "descr",
1270 	    "Test JIT compilation of BPF_JMP+BPF_JA");
1271 }
1272 
1273 ATF_TC_BODY(bpfjit_jmp_ja, tc)
1274 {
1275 	static struct bpf_insn insns[] = {
1276 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1277 		BPF_STMT(BPF_RET+BPF_K, 0),
1278 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1279 		BPF_STMT(BPF_RET+BPF_K, 1),
1280 		BPF_STMT(BPF_RET+BPF_K, 2),
1281 		BPF_STMT(BPF_RET+BPF_K, 3),
1282 	};
1283 
1284 	bpfjit_func_t code;
1285 	uint8_t pkt[1]; /* the program doesn't read any data */
1286 
1287 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1288 
1289 	ATF_CHECK(bpf_validate(insns, insn_count));
1290 
1291 	code = bpfjit_generate_code(bc, insns, insn_count);
1292 	ATF_REQUIRE(code != NULL);
1293 
1294 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1295 
1296 	bpfjit_free_code(code);
1297 }
1298 
1299 ATF_TC(bpfjit_jmp_jgt_k);
1300 ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
1301 {
1302 	atf_tc_set_md_var(tc, "descr",
1303 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1304 }
1305 
1306 ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
1307 {
1308 	static struct bpf_insn insns[] = {
1309 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1310 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1311 		BPF_STMT(BPF_RET+BPF_K, 0),
1312 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1313 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1314 		BPF_STMT(BPF_RET+BPF_K, 1),
1315 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1316 		BPF_STMT(BPF_RET+BPF_K, 2),
1317 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1318 		BPF_STMT(BPF_RET+BPF_K, 3),
1319 		BPF_STMT(BPF_RET+BPF_K, 4),
1320 		BPF_STMT(BPF_RET+BPF_K, 5),
1321 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1322 		BPF_STMT(BPF_RET+BPF_K, 6),
1323 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1324 		BPF_STMT(BPF_RET+BPF_K, 7),
1325 		BPF_STMT(BPF_RET+BPF_K, 8)
1326 	};
1327 
1328 	bpfjit_func_t code;
1329 	uint8_t pkt[8]; /* the program doesn't read any data */
1330 
1331 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1332 
1333 	ATF_CHECK(bpf_validate(insns, insn_count));
1334 
1335 	code = bpfjit_generate_code(bc, insns, insn_count);
1336 	ATF_REQUIRE(code != NULL);
1337 
1338 	ATF_CHECK(code(pkt, 1, 1) == 1);
1339 	ATF_CHECK(code(pkt, 2, 2) == 1);
1340 	ATF_CHECK(code(pkt, 3, 3) == 7);
1341 	ATF_CHECK(code(pkt, 4, 4) == 7);
1342 	ATF_CHECK(code(pkt, 5, 5) == 7);
1343 	ATF_CHECK(code(pkt, 6, 6) == 8);
1344 	ATF_CHECK(code(pkt, 7, 7) == 5);
1345 	ATF_CHECK(code(pkt, 8, 8) == 0);
1346 
1347 	bpfjit_free_code(code);
1348 }
1349 
1350 ATF_TC(bpfjit_jmp_jge_k);
1351 ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
1352 {
1353 	atf_tc_set_md_var(tc, "descr",
1354 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1355 }
1356 
1357 ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
1358 {
1359 	static struct bpf_insn insns[] = {
1360 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1361 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1362 		BPF_STMT(BPF_RET+BPF_K, 0),
1363 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1364 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1365 		BPF_STMT(BPF_RET+BPF_K, 1),
1366 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1367 		BPF_STMT(BPF_RET+BPF_K, 2),
1368 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1369 		BPF_STMT(BPF_RET+BPF_K, 3),
1370 		BPF_STMT(BPF_RET+BPF_K, 4),
1371 		BPF_STMT(BPF_RET+BPF_K, 5),
1372 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1373 		BPF_STMT(BPF_RET+BPF_K, 6),
1374 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1375 		BPF_STMT(BPF_RET+BPF_K, 7),
1376 		BPF_STMT(BPF_RET+BPF_K, 8)
1377 	};
1378 
1379 	bpfjit_func_t code;
1380 	uint8_t pkt[8]; /* the program doesn't read any data */
1381 
1382 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1383 
1384 	ATF_CHECK(bpf_validate(insns, insn_count));
1385 
1386 	code = bpfjit_generate_code(bc, insns, insn_count);
1387 	ATF_REQUIRE(code != NULL);
1388 
1389 	ATF_CHECK(code(pkt, 1, 1) == 1);
1390 	ATF_CHECK(code(pkt, 2, 2) == 1);
1391 	ATF_CHECK(code(pkt, 3, 3) == 7);
1392 	ATF_CHECK(code(pkt, 4, 4) == 7);
1393 	ATF_CHECK(code(pkt, 5, 5) == 7);
1394 	ATF_CHECK(code(pkt, 6, 6) == 8);
1395 	ATF_CHECK(code(pkt, 7, 7) == 5);
1396 	ATF_CHECK(code(pkt, 8, 8) == 0);
1397 
1398 	bpfjit_free_code(code);
1399 }
1400 
1401 ATF_TC(bpfjit_jmp_jeq_k);
1402 ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
1403 {
1404 	atf_tc_set_md_var(tc, "descr",
1405 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1406 }
1407 
1408 ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
1409 {
1410 	static struct bpf_insn insns[] = {
1411 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1412 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1413 		BPF_STMT(BPF_RET+BPF_K, 0),
1414 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1415 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1416 		BPF_STMT(BPF_RET+BPF_K, 1),
1417 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1418 		BPF_STMT(BPF_RET+BPF_K, 2),
1419 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1420 		BPF_STMT(BPF_RET+BPF_K, 3),
1421 		BPF_STMT(BPF_RET+BPF_K, 4),
1422 		BPF_STMT(BPF_RET+BPF_K, 5),
1423 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1424 		BPF_STMT(BPF_RET+BPF_K, 6),
1425 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1426 		BPF_STMT(BPF_RET+BPF_K, 7),
1427 		BPF_STMT(BPF_RET+BPF_K, 8)
1428 	};
1429 
1430 	bpfjit_func_t code;
1431 	uint8_t pkt[8]; /* the program doesn't read any data */
1432 
1433 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1434 
1435 	ATF_CHECK(bpf_validate(insns, insn_count));
1436 
1437 	code = bpfjit_generate_code(bc, insns, insn_count);
1438 	ATF_REQUIRE(code != NULL);
1439 
1440 	ATF_CHECK(code(pkt, 1, 1) == 7);
1441 	ATF_CHECK(code(pkt, 2, 2) == 7);
1442 	ATF_CHECK(code(pkt, 3, 3) == 1);
1443 	ATF_CHECK(code(pkt, 4, 4) == 7);
1444 	ATF_CHECK(code(pkt, 5, 5) == 7);
1445 	ATF_CHECK(code(pkt, 6, 6) == 8);
1446 	ATF_CHECK(code(pkt, 7, 7) == 5);
1447 	ATF_CHECK(code(pkt, 8, 8) == 0);
1448 
1449 	bpfjit_free_code(code);
1450 }
1451 
1452 ATF_TC(bpfjit_jmp_jset_k);
1453 ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
1454 {
1455 	atf_tc_set_md_var(tc, "descr",
1456 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1457 }
1458 
1459 ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
1460 {
1461 	static struct bpf_insn insns[] = {
1462 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1463 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1464 		BPF_STMT(BPF_RET+BPF_K, 0),
1465 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1466 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1467 		BPF_STMT(BPF_RET+BPF_K, 1),
1468 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1469 		BPF_STMT(BPF_RET+BPF_K, 2),
1470 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1471 		BPF_STMT(BPF_RET+BPF_K, 3),
1472 		BPF_STMT(BPF_RET+BPF_K, 4),
1473 		BPF_STMT(BPF_RET+BPF_K, 5),
1474 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1475 		BPF_STMT(BPF_RET+BPF_K, 6),
1476 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1477 		BPF_STMT(BPF_RET+BPF_K, 7),
1478 		BPF_STMT(BPF_RET+BPF_K, 8)
1479 	};
1480 
1481 	bpfjit_func_t code;
1482 	uint8_t pkt[8]; /* the program doesn't read any data */
1483 
1484 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1485 
1486 	ATF_CHECK(bpf_validate(insns, insn_count));
1487 
1488 	code = bpfjit_generate_code(bc, insns, insn_count);
1489 	ATF_REQUIRE(code != NULL);
1490 
1491 	ATF_CHECK(code(pkt, 1, 1) == 1);
1492 	ATF_CHECK(code(pkt, 2, 2) == 1);
1493 	ATF_CHECK(code(pkt, 3, 3) == 1);
1494 	ATF_CHECK(code(pkt, 4, 4) == 7);
1495 	ATF_CHECK(code(pkt, 5, 5) == 5);
1496 	ATF_CHECK(code(pkt, 6, 6) == 8);
1497 	ATF_CHECK(code(pkt, 7, 7) == 5);
1498 	ATF_CHECK(code(pkt, 8, 8) == 0);
1499 
1500 	bpfjit_free_code(code);
1501 }
1502 
1503 ATF_TC(bpfjit_jmp_modulo_k);
1504 ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
1505 {
1506 	atf_tc_set_md_var(tc, "descr",
1507 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1508 }
1509 
1510 ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
1511 {
1512 	static struct bpf_insn insns[] = {
1513 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1514 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1515 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1516 		BPF_STMT(BPF_RET+BPF_K, 0),
1517 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1518 		BPF_STMT(BPF_RET+BPF_K, 1),
1519 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1520 		BPF_STMT(BPF_RET+BPF_K, 2),
1521 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1522 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1523 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1524 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1525 		BPF_STMT(BPF_RET+BPF_K, 3),
1526 
1527 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1528 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1529 
1530 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1531 		BPF_STMT(BPF_RET+BPF_K, 4),
1532 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1533 		BPF_STMT(BPF_RET+BPF_K, 5),
1534 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1535 		BPF_STMT(BPF_RET+BPF_K, 6),
1536 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1537 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1538 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1539 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1540 		BPF_STMT(BPF_RET+BPF_K, 7)
1541 	};
1542 
1543 	bpfjit_func_t code;
1544 	uint8_t pkt[1]; /* the program doesn't read any data */
1545 
1546 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1547 
1548 	ATF_CHECK(bpf_validate(insns, insn_count));
1549 
1550 	code = bpfjit_generate_code(bc, insns, insn_count);
1551 	ATF_REQUIRE(code != NULL);
1552 
1553 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1554 
1555 	bpfjit_free_code(code);
1556 }
1557 
1558 ATF_TC(bpfjit_jmp_jgt_x);
1559 ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
1560 {
1561 	atf_tc_set_md_var(tc, "descr",
1562 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1563 }
1564 
1565 ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
1566 {
1567 	static struct bpf_insn insns[] = {
1568 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1569 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1570 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1571 		BPF_STMT(BPF_RET+BPF_K, 0),
1572 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1573 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1574 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1575 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1576 		BPF_STMT(BPF_RET+BPF_K, 1),
1577 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1578 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1579 		BPF_STMT(BPF_RET+BPF_K, 2),
1580 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1581 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1582 		BPF_STMT(BPF_RET+BPF_K, 3),
1583 		BPF_STMT(BPF_RET+BPF_K, 4),
1584 		BPF_STMT(BPF_RET+BPF_K, 5),
1585 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1586 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1587 		BPF_STMT(BPF_RET+BPF_K, 6),
1588 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1589 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1590 		BPF_STMT(BPF_RET+BPF_K, 7),
1591 		BPF_STMT(BPF_RET+BPF_K, 8)
1592 	};
1593 
1594 	bpfjit_func_t code;
1595 	uint8_t pkt[8]; /* the program doesn't read any data */
1596 
1597 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1598 
1599 	ATF_CHECK(bpf_validate(insns, insn_count));
1600 
1601 	code = bpfjit_generate_code(bc, insns, insn_count);
1602 	ATF_REQUIRE(code != NULL);
1603 
1604 	ATF_CHECK(code(pkt, 1, 1) == 1);
1605 	ATF_CHECK(code(pkt, 2, 2) == 1);
1606 	ATF_CHECK(code(pkt, 3, 3) == 7);
1607 	ATF_CHECK(code(pkt, 4, 4) == 7);
1608 	ATF_CHECK(code(pkt, 5, 5) == 7);
1609 	ATF_CHECK(code(pkt, 6, 6) == 8);
1610 	ATF_CHECK(code(pkt, 7, 7) == 5);
1611 	ATF_CHECK(code(pkt, 8, 8) == 0);
1612 
1613 	bpfjit_free_code(code);
1614 }
1615 
1616 ATF_TC(bpfjit_jmp_jge_x);
1617 ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
1618 {
1619 	atf_tc_set_md_var(tc, "descr",
1620 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1621 }
1622 
1623 ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
1624 {
1625 	static struct bpf_insn insns[] = {
1626 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1627 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1628 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1629 		BPF_STMT(BPF_RET+BPF_K, 0),
1630 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1631 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1632 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1633 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1634 		BPF_STMT(BPF_RET+BPF_K, 1),
1635 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1636 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1637 		BPF_STMT(BPF_RET+BPF_K, 2),
1638 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1639 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1640 		BPF_STMT(BPF_RET+BPF_K, 3),
1641 		BPF_STMT(BPF_RET+BPF_K, 4),
1642 		BPF_STMT(BPF_RET+BPF_K, 5),
1643 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1644 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1645 		BPF_STMT(BPF_RET+BPF_K, 6),
1646 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1647 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1648 		BPF_STMT(BPF_RET+BPF_K, 7),
1649 		BPF_STMT(BPF_RET+BPF_K, 8)
1650 	};
1651 
1652 	bpfjit_func_t code;
1653 	uint8_t pkt[8]; /* the program doesn't read any data */
1654 
1655 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1656 
1657 	ATF_CHECK(bpf_validate(insns, insn_count));
1658 
1659 	code = bpfjit_generate_code(bc, insns, insn_count);
1660 	ATF_REQUIRE(code != NULL);
1661 
1662 	ATF_CHECK(code(pkt, 1, 1) == 1);
1663 	ATF_CHECK(code(pkt, 2, 2) == 1);
1664 	ATF_CHECK(code(pkt, 3, 3) == 7);
1665 	ATF_CHECK(code(pkt, 4, 4) == 7);
1666 	ATF_CHECK(code(pkt, 5, 5) == 7);
1667 	ATF_CHECK(code(pkt, 6, 6) == 8);
1668 	ATF_CHECK(code(pkt, 7, 7) == 5);
1669 	ATF_CHECK(code(pkt, 8, 8) == 0);
1670 
1671 	bpfjit_free_code(code);
1672 }
1673 
1674 ATF_TC(bpfjit_jmp_jeq_x);
1675 ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
1676 {
1677 	atf_tc_set_md_var(tc, "descr",
1678 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1679 }
1680 
1681 ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
1682 {
1683 	static struct bpf_insn insns[] = {
1684 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1685 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1686 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1687 		BPF_STMT(BPF_RET+BPF_K, 0),
1688 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1689 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1690 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1691 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1692 		BPF_STMT(BPF_RET+BPF_K, 1),
1693 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1694 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1695 		BPF_STMT(BPF_RET+BPF_K, 2),
1696 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1697 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1698 		BPF_STMT(BPF_RET+BPF_K, 3),
1699 		BPF_STMT(BPF_RET+BPF_K, 4),
1700 		BPF_STMT(BPF_RET+BPF_K, 5),
1701 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1702 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1703 		BPF_STMT(BPF_RET+BPF_K, 6),
1704 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1705 		BPF_STMT(BPF_RET+BPF_K, 7),
1706 		BPF_STMT(BPF_RET+BPF_K, 8)
1707 	};
1708 
1709 	bpfjit_func_t code;
1710 	uint8_t pkt[8]; /* the program doesn't read any data */
1711 
1712 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1713 
1714 	ATF_CHECK(bpf_validate(insns, insn_count));
1715 
1716 	code = bpfjit_generate_code(bc, insns, insn_count);
1717 	ATF_REQUIRE(code != NULL);
1718 
1719 	ATF_CHECK(code(pkt, 1, 1) == 7);
1720 	ATF_CHECK(code(pkt, 2, 2) == 7);
1721 	ATF_CHECK(code(pkt, 3, 3) == 1);
1722 	ATF_CHECK(code(pkt, 4, 4) == 7);
1723 	ATF_CHECK(code(pkt, 5, 5) == 7);
1724 	ATF_CHECK(code(pkt, 6, 6) == 8);
1725 	ATF_CHECK(code(pkt, 7, 7) == 5);
1726 	ATF_CHECK(code(pkt, 8, 8) == 0);
1727 
1728 	bpfjit_free_code(code);
1729 }
1730 
1731 ATF_TC(bpfjit_jmp_jset_x);
1732 ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
1733 {
1734 	atf_tc_set_md_var(tc, "descr",
1735 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1736 }
1737 
1738 ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
1739 {
1740 	static struct bpf_insn insns[] = {
1741 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1742 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1743 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1744 		BPF_STMT(BPF_RET+BPF_K, 0),
1745 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1746 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1747 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1748 		BPF_STMT(BPF_RET+BPF_K, 1),
1749 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1750 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1751 		BPF_STMT(BPF_RET+BPF_K, 2),
1752 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1753 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1754 		BPF_STMT(BPF_RET+BPF_K, 3),
1755 		BPF_STMT(BPF_RET+BPF_K, 4),
1756 		BPF_STMT(BPF_RET+BPF_K, 5),
1757 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1758 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1759 		BPF_STMT(BPF_RET+BPF_K, 6),
1760 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1761 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1762 		BPF_STMT(BPF_RET+BPF_K, 7),
1763 		BPF_STMT(BPF_RET+BPF_K, 8)
1764 	};
1765 
1766 	bpfjit_func_t code;
1767 	uint8_t pkt[8]; /* the program doesn't read any data */
1768 
1769 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1770 
1771 	ATF_CHECK(bpf_validate(insns, insn_count));
1772 
1773 	code = bpfjit_generate_code(bc, insns, insn_count);
1774 	ATF_REQUIRE(code != NULL);
1775 
1776 	ATF_CHECK(code(pkt, 1, 1) == 1);
1777 	ATF_CHECK(code(pkt, 2, 2) == 1);
1778 	ATF_CHECK(code(pkt, 3, 3) == 1);
1779 	ATF_CHECK(code(pkt, 4, 4) == 7);
1780 	ATF_CHECK(code(pkt, 5, 5) == 5);
1781 	ATF_CHECK(code(pkt, 6, 6) == 8);
1782 	ATF_CHECK(code(pkt, 7, 7) == 5);
1783 	ATF_CHECK(code(pkt, 8, 8) == 0);
1784 
1785 	bpfjit_free_code(code);
1786 }
1787 
1788 ATF_TC(bpfjit_jmp_modulo_x);
1789 ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
1790 {
1791 	atf_tc_set_md_var(tc, "descr",
1792 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1793 }
1794 
1795 ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
1796 {
1797 	static struct bpf_insn insns[] = {
1798 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1799 		/* FFFFF770 << 4 = FFFFF770 */
1800 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1801 
1802 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1803 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1804 		BPF_STMT(BPF_RET+BPF_K, 0),
1805 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1806 		BPF_STMT(BPF_RET+BPF_K, 1),
1807 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1808 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1809 		BPF_STMT(BPF_RET+BPF_K, 2),
1810 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1811 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1812 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1813 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1814 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1815 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1816 		BPF_STMT(BPF_RET+BPF_K, 3),
1817 
1818 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1819 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1820 
1821 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1822 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1823 		BPF_STMT(BPF_RET+BPF_K, 4),
1824 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1825 		BPF_STMT(BPF_RET+BPF_K, 5),
1826 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1827 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1828 		BPF_STMT(BPF_RET+BPF_K, 6),
1829 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1830 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1831 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1832 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1833 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1834 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1835 		BPF_STMT(BPF_RET+BPF_K, 7)
1836 	};
1837 
1838 	bpfjit_func_t code;
1839 	uint8_t pkt[1]; /* the program doesn't read any data */
1840 
1841 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1842 
1843 	ATF_CHECK(bpf_validate(insns, insn_count));
1844 
1845 	code = bpfjit_generate_code(bc, insns, insn_count);
1846 	ATF_REQUIRE(code != NULL);
1847 
1848 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1849 
1850 	bpfjit_free_code(code);
1851 }
1852 
1853 ATF_TC(bpfjit_ld_abs);
1854 ATF_TC_HEAD(bpfjit_ld_abs, tc)
1855 {
1856 	atf_tc_set_md_var(tc, "descr",
1857 	    "Test JIT compilation of BPF_LD+BPF_ABS");
1858 }
1859 
1860 ATF_TC_BODY(bpfjit_ld_abs, tc)
1861 {
1862 	static struct bpf_insn insns[3][2] = {
1863 		{
1864 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1865 			BPF_STMT(BPF_RET+BPF_A, 0)
1866 		},
1867 		{
1868 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1869 			BPF_STMT(BPF_RET+BPF_A, 0)
1870 		},
1871 		{
1872 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1873 			BPF_STMT(BPF_RET+BPF_A, 0)
1874 		}
1875 	};
1876 
1877 	static size_t lengths[3] = { 1, 2, 4 };
1878 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1879 
1880 	size_t i, l;
1881 	uint8_t *pkt = deadbeef_at_5;
1882 	size_t pktsize = sizeof(deadbeef_at_5);
1883 
1884 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1885 
1886 	for (i = 0; i < 3; i++) {
1887 		bpfjit_func_t code;
1888 
1889 		ATF_CHECK(bpf_validate(insns[i], insn_count));
1890 
1891 		code = bpfjit_generate_code(bc, insns[i], insn_count);
1892 		ATF_REQUIRE(code != NULL);
1893 
1894 		for (l = 0; l < 5 + lengths[i]; l++) {
1895 			ATF_CHECK(code(pkt, l, l) == 0);
1896 			ATF_CHECK(code(pkt, pktsize, l) == 0);
1897 		}
1898 
1899 		l = 5 + lengths[i];
1900 		ATF_CHECK(code(pkt, l, l) == expected[i]);
1901 		ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
1902 
1903 		l = pktsize;
1904 		ATF_CHECK(code(pkt, l, l) == expected[i]);
1905 
1906 		bpfjit_free_code(code);
1907 	}
1908 }
1909 
1910 ATF_TC(bpfjit_ld_abs_k_overflow);
1911 ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
1912 {
1913 	atf_tc_set_md_var(tc, "descr",
1914 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1915 }
1916 
1917 ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
1918 {
1919 	static struct bpf_insn insns[12][3] = {
1920 		{
1921 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1922 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1923 			BPF_STMT(BPF_RET+BPF_K, 1)
1924 		},
1925 		{
1926 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1927 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1928 			BPF_STMT(BPF_RET+BPF_K, 1)
1929 		},
1930 		{
1931 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1932 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1933 			BPF_STMT(BPF_RET+BPF_K, 1)
1934 		},
1935 		{
1936 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1937 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1938 			BPF_STMT(BPF_RET+BPF_K, 1)
1939 		},
1940 		{
1941 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1942 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1943 			BPF_STMT(BPF_RET+BPF_K, 1)
1944 		},
1945 		{
1946 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1947 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1948 			BPF_STMT(BPF_RET+BPF_K, 1)
1949 		},
1950 		{
1951 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1952 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1953 			BPF_STMT(BPF_RET+BPF_K, 1)
1954 		},
1955 		{
1956 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1957 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1958 			BPF_STMT(BPF_RET+BPF_K, 1)
1959 		},
1960 		{
1961 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1962 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1963 			BPF_STMT(BPF_RET+BPF_K, 1)
1964 		},
1965 		{
1966 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1967 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1968 			BPF_STMT(BPF_RET+BPF_K, 1)
1969 		},
1970 		{
1971 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1972 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1973 			BPF_STMT(BPF_RET+BPF_K, 1)
1974 		},
1975 		{
1976 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1977 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1978 			BPF_STMT(BPF_RET+BPF_K, 1)
1979 		}
1980 	};
1981 
1982 	int i;
1983 	uint8_t pkt[8] = { 0 };
1984 
1985 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1986 
1987 	for (i = 0; i < 3; i++) {
1988 		bpfjit_func_t code;
1989 
1990 		ATF_CHECK(bpf_validate(insns[i], insn_count));
1991 
1992 		code = bpfjit_generate_code(bc, insns[i], insn_count);
1993 		ATF_REQUIRE(code != NULL);
1994 
1995 		ATF_CHECK(code(pkt, 8, 8) == 0);
1996 
1997 		bpfjit_free_code(code);
1998 	}
1999 }
2000 
2001 ATF_TC(bpfjit_ld_ind);
2002 ATF_TC_HEAD(bpfjit_ld_ind, tc)
2003 {
2004 	atf_tc_set_md_var(tc, "descr",
2005 	    "Test JIT compilation of BPF_LD+BPF_IND");
2006 }
2007 
2008 ATF_TC_BODY(bpfjit_ld_ind, tc)
2009 {
2010 	static struct bpf_insn insns[6][3] = {
2011 		{
2012 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2013 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2014 			BPF_STMT(BPF_RET+BPF_A, 0)
2015 		},
2016 		{
2017 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2018 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2019 			BPF_STMT(BPF_RET+BPF_A, 0)
2020 		},
2021 		{
2022 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2023 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2024 			BPF_STMT(BPF_RET+BPF_A, 0)
2025 		},
2026 		{
2027 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2028 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2029 			BPF_STMT(BPF_RET+BPF_A, 0)
2030 		},
2031 		{
2032 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2033 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2034 			BPF_STMT(BPF_RET+BPF_A, 0)
2035 		},
2036 		{
2037 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2038 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2039 			BPF_STMT(BPF_RET+BPF_A, 0)
2040 		}
2041 	};
2042 
2043 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2044 
2045 	static unsigned int expected[6] = {
2046 		0xde, 0xdead, 0xdeadbeef,
2047 		0xde, 0xdead, 0xdeadbeef
2048 	};
2049 
2050 	size_t i, l;
2051 	uint8_t *pkt = deadbeef_at_5;
2052 	size_t pktsize = sizeof(deadbeef_at_5);
2053 
2054 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2055 
2056 	for (i = 0; i < 3; i++) {
2057 		bpfjit_func_t code;
2058 
2059 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2060 
2061 		code = bpfjit_generate_code(bc, insns[i], insn_count);
2062 		ATF_REQUIRE(code != NULL);
2063 
2064 		for (l = 0; l < 5 + lengths[i]; l++) {
2065 			ATF_CHECK(code(pkt, l, l) == 0);
2066 			ATF_CHECK(code(pkt, pktsize, l) == 0);
2067 		}
2068 
2069 		l = 5 + lengths[i];
2070 		ATF_CHECK(code(pkt, l, l) == expected[i]);
2071 		ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
2072 
2073 		l = pktsize;
2074 		ATF_CHECK(code(pkt, l, l) == expected[i]);
2075 
2076 		bpfjit_free_code(code);
2077 	}
2078 }
2079 
2080 ATF_TC(bpfjit_ld_ind_k_overflow);
2081 ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
2082 {
2083 	atf_tc_set_md_var(tc, "descr",
2084 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2085 }
2086 
2087 ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
2088 {
2089 	static struct bpf_insn insns[12][3] = {
2090 		{
2091 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2092 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2093 			BPF_STMT(BPF_RET+BPF_K, 1)
2094 		},
2095 		{
2096 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2097 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2098 			BPF_STMT(BPF_RET+BPF_K, 1)
2099 		},
2100 		{
2101 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2102 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2103 			BPF_STMT(BPF_RET+BPF_K, 1)
2104 		},
2105 		{
2106 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2107 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2108 			BPF_STMT(BPF_RET+BPF_K, 1)
2109 		},
2110 		{
2111 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2112 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2113 			BPF_STMT(BPF_RET+BPF_K, 1)
2114 		},
2115 		{
2116 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2117 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2118 			BPF_STMT(BPF_RET+BPF_K, 1)
2119 		},
2120 		{
2121 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2122 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2123 			BPF_STMT(BPF_RET+BPF_K, 1)
2124 		},
2125 		{
2126 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2127 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2128 			BPF_STMT(BPF_RET+BPF_K, 1)
2129 		},
2130 		{
2131 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2132 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2133 			BPF_STMT(BPF_RET+BPF_K, 1)
2134 		},
2135 		{
2136 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2137 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2138 			BPF_STMT(BPF_RET+BPF_K, 1)
2139 		},
2140 		{
2141 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2142 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2143 			BPF_STMT(BPF_RET+BPF_K, 1)
2144 		},
2145 		{
2146 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2147 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2148 			BPF_STMT(BPF_RET+BPF_K, 1)
2149 		}
2150 	};
2151 
2152 	int i;
2153 	uint8_t pkt[8] = { 0 };
2154 
2155 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2156 
2157 	for (i = 0; i < 3; i++) {
2158 		bpfjit_func_t code;
2159 
2160 		ATF_CHECK(bpf_validate(insns[i], insn_count));
2161 
2162 		code = bpfjit_generate_code(bc, insns[i], insn_count);
2163 		ATF_REQUIRE(code != NULL);
2164 
2165 		ATF_CHECK(code(pkt, 8, 8) == 0);
2166 
2167 		bpfjit_free_code(code);
2168 	}
2169 }
2170 
2171 ATF_TC(bpfjit_ld_ind_x_overflow1);
2172 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2173 {
2174 	atf_tc_set_md_var(tc, "descr",
2175 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2176 }
2177 
2178 ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2179 {
2180 	static struct bpf_insn insns[] = {
2181 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2182 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2183 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2184 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2185 		BPF_STMT(BPF_RET+BPF_A, 0)
2186 	};
2187 
2188 	size_t i;
2189 	bpfjit_func_t code;
2190 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2191 
2192 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2193 
2194 	ATF_CHECK(bpf_validate(insns, insn_count));
2195 
2196 	code = bpfjit_generate_code(bc, insns, insn_count);
2197 	ATF_REQUIRE(code != NULL);
2198 
2199 	for (i = 1; i <= sizeof(pkt); i++) {
2200 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2201 		ATF_CHECK(code(pkt, i, i) == 10 * i);
2202 	}
2203 
2204 	bpfjit_free_code(code);
2205 }
2206 
2207 ATF_TC(bpfjit_ld_ind_x_overflow2);
2208 ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2209 {
2210 	atf_tc_set_md_var(tc, "descr",
2211 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2212 }
2213 
2214 ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2215 {
2216 	static struct bpf_insn insns[] = {
2217 		BPF_STMT(BPF_LD+BPF_LEN, 0),
2218 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2219 		BPF_STMT(BPF_ST, 3),
2220 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2221 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2222 		BPF_STMT(BPF_RET+BPF_A, 0)
2223 	};
2224 
2225 	size_t i;
2226 	bpfjit_func_t code;
2227 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2228 
2229 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2230 
2231 	ATF_CHECK(bpf_validate(insns, insn_count));
2232 
2233 	code = bpfjit_generate_code(bc, insns, insn_count);
2234 	ATF_REQUIRE(code != NULL);
2235 
2236 	for (i = 1; i <= sizeof(pkt); i++) {
2237 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2238 		ATF_CHECK(code(pkt, i, i) == 10 * i);
2239 	}
2240 
2241 	bpfjit_free_code(code);
2242 }
2243 
2244 ATF_TC(bpfjit_ld_len);
2245 ATF_TC_HEAD(bpfjit_ld_len, tc)
2246 {
2247 	atf_tc_set_md_var(tc, "descr",
2248 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2249 }
2250 
2251 ATF_TC_BODY(bpfjit_ld_len, tc)
2252 {
2253 	static struct bpf_insn insns[] = {
2254 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2255 		BPF_STMT(BPF_RET+BPF_A, 0)
2256 	};
2257 
2258 	size_t i;
2259 	bpfjit_func_t code;
2260 	uint8_t pkt[32]; /* the program doesn't read any data */
2261 
2262 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2263 
2264 	ATF_CHECK(bpf_validate(insns, insn_count));
2265 
2266 	code = bpfjit_generate_code(bc, insns, insn_count);
2267 	ATF_REQUIRE(code != NULL);
2268 
2269 	for (i = 0; i < sizeof(pkt); i++)
2270 		ATF_CHECK(code(pkt, i, 1) == i);
2271 
2272 	bpfjit_free_code(code);
2273 }
2274 
2275 ATF_TC(bpfjit_ld_imm);
2276 ATF_TC_HEAD(bpfjit_ld_imm, tc)
2277 {
2278 	atf_tc_set_md_var(tc, "descr",
2279 	    "Test JIT compilation of BPF_LD+BPF_IMM");
2280 }
2281 
2282 ATF_TC_BODY(bpfjit_ld_imm, tc)
2283 {
2284 	static struct bpf_insn insns[] = {
2285 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2286 		BPF_STMT(BPF_RET+BPF_A, 0)
2287 	};
2288 
2289 	bpfjit_func_t code;
2290 	uint8_t pkt[1]; /* the program doesn't read any data */
2291 
2292 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2293 
2294 	ATF_CHECK(bpf_validate(insns, insn_count));
2295 
2296 	code = bpfjit_generate_code(bc, insns, insn_count);
2297 	ATF_REQUIRE(code != NULL);
2298 
2299 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2300 
2301 	bpfjit_free_code(code);
2302 }
2303 
2304 ATF_TC(bpfjit_ldx_imm1);
2305 ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2306 {
2307 	atf_tc_set_md_var(tc, "descr",
2308 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2309 }
2310 
2311 ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2312 {
2313 	static struct bpf_insn insns[] = {
2314 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2315 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2316 		BPF_STMT(BPF_RET+BPF_A, 0)
2317 	};
2318 
2319 	bpfjit_func_t code;
2320 	uint8_t pkt[1]; /* the program doesn't read any data */
2321 
2322 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2323 
2324 	ATF_CHECK(bpf_validate(insns, insn_count));
2325 
2326 	code = bpfjit_generate_code(bc, insns, insn_count);
2327 	ATF_REQUIRE(code != NULL);
2328 
2329 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX - 5);
2330 
2331 	bpfjit_free_code(code);
2332 }
2333 
2334 ATF_TC(bpfjit_ldx_imm2);
2335 ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2336 {
2337 	atf_tc_set_md_var(tc, "descr",
2338 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
2339 }
2340 
2341 ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2342 {
2343 	static struct bpf_insn insns[] = {
2344 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2345 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2346 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2347 		BPF_STMT(BPF_RET+BPF_K, 7),
2348 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2349 	};
2350 
2351 	bpfjit_func_t code;
2352 	uint8_t pkt[1]; /* the program doesn't read any data */
2353 
2354 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2355 
2356 	ATF_CHECK(bpf_validate(insns, insn_count));
2357 
2358 	code = bpfjit_generate_code(bc, insns, insn_count);
2359 	ATF_REQUIRE(code != NULL);
2360 
2361 	ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2362 
2363 	bpfjit_free_code(code);
2364 }
2365 
2366 ATF_TC(bpfjit_ldx_len1);
2367 ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2368 {
2369 	atf_tc_set_md_var(tc, "descr",
2370 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2371 }
2372 
2373 ATF_TC_BODY(bpfjit_ldx_len1, tc)
2374 {
2375 	static struct bpf_insn insns[] = {
2376 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2377 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2378 		BPF_STMT(BPF_RET+BPF_A, 0)
2379 	};
2380 
2381 	size_t i;
2382 	bpfjit_func_t code;
2383 	uint8_t pkt[5]; /* the program doesn't read any data */
2384 
2385 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2386 
2387 	ATF_CHECK(bpf_validate(insns, insn_count));
2388 
2389 	code = bpfjit_generate_code(bc, insns, insn_count);
2390 	ATF_REQUIRE(code != NULL);
2391 
2392 	for (i = 1; i < sizeof(pkt); i++) {
2393 		ATF_CHECK(code(pkt, i, 1) == i);
2394 		ATF_CHECK(code(pkt, i + 1, i) == i + 1);
2395 	}
2396 
2397 	bpfjit_free_code(code);
2398 }
2399 
2400 ATF_TC(bpfjit_ldx_len2);
2401 ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2402 {
2403 	atf_tc_set_md_var(tc, "descr",
2404 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
2405 }
2406 
2407 ATF_TC_BODY(bpfjit_ldx_len2, tc)
2408 {
2409 	static struct bpf_insn insns[] = {
2410 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2411 		BPF_STMT(BPF_LD+BPF_IMM, 5),
2412 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2413 		BPF_STMT(BPF_RET+BPF_K, 7),
2414 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2415 	};
2416 
2417 	bpfjit_func_t code;
2418 	uint8_t pkt[5]; /* the program doesn't read any data */
2419 
2420 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2421 
2422 	ATF_CHECK(bpf_validate(insns, insn_count));
2423 
2424 	code = bpfjit_generate_code(bc, insns, insn_count);
2425 	ATF_REQUIRE(code != NULL);
2426 
2427 	ATF_CHECK(code(pkt, 5, 1) == UINT32_MAX);
2428 	ATF_CHECK(code(pkt, 6, 5) == 7);
2429 
2430 	bpfjit_free_code(code);
2431 }
2432 
2433 ATF_TC(bpfjit_ldx_msh);
2434 ATF_TC_HEAD(bpfjit_ldx_msh, tc)
2435 {
2436 	atf_tc_set_md_var(tc, "descr",
2437 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
2438 }
2439 
2440 ATF_TC_BODY(bpfjit_ldx_msh, tc)
2441 {
2442 	static struct bpf_insn insns[] = {
2443 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2444 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2445 		BPF_STMT(BPF_RET+BPF_A, 0)
2446 	};
2447 
2448 	bpfjit_func_t code;
2449 	uint8_t pkt[2] = { 0, 0x7a };
2450 
2451 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2452 
2453 	ATF_CHECK(bpf_validate(insns, insn_count));
2454 
2455 	code = bpfjit_generate_code(bc, insns, insn_count);
2456 	ATF_REQUIRE(code != NULL);
2457 
2458 	ATF_CHECK(code(pkt, 2, 2) == 40);
2459 
2460 	bpfjit_free_code(code);
2461 }
2462 
2463 ATF_TC(bpfjit_misc_tax);
2464 ATF_TC_HEAD(bpfjit_misc_tax, tc)
2465 {
2466 	atf_tc_set_md_var(tc, "descr",
2467 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
2468 }
2469 
2470 ATF_TC_BODY(bpfjit_misc_tax, tc)
2471 {
2472 	static struct bpf_insn insns[] = {
2473 		BPF_STMT(BPF_LD+BPF_IMM, 3),
2474 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
2475 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2476 		BPF_STMT(BPF_RET+BPF_A, 0)
2477 	};
2478 
2479 	bpfjit_func_t code;
2480 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
2481 
2482 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2483 
2484 	ATF_CHECK(bpf_validate(insns, insn_count));
2485 
2486 	code = bpfjit_generate_code(bc, insns, insn_count);
2487 	ATF_REQUIRE(code != NULL);
2488 
2489 	ATF_CHECK(code(pkt, sizeof(pkt), sizeof(pkt)) == 55);
2490 
2491 	bpfjit_free_code(code);
2492 }
2493 
2494 ATF_TC(bpfjit_misc_txa);
2495 ATF_TC_HEAD(bpfjit_misc_txa, tc)
2496 {
2497 	atf_tc_set_md_var(tc, "descr",
2498 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
2499 }
2500 
2501 ATF_TC_BODY(bpfjit_misc_txa, tc)
2502 {
2503 	static struct bpf_insn insns[] = {
2504 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2505 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
2506 		BPF_STMT(BPF_RET+BPF_A, 0)
2507 	};
2508 
2509 	bpfjit_func_t code;
2510 	uint8_t pkt[1]; /* the program doesn't read any data */
2511 
2512 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2513 
2514 	ATF_CHECK(bpf_validate(insns, insn_count));
2515 
2516 	code = bpfjit_generate_code(bc, insns, insn_count);
2517 	ATF_REQUIRE(code != NULL);
2518 
2519 	ATF_CHECK(code(pkt, 1, 1) == 391);
2520 
2521 	bpfjit_free_code(code);
2522 }
2523 
2524 ATF_TC(bpfjit_st1);
2525 ATF_TC_HEAD(bpfjit_st1, tc)
2526 {
2527 	atf_tc_set_md_var(tc, "descr",
2528 	    "Test JIT compilation of BPF_ST");
2529 }
2530 
2531 ATF_TC_BODY(bpfjit_st1, tc)
2532 {
2533 	static struct bpf_insn insns[] = {
2534 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2535 		BPF_STMT(BPF_ST, 0),
2536 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2537 		BPF_STMT(BPF_RET+BPF_A, 0)
2538 	};
2539 
2540 	size_t i;
2541 	bpfjit_func_t code;
2542 	uint8_t pkt[16]; /* the program doesn't read any data */
2543 
2544 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2545 
2546 	ATF_CHECK(bpf_validate(insns, insn_count));
2547 
2548 	code = bpfjit_generate_code(bc, insns, insn_count);
2549 	ATF_REQUIRE(code != NULL);
2550 
2551 	for (i = 1; i <= sizeof(pkt); i++)
2552 		ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2553 
2554 	bpfjit_free_code(code);
2555 }
2556 
2557 ATF_TC(bpfjit_st2);
2558 ATF_TC_HEAD(bpfjit_st2, tc)
2559 {
2560 	atf_tc_set_md_var(tc, "descr",
2561 	    "Test JIT compilation of BPF_ST");
2562 }
2563 
2564 ATF_TC_BODY(bpfjit_st2, tc)
2565 {
2566 	static struct bpf_insn insns[] = {
2567 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2568 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2569 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2570 		BPF_STMT(BPF_RET+BPF_A, 0)
2571 	};
2572 
2573 	bpfjit_func_t code;
2574 	uint8_t pkt[1]; /* the program doesn't read any data */
2575 
2576 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2577 
2578 	ATF_CHECK(bpf_validate(insns, insn_count));
2579 
2580 	code = bpfjit_generate_code(bc, insns, insn_count);
2581 	ATF_REQUIRE(code != NULL);
2582 
2583 	ATF_CHECK(code(pkt, 1, 1) == 0);
2584 
2585 	bpfjit_free_code(code);
2586 }
2587 
2588 ATF_TC(bpfjit_st3);
2589 ATF_TC_HEAD(bpfjit_st3, tc)
2590 {
2591 	atf_tc_set_md_var(tc, "descr",
2592 	    "Test JIT compilation of BPF_ST");
2593 }
2594 
2595 ATF_TC_BODY(bpfjit_st3, tc)
2596 {
2597 	static struct bpf_insn insns[] = {
2598 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2599 		BPF_STMT(BPF_ST, 0),
2600 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2601 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2602 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2603 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2604 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2605 		BPF_STMT(BPF_RET+BPF_A, 0),
2606 		BPF_STMT(BPF_LD+BPF_MEM, 0),
2607 		BPF_STMT(BPF_RET+BPF_A, 0)
2608 	};
2609 
2610 	bpfjit_func_t code;
2611 	uint8_t pkt[2]; /* the program doesn't read any data */
2612 
2613 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2614 
2615 	ATF_REQUIRE(BPF_MEMWORDS > 1);
2616 
2617 	ATF_CHECK(bpf_validate(insns, insn_count));
2618 
2619 	code = bpfjit_generate_code(bc, insns, insn_count);
2620 	ATF_REQUIRE(code != NULL);
2621 
2622 	ATF_CHECK(code(pkt, 1, 1) == 1);
2623 	ATF_CHECK(code(pkt, 2, 2) == 102);
2624 
2625 	bpfjit_free_code(code);
2626 }
2627 
2628 ATF_TC(bpfjit_st4);
2629 ATF_TC_HEAD(bpfjit_st4, tc)
2630 {
2631 	atf_tc_set_md_var(tc, "descr",
2632 	    "Test JIT compilation of BPF_ST");
2633 }
2634 
2635 ATF_TC_BODY(bpfjit_st4, tc)
2636 {
2637 	static struct bpf_insn insns[] = {
2638 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2639 		BPF_STMT(BPF_ST, 5),
2640 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2641 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2642 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2643 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2644 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2645 		BPF_STMT(BPF_RET+BPF_A, 0),
2646 		BPF_STMT(BPF_LD+BPF_MEM, 5),
2647 		BPF_STMT(BPF_RET+BPF_A, 0)
2648 	};
2649 
2650 	bpfjit_func_t code;
2651 	uint8_t pkt[2]; /* the program doesn't read any data */
2652 
2653 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2654 
2655 	ATF_REQUIRE(BPF_MEMWORDS > 6);
2656 
2657 	ATF_CHECK(bpf_validate(insns, insn_count));
2658 
2659 	code = bpfjit_generate_code(bc, insns, insn_count);
2660 	ATF_REQUIRE(code != NULL);
2661 
2662 	ATF_CHECK(code(pkt, 1, 1) == 1);
2663 	ATF_CHECK(code(pkt, 2, 2) == 102);
2664 
2665 	bpfjit_free_code(code);
2666 }
2667 
2668 ATF_TC(bpfjit_st5);
2669 ATF_TC_HEAD(bpfjit_st5, tc)
2670 {
2671 	atf_tc_set_md_var(tc, "descr",
2672 	    "Test JIT compilation of BPF_ST");
2673 }
2674 
2675 ATF_TC_BODY(bpfjit_st5, tc)
2676 {
2677 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
2678 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2679 
2680 	size_t k;
2681 	bpfjit_func_t code;
2682 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2683 
2684 	memset(insns, 0, sizeof(insns));
2685 
2686 	/* for each k do M[k] = k */
2687 	for (k = 0; k < BPF_MEMWORDS; k++) {
2688 		insns[2*k].code   = BPF_LD+BPF_IMM;
2689 		insns[2*k].k      = 3*k;
2690 		insns[2*k+1].code = BPF_ST;
2691 		insns[2*k+1].k    = k;
2692 	}
2693 
2694 	/* load wirelen into A */
2695 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2696 
2697 	/* for each k, if (A == k + 1) return M[k] */
2698 	for (k = 0; k < BPF_MEMWORDS; k++) {
2699 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2700 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
2701 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
2702 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
2703 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2704 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
2705 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2706 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
2707 	}
2708 
2709 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2710 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
2711 
2712 	ATF_CHECK(bpf_validate(insns, insn_count));
2713 
2714 	code = bpfjit_generate_code(bc, insns, insn_count);
2715 	ATF_REQUIRE(code != NULL);
2716 
2717 	for (k = 1; k <= sizeof(pkt); k++)
2718 		ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2719 
2720 	bpfjit_free_code(code);
2721 }
2722 
2723 ATF_TC(bpfjit_stx1);
2724 ATF_TC_HEAD(bpfjit_stx1, tc)
2725 {
2726 	atf_tc_set_md_var(tc, "descr",
2727 	    "Test JIT compilation of BPF_STX");
2728 }
2729 
2730 ATF_TC_BODY(bpfjit_stx1, tc)
2731 {
2732 	static struct bpf_insn insns[] = {
2733 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2734 		BPF_STMT(BPF_STX, 0),
2735 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2736 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2737 		BPF_STMT(BPF_RET+BPF_A, 0)
2738 	};
2739 
2740 	size_t i;
2741 	bpfjit_func_t code;
2742 	uint8_t pkt[16]; /* the program doesn't read any data */
2743 
2744 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2745 
2746 	ATF_CHECK(bpf_validate(insns, insn_count));
2747 
2748 	code = bpfjit_generate_code(bc, insns, insn_count);
2749 	ATF_REQUIRE(code != NULL);
2750 
2751 	for (i = 1; i <= sizeof(pkt); i++)
2752 		ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2753 
2754 	bpfjit_free_code(code);
2755 }
2756 
2757 ATF_TC(bpfjit_stx2);
2758 ATF_TC_HEAD(bpfjit_stx2, tc)
2759 {
2760 	atf_tc_set_md_var(tc, "descr",
2761 	    "Test JIT compilation of BPF_STX");
2762 }
2763 
2764 ATF_TC_BODY(bpfjit_stx2, tc)
2765 {
2766 	static struct bpf_insn insns[] = {
2767 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2768 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2769 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2770 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
2771 		BPF_STMT(BPF_RET+BPF_A, 0)
2772 	};
2773 
2774 	bpfjit_func_t code;
2775 	uint8_t pkt[1]; /* the program doesn't read any data */
2776 
2777 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2778 
2779 	ATF_CHECK(bpf_validate(insns, insn_count));
2780 
2781 	code = bpfjit_generate_code(bc, insns, insn_count);
2782 	ATF_REQUIRE(code != NULL);
2783 
2784 	ATF_CHECK(code(pkt, 1, 1) == 0);
2785 
2786 	bpfjit_free_code(code);
2787 }
2788 
2789 ATF_TC(bpfjit_stx3);
2790 ATF_TC_HEAD(bpfjit_stx3, tc)
2791 {
2792 	atf_tc_set_md_var(tc, "descr",
2793 	    "Test JIT compilation of BPF_STX");
2794 }
2795 
2796 ATF_TC_BODY(bpfjit_stx3, tc)
2797 {
2798 	static struct bpf_insn insns[] = {
2799 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2800 		BPF_STMT(BPF_STX, 5),
2801 		BPF_STMT(BPF_STX, 2),
2802 		BPF_STMT(BPF_STX, 3),
2803 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2804 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2805 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2806 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2807 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2808 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2809 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2810 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2811 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2812 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2813 		BPF_STMT(BPF_RET+BPF_A, 0)
2814 	};
2815 
2816 	size_t i;
2817 	bpfjit_func_t code;
2818 	uint8_t pkt[16]; /* the program doesn't read any data */
2819 
2820 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2821 
2822 	ATF_CHECK(bpf_validate(insns, insn_count));
2823 
2824 	code = bpfjit_generate_code(bc, insns, insn_count);
2825 	ATF_REQUIRE(code != NULL);
2826 
2827 	for (i = 1; i <= sizeof(pkt); i++)
2828 		ATF_CHECK(code(pkt, i, sizeof(pkt)) == 3 * i);
2829 
2830 	bpfjit_free_code(code);
2831 }
2832 
2833 ATF_TC(bpfjit_stx4);
2834 ATF_TC_HEAD(bpfjit_stx4, tc)
2835 {
2836 	atf_tc_set_md_var(tc, "descr",
2837 	    "Test JIT compilation of BPF_STX");
2838 }
2839 
2840 ATF_TC_BODY(bpfjit_stx4, tc)
2841 {
2842 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
2843 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2844 
2845 	size_t k;
2846 	bpfjit_func_t code;
2847 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2848 
2849 	memset(insns, 0, sizeof(insns));
2850 
2851 	/* for each k do M[k] = k */
2852 	for (k = 0; k < BPF_MEMWORDS; k++) {
2853 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
2854 		insns[2*k].k      = 3*k;
2855 		insns[2*k+1].code = BPF_STX;
2856 		insns[2*k+1].k    = k;
2857 	}
2858 
2859 	/* load wirelen into A */
2860 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2861 
2862 	/* for each k, if (A == k + 1) return M[k] */
2863 	for (k = 0; k < BPF_MEMWORDS; k++) {
2864 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2865 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
2866 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
2867 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
2868 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2869 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
2870 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2871 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
2872 	}
2873 
2874 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2875 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
2876 
2877 	ATF_CHECK(bpf_validate(insns, insn_count));
2878 
2879 	code = bpfjit_generate_code(bc, insns, insn_count);
2880 	ATF_REQUIRE(code != NULL);
2881 
2882 	for (k = 1; k <= sizeof(pkt); k++)
2883 		ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2884 
2885 	bpfjit_free_code(code);
2886 }
2887 
2888 ATF_TC(bpfjit_opt_ld_abs_1);
2889 ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
2890 {
2891 	atf_tc_set_md_var(tc, "descr",
2892 	    "Test JIT compilation with length optimization "
2893 	    "applied to BPF_LD+BPF_ABS");
2894 }
2895 
2896 ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
2897 {
2898 	static struct bpf_insn insns[] = {
2899 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2900 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2901 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2902 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2903 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2904 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2905 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2906 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2907 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2908 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2909 		BPF_STMT(BPF_RET+BPF_K, 0),
2910 	};
2911 
2912 	size_t i, j;
2913 	bpfjit_func_t code;
2914 	uint8_t pkt[2][34] = {
2915 		{
2916 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2917 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2918 			0x80, 0x03, 0x70, 0x0f,
2919 			0x80, 0x03, 0x70, 0x23
2920 		},
2921 		{
2922 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2923 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2924 			0x80, 0x03, 0x70, 0x23,
2925 			0x80, 0x03, 0x70, 0x0f
2926 		}
2927 	};
2928 
2929 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2930 
2931 	ATF_CHECK(bpf_validate(insns, insn_count));
2932 
2933 	code = bpfjit_generate_code(bc, insns, insn_count);
2934 	ATF_REQUIRE(code != NULL);
2935 
2936 	for (i = 0; i < 2; i++) {
2937 		for (j = 1; j < sizeof(pkt[i]); j++)
2938 			ATF_CHECK(code(pkt[i], j, j) == 0);
2939 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2940 	}
2941 
2942 	bpfjit_free_code(code);
2943 }
2944 
2945 ATF_TC(bpfjit_opt_ld_abs_2);
2946 ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
2947 {
2948 	atf_tc_set_md_var(tc, "descr",
2949 	    "Test JIT compilation with length optimization "
2950 	    "applied to BPF_LD+BPF_ABS");
2951 }
2952 
2953 ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
2954 {
2955 	static struct bpf_insn insns[] = {
2956 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2957 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2958 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2959 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2960 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2961 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2962 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2963 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2964 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2965 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2966 		BPF_STMT(BPF_RET+BPF_K, 0),
2967 	};
2968 
2969 	size_t i, j;
2970 	bpfjit_func_t code;
2971 	uint8_t pkt[2][34] = {
2972 		{
2973 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2974 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2975 			0x80, 0x03, 0x70, 0x0f,
2976 			0x80, 0x03, 0x70, 0x23
2977 		},
2978 		{
2979 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2980 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2981 			0x80, 0x03, 0x70, 0x23,
2982 			0x80, 0x03, 0x70, 0x0f
2983 		}
2984 	};
2985 
2986 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2987 
2988 	ATF_CHECK(bpf_validate(insns, insn_count));
2989 
2990 	code = bpfjit_generate_code(bc, insns, insn_count);
2991 	ATF_REQUIRE(code != NULL);
2992 
2993 	for (i = 0; i < 2; i++) {
2994 		for (j = 1; j < sizeof(pkt[i]); j++)
2995 			ATF_CHECK(code(pkt[i], j, j) == 0);
2996 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2997 	}
2998 
2999 	bpfjit_free_code(code);
3000 }
3001 
3002 ATF_TC(bpfjit_opt_ld_abs_3);
3003 ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
3004 {
3005 	atf_tc_set_md_var(tc, "descr",
3006 	    "Test JIT compilation with length optimization "
3007 	    "applied to BPF_LD+BPF_ABS");
3008 }
3009 
3010 ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
3011 {
3012 	static struct bpf_insn insns[] = {
3013 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3014 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3015 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3016 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3017 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3018 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3019 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3020 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3021 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3022 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3023 		BPF_STMT(BPF_RET+BPF_K, 0),
3024 	};
3025 
3026 	size_t i, j;
3027 	bpfjit_func_t code;
3028 	uint8_t pkt[2][34] = {
3029 		{
3030 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3031 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3032 			0x80, 0x03, 0x70, 0x0f,
3033 			0x80, 0x03, 0x70, 0x23
3034 		},
3035 		{
3036 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3037 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3038 			0x80, 0x03, 0x70, 0x23,
3039 			0x80, 0x03, 0x70, 0x0f
3040 		}
3041 	};
3042 
3043 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3044 
3045 	ATF_CHECK(bpf_validate(insns, insn_count));
3046 
3047 	code = bpfjit_generate_code(bc, insns, insn_count);
3048 	ATF_REQUIRE(code != NULL);
3049 
3050 	for (i = 0; i < 2; i++) {
3051 		for (j = 1; j < sizeof(pkt[i]); j++)
3052 			ATF_CHECK(code(pkt[i], j, j) == 0);
3053 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3054 	}
3055 
3056 	bpfjit_free_code(code);
3057 }
3058 
3059 ATF_TC(bpfjit_opt_ld_ind_1);
3060 ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3061 {
3062 	atf_tc_set_md_var(tc, "descr",
3063 	    "Test JIT compilation with length optimization "
3064 	    "applied to BPF_LD+BPF_IND");
3065 }
3066 
3067 ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3068 {
3069 	static struct bpf_insn insns[] = {
3070 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3071 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3072 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3073 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3074 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3075 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3076 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3077 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3078 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3079 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3080 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3081 		BPF_STMT(BPF_RET+BPF_K, 0),
3082 	};
3083 
3084 	size_t i, j;
3085 	bpfjit_func_t code;
3086 	uint8_t pkt[2][34] = {
3087 		{
3088 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3089 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3090 			0x80, 0x03, 0x70, 0x0f,
3091 			0x80, 0x03, 0x70, 0x23
3092 		},
3093 		{
3094 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3095 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3096 			0x80, 0x03, 0x70, 0x23,
3097 			0x80, 0x03, 0x70, 0x0f
3098 		}
3099 	};
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(bc, insns, insn_count);
3106 	ATF_REQUIRE(code != NULL);
3107 
3108 	for (i = 0; i < 2; i++) {
3109 		for (j = 1; j < sizeof(pkt[i]); j++)
3110 			ATF_CHECK(code(pkt[i], j, j) == 0);
3111 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3112 	}
3113 
3114 	bpfjit_free_code(code);
3115 }
3116 
3117 ATF_TC(bpfjit_opt_ld_ind_2);
3118 ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3119 {
3120 	atf_tc_set_md_var(tc, "descr",
3121 	    "Test JIT compilation with length optimization "
3122 	    "applied to BPF_LD+BPF_IND");
3123 }
3124 
3125 ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3126 {
3127 	static struct bpf_insn insns[] = {
3128 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3129 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3130 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3131 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3132 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3133 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3134 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3135 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3136 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3137 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3138 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3139 		BPF_STMT(BPF_RET+BPF_K, 0),
3140 	};
3141 
3142 	size_t i, j;
3143 	bpfjit_func_t code;
3144 	uint8_t pkt[2][34] = {
3145 		{
3146 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3147 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3148 			0x80, 0x03, 0x70, 0x0f,
3149 			0x80, 0x03, 0x70, 0x23
3150 		},
3151 		{
3152 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3153 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3154 			0x80, 0x03, 0x70, 0x23,
3155 			0x80, 0x03, 0x70, 0x0f
3156 		}
3157 	};
3158 
3159 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3160 
3161 	ATF_CHECK(bpf_validate(insns, insn_count));
3162 
3163 	code = bpfjit_generate_code(bc, insns, insn_count);
3164 	ATF_REQUIRE(code != NULL);
3165 
3166 	for (i = 0; i < 2; i++) {
3167 		for (j = 1; j < sizeof(pkt[i]); j++)
3168 			ATF_CHECK(code(pkt[i], j, j) == 0);
3169 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3170 	}
3171 
3172 	bpfjit_free_code(code);
3173 }
3174 
3175 ATF_TC(bpfjit_opt_ld_ind_3);
3176 ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3177 {
3178 	atf_tc_set_md_var(tc, "descr",
3179 	    "Test JIT compilation with length optimization "
3180 	    "applied to BPF_LD+BPF_IND");
3181 }
3182 
3183 ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3184 {
3185 	static struct bpf_insn insns[] = {
3186 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3187 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3188 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3189 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3190 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3191 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3192 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3193 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3194 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3195 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3196 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3197 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3198 		BPF_STMT(BPF_RET+BPF_K, 0),
3199 	};
3200 
3201 	size_t i, j;
3202 	bpfjit_func_t code;
3203 	uint8_t pkt[2][34] = {
3204 		{
3205 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3206 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3207 			0x80, 0x03, 0x70, 0x0f,
3208 			0x80, 0x03, 0x70, 0x23
3209 		},
3210 		{
3211 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3212 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3213 			0x80, 0x03, 0x70, 0x23,
3214 			0x80, 0x03, 0x70, 0x0f
3215 		}
3216 	};
3217 
3218 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3219 
3220 	ATF_CHECK(bpf_validate(insns, insn_count));
3221 
3222 	code = bpfjit_generate_code(bc, insns, insn_count);
3223 	ATF_REQUIRE(code != NULL);
3224 
3225 	for (i = 0; i < 2; i++) {
3226 		for (j = 1; j < sizeof(pkt[i]); j++)
3227 			ATF_CHECK(code(pkt[i], j, j) == 0);
3228 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3229 	}
3230 
3231 	bpfjit_free_code(code);
3232 }
3233 
3234 ATF_TC(bpfjit_opt_ld_ind_4);
3235 ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3236 {
3237 	atf_tc_set_md_var(tc, "descr",
3238 	    "Test JIT compilation with length optimization "
3239 	    "applied to BPF_LD+BPF_IND");
3240 }
3241 
3242 ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3243 {
3244 	static struct bpf_insn insns[] = {
3245 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3246 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3247 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3248 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3249 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3250 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3251 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3252 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3253 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3254 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3255 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3256 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3257 		BPF_STMT(BPF_RET+BPF_K, 0),
3258 	};
3259 
3260 	size_t i, j;
3261 	bpfjit_func_t code;
3262 	uint8_t pkt[2][34] = {
3263 		{
3264 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3265 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3266 			0x80, 0x03, 0x70, 0x0f,
3267 			0x80, 0x03, 0x70, 0x23
3268 		},
3269 		{
3270 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3271 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3272 			0x80, 0x03, 0x70, 0x23,
3273 			0x80, 0x03, 0x70, 0x0f
3274 		}
3275 	};
3276 
3277 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3278 
3279 	ATF_CHECK(bpf_validate(insns, insn_count));
3280 
3281 	code = bpfjit_generate_code(bc, insns, insn_count);
3282 	ATF_REQUIRE(code != NULL);
3283 
3284 	for (i = 0; i < 2; i++) {
3285 		for (j = 1; j < sizeof(pkt[i]); j++)
3286 			ATF_CHECK(code(pkt[i], j, j) == 0);
3287 		ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3288 	}
3289 
3290 	bpfjit_free_code(code);
3291 }
3292 
3293 ATF_TP_ADD_TCS(tp)
3294 {
3295 
3296 	ATF_TP_ADD_TC(tp, bpfjit_empty);
3297 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
3298 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
3299 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
3300 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
3301 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
3302 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
3303 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
3304 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
3305 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
3306 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
3307 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
3308 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
3309 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
3310 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
3311 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
3312 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
3313 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
3314 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
3315 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
3316 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
3317 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
3318 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
3319 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
3320 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
3321 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
3322 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
3323 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
3324 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
3325 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
3326 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
3327 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
3328 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
3329 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
3330 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
3331 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
3332 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
3333 	ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
3334 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
3335 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
3336 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
3337 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
3338 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
3339 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
3340 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
3341 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
3342 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
3343 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
3344 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
3345 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
3346 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
3347 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
3348 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
3349 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
3350 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
3351 	ATF_TP_ADD_TC(tp, bpfjit_ld_len);
3352 	ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
3353 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
3354 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
3355 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
3356 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
3357 	ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
3358 	ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
3359 	ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
3360 	ATF_TP_ADD_TC(tp, bpfjit_st1);
3361 	ATF_TP_ADD_TC(tp, bpfjit_st2);
3362 	ATF_TP_ADD_TC(tp, bpfjit_st3);
3363 	ATF_TP_ADD_TC(tp, bpfjit_st4);
3364 	ATF_TP_ADD_TC(tp, bpfjit_st5);
3365 	ATF_TP_ADD_TC(tp, bpfjit_stx1);
3366 	ATF_TP_ADD_TC(tp, bpfjit_stx2);
3367 	ATF_TP_ADD_TC(tp, bpfjit_stx3);
3368 	ATF_TP_ADD_TC(tp, bpfjit_stx4);
3369 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
3370 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
3371 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
3372 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
3373 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
3374 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
3375 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
3376 	/* XXX: bpfjit_opt_ldx_msh */
3377 
3378 	return atf_no_error();
3379 }
3380