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