Home | History | Annotate | Line # | Download | only in libbpfjit
t_bpfjit.c revision 1.11
      1 /*	$NetBSD: t_bpfjit.c,v 1.11 2015/02/11 23:33:16 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.11 2015/02/11 23:33:16 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, 0),
   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, 1),
   2363 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2364 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
   2365 		BPF_STMT(BPF_RET+BPF_K, 2),
   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, 3),
   2369 		BPF_STMT(BPF_RET+BPF_K, 4),
   2370 		BPF_STMT(BPF_RET+BPF_K, 5),
   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, 6),
   2374 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
   2375 		BPF_STMT(BPF_RET+BPF_K, 7),
   2376 		BPF_STMT(BPF_RET+BPF_K, 8)
   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) == 7);
   2390 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
   2391 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
   2392 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2393 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2394 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2395 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2396 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   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_modulo_x);
   2459 ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
   2460 {
   2461 	atf_tc_set_md_var(tc, "descr",
   2462 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
   2463 }
   2464 
   2465 ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
   2466 {
   2467 	static struct bpf_insn insns[] = {
   2468 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
   2469 		/* FFFFF770 << 4 = FFFFF770 */
   2470 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
   2471 
   2472 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2473 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2474 		BPF_STMT(BPF_RET+BPF_K, 0),
   2475 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2476 		BPF_STMT(BPF_RET+BPF_K, 1),
   2477 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2478 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2479 		BPF_STMT(BPF_RET+BPF_K, 2),
   2480 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2481 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2482 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2483 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2484 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2485 		BPF_STMT(BPF_JMP+BPF_JA, 1),
   2486 		BPF_STMT(BPF_RET+BPF_K, 3),
   2487 
   2488 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
   2489 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
   2490 
   2491 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2492 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2493 		BPF_STMT(BPF_RET+BPF_K, 4),
   2494 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2495 		BPF_STMT(BPF_RET+BPF_K, 5),
   2496 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2497 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2498 		BPF_STMT(BPF_RET+BPF_K, 6),
   2499 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2500 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2501 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2502 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2503 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2504 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   2505 		BPF_STMT(BPF_RET+BPF_K, 7)
   2506 	};
   2507 
   2508 	bpfjit_func_t code;
   2509 	uint8_t pkt[1]; /* the program doesn't read any data */
   2510 
   2511 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2512 
   2513 	ATF_CHECK(bpf_validate(insns, insn_count));
   2514 
   2515 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2516 	ATF_REQUIRE(code != NULL);
   2517 
   2518 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   2519 
   2520 	bpfjit_free_code(code);
   2521 }
   2522 
   2523 ATF_TC(libbpfjit_ld_abs);
   2524 ATF_TC_HEAD(libbpfjit_ld_abs, tc)
   2525 {
   2526 	atf_tc_set_md_var(tc, "descr",
   2527 	    "Test JIT compilation of BPF_LD+BPF_ABS");
   2528 }
   2529 
   2530 ATF_TC_BODY(libbpfjit_ld_abs, tc)
   2531 {
   2532 	static struct bpf_insn insns[3][2] = {
   2533 		{
   2534 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   2535 			BPF_STMT(BPF_RET+BPF_A, 0)
   2536 		},
   2537 		{
   2538 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
   2539 			BPF_STMT(BPF_RET+BPF_A, 0)
   2540 		},
   2541 		{
   2542 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
   2543 			BPF_STMT(BPF_RET+BPF_A, 0)
   2544 		}
   2545 	};
   2546 
   2547 	static size_t lengths[3] = { 1, 2, 4 };
   2548 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
   2549 
   2550 	size_t i, l;
   2551 	uint8_t *pkt = deadbeef_at_5;
   2552 	size_t pktsize = sizeof(deadbeef_at_5);
   2553 
   2554 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2555 
   2556 	for (i = 0; i < 3; i++) {
   2557 		bpfjit_func_t code;
   2558 
   2559 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2560 
   2561 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2562 		ATF_REQUIRE(code != NULL);
   2563 
   2564 		for (l = 1; l < 5 + lengths[i]; l++) {
   2565 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2566 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2567 		}
   2568 
   2569 		l = 5 + lengths[i];
   2570 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2571 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2572 
   2573 		l = pktsize;
   2574 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2575 
   2576 		bpfjit_free_code(code);
   2577 	}
   2578 }
   2579 
   2580 ATF_TC(libbpfjit_ld_abs_k_overflow);
   2581 ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
   2582 {
   2583 	atf_tc_set_md_var(tc, "descr",
   2584 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
   2585 }
   2586 
   2587 ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
   2588 {
   2589 	static struct bpf_insn insns[12][3] = {
   2590 		{
   2591 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   2592 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2593 			BPF_STMT(BPF_RET+BPF_K, 1)
   2594 		},
   2595 		{
   2596 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   2597 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2598 			BPF_STMT(BPF_RET+BPF_K, 1)
   2599 		},
   2600 		{
   2601 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   2602 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2603 			BPF_STMT(BPF_RET+BPF_K, 1)
   2604 		},
   2605 		{
   2606 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   2607 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2608 			BPF_STMT(BPF_RET+BPF_K, 1)
   2609 		},
   2610 		{
   2611 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   2612 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2613 			BPF_STMT(BPF_RET+BPF_K, 1)
   2614 		},
   2615 		{
   2616 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
   2617 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2618 			BPF_STMT(BPF_RET+BPF_K, 1)
   2619 		},
   2620 		{
   2621 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2622 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   2623 			BPF_STMT(BPF_RET+BPF_K, 1)
   2624 		},
   2625 		{
   2626 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2627 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   2628 			BPF_STMT(BPF_RET+BPF_K, 1)
   2629 		},
   2630 		{
   2631 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2632 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   2633 			BPF_STMT(BPF_RET+BPF_K, 1)
   2634 		},
   2635 		{
   2636 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2637 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   2638 			BPF_STMT(BPF_RET+BPF_K, 1)
   2639 		},
   2640 		{
   2641 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2642 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   2643 			BPF_STMT(BPF_RET+BPF_K, 1)
   2644 		},
   2645 		{
   2646 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2647 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
   2648 			BPF_STMT(BPF_RET+BPF_K, 1)
   2649 		}
   2650 	};
   2651 
   2652 	int i;
   2653 	uint8_t pkt[8] = { 0 };
   2654 
   2655 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2656 
   2657 	for (i = 0; i < 3; i++) {
   2658 		bpfjit_func_t code;
   2659 
   2660 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2661 
   2662 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2663 		ATF_REQUIRE(code != NULL);
   2664 
   2665 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2666 
   2667 		bpfjit_free_code(code);
   2668 	}
   2669 }
   2670 
   2671 ATF_TC(libbpfjit_ld_ind);
   2672 ATF_TC_HEAD(libbpfjit_ld_ind, tc)
   2673 {
   2674 	atf_tc_set_md_var(tc, "descr",
   2675 	    "Test JIT compilation of BPF_LD+BPF_IND");
   2676 }
   2677 
   2678 ATF_TC_BODY(libbpfjit_ld_ind, tc)
   2679 {
   2680 	static struct bpf_insn insns[6][3] = {
   2681 		{
   2682 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2683 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   2684 			BPF_STMT(BPF_RET+BPF_A, 0)
   2685 		},
   2686 		{
   2687 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2688 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
   2689 			BPF_STMT(BPF_RET+BPF_A, 0)
   2690 		},
   2691 		{
   2692 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2693 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
   2694 			BPF_STMT(BPF_RET+BPF_A, 0)
   2695 		},
   2696 		{
   2697 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2698 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2699 			BPF_STMT(BPF_RET+BPF_A, 0)
   2700 		},
   2701 		{
   2702 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2703 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   2704 			BPF_STMT(BPF_RET+BPF_A, 0)
   2705 		},
   2706 		{
   2707 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2708 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
   2709 			BPF_STMT(BPF_RET+BPF_A, 0)
   2710 		}
   2711 	};
   2712 
   2713 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
   2714 
   2715 	static unsigned int expected[6] = {
   2716 		0xde, 0xdead, 0xdeadbeef,
   2717 		0xde, 0xdead, 0xdeadbeef
   2718 	};
   2719 
   2720 	size_t i, l;
   2721 	uint8_t *pkt = deadbeef_at_5;
   2722 	size_t pktsize = sizeof(deadbeef_at_5);
   2723 
   2724 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2725 
   2726 	for (i = 0; i < 3; i++) {
   2727 		bpfjit_func_t code;
   2728 
   2729 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2730 
   2731 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2732 		ATF_REQUIRE(code != NULL);
   2733 
   2734 		for (l = 1; l < 5 + lengths[i]; l++) {
   2735 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2736 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2737 		}
   2738 
   2739 		l = 5 + lengths[i];
   2740 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2741 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2742 
   2743 		l = pktsize;
   2744 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2745 
   2746 		bpfjit_free_code(code);
   2747 	}
   2748 }
   2749 
   2750 ATF_TC(libbpfjit_ld_ind_k_overflow);
   2751 ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
   2752 {
   2753 	atf_tc_set_md_var(tc, "descr",
   2754 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
   2755 }
   2756 
   2757 ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
   2758 {
   2759 	static struct bpf_insn insns[12][3] = {
   2760 		{
   2761 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   2762 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2763 			BPF_STMT(BPF_RET+BPF_K, 1)
   2764 		},
   2765 		{
   2766 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   2767 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2768 			BPF_STMT(BPF_RET+BPF_K, 1)
   2769 		},
   2770 		{
   2771 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   2772 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2773 			BPF_STMT(BPF_RET+BPF_K, 1)
   2774 		},
   2775 		{
   2776 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   2777 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2778 			BPF_STMT(BPF_RET+BPF_K, 1)
   2779 		},
   2780 		{
   2781 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   2782 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2783 			BPF_STMT(BPF_RET+BPF_K, 1)
   2784 		},
   2785 		{
   2786 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
   2787 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2788 			BPF_STMT(BPF_RET+BPF_K, 1)
   2789 		},
   2790 		{
   2791 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2792 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   2793 			BPF_STMT(BPF_RET+BPF_K, 1)
   2794 		},
   2795 		{
   2796 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2797 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   2798 			BPF_STMT(BPF_RET+BPF_K, 1)
   2799 		},
   2800 		{
   2801 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2802 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   2803 			BPF_STMT(BPF_RET+BPF_K, 1)
   2804 		},
   2805 		{
   2806 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2807 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   2808 			BPF_STMT(BPF_RET+BPF_K, 1)
   2809 		},
   2810 		{
   2811 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2812 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   2813 			BPF_STMT(BPF_RET+BPF_K, 1)
   2814 		},
   2815 		{
   2816 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2817 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
   2818 			BPF_STMT(BPF_RET+BPF_K, 1)
   2819 		}
   2820 	};
   2821 
   2822 	int i;
   2823 	uint8_t pkt[8] = { 0 };
   2824 
   2825 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2826 
   2827 	for (i = 0; i < 3; i++) {
   2828 		bpfjit_func_t code;
   2829 
   2830 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2831 
   2832 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2833 		ATF_REQUIRE(code != NULL);
   2834 
   2835 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2836 
   2837 		bpfjit_free_code(code);
   2838 	}
   2839 }
   2840 
   2841 ATF_TC(libbpfjit_ld_ind_x_overflow1);
   2842 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
   2843 {
   2844 	atf_tc_set_md_var(tc, "descr",
   2845 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2846 }
   2847 
   2848 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
   2849 {
   2850 	static struct bpf_insn insns[] = {
   2851 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2852 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2853 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   2854 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2855 		BPF_STMT(BPF_RET+BPF_A, 0)
   2856 	};
   2857 
   2858 	size_t i;
   2859 	bpfjit_func_t code;
   2860 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2861 
   2862 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2863 
   2864 	ATF_CHECK(bpf_validate(insns, insn_count));
   2865 
   2866 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2867 	ATF_REQUIRE(code != NULL);
   2868 
   2869 	for (i = 1; i <= sizeof(pkt); i++) {
   2870 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2871 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2872 	}
   2873 
   2874 	bpfjit_free_code(code);
   2875 }
   2876 
   2877 ATF_TC(libbpfjit_ld_ind_x_overflow2);
   2878 ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
   2879 {
   2880 	atf_tc_set_md_var(tc, "descr",
   2881 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2882 }
   2883 
   2884 ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
   2885 {
   2886 	static struct bpf_insn insns[] = {
   2887 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2888 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2889 		BPF_STMT(BPF_ST, 3),
   2890 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   2891 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2892 		BPF_STMT(BPF_RET+BPF_A, 0)
   2893 	};
   2894 
   2895 	size_t i;
   2896 	bpfjit_func_t code;
   2897 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2898 
   2899 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2900 
   2901 	ATF_CHECK(bpf_validate(insns, insn_count));
   2902 
   2903 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2904 	ATF_REQUIRE(code != NULL);
   2905 
   2906 	for (i = 1; i <= sizeof(pkt); i++) {
   2907 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2908 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2909 	}
   2910 
   2911 	bpfjit_free_code(code);
   2912 }
   2913 
   2914 ATF_TC(libbpfjit_ld_len);
   2915 ATF_TC_HEAD(libbpfjit_ld_len, tc)
   2916 {
   2917 	atf_tc_set_md_var(tc, "descr",
   2918 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
   2919 }
   2920 
   2921 ATF_TC_BODY(libbpfjit_ld_len, tc)
   2922 {
   2923 	static struct bpf_insn insns[] = {
   2924 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2925 		BPF_STMT(BPF_RET+BPF_A, 0)
   2926 	};
   2927 
   2928 	size_t i;
   2929 	bpfjit_func_t code;
   2930 	uint8_t pkt[32]; /* the program doesn't read any data */
   2931 
   2932 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2933 
   2934 	ATF_CHECK(bpf_validate(insns, insn_count));
   2935 
   2936 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2937 	ATF_REQUIRE(code != NULL);
   2938 
   2939 	for (i = 0; i < sizeof(pkt); i++)
   2940 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   2941 
   2942 	bpfjit_free_code(code);
   2943 }
   2944 
   2945 ATF_TC(libbpfjit_ld_imm);
   2946 ATF_TC_HEAD(libbpfjit_ld_imm, tc)
   2947 {
   2948 	atf_tc_set_md_var(tc, "descr",
   2949 	    "Test JIT compilation of BPF_LD+BPF_IMM");
   2950 }
   2951 
   2952 ATF_TC_BODY(libbpfjit_ld_imm, tc)
   2953 {
   2954 	static struct bpf_insn insns[] = {
   2955 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
   2956 		BPF_STMT(BPF_RET+BPF_A, 0)
   2957 	};
   2958 
   2959 	bpfjit_func_t code;
   2960 	uint8_t pkt[1]; /* the program doesn't read any data */
   2961 
   2962 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2963 
   2964 	ATF_CHECK(bpf_validate(insns, insn_count));
   2965 
   2966 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2967 	ATF_REQUIRE(code != NULL);
   2968 
   2969 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   2970 
   2971 	bpfjit_free_code(code);
   2972 }
   2973 
   2974 ATF_TC(libbpfjit_ldx_imm1);
   2975 ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
   2976 {
   2977 	atf_tc_set_md_var(tc, "descr",
   2978 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   2979 }
   2980 
   2981 ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
   2982 {
   2983 	static struct bpf_insn insns[] = {
   2984 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
   2985 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   2986 		BPF_STMT(BPF_RET+BPF_A, 0)
   2987 	};
   2988 
   2989 	bpfjit_func_t code;
   2990 	uint8_t pkt[1]; /* the program doesn't read any data */
   2991 
   2992 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2993 
   2994 	ATF_CHECK(bpf_validate(insns, insn_count));
   2995 
   2996 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2997 	ATF_REQUIRE(code != NULL);
   2998 
   2999 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
   3000 
   3001 	bpfjit_free_code(code);
   3002 }
   3003 
   3004 ATF_TC(libbpfjit_ldx_imm2);
   3005 ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
   3006 {
   3007 	atf_tc_set_md_var(tc, "descr",
   3008 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   3009 }
   3010 
   3011 ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
   3012 {
   3013 	static struct bpf_insn insns[] = {
   3014 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   3015 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   3016 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   3017 		BPF_STMT(BPF_RET+BPF_K, 7),
   3018 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   3019 	};
   3020 
   3021 	bpfjit_func_t code;
   3022 	uint8_t pkt[1]; /* the program doesn't read any data */
   3023 
   3024 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3025 
   3026 	ATF_CHECK(bpf_validate(insns, insn_count));
   3027 
   3028 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3029 	ATF_REQUIRE(code != NULL);
   3030 
   3031 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   3032 
   3033 	bpfjit_free_code(code);
   3034 }
   3035 
   3036 ATF_TC(libbpfjit_ldx_len1);
   3037 ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
   3038 {
   3039 	atf_tc_set_md_var(tc, "descr",
   3040 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   3041 }
   3042 
   3043 ATF_TC_BODY(libbpfjit_ldx_len1, tc)
   3044 {
   3045 	static struct bpf_insn insns[] = {
   3046 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3047 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3048 		BPF_STMT(BPF_RET+BPF_A, 0)
   3049 	};
   3050 
   3051 	size_t i;
   3052 	bpfjit_func_t code;
   3053 	uint8_t pkt[5]; /* 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 	for (i = 1; i < sizeof(pkt); i++) {
   3063 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   3064 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
   3065 	}
   3066 
   3067 	bpfjit_free_code(code);
   3068 }
   3069 
   3070 ATF_TC(libbpfjit_ldx_len2);
   3071 ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
   3072 {
   3073 	atf_tc_set_md_var(tc, "descr",
   3074 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   3075 }
   3076 
   3077 ATF_TC_BODY(libbpfjit_ldx_len2, tc)
   3078 {
   3079 	static struct bpf_insn insns[] = {
   3080 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3081 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   3082 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   3083 		BPF_STMT(BPF_RET+BPF_K, 7),
   3084 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   3085 	};
   3086 
   3087 	bpfjit_func_t code;
   3088 	uint8_t pkt[5]; /* the program doesn't read any data */
   3089 
   3090 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3091 
   3092 	ATF_CHECK(bpf_validate(insns, insn_count));
   3093 
   3094 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3095 	ATF_REQUIRE(code != NULL);
   3096 
   3097 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
   3098 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
   3099 
   3100 	bpfjit_free_code(code);
   3101 }
   3102 
   3103 ATF_TC(libbpfjit_ldx_msh);
   3104 ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
   3105 {
   3106 	atf_tc_set_md_var(tc, "descr",
   3107 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
   3108 }
   3109 
   3110 ATF_TC_BODY(libbpfjit_ldx_msh, tc)
   3111 {
   3112 	static struct bpf_insn insns[] = {
   3113 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
   3114 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3115 		BPF_STMT(BPF_RET+BPF_A, 0)
   3116 	};
   3117 
   3118 	bpfjit_func_t code;
   3119 	uint8_t pkt[2] = { 0, 0x7a };
   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, 2, 2) == 40);
   3129 
   3130 	bpfjit_free_code(code);
   3131 }
   3132 
   3133 ATF_TC(libbpfjit_misc_tax);
   3134 ATF_TC_HEAD(libbpfjit_misc_tax, tc)
   3135 {
   3136 	atf_tc_set_md_var(tc, "descr",
   3137 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
   3138 }
   3139 
   3140 ATF_TC_BODY(libbpfjit_misc_tax, tc)
   3141 {
   3142 	static struct bpf_insn insns[] = {
   3143 		BPF_STMT(BPF_LD+BPF_IMM, 3),
   3144 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   3145 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   3146 		BPF_STMT(BPF_RET+BPF_A, 0)
   3147 	};
   3148 
   3149 	bpfjit_func_t code;
   3150 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
   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, sizeof(pkt), sizeof(pkt)) == 55);
   3160 
   3161 	bpfjit_free_code(code);
   3162 }
   3163 
   3164 ATF_TC(libbpfjit_misc_txa);
   3165 ATF_TC_HEAD(libbpfjit_misc_txa, tc)
   3166 {
   3167 	atf_tc_set_md_var(tc, "descr",
   3168 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
   3169 }
   3170 
   3171 ATF_TC_BODY(libbpfjit_misc_txa, tc)
   3172 {
   3173 	static struct bpf_insn insns[] = {
   3174 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
   3175 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3176 		BPF_STMT(BPF_RET+BPF_A, 0)
   3177 	};
   3178 
   3179 	bpfjit_func_t code;
   3180 	uint8_t pkt[1]; /* the program doesn't read any data */
   3181 
   3182 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3183 
   3184 	ATF_CHECK(bpf_validate(insns, insn_count));
   3185 
   3186 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3187 	ATF_REQUIRE(code != NULL);
   3188 
   3189 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
   3190 
   3191 	bpfjit_free_code(code);
   3192 }
   3193 
   3194 ATF_TC(libbpfjit_st1);
   3195 ATF_TC_HEAD(libbpfjit_st1, tc)
   3196 {
   3197 	atf_tc_set_md_var(tc, "descr",
   3198 	    "Test JIT compilation of BPF_ST");
   3199 }
   3200 
   3201 ATF_TC_BODY(libbpfjit_st1, tc)
   3202 {
   3203 	static struct bpf_insn insns[] = {
   3204 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3205 		BPF_STMT(BPF_ST, 0),
   3206 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
   3207 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3208 		BPF_STMT(BPF_RET+BPF_A, 0)
   3209 	};
   3210 
   3211 	size_t i;
   3212 	bpfjit_func_t code;
   3213 	uint8_t pkt[16]; /* the program doesn't read any data */
   3214 
   3215 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3216 
   3217 	ATF_CHECK(bpf_validate(insns, insn_count));
   3218 
   3219 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3220 	ATF_REQUIRE(code != NULL);
   3221 
   3222 	for (i = 1; i <= sizeof(pkt); i++)
   3223 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3224 
   3225 	bpfjit_free_code(code);
   3226 }
   3227 
   3228 ATF_TC(libbpfjit_st2);
   3229 ATF_TC_HEAD(libbpfjit_st2, tc)
   3230 {
   3231 	atf_tc_set_md_var(tc, "descr",
   3232 	    "Test JIT compilation of BPF_ST");
   3233 }
   3234 
   3235 ATF_TC_BODY(libbpfjit_st2, tc)
   3236 {
   3237 	static struct bpf_insn insns[] = {
   3238 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3239 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3240 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3241 		BPF_STMT(BPF_RET+BPF_A, 0)
   3242 	};
   3243 
   3244 	bpfjit_func_t code;
   3245 	uint8_t pkt[1]; /* the program doesn't read any data */
   3246 
   3247 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3248 
   3249 	ATF_CHECK(bpf_validate(insns, insn_count));
   3250 
   3251 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3252 	ATF_REQUIRE(code != NULL);
   3253 
   3254 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3255 
   3256 	bpfjit_free_code(code);
   3257 }
   3258 
   3259 ATF_TC(libbpfjit_st3);
   3260 ATF_TC_HEAD(libbpfjit_st3, tc)
   3261 {
   3262 	atf_tc_set_md_var(tc, "descr",
   3263 	    "Test JIT compilation of BPF_ST");
   3264 }
   3265 
   3266 ATF_TC_BODY(libbpfjit_st3, tc)
   3267 {
   3268 	static struct bpf_insn insns[] = {
   3269 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3270 		BPF_STMT(BPF_ST, 0),
   3271 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3272 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3273 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3274 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3275 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3276 		BPF_STMT(BPF_RET+BPF_A, 0),
   3277 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3278 		BPF_STMT(BPF_RET+BPF_A, 0)
   3279 	};
   3280 
   3281 	bpfjit_func_t code;
   3282 	uint8_t pkt[2]; /* the program doesn't read any data */
   3283 
   3284 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3285 
   3286 	ATF_REQUIRE(BPF_MEMWORDS > 1);
   3287 
   3288 	ATF_CHECK(bpf_validate(insns, insn_count));
   3289 
   3290 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3291 	ATF_REQUIRE(code != NULL);
   3292 
   3293 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3294 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3295 
   3296 	bpfjit_free_code(code);
   3297 }
   3298 
   3299 ATF_TC(libbpfjit_st4);
   3300 ATF_TC_HEAD(libbpfjit_st4, tc)
   3301 {
   3302 	atf_tc_set_md_var(tc, "descr",
   3303 	    "Test JIT compilation of BPF_ST");
   3304 }
   3305 
   3306 ATF_TC_BODY(libbpfjit_st4, tc)
   3307 {
   3308 	static struct bpf_insn insns[] = {
   3309 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3310 		BPF_STMT(BPF_ST, 5),
   3311 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3312 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3313 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3314 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3315 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3316 		BPF_STMT(BPF_RET+BPF_A, 0),
   3317 		BPF_STMT(BPF_LD+BPF_MEM, 5),
   3318 		BPF_STMT(BPF_RET+BPF_A, 0)
   3319 	};
   3320 
   3321 	bpfjit_func_t code;
   3322 	uint8_t pkt[2]; /* the program doesn't read any data */
   3323 
   3324 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3325 
   3326 	ATF_REQUIRE(BPF_MEMWORDS > 6);
   3327 
   3328 	ATF_CHECK(bpf_validate(insns, insn_count));
   3329 
   3330 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3331 	ATF_REQUIRE(code != NULL);
   3332 
   3333 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3334 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3335 
   3336 	bpfjit_free_code(code);
   3337 }
   3338 
   3339 ATF_TC(libbpfjit_st5);
   3340 ATF_TC_HEAD(libbpfjit_st5, tc)
   3341 {
   3342 	atf_tc_set_md_var(tc, "descr",
   3343 	    "Test JIT compilation of BPF_ST");
   3344 }
   3345 
   3346 ATF_TC_BODY(libbpfjit_st5, tc)
   3347 {
   3348 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3349 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3350 
   3351 	size_t k;
   3352 	bpfjit_func_t code;
   3353 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3354 
   3355 	memset(insns, 0, sizeof(insns));
   3356 
   3357 	/* for each k do M[k] = k */
   3358 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3359 		insns[2*k].code   = BPF_LD+BPF_IMM;
   3360 		insns[2*k].k      = 3*k;
   3361 		insns[2*k+1].code = BPF_ST;
   3362 		insns[2*k+1].k    = k;
   3363 	}
   3364 
   3365 	/* load wirelen into A */
   3366 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3367 
   3368 	/* for each k, if (A == k + 1) return M[k] */
   3369 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3370 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3371 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3372 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3373 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3374 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3375 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3376 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3377 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3378 	}
   3379 
   3380 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3381 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3382 
   3383 	ATF_CHECK(bpf_validate(insns, insn_count));
   3384 
   3385 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3386 	ATF_REQUIRE(code != NULL);
   3387 
   3388 	for (k = 1; k <= sizeof(pkt); k++)
   3389 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3390 
   3391 	bpfjit_free_code(code);
   3392 }
   3393 
   3394 ATF_TC(libbpfjit_stx1);
   3395 ATF_TC_HEAD(libbpfjit_stx1, tc)
   3396 {
   3397 	atf_tc_set_md_var(tc, "descr",
   3398 	    "Test JIT compilation of BPF_STX");
   3399 }
   3400 
   3401 ATF_TC_BODY(libbpfjit_stx1, tc)
   3402 {
   3403 	static struct bpf_insn insns[] = {
   3404 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3405 		BPF_STMT(BPF_STX, 0),
   3406 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3407 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3408 		BPF_STMT(BPF_RET+BPF_A, 0)
   3409 	};
   3410 
   3411 	size_t i;
   3412 	bpfjit_func_t code;
   3413 	uint8_t pkt[16]; /* the program doesn't read any data */
   3414 
   3415 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3416 
   3417 	ATF_CHECK(bpf_validate(insns, insn_count));
   3418 
   3419 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3420 	ATF_REQUIRE(code != NULL);
   3421 
   3422 	for (i = 1; i <= sizeof(pkt); i++)
   3423 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3424 
   3425 	bpfjit_free_code(code);
   3426 }
   3427 
   3428 ATF_TC(libbpfjit_stx2);
   3429 ATF_TC_HEAD(libbpfjit_stx2, tc)
   3430 {
   3431 	atf_tc_set_md_var(tc, "descr",
   3432 	    "Test JIT compilation of BPF_STX");
   3433 }
   3434 
   3435 ATF_TC_BODY(libbpfjit_stx2, tc)
   3436 {
   3437 	static struct bpf_insn insns[] = {
   3438 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3439 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
   3440 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3441 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3442 		BPF_STMT(BPF_RET+BPF_A, 0)
   3443 	};
   3444 
   3445 	bpfjit_func_t code;
   3446 	uint8_t pkt[1]; /* the program doesn't read any data */
   3447 
   3448 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3449 
   3450 	ATF_CHECK(bpf_validate(insns, insn_count));
   3451 
   3452 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3453 	ATF_REQUIRE(code != NULL);
   3454 
   3455 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3456 
   3457 	bpfjit_free_code(code);
   3458 }
   3459 
   3460 ATF_TC(libbpfjit_stx3);
   3461 ATF_TC_HEAD(libbpfjit_stx3, tc)
   3462 {
   3463 	atf_tc_set_md_var(tc, "descr",
   3464 	    "Test JIT compilation of BPF_STX");
   3465 }
   3466 
   3467 ATF_TC_BODY(libbpfjit_stx3, tc)
   3468 {
   3469 	static struct bpf_insn insns[] = {
   3470 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3471 		BPF_STMT(BPF_STX, 5),
   3472 		BPF_STMT(BPF_STX, 2),
   3473 		BPF_STMT(BPF_STX, 3),
   3474 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
   3475 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3476 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
   3477 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3478 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   3479 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3480 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
   3481 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3482 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
   3483 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3484 		BPF_STMT(BPF_RET+BPF_A, 0)
   3485 	};
   3486 
   3487 	size_t i;
   3488 	bpfjit_func_t code;
   3489 	uint8_t pkt[16]; /* the program doesn't read any data */
   3490 
   3491 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3492 
   3493 	ATF_CHECK(bpf_validate(insns, insn_count));
   3494 
   3495 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3496 	ATF_REQUIRE(code != NULL);
   3497 
   3498 	for (i = 1; i <= sizeof(pkt); i++)
   3499 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
   3500 
   3501 	bpfjit_free_code(code);
   3502 }
   3503 
   3504 ATF_TC(libbpfjit_stx4);
   3505 ATF_TC_HEAD(libbpfjit_stx4, tc)
   3506 {
   3507 	atf_tc_set_md_var(tc, "descr",
   3508 	    "Test JIT compilation of BPF_STX");
   3509 }
   3510 
   3511 ATF_TC_BODY(libbpfjit_stx4, tc)
   3512 {
   3513 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3514 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3515 
   3516 	size_t k;
   3517 	bpfjit_func_t code;
   3518 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3519 
   3520 	memset(insns, 0, sizeof(insns));
   3521 
   3522 	/* for each k do M[k] = k */
   3523 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3524 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
   3525 		insns[2*k].k      = 3*k;
   3526 		insns[2*k+1].code = BPF_STX;
   3527 		insns[2*k+1].k    = k;
   3528 	}
   3529 
   3530 	/* load wirelen into A */
   3531 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3532 
   3533 	/* for each k, if (A == k + 1) return M[k] */
   3534 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3535 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3536 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3537 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3538 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3539 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3540 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3541 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3542 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3543 	}
   3544 
   3545 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3546 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3547 
   3548 	ATF_CHECK(bpf_validate(insns, insn_count));
   3549 
   3550 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3551 	ATF_REQUIRE(code != NULL);
   3552 
   3553 	for (k = 1; k <= sizeof(pkt); k++)
   3554 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3555 
   3556 	bpfjit_free_code(code);
   3557 }
   3558 
   3559 ATF_TC(libbpfjit_opt_ld_abs_1);
   3560 ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
   3561 {
   3562 	atf_tc_set_md_var(tc, "descr",
   3563 	    "Test JIT compilation with length optimization "
   3564 	    "applied to BPF_LD+BPF_ABS");
   3565 }
   3566 
   3567 ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
   3568 {
   3569 	static struct bpf_insn insns[] = {
   3570 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3571 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3572 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3573 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3574 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3575 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3576 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3577 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3578 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3579 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3580 		BPF_STMT(BPF_RET+BPF_K, 0),
   3581 	};
   3582 
   3583 	size_t i, j;
   3584 	bpfjit_func_t code;
   3585 	uint8_t pkt[2][34] = {
   3586 		{
   3587 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3588 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3589 			0x80, 0x03, 0x70, 0x0f,
   3590 			0x80, 0x03, 0x70, 0x23
   3591 		},
   3592 		{
   3593 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3594 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3595 			0x80, 0x03, 0x70, 0x23,
   3596 			0x80, 0x03, 0x70, 0x0f
   3597 		}
   3598 	};
   3599 
   3600 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3601 
   3602 	ATF_CHECK(bpf_validate(insns, insn_count));
   3603 
   3604 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3605 	ATF_REQUIRE(code != NULL);
   3606 
   3607 	for (i = 0; i < 2; i++) {
   3608 		for (j = 1; j < sizeof(pkt[i]); j++)
   3609 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3610 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3611 	}
   3612 
   3613 	bpfjit_free_code(code);
   3614 }
   3615 
   3616 ATF_TC(libbpfjit_opt_ld_abs_2);
   3617 ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
   3618 {
   3619 	atf_tc_set_md_var(tc, "descr",
   3620 	    "Test JIT compilation with length optimization "
   3621 	    "applied to BPF_LD+BPF_ABS");
   3622 }
   3623 
   3624 ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
   3625 {
   3626 	static struct bpf_insn insns[] = {
   3627 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3628 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3629 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3630 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3631 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3632 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3633 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3634 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3635 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3636 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3637 		BPF_STMT(BPF_RET+BPF_K, 0),
   3638 	};
   3639 
   3640 	size_t i, j;
   3641 	bpfjit_func_t code;
   3642 	uint8_t pkt[2][34] = {
   3643 		{
   3644 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3645 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3646 			0x80, 0x03, 0x70, 0x0f,
   3647 			0x80, 0x03, 0x70, 0x23
   3648 		},
   3649 		{
   3650 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3651 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3652 			0x80, 0x03, 0x70, 0x23,
   3653 			0x80, 0x03, 0x70, 0x0f
   3654 		}
   3655 	};
   3656 
   3657 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3658 
   3659 	ATF_CHECK(bpf_validate(insns, insn_count));
   3660 
   3661 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3662 	ATF_REQUIRE(code != NULL);
   3663 
   3664 	for (i = 0; i < 2; i++) {
   3665 		for (j = 1; j < sizeof(pkt[i]); j++)
   3666 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3667 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3668 	}
   3669 
   3670 	bpfjit_free_code(code);
   3671 }
   3672 
   3673 ATF_TC(libbpfjit_opt_ld_abs_3);
   3674 ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
   3675 {
   3676 	atf_tc_set_md_var(tc, "descr",
   3677 	    "Test JIT compilation with length optimization "
   3678 	    "applied to BPF_LD+BPF_ABS");
   3679 }
   3680 
   3681 ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
   3682 {
   3683 	static struct bpf_insn insns[] = {
   3684 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3685 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3686 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3687 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
   3688 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
   3689 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3690 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3691 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3692 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3693 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3694 		BPF_STMT(BPF_RET+BPF_K, 0),
   3695 	};
   3696 
   3697 	size_t i, j;
   3698 	bpfjit_func_t code;
   3699 	uint8_t pkt[2][34] = {
   3700 		{
   3701 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3702 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3703 			0x80, 0x03, 0x70, 0x0f,
   3704 			0x80, 0x03, 0x70, 0x23
   3705 		},
   3706 		{
   3707 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3708 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3709 			0x80, 0x03, 0x70, 0x23,
   3710 			0x80, 0x03, 0x70, 0x0f
   3711 		}
   3712 	};
   3713 
   3714 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3715 
   3716 	ATF_CHECK(bpf_validate(insns, insn_count));
   3717 
   3718 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3719 	ATF_REQUIRE(code != NULL);
   3720 
   3721 	for (i = 0; i < 2; i++) {
   3722 		for (j = 1; j < sizeof(pkt[i]); j++)
   3723 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3724 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3725 	}
   3726 
   3727 	bpfjit_free_code(code);
   3728 }
   3729 
   3730 ATF_TC(libbpfjit_opt_ld_ind_1);
   3731 ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
   3732 {
   3733 	atf_tc_set_md_var(tc, "descr",
   3734 	    "Test JIT compilation with length optimization "
   3735 	    "applied to BPF_LD+BPF_IND");
   3736 }
   3737 
   3738 ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
   3739 {
   3740 	static struct bpf_insn insns[] = {
   3741 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
   3742 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   3743 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3744 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
   3745 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3746 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3747 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3748 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3749 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3750 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3751 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3752 		BPF_STMT(BPF_RET+BPF_K, 0),
   3753 	};
   3754 
   3755 	size_t i, j;
   3756 	bpfjit_func_t code;
   3757 	uint8_t pkt[2][34] = {
   3758 		{
   3759 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3760 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3761 			0x80, 0x03, 0x70, 0x0f,
   3762 			0x80, 0x03, 0x70, 0x23
   3763 		},
   3764 		{
   3765 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3766 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3767 			0x80, 0x03, 0x70, 0x23,
   3768 			0x80, 0x03, 0x70, 0x0f
   3769 		}
   3770 	};
   3771 
   3772 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3773 
   3774 	ATF_CHECK(bpf_validate(insns, insn_count));
   3775 
   3776 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3777 	ATF_REQUIRE(code != NULL);
   3778 
   3779 	for (i = 0; i < 2; i++) {
   3780 		for (j = 1; j < sizeof(pkt[i]); j++)
   3781 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3782 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3783 	}
   3784 
   3785 	bpfjit_free_code(code);
   3786 }
   3787 
   3788 ATF_TC(libbpfjit_opt_ld_ind_2);
   3789 ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
   3790 {
   3791 	atf_tc_set_md_var(tc, "descr",
   3792 	    "Test JIT compilation with length optimization "
   3793 	    "applied to BPF_LD+BPF_IND");
   3794 }
   3795 
   3796 ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
   3797 {
   3798 	static struct bpf_insn insns[] = {
   3799 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3800 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
   3801 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3802 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3803 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3804 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3805 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3806 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3807 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3808 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3809 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3810 		BPF_STMT(BPF_RET+BPF_K, 0),
   3811 	};
   3812 
   3813 	size_t i, j;
   3814 	bpfjit_func_t code;
   3815 	uint8_t pkt[2][34] = {
   3816 		{
   3817 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3818 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3819 			0x80, 0x03, 0x70, 0x0f,
   3820 			0x80, 0x03, 0x70, 0x23
   3821 		},
   3822 		{
   3823 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3824 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3825 			0x80, 0x03, 0x70, 0x23,
   3826 			0x80, 0x03, 0x70, 0x0f
   3827 		}
   3828 	};
   3829 
   3830 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3831 
   3832 	ATF_CHECK(bpf_validate(insns, insn_count));
   3833 
   3834 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3835 	ATF_REQUIRE(code != NULL);
   3836 
   3837 	for (i = 0; i < 2; i++) {
   3838 		for (j = 1; j < sizeof(pkt[i]); j++)
   3839 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3840 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3841 	}
   3842 
   3843 	bpfjit_free_code(code);
   3844 }
   3845 
   3846 ATF_TC(libbpfjit_opt_ld_ind_3);
   3847 ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
   3848 {
   3849 	atf_tc_set_md_var(tc, "descr",
   3850 	    "Test JIT compilation with length optimization "
   3851 	    "applied to BPF_LD+BPF_IND");
   3852 }
   3853 
   3854 ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
   3855 {
   3856 	static struct bpf_insn insns[] = {
   3857 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
   3858 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3859 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3860 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3861 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3862 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3863 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3864 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3865 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3866 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3867 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3868 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3869 		BPF_STMT(BPF_RET+BPF_K, 0),
   3870 	};
   3871 
   3872 	size_t i, j;
   3873 	bpfjit_func_t code;
   3874 	uint8_t pkt[2][34] = {
   3875 		{
   3876 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3877 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3878 			0x80, 0x03, 0x70, 0x0f,
   3879 			0x80, 0x03, 0x70, 0x23
   3880 		},
   3881 		{
   3882 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3883 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3884 			0x80, 0x03, 0x70, 0x23,
   3885 			0x80, 0x03, 0x70, 0x0f
   3886 		}
   3887 	};
   3888 
   3889 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3890 
   3891 	ATF_CHECK(bpf_validate(insns, insn_count));
   3892 
   3893 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3894 	ATF_REQUIRE(code != NULL);
   3895 
   3896 	for (i = 0; i < 2; i++) {
   3897 		for (j = 1; j < sizeof(pkt[i]); j++)
   3898 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3899 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3900 	}
   3901 
   3902 	bpfjit_free_code(code);
   3903 }
   3904 
   3905 ATF_TC(libbpfjit_opt_ld_ind_4);
   3906 ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
   3907 {
   3908 	atf_tc_set_md_var(tc, "descr",
   3909 	    "Test JIT compilation with length optimization "
   3910 	    "applied to BPF_LD+BPF_IND");
   3911 }
   3912 
   3913 ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
   3914 {
   3915 	static struct bpf_insn insns[] = {
   3916 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
   3917 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
   3918 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3919 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3920 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3921 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3922 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3923 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3924 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3925 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3926 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3927 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3928 		BPF_STMT(BPF_RET+BPF_K, 0),
   3929 	};
   3930 
   3931 	size_t i, j;
   3932 	bpfjit_func_t code;
   3933 	uint8_t pkt[2][34] = {
   3934 		{
   3935 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3936 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3937 			0x80, 0x03, 0x70, 0x0f,
   3938 			0x80, 0x03, 0x70, 0x23
   3939 		},
   3940 		{
   3941 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3942 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3943 			0x80, 0x03, 0x70, 0x23,
   3944 			0x80, 0x03, 0x70, 0x0f
   3945 		}
   3946 	};
   3947 
   3948 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3949 
   3950 	ATF_CHECK(bpf_validate(insns, insn_count));
   3951 
   3952 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3953 	ATF_REQUIRE(code != NULL);
   3954 
   3955 	for (i = 0; i < 2; i++) {
   3956 		for (j = 1; j < sizeof(pkt[i]); j++)
   3957 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3958 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3959 	}
   3960 
   3961 	bpfjit_free_code(code);
   3962 }
   3963 
   3964 ATF_TC(libbpfjit_abc_ja);
   3965 ATF_TC_HEAD(libbpfjit_abc_ja, tc)
   3966 {
   3967 	atf_tc_set_md_var(tc, "descr",
   3968 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
   3969 }
   3970 
   3971 ATF_TC_BODY(libbpfjit_abc_ja, tc)
   3972 {
   3973 	static struct bpf_insn insns[] = {
   3974 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   3975 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   3976 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
   3977 		BPF_STMT(BPF_RET+BPF_K, 0),
   3978 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
   3979 		BPF_STMT(BPF_RET+BPF_A, 0),
   3980 		BPF_STMT(BPF_RET+BPF_K, 1),
   3981 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   3982 		BPF_STMT(BPF_RET+BPF_K, 2),
   3983 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   3984 		BPF_STMT(BPF_RET+BPF_K, 3),
   3985 	};
   3986 
   3987 	bpfjit_func_t code;
   3988 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
   3989 
   3990 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3991 
   3992 	ATF_CHECK(bpf_validate(insns, insn_count));
   3993 
   3994 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3995 	ATF_REQUIRE(code != NULL);
   3996 
   3997 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3998 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   3999 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4000 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4001 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4002 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
   4003 
   4004 	bpfjit_free_code(code);
   4005 }
   4006 
   4007 ATF_TC(libbpfjit_abc_ja_over);
   4008 ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
   4009 {
   4010 	atf_tc_set_md_var(tc, "descr",
   4011 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
   4012 }
   4013 
   4014 ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
   4015 {
   4016 	static struct bpf_insn insns[] = {
   4017 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   4018 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
   4019 		BPF_STMT(BPF_RET+BPF_K, 0),
   4020 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4021 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
   4022 		BPF_STMT(BPF_RET+BPF_K, 1),
   4023 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   4024 		BPF_STMT(BPF_RET+BPF_K, 2),
   4025 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   4026 		BPF_STMT(BPF_RET+BPF_K, 3),
   4027 	};
   4028 
   4029 	bpfjit_func_t code;
   4030 	uint8_t pkt[1]; /* the program doesn't read any data */
   4031 
   4032 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4033 
   4034 	ATF_CHECK(bpf_validate(insns, insn_count));
   4035 
   4036 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4037 	ATF_REQUIRE(code != NULL);
   4038 
   4039 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   4040 
   4041 	bpfjit_free_code(code);
   4042 }
   4043 
   4044 ATF_TC(libbpfjit_abc_ld_chain);
   4045 ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
   4046 {
   4047 	atf_tc_set_md_var(tc, "descr",
   4048 	    "Test ABC optimization of a chain of BPF_LD instructions "
   4049 	    "with exits leading to a single BPF_RET");
   4050 }
   4051 
   4052 ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
   4053 {
   4054 	static struct bpf_insn insns[] = {
   4055 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   4056 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
   4057 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
   4058 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
   4059 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
   4060 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
   4061 		BPF_STMT(BPF_RET+BPF_K, 123456789),
   4062 		BPF_STMT(BPF_RET+BPF_K, 987654321),
   4063 	};
   4064 
   4065 	bpfjit_func_t code;
   4066 	uint8_t pkt[10] = {};
   4067 
   4068 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4069 
   4070 	ATF_CHECK(bpf_validate(insns, insn_count));
   4071 
   4072 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4073 	ATF_REQUIRE(code != NULL);
   4074 
   4075 	/* Packet is too short. */
   4076 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4077 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4078 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4079 
   4080 	/* !(pkt[3] == 8) => return 123456789 */
   4081 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
   4082 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
   4083 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4084 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
   4085 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
   4086 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4087 
   4088 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
   4089 	pkt[3] = 8;
   4090 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4091 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4092 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4093 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4094 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4095 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4096 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4097 
   4098 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
   4099 	pkt[4] = pkt[5] = 1;
   4100 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4101 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4102 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4103 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4104 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4105 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4106 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4107 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4108 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4109 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
   4110 
   4111 	/* (pkt[6:4] > 6) => too short or return 123456789 */
   4112 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
   4113 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4114 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4115 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4116 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4117 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4118 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4119 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4120 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4121 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4122 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
   4123 
   4124 	bpfjit_free_code(code);
   4125 }
   4126 
   4127 ATF_TC(libbpfjit_examples_1);
   4128 ATF_TC_HEAD(libbpfjit_examples_1, tc)
   4129 {
   4130 	atf_tc_set_md_var(tc, "descr",
   4131 	    "Test the first example from bpf(4) - "
   4132 	    "accept Reverse ARP requests");
   4133 }
   4134 
   4135 ATF_TC_BODY(libbpfjit_examples_1, tc)
   4136 {
   4137 	/*
   4138 	 * The following filter is taken from the Reverse ARP
   4139 	 * Daemon. It accepts only Reverse ARP requests.
   4140 	 */
   4141 	struct bpf_insn insns[] = {
   4142 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4143 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
   4144 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4145 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
   4146 		BPF_STMT(BPF_RET+BPF_K, 42),
   4147 		BPF_STMT(BPF_RET+BPF_K, 0),
   4148 	};
   4149 
   4150 	bpfjit_func_t code;
   4151 	uint8_t pkt[22] = {};
   4152 
   4153 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4154 
   4155 	ATF_CHECK(bpf_validate(insns, insn_count));
   4156 
   4157 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4158 	ATF_REQUIRE(code != NULL);
   4159 
   4160 	/* Packet is too short. */
   4161 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4162 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4163 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4164 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4165 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4166 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4167 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4168 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4169 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4170 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4171 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4172 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4173 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4174 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4175 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4176 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4177 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4178 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4179 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4180 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4181 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4182 
   4183 	/* The packet doesn't match. */
   4184 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4185 
   4186 	/* Still no match after setting the protocol field. */
   4187 	pkt[12] = 0x80; pkt[13] = 0x35;
   4188 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4189 
   4190 	/* Set RARP message type. */
   4191 	pkt[21] = 3;
   4192 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
   4193 
   4194 	/* Packet is too short. */
   4195 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4196 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4197 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4198 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4199 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4200 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4201 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4202 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4203 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4204 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4205 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4206 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4207 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4208 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4209 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4210 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4211 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4212 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4213 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4214 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4215 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4216 
   4217 	/* Change RARP message type. */
   4218 	pkt[20] = 3;
   4219 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4220 
   4221 	bpfjit_free_code(code);
   4222 }
   4223 
   4224 ATF_TC(libbpfjit_examples_2);
   4225 ATF_TC_HEAD(libbpfjit_examples_2, tc)
   4226 {
   4227 	atf_tc_set_md_var(tc, "descr",
   4228 	    "Test the second example from bpf(4) - "
   4229 	    "accept IP packets between two specified hosts");
   4230 }
   4231 
   4232 ATF_TC_BODY(libbpfjit_examples_2, tc)
   4233 {
   4234 	/*
   4235 	 * This filter accepts only IP packets between host 128.3.112.15
   4236 	 * and 128.3.112.35.
   4237 	 */
   4238 	static struct bpf_insn insns[] = {
   4239 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4240 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
   4241 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   4242 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   4243 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4244 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   4245 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   4246 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4247 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   4248 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4249 		BPF_STMT(BPF_RET+BPF_K, 0),
   4250 	};
   4251 
   4252 	bpfjit_func_t code;
   4253 	uint8_t pkt[34] = {};
   4254 
   4255 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4256 
   4257 	ATF_CHECK(bpf_validate(insns, insn_count));
   4258 
   4259 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4260 	ATF_REQUIRE(code != NULL);
   4261 
   4262 	/* Packet is too short. */
   4263 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4264 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4265 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4266 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4267 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4268 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4269 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4270 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4271 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4272 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4273 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4274 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4275 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4276 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4277 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4278 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4279 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4280 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4281 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4282 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4283 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4284 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4285 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4286 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4287 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4288 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4289 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4290 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4291 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4292 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4293 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4294 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4295 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4296 
   4297 	/* The packet doesn't match. */
   4298 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4299 
   4300 	/* Still no match after setting the protocol field. */
   4301 	pkt[12] = 8;
   4302 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4303 
   4304 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
   4305 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4306 
   4307 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
   4308 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4309 
   4310 	/* Swap the ip addresses. */
   4311 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
   4312 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4313 
   4314 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
   4315 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4316 
   4317 	/* Packet is too short. */
   4318 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4319 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4320 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4321 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4322 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4323 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4324 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4325 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4326 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4327 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4328 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4329 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4330 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4331 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4332 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4333 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4334 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4335 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4336 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4337 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4338 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4339 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4340 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4341 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4342 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4343 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4344 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4345 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4346 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4347 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4348 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4349 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4350 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4351 
   4352 	/* Change the protocol field. */
   4353 	pkt[13] = 8;
   4354 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4355 
   4356 	bpfjit_free_code(code);
   4357 }
   4358 
   4359 ATF_TC(libbpfjit_examples_3);
   4360 ATF_TC_HEAD(libbpfjit_examples_3, tc)
   4361 {
   4362 	atf_tc_set_md_var(tc, "descr",
   4363 	    "Test the third example from bpf(4) - "
   4364 	    "accept TCP finger packets");
   4365 }
   4366 
   4367 ATF_TC_BODY(libbpfjit_examples_3, tc)
   4368 {
   4369 	/*
   4370 	 * This filter returns only TCP finger packets.
   4371 	 */
   4372 	struct bpf_insn insns[] = {
   4373 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4374 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
   4375 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
   4376 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
   4377 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4378 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
   4379 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
   4380 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
   4381 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
   4382 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
   4383 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
   4384 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4385 		BPF_STMT(BPF_RET+BPF_K, 0),
   4386 	};
   4387 
   4388 	bpfjit_func_t code;
   4389 	uint8_t pkt[30] = {};
   4390 
   4391 	/* Set IP fragment offset to non-zero. */
   4392 	pkt[20] = 1; pkt[21] = 1;
   4393 
   4394 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4395 
   4396 	ATF_CHECK(bpf_validate(insns, insn_count));
   4397 
   4398 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4399 	ATF_REQUIRE(code != NULL);
   4400 
   4401 	/* Packet is too short. */
   4402 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4403 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4404 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4405 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4406 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4407 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4408 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4409 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4410 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4411 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4412 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4413 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4414 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4415 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4416 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4417 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4418 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4419 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4420 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4421 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4422 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4423 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4424 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4425 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4426 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4427 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4428 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4429 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4430 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4431 
   4432 	/* The packet doesn't match. */
   4433 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4434 
   4435 	/* Still no match after setting the protocol field. */
   4436 	pkt[12] = 8;
   4437 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4438 
   4439 	/* Get one step closer to the match. */
   4440 	pkt[23] = 6;
   4441 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4442 
   4443 	/* Set IP fragment offset to zero. */
   4444 	pkt[20] = 0x20; pkt[21] = 0;
   4445 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4446 
   4447 	/* Set IP header length to 12. */
   4448 	pkt[14] = 0xd3;
   4449 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4450 
   4451 	/* Match one branch of the program. */
   4452 	pkt[27] = 79;
   4453 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4454 
   4455 	/* Match the other branch of the program. */
   4456 	pkt[29] = 79; pkt[27] = 0;
   4457 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4458 
   4459 	/* Packet is too short. */
   4460 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4461 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4462 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4463 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4464 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4465 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4466 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4467 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4468 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4469 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4470 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4471 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4472 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4473 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4474 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4475 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4476 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4477 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4478 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4479 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4480 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4481 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4482 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4483 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4484 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4485 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4486 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4487 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4488 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4489 
   4490 	/* Set IP header length to 16. Packet is too short. */
   4491 	pkt[14] = 4;
   4492 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4493 
   4494 	bpfjit_free_code(code);
   4495 }
   4496 
   4497 ATF_TC(libbpfjit_cop_no_ctx);
   4498 ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
   4499 {
   4500 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
   4501 	    "instruction can't be accepted without a context");
   4502 }
   4503 
   4504 ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
   4505 {
   4506 	static struct bpf_insn insns[] = {
   4507 		BPF_STMT(BPF_MISC+BPF_COP, 0),
   4508 		BPF_STMT(BPF_RET+BPF_K, 7)
   4509 	};
   4510 
   4511 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4512 
   4513 	ATF_CHECK(!bpf_validate(insns, insn_count));
   4514 
   4515 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
   4516 }
   4517 
   4518 ATF_TC(libbpfjit_copx_no_ctx);
   4519 ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
   4520 {
   4521 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
   4522 	    "instruction can't be accepted without a context");
   4523 }
   4524 
   4525 ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
   4526 {
   4527 	static struct bpf_insn insns[] = {
   4528 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
   4529 		BPF_STMT(BPF_RET+BPF_K, 7)
   4530 	};
   4531 
   4532 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4533 
   4534 	ATF_CHECK(!bpf_validate(insns, insn_count));
   4535 
   4536 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
   4537 }
   4538 
   4539 ATF_TP_ADD_TCS(tp)
   4540 {
   4541 
   4542 	/*
   4543 	 * For every new test please also add a similar test
   4544 	 * to ../../net/bpfjit/t_bpfjit.c
   4545 	 */
   4546 	ATF_TP_ADD_TC(tp, libbpfjit_empty);
   4547 	ATF_TP_ADD_TC(tp, libbpfjit_ret_k);
   4548 	ATF_TP_ADD_TC(tp, libbpfjit_bad_ret_k);
   4549 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
   4550 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
   4551 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
   4552 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
   4553 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
   4554 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
   4555 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
   4556 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
   4557 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
   4558 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
   4559 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
   4560 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
   4561 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
   4562 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
   4563 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
   4564 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
   4565 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
   4566 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
   4567 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
   4568 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
   4569 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
   4570 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
   4571 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
   4572 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
   4573 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
   4574 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
   4575 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
   4576 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
   4577 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
   4578 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
   4579 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
   4580 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
   4581 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
   4582 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
   4583 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
   4584 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
   4585 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
   4586 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
   4587 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
   4588 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
   4589 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
   4590 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
   4591 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
   4592 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
   4593 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
   4594 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
   4595 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
   4596 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
   4597 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
   4598 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
   4599 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
   4600 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
   4601 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
   4602 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
   4603 	ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
   4604 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
   4605 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_invalid);
   4606 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_overflow);
   4607 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
   4608 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
   4609 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
   4610 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
   4611 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
   4612 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
   4613 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
   4614 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
   4615 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
   4616 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
   4617 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
   4618 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
   4619 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
   4620 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
   4621 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
   4622 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
   4623 	ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
   4624 	ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
   4625 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
   4626 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
   4627 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
   4628 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
   4629 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
   4630 	ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
   4631 	ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
   4632 	ATF_TP_ADD_TC(tp, libbpfjit_st1);
   4633 	ATF_TP_ADD_TC(tp, libbpfjit_st2);
   4634 	ATF_TP_ADD_TC(tp, libbpfjit_st3);
   4635 	ATF_TP_ADD_TC(tp, libbpfjit_st4);
   4636 	ATF_TP_ADD_TC(tp, libbpfjit_st5);
   4637 	ATF_TP_ADD_TC(tp, libbpfjit_stx1);
   4638 	ATF_TP_ADD_TC(tp, libbpfjit_stx2);
   4639 	ATF_TP_ADD_TC(tp, libbpfjit_stx3);
   4640 	ATF_TP_ADD_TC(tp, libbpfjit_stx4);
   4641 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
   4642 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
   4643 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
   4644 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
   4645 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
   4646 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
   4647 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
   4648 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
   4649 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
   4650 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
   4651 	ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
   4652 	ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
   4653 	ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
   4654 	ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
   4655 	ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
   4656 
   4657 	return atf_no_error();
   4658 }
   4659