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