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