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