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