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