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