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