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