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