Home | History | Annotate | Line # | Download | only in bpfjit
t_bpfjit.c revision 1.7
      1  1.7  alnsn /*	$NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 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.7  alnsn __RCSID("$NetBSD: t_bpfjit.c,v 1.7 2015/02/14 16:48:30 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.7  alnsn ATF_TC(bpfjit_jmp_x_uninitialised);
   2266  1.7  alnsn ATF_TC_HEAD(bpfjit_jmp_x_uninitialised, tc)
   2267  1.7  alnsn {
   2268  1.7  alnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
   2269  1.7  alnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
   2270  1.7  alnsn }
   2271  1.7  alnsn 
   2272  1.7  alnsn ATF_TC_BODY(bpfjit_jmp_x_uninitialised, tc)
   2273  1.7  alnsn {
   2274  1.7  alnsn 	static struct bpf_insn insns[] = {
   2275  1.7  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 1),
   2276  1.7  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2277  1.7  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0)
   2278  1.7  alnsn 	};
   2279  1.7  alnsn 
   2280  1.7  alnsn 	bpfjit_func_t code;
   2281  1.7  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2282  1.7  alnsn 
   2283  1.7  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2284  1.7  alnsn 
   2285  1.7  alnsn 	RZ(rump_init());
   2286  1.7  alnsn 
   2287  1.7  alnsn 	/* X isn't initialised. */
   2288  1.7  alnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
   2289  1.7  alnsn 
   2290  1.7  alnsn 	rump_schedule();
   2291  1.7  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2292  1.7  alnsn 	rump_unschedule();
   2293  1.7  alnsn 	ATF_REQUIRE(code != NULL);
   2294  1.7  alnsn 
   2295  1.7  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   2296  1.7  alnsn 
   2297  1.7  alnsn 	rump_schedule();
   2298  1.7  alnsn 	rumpns_bpfjit_free_code(code);
   2299  1.7  alnsn 	rump_unschedule();
   2300  1.7  alnsn }
   2301  1.7  alnsn 
   2302  1.2  alnsn ATF_TC(bpfjit_jmp_modulo_x);
   2303  1.2  alnsn ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
   2304  1.2  alnsn {
   2305  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2306  1.2  alnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
   2307  1.2  alnsn }
   2308  1.2  alnsn 
   2309  1.2  alnsn ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
   2310  1.2  alnsn {
   2311  1.2  alnsn 	static struct bpf_insn insns[] = {
   2312  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
   2313  1.2  alnsn 		/* FFFFF770 << 4 = FFFFF770 */
   2314  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
   2315  1.2  alnsn 
   2316  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2317  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2318  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2319  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2320  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2321  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2322  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2323  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2324  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2325  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2326  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2327  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2328  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2329  1.2  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
   2330  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2331  1.2  alnsn 
   2332  1.2  alnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
   2333  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
   2334  1.2  alnsn 
   2335  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2336  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2337  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2338  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2339  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2340  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2341  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2342  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2343  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2344  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2345  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2346  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2347  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2348  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   2349  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   2350  1.2  alnsn 	};
   2351  1.2  alnsn 
   2352  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2353  1.2  alnsn 
   2354  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2355  1.2  alnsn 
   2356  1.2  alnsn 	RZ(rump_init());
   2357  1.2  alnsn 
   2358  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2359  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
   2360  1.2  alnsn }
   2361  1.2  alnsn 
   2362  1.2  alnsn ATF_TC(bpfjit_ld_abs);
   2363  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_abs, tc)
   2364  1.2  alnsn {
   2365  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2366  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS");
   2367  1.2  alnsn }
   2368  1.2  alnsn 
   2369  1.2  alnsn ATF_TC_BODY(bpfjit_ld_abs, tc)
   2370  1.2  alnsn {
   2371  1.2  alnsn 	static struct bpf_insn insns[3][2] = {
   2372  1.2  alnsn 		{
   2373  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   2374  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2375  1.2  alnsn 		},
   2376  1.2  alnsn 		{
   2377  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
   2378  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2379  1.2  alnsn 		},
   2380  1.2  alnsn 		{
   2381  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
   2382  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2383  1.2  alnsn 		}
   2384  1.2  alnsn 	};
   2385  1.2  alnsn 
   2386  1.2  alnsn 	static size_t lengths[3] = { 1, 2, 4 };
   2387  1.2  alnsn 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
   2388  1.2  alnsn 
   2389  1.2  alnsn 	size_t i, l;
   2390  1.2  alnsn 	uint8_t *pkt = deadbeef_at_5;
   2391  1.2  alnsn 	size_t pktsize = sizeof(deadbeef_at_5);
   2392  1.2  alnsn 
   2393  1.2  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2394  1.2  alnsn 
   2395  1.2  alnsn 	RZ(rump_init());
   2396  1.2  alnsn 
   2397  1.2  alnsn 	for (i = 0; i < 3; i++) {
   2398  1.2  alnsn 		bpfjit_func_t code;
   2399  1.2  alnsn 
   2400  1.2  alnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
   2401  1.2  alnsn 
   2402  1.2  alnsn 		rump_schedule();
   2403  1.2  alnsn 		code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
   2404  1.2  alnsn 		rump_unschedule();
   2405  1.2  alnsn 		ATF_REQUIRE(code != NULL);
   2406  1.2  alnsn 
   2407  1.2  alnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
   2408  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2409  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2410  1.2  alnsn 		}
   2411  1.2  alnsn 
   2412  1.2  alnsn 		l = 5 + lengths[i];
   2413  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2414  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2415  1.2  alnsn 
   2416  1.2  alnsn 		l = pktsize;
   2417  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2418  1.2  alnsn 
   2419  1.2  alnsn 		rump_schedule();
   2420  1.2  alnsn 		rumpns_bpfjit_free_code(code);
   2421  1.2  alnsn 		rump_unschedule();
   2422  1.2  alnsn 	}
   2423  1.2  alnsn }
   2424  1.2  alnsn 
   2425  1.2  alnsn ATF_TC(bpfjit_ld_abs_k_overflow);
   2426  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
   2427  1.2  alnsn {
   2428  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2429  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
   2430  1.2  alnsn }
   2431  1.2  alnsn 
   2432  1.2  alnsn ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
   2433  1.2  alnsn {
   2434  1.2  alnsn 	static struct bpf_insn insns[12][3] = {
   2435  1.2  alnsn 		{
   2436  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   2437  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2438  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2439  1.2  alnsn 		},
   2440  1.2  alnsn 		{
   2441  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   2442  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2443  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2444  1.2  alnsn 		},
   2445  1.2  alnsn 		{
   2446  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   2447  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2448  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2449  1.2  alnsn 		},
   2450  1.2  alnsn 		{
   2451  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   2452  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2453  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2454  1.2  alnsn 		},
   2455  1.2  alnsn 		{
   2456  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   2457  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2458  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2459  1.2  alnsn 		},
   2460  1.2  alnsn 		{
   2461  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
   2462  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2463  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2464  1.2  alnsn 		},
   2465  1.2  alnsn 		{
   2466  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2467  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   2468  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2469  1.2  alnsn 		},
   2470  1.2  alnsn 		{
   2471  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2472  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   2473  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2474  1.2  alnsn 		},
   2475  1.2  alnsn 		{
   2476  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2477  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   2478  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2479  1.2  alnsn 		},
   2480  1.2  alnsn 		{
   2481  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2482  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   2483  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2484  1.2  alnsn 		},
   2485  1.2  alnsn 		{
   2486  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2487  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   2488  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2489  1.2  alnsn 		},
   2490  1.2  alnsn 		{
   2491  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2492  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
   2493  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2494  1.2  alnsn 		}
   2495  1.2  alnsn 	};
   2496  1.2  alnsn 
   2497  1.2  alnsn 	int i;
   2498  1.2  alnsn 	uint8_t pkt[8] = { 0 };
   2499  1.2  alnsn 
   2500  1.2  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2501  1.2  alnsn 
   2502  1.2  alnsn 	RZ(rump_init());
   2503  1.2  alnsn 
   2504  1.2  alnsn 	for (i = 0; i < 3; i++) {
   2505  1.2  alnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
   2506  1.2  alnsn 		ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
   2507  1.2  alnsn 	}
   2508  1.2  alnsn }
   2509  1.2  alnsn 
   2510  1.2  alnsn ATF_TC(bpfjit_ld_ind);
   2511  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_ind, tc)
   2512  1.2  alnsn {
   2513  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2514  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND");
   2515  1.2  alnsn }
   2516  1.2  alnsn 
   2517  1.2  alnsn ATF_TC_BODY(bpfjit_ld_ind, tc)
   2518  1.2  alnsn {
   2519  1.2  alnsn 	static struct bpf_insn insns[6][3] = {
   2520  1.2  alnsn 		{
   2521  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2522  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   2523  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2524  1.2  alnsn 		},
   2525  1.2  alnsn 		{
   2526  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2527  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
   2528  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2529  1.2  alnsn 		},
   2530  1.2  alnsn 		{
   2531  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2532  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
   2533  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2534  1.2  alnsn 		},
   2535  1.2  alnsn 		{
   2536  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2537  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2538  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2539  1.2  alnsn 		},
   2540  1.2  alnsn 		{
   2541  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2542  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   2543  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2544  1.2  alnsn 		},
   2545  1.2  alnsn 		{
   2546  1.2  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2547  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
   2548  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2549  1.2  alnsn 		}
   2550  1.2  alnsn 	};
   2551  1.2  alnsn 
   2552  1.2  alnsn 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
   2553  1.2  alnsn 
   2554  1.2  alnsn 	static unsigned int expected[6] = {
   2555  1.2  alnsn 		0xde, 0xdead, 0xdeadbeef,
   2556  1.2  alnsn 		0xde, 0xdead, 0xdeadbeef
   2557  1.2  alnsn 	};
   2558  1.2  alnsn 
   2559  1.2  alnsn 	size_t i, l;
   2560  1.2  alnsn 	uint8_t *pkt = deadbeef_at_5;
   2561  1.2  alnsn 	size_t pktsize = sizeof(deadbeef_at_5);
   2562  1.2  alnsn 
   2563  1.2  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2564  1.2  alnsn 
   2565  1.2  alnsn 	RZ(rump_init());
   2566  1.2  alnsn 
   2567  1.2  alnsn 	for (i = 0; i < 3; i++) {
   2568  1.2  alnsn 		bpfjit_func_t code;
   2569  1.2  alnsn 
   2570  1.2  alnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
   2571  1.2  alnsn 
   2572  1.2  alnsn 		rump_schedule();
   2573  1.2  alnsn 		code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
   2574  1.2  alnsn 		rump_unschedule();
   2575  1.2  alnsn 		ATF_REQUIRE(code != NULL);
   2576  1.2  alnsn 
   2577  1.2  alnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
   2578  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2579  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2580  1.2  alnsn 		}
   2581  1.2  alnsn 
   2582  1.2  alnsn 		l = 5 + lengths[i];
   2583  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2584  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2585  1.2  alnsn 
   2586  1.2  alnsn 		l = pktsize;
   2587  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2588  1.2  alnsn 
   2589  1.2  alnsn 		rump_schedule();
   2590  1.2  alnsn 		rumpns_bpfjit_free_code(code);
   2591  1.2  alnsn 		rump_unschedule();
   2592  1.2  alnsn 	}
   2593  1.2  alnsn }
   2594  1.2  alnsn 
   2595  1.2  alnsn ATF_TC(bpfjit_ld_ind_k_overflow);
   2596  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
   2597  1.2  alnsn {
   2598  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2599  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
   2600  1.2  alnsn }
   2601  1.2  alnsn 
   2602  1.2  alnsn ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
   2603  1.2  alnsn {
   2604  1.2  alnsn 	static struct bpf_insn insns[12][3] = {
   2605  1.2  alnsn 		{
   2606  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   2607  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2608  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2609  1.2  alnsn 		},
   2610  1.2  alnsn 		{
   2611  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   2612  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2613  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2614  1.2  alnsn 		},
   2615  1.2  alnsn 		{
   2616  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   2617  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2618  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2619  1.2  alnsn 		},
   2620  1.2  alnsn 		{
   2621  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   2622  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2623  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2624  1.2  alnsn 		},
   2625  1.2  alnsn 		{
   2626  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   2627  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2628  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2629  1.2  alnsn 		},
   2630  1.2  alnsn 		{
   2631  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
   2632  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2633  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2634  1.2  alnsn 		},
   2635  1.2  alnsn 		{
   2636  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2637  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   2638  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2639  1.2  alnsn 		},
   2640  1.2  alnsn 		{
   2641  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2642  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   2643  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2644  1.2  alnsn 		},
   2645  1.2  alnsn 		{
   2646  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2647  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   2648  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2649  1.2  alnsn 		},
   2650  1.2  alnsn 		{
   2651  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2652  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   2653  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2654  1.2  alnsn 		},
   2655  1.2  alnsn 		{
   2656  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2657  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   2658  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2659  1.2  alnsn 		},
   2660  1.2  alnsn 		{
   2661  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2662  1.2  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
   2663  1.2  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2664  1.2  alnsn 		}
   2665  1.2  alnsn 	};
   2666  1.2  alnsn 
   2667  1.2  alnsn 	int i;
   2668  1.2  alnsn 	uint8_t pkt[8] = { 0 };
   2669  1.2  alnsn 
   2670  1.2  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2671  1.2  alnsn 
   2672  1.2  alnsn 	RZ(rump_init());
   2673  1.2  alnsn 
   2674  1.2  alnsn 	for (i = 0; i < 3; i++) {
   2675  1.2  alnsn 
   2676  1.2  alnsn 		ATF_CHECK(prog_validate(insns[i], insn_count));
   2677  1.2  alnsn 		ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
   2678  1.2  alnsn 	}
   2679  1.2  alnsn }
   2680  1.2  alnsn 
   2681  1.2  alnsn ATF_TC(bpfjit_ld_ind_x_overflow1);
   2682  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
   2683  1.2  alnsn {
   2684  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2685  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2686  1.2  alnsn }
   2687  1.2  alnsn 
   2688  1.2  alnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
   2689  1.2  alnsn {
   2690  1.2  alnsn 	static struct bpf_insn insns[] = {
   2691  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2692  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2693  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   2694  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2695  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2696  1.2  alnsn 	};
   2697  1.2  alnsn 
   2698  1.2  alnsn 	size_t i;
   2699  1.2  alnsn 	bpfjit_func_t code;
   2700  1.2  alnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2701  1.2  alnsn 
   2702  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2703  1.2  alnsn 
   2704  1.2  alnsn 	RZ(rump_init());
   2705  1.2  alnsn 
   2706  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2707  1.2  alnsn 
   2708  1.2  alnsn 	rump_schedule();
   2709  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2710  1.2  alnsn 	rump_unschedule();
   2711  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   2712  1.2  alnsn 
   2713  1.2  alnsn 	for (i = 1; i <= sizeof(pkt); i++) {
   2714  1.2  alnsn 		//ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2715  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2716  1.2  alnsn 	}
   2717  1.2  alnsn 
   2718  1.2  alnsn 	rump_schedule();
   2719  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   2720  1.2  alnsn 	rump_unschedule();
   2721  1.2  alnsn }
   2722  1.2  alnsn 
   2723  1.2  alnsn ATF_TC(bpfjit_ld_ind_x_overflow2);
   2724  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
   2725  1.2  alnsn {
   2726  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2727  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2728  1.2  alnsn }
   2729  1.2  alnsn 
   2730  1.2  alnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
   2731  1.2  alnsn {
   2732  1.2  alnsn 	static struct bpf_insn insns[] = {
   2733  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2734  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2735  1.2  alnsn 		BPF_STMT(BPF_ST, 3),
   2736  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   2737  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2738  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2739  1.2  alnsn 	};
   2740  1.2  alnsn 
   2741  1.2  alnsn 	size_t i;
   2742  1.2  alnsn 	bpfjit_func_t code;
   2743  1.2  alnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2744  1.2  alnsn 
   2745  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2746  1.2  alnsn 
   2747  1.2  alnsn 	RZ(rump_init());
   2748  1.2  alnsn 
   2749  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2750  1.2  alnsn 
   2751  1.2  alnsn 	rump_schedule();
   2752  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2753  1.2  alnsn 	rump_unschedule();
   2754  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   2755  1.2  alnsn 
   2756  1.2  alnsn 	for (i = 1; i <= sizeof(pkt); i++) {
   2757  1.2  alnsn 		//ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2758  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2759  1.2  alnsn 	}
   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_len);
   2767  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_len, 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_W+BPF_LEN");
   2771  1.2  alnsn }
   2772  1.2  alnsn 
   2773  1.2  alnsn ATF_TC_BODY(bpfjit_ld_len, tc)
   2774  1.2  alnsn {
   2775  1.2  alnsn 	static struct bpf_insn insns[] = {
   2776  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2777  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2778  1.2  alnsn 	};
   2779  1.2  alnsn 
   2780  1.2  alnsn 	size_t i;
   2781  1.2  alnsn 	bpfjit_func_t code;
   2782  1.2  alnsn 	uint8_t pkt[32]; /* the program doesn't read any data */
   2783  1.2  alnsn 
   2784  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2785  1.2  alnsn 
   2786  1.2  alnsn 	RZ(rump_init());
   2787  1.2  alnsn 
   2788  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2789  1.2  alnsn 
   2790  1.2  alnsn 	rump_schedule();
   2791  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2792  1.2  alnsn 	rump_unschedule();
   2793  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   2794  1.2  alnsn 
   2795  1.2  alnsn 	for (i = 0; i < sizeof(pkt); i++)
   2796  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   2797  1.2  alnsn 
   2798  1.2  alnsn 	rump_schedule();
   2799  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   2800  1.2  alnsn 	rump_unschedule();
   2801  1.2  alnsn }
   2802  1.2  alnsn 
   2803  1.2  alnsn ATF_TC(bpfjit_ld_imm);
   2804  1.2  alnsn ATF_TC_HEAD(bpfjit_ld_imm, tc)
   2805  1.2  alnsn {
   2806  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2807  1.2  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IMM");
   2808  1.2  alnsn }
   2809  1.2  alnsn 
   2810  1.2  alnsn ATF_TC_BODY(bpfjit_ld_imm, tc)
   2811  1.2  alnsn {
   2812  1.2  alnsn 	static struct bpf_insn insns[] = {
   2813  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
   2814  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2815  1.2  alnsn 	};
   2816  1.2  alnsn 
   2817  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2818  1.2  alnsn 
   2819  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2820  1.2  alnsn 
   2821  1.2  alnsn 	RZ(rump_init());
   2822  1.2  alnsn 
   2823  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2824  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
   2825  1.2  alnsn }
   2826  1.2  alnsn 
   2827  1.2  alnsn ATF_TC(bpfjit_ldx_imm1);
   2828  1.2  alnsn ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
   2829  1.2  alnsn {
   2830  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2831  1.2  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   2832  1.2  alnsn }
   2833  1.2  alnsn 
   2834  1.2  alnsn ATF_TC_BODY(bpfjit_ldx_imm1, tc)
   2835  1.2  alnsn {
   2836  1.2  alnsn 	static struct bpf_insn insns[] = {
   2837  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
   2838  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   2839  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2840  1.2  alnsn 	};
   2841  1.2  alnsn 
   2842  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2843  1.2  alnsn 
   2844  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2845  1.2  alnsn 
   2846  1.2  alnsn 	RZ(rump_init());
   2847  1.2  alnsn 
   2848  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2849  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX - 5);
   2850  1.2  alnsn }
   2851  1.2  alnsn 
   2852  1.2  alnsn ATF_TC(bpfjit_ldx_imm2);
   2853  1.2  alnsn ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
   2854  1.2  alnsn {
   2855  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2856  1.2  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   2857  1.2  alnsn }
   2858  1.2  alnsn 
   2859  1.2  alnsn ATF_TC_BODY(bpfjit_ldx_imm2, tc)
   2860  1.2  alnsn {
   2861  1.2  alnsn 	static struct bpf_insn insns[] = {
   2862  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2863  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   2864  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2865  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2866  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   2867  1.2  alnsn 	};
   2868  1.2  alnsn 
   2869  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2870  1.2  alnsn 
   2871  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2872  1.2  alnsn 
   2873  1.2  alnsn 	RZ(rump_init());
   2874  1.2  alnsn 
   2875  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2876  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
   2877  1.2  alnsn }
   2878  1.2  alnsn 
   2879  1.2  alnsn ATF_TC(bpfjit_ldx_len1);
   2880  1.2  alnsn ATF_TC_HEAD(bpfjit_ldx_len1, tc)
   2881  1.2  alnsn {
   2882  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2883  1.2  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   2884  1.2  alnsn }
   2885  1.2  alnsn 
   2886  1.2  alnsn ATF_TC_BODY(bpfjit_ldx_len1, tc)
   2887  1.2  alnsn {
   2888  1.2  alnsn 	static struct bpf_insn insns[] = {
   2889  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   2890  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   2891  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2892  1.2  alnsn 	};
   2893  1.2  alnsn 
   2894  1.2  alnsn 	size_t i;
   2895  1.2  alnsn 	bpfjit_func_t code;
   2896  1.2  alnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
   2897  1.2  alnsn 
   2898  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2899  1.2  alnsn 
   2900  1.2  alnsn 	RZ(rump_init());
   2901  1.2  alnsn 
   2902  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2903  1.2  alnsn 
   2904  1.2  alnsn 	rump_schedule();
   2905  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2906  1.2  alnsn 	rump_unschedule();
   2907  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   2908  1.2  alnsn 
   2909  1.2  alnsn 	for (i = 1; i < sizeof(pkt); i++) {
   2910  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   2911  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
   2912  1.2  alnsn 	}
   2913  1.2  alnsn 
   2914  1.2  alnsn 	rump_schedule();
   2915  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   2916  1.2  alnsn 	rump_unschedule();
   2917  1.2  alnsn }
   2918  1.2  alnsn 
   2919  1.2  alnsn ATF_TC(bpfjit_ldx_len2);
   2920  1.2  alnsn ATF_TC_HEAD(bpfjit_ldx_len2, tc)
   2921  1.2  alnsn {
   2922  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2923  1.2  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   2924  1.2  alnsn }
   2925  1.2  alnsn 
   2926  1.2  alnsn ATF_TC_BODY(bpfjit_ldx_len2, tc)
   2927  1.2  alnsn {
   2928  1.2  alnsn 	static struct bpf_insn insns[] = {
   2929  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   2930  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   2931  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2932  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2933  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   2934  1.2  alnsn 	};
   2935  1.2  alnsn 
   2936  1.2  alnsn 	bpfjit_func_t code;
   2937  1.2  alnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
   2938  1.2  alnsn 
   2939  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2940  1.2  alnsn 
   2941  1.2  alnsn 	RZ(rump_init());
   2942  1.2  alnsn 
   2943  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2944  1.2  alnsn 
   2945  1.2  alnsn 	rump_schedule();
   2946  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   2947  1.2  alnsn 	rump_unschedule();
   2948  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   2949  1.2  alnsn 
   2950  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
   2951  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
   2952  1.2  alnsn 
   2953  1.2  alnsn 	rump_schedule();
   2954  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   2955  1.2  alnsn 	rump_unschedule();
   2956  1.2  alnsn }
   2957  1.2  alnsn 
   2958  1.2  alnsn ATF_TC(bpfjit_ldx_msh);
   2959  1.2  alnsn ATF_TC_HEAD(bpfjit_ldx_msh, tc)
   2960  1.2  alnsn {
   2961  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2962  1.2  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
   2963  1.2  alnsn }
   2964  1.2  alnsn 
   2965  1.2  alnsn ATF_TC_BODY(bpfjit_ldx_msh, tc)
   2966  1.2  alnsn {
   2967  1.2  alnsn 	static struct bpf_insn insns[] = {
   2968  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
   2969  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   2970  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2971  1.2  alnsn 	};
   2972  1.2  alnsn 
   2973  1.2  alnsn 	uint8_t pkt[2] = { 0, 0x7a };
   2974  1.2  alnsn 
   2975  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2976  1.2  alnsn 
   2977  1.2  alnsn 	RZ(rump_init());
   2978  1.2  alnsn 
   2979  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   2980  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 2) == 40);
   2981  1.2  alnsn }
   2982  1.2  alnsn 
   2983  1.2  alnsn ATF_TC(bpfjit_misc_tax);
   2984  1.2  alnsn ATF_TC_HEAD(bpfjit_misc_tax, tc)
   2985  1.2  alnsn {
   2986  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   2987  1.2  alnsn 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
   2988  1.2  alnsn }
   2989  1.2  alnsn 
   2990  1.2  alnsn ATF_TC_BODY(bpfjit_misc_tax, tc)
   2991  1.2  alnsn {
   2992  1.2  alnsn 	static struct bpf_insn insns[] = {
   2993  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
   2994  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   2995  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   2996  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2997  1.2  alnsn 	};
   2998  1.2  alnsn 
   2999  1.2  alnsn 	uint8_t pkt[6] = { 0, 11, 22, 33, 44, 55 };
   3000  1.2  alnsn 
   3001  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3002  1.2  alnsn 
   3003  1.2  alnsn 	RZ(rump_init());
   3004  1.2  alnsn 
   3005  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3006  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 6) == 55);
   3007  1.2  alnsn }
   3008  1.2  alnsn 
   3009  1.2  alnsn ATF_TC(bpfjit_misc_txa);
   3010  1.2  alnsn ATF_TC_HEAD(bpfjit_misc_txa, tc)
   3011  1.2  alnsn {
   3012  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3013  1.2  alnsn 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
   3014  1.2  alnsn }
   3015  1.2  alnsn 
   3016  1.2  alnsn ATF_TC_BODY(bpfjit_misc_txa, tc)
   3017  1.2  alnsn {
   3018  1.2  alnsn 	static struct bpf_insn insns[] = {
   3019  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
   3020  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3021  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3022  1.2  alnsn 	};
   3023  1.2  alnsn 
   3024  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3025  1.2  alnsn 
   3026  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3027  1.2  alnsn 
   3028  1.2  alnsn 	RZ(rump_init());
   3029  1.2  alnsn 
   3030  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3031  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 391);
   3032  1.2  alnsn }
   3033  1.2  alnsn 
   3034  1.2  alnsn ATF_TC(bpfjit_st1);
   3035  1.2  alnsn ATF_TC_HEAD(bpfjit_st1, tc)
   3036  1.2  alnsn {
   3037  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3038  1.2  alnsn 	    "Test JIT compilation of BPF_ST");
   3039  1.2  alnsn }
   3040  1.2  alnsn 
   3041  1.2  alnsn ATF_TC_BODY(bpfjit_st1, tc)
   3042  1.2  alnsn {
   3043  1.2  alnsn 	static struct bpf_insn insns[] = {
   3044  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3045  1.2  alnsn 		BPF_STMT(BPF_ST, 0),
   3046  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
   3047  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3048  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3049  1.2  alnsn 	};
   3050  1.2  alnsn 
   3051  1.2  alnsn 	size_t i;
   3052  1.2  alnsn 	bpfjit_func_t code;
   3053  1.2  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3054  1.2  alnsn 
   3055  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3056  1.2  alnsn 
   3057  1.2  alnsn 	RZ(rump_init());
   3058  1.2  alnsn 
   3059  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3060  1.2  alnsn 
   3061  1.2  alnsn 	rump_schedule();
   3062  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3063  1.2  alnsn 	rump_unschedule();
   3064  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3065  1.2  alnsn 
   3066  1.2  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3067  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3068  1.2  alnsn 
   3069  1.2  alnsn 	rump_schedule();
   3070  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3071  1.2  alnsn 	rump_unschedule();
   3072  1.2  alnsn }
   3073  1.2  alnsn 
   3074  1.2  alnsn ATF_TC(bpfjit_st2);
   3075  1.2  alnsn ATF_TC_HEAD(bpfjit_st2, tc)
   3076  1.2  alnsn {
   3077  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3078  1.2  alnsn 	    "Test JIT compilation of BPF_ST");
   3079  1.2  alnsn }
   3080  1.2  alnsn 
   3081  1.2  alnsn ATF_TC_BODY(bpfjit_st2, tc)
   3082  1.2  alnsn {
   3083  1.2  alnsn 	static struct bpf_insn insns[] = {
   3084  1.2  alnsn 		BPF_STMT(BPF_ST, 0),
   3085  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3086  1.2  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3087  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3088  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3089  1.2  alnsn 	};
   3090  1.2  alnsn 
   3091  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3092  1.2  alnsn 
   3093  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3094  1.2  alnsn 
   3095  1.2  alnsn 	RZ(rump_init());
   3096  1.2  alnsn 
   3097  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3098  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
   3099  1.2  alnsn }
   3100  1.2  alnsn 
   3101  1.2  alnsn ATF_TC(bpfjit_st3);
   3102  1.2  alnsn ATF_TC_HEAD(bpfjit_st3, tc)
   3103  1.2  alnsn {
   3104  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3105  1.2  alnsn 	    "Test JIT compilation of BPF_ST");
   3106  1.2  alnsn }
   3107  1.2  alnsn 
   3108  1.2  alnsn ATF_TC_BODY(bpfjit_st3, tc)
   3109  1.2  alnsn {
   3110  1.2  alnsn 	static struct bpf_insn insns[] = {
   3111  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3112  1.2  alnsn 		BPF_STMT(BPF_ST, 0),
   3113  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3114  1.2  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3115  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3116  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3117  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3118  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3119  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3120  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3121  1.2  alnsn 	};
   3122  1.2  alnsn 
   3123  1.2  alnsn 	bpfjit_func_t code;
   3124  1.2  alnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
   3125  1.2  alnsn 
   3126  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3127  1.2  alnsn 
   3128  1.2  alnsn 	ATF_REQUIRE(BPF_MEMWORDS > 1);
   3129  1.2  alnsn 
   3130  1.2  alnsn 	RZ(rump_init());
   3131  1.2  alnsn 
   3132  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3133  1.2  alnsn 
   3134  1.2  alnsn 	rump_schedule();
   3135  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3136  1.2  alnsn 	rump_unschedule();
   3137  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3138  1.2  alnsn 
   3139  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3140  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3141  1.2  alnsn 
   3142  1.2  alnsn 	rump_schedule();
   3143  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3144  1.2  alnsn 	rump_unschedule();
   3145  1.2  alnsn }
   3146  1.2  alnsn 
   3147  1.2  alnsn ATF_TC(bpfjit_st4);
   3148  1.2  alnsn ATF_TC_HEAD(bpfjit_st4, tc)
   3149  1.2  alnsn {
   3150  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3151  1.2  alnsn 	    "Test JIT compilation of BPF_ST");
   3152  1.2  alnsn }
   3153  1.2  alnsn 
   3154  1.2  alnsn ATF_TC_BODY(bpfjit_st4, tc)
   3155  1.2  alnsn {
   3156  1.2  alnsn 	static struct bpf_insn insns[] = {
   3157  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3158  1.2  alnsn 		BPF_STMT(BPF_ST, 5),
   3159  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3160  1.2  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3161  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3162  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3163  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3164  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3165  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 5),
   3166  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3167  1.2  alnsn 	};
   3168  1.2  alnsn 
   3169  1.2  alnsn 	bpfjit_func_t code;
   3170  1.2  alnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
   3171  1.2  alnsn 
   3172  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3173  1.2  alnsn 
   3174  1.2  alnsn 	ATF_REQUIRE(BPF_MEMWORDS > 6);
   3175  1.2  alnsn 
   3176  1.2  alnsn 	RZ(rump_init());
   3177  1.2  alnsn 
   3178  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3179  1.2  alnsn 
   3180  1.2  alnsn 	rump_schedule();
   3181  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3182  1.2  alnsn 	rump_unschedule();
   3183  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3184  1.2  alnsn 
   3185  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3186  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3187  1.2  alnsn 
   3188  1.2  alnsn 	rump_schedule();
   3189  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3190  1.2  alnsn 	rump_unschedule();
   3191  1.2  alnsn }
   3192  1.2  alnsn 
   3193  1.2  alnsn ATF_TC(bpfjit_st5);
   3194  1.2  alnsn ATF_TC_HEAD(bpfjit_st5, tc)
   3195  1.2  alnsn {
   3196  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3197  1.2  alnsn 	    "Test JIT compilation of BPF_ST");
   3198  1.2  alnsn }
   3199  1.2  alnsn 
   3200  1.2  alnsn ATF_TC_BODY(bpfjit_st5, tc)
   3201  1.2  alnsn {
   3202  1.2  alnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3203  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3204  1.2  alnsn 
   3205  1.2  alnsn 	size_t k;
   3206  1.2  alnsn 	bpfjit_func_t code;
   3207  1.2  alnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3208  1.2  alnsn 
   3209  1.2  alnsn 	memset(insns, 0, sizeof(insns));
   3210  1.2  alnsn 
   3211  1.2  alnsn 	/* for each k do M[k] = k */
   3212  1.2  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3213  1.2  alnsn 		insns[2*k].code   = BPF_LD+BPF_IMM;
   3214  1.2  alnsn 		insns[2*k].k      = 3*k;
   3215  1.2  alnsn 		insns[2*k+1].code = BPF_ST;
   3216  1.2  alnsn 		insns[2*k+1].k    = k;
   3217  1.2  alnsn 	}
   3218  1.2  alnsn 
   3219  1.2  alnsn 	/* load wirelen into A */
   3220  1.2  alnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3221  1.2  alnsn 
   3222  1.2  alnsn 	/* for each k, if (A == k + 1) return M[k] */
   3223  1.2  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3224  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3225  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3226  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3227  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3228  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3229  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3230  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3231  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3232  1.2  alnsn 	}
   3233  1.2  alnsn 
   3234  1.2  alnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3235  1.2  alnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3236  1.2  alnsn 
   3237  1.2  alnsn 	RZ(rump_init());
   3238  1.2  alnsn 
   3239  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3240  1.2  alnsn 
   3241  1.2  alnsn 	rump_schedule();
   3242  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3243  1.2  alnsn 	rump_unschedule();
   3244  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3245  1.2  alnsn 
   3246  1.2  alnsn 	for (k = 1; k <= sizeof(pkt); k++)
   3247  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3248  1.2  alnsn 
   3249  1.2  alnsn 	rump_schedule();
   3250  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3251  1.2  alnsn 	rump_unschedule();
   3252  1.2  alnsn }
   3253  1.2  alnsn 
   3254  1.2  alnsn ATF_TC(bpfjit_stx1);
   3255  1.2  alnsn ATF_TC_HEAD(bpfjit_stx1, tc)
   3256  1.2  alnsn {
   3257  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3258  1.2  alnsn 	    "Test JIT compilation of BPF_STX");
   3259  1.2  alnsn }
   3260  1.2  alnsn 
   3261  1.2  alnsn ATF_TC_BODY(bpfjit_stx1, tc)
   3262  1.2  alnsn {
   3263  1.2  alnsn 	static struct bpf_insn insns[] = {
   3264  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3265  1.2  alnsn 		BPF_STMT(BPF_STX, 0),
   3266  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3267  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3268  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3269  1.2  alnsn 	};
   3270  1.2  alnsn 
   3271  1.2  alnsn 	size_t i;
   3272  1.2  alnsn 	bpfjit_func_t code;
   3273  1.2  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3274  1.2  alnsn 
   3275  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3276  1.2  alnsn 
   3277  1.2  alnsn 	RZ(rump_init());
   3278  1.2  alnsn 
   3279  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3280  1.2  alnsn 
   3281  1.2  alnsn 	rump_schedule();
   3282  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3283  1.2  alnsn 	rump_unschedule();
   3284  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3285  1.2  alnsn 
   3286  1.2  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3287  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3288  1.2  alnsn 
   3289  1.2  alnsn 	rump_schedule();
   3290  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3291  1.2  alnsn 	rump_unschedule();
   3292  1.2  alnsn }
   3293  1.2  alnsn 
   3294  1.2  alnsn ATF_TC(bpfjit_stx2);
   3295  1.2  alnsn ATF_TC_HEAD(bpfjit_stx2, tc)
   3296  1.2  alnsn {
   3297  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3298  1.2  alnsn 	    "Test JIT compilation of BPF_STX");
   3299  1.2  alnsn }
   3300  1.2  alnsn 
   3301  1.2  alnsn ATF_TC_BODY(bpfjit_stx2, tc)
   3302  1.2  alnsn {
   3303  1.2  alnsn 	static struct bpf_insn insns[] = {
   3304  1.2  alnsn 		BPF_STMT(BPF_ST, 0),
   3305  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3306  1.2  alnsn 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
   3307  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3308  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3309  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3310  1.2  alnsn 	};
   3311  1.2  alnsn 
   3312  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3313  1.2  alnsn 
   3314  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3315  1.2  alnsn 
   3316  1.2  alnsn 	RZ(rump_init());
   3317  1.2  alnsn 
   3318  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3319  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
   3320  1.2  alnsn }
   3321  1.2  alnsn 
   3322  1.2  alnsn ATF_TC(bpfjit_stx3);
   3323  1.2  alnsn ATF_TC_HEAD(bpfjit_stx3, tc)
   3324  1.2  alnsn {
   3325  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3326  1.2  alnsn 	    "Test JIT compilation of BPF_STX");
   3327  1.2  alnsn }
   3328  1.2  alnsn 
   3329  1.2  alnsn ATF_TC_BODY(bpfjit_stx3, tc)
   3330  1.2  alnsn {
   3331  1.2  alnsn 	static struct bpf_insn insns[] = {
   3332  1.2  alnsn 		BPF_STMT(BPF_STX, 6),
   3333  1.2  alnsn 		BPF_STMT(BPF_ST, 1),
   3334  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3335  1.2  alnsn 		BPF_STMT(BPF_STX, 5),
   3336  1.2  alnsn 		BPF_STMT(BPF_STX, 2),
   3337  1.2  alnsn 		BPF_STMT(BPF_STX, 3),
   3338  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
   3339  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3340  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
   3341  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3342  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   3343  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3344  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
   3345  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3346  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
   3347  1.2  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3348  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3349  1.2  alnsn 	};
   3350  1.2  alnsn 
   3351  1.2  alnsn 	size_t i;
   3352  1.2  alnsn 	bpfjit_func_t code;
   3353  1.2  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3354  1.2  alnsn 
   3355  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3356  1.2  alnsn 
   3357  1.2  alnsn 	RZ(rump_init());
   3358  1.2  alnsn 
   3359  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3360  1.2  alnsn 
   3361  1.2  alnsn 	rump_schedule();
   3362  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3363  1.2  alnsn 	rump_unschedule();
   3364  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3365  1.2  alnsn 
   3366  1.2  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3367  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
   3368  1.2  alnsn 
   3369  1.2  alnsn 	rump_schedule();
   3370  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3371  1.2  alnsn 	rump_unschedule();
   3372  1.2  alnsn }
   3373  1.2  alnsn 
   3374  1.2  alnsn ATF_TC(bpfjit_stx4);
   3375  1.2  alnsn ATF_TC_HEAD(bpfjit_stx4, tc)
   3376  1.2  alnsn {
   3377  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3378  1.2  alnsn 	    "Test JIT compilation of BPF_STX");
   3379  1.2  alnsn }
   3380  1.2  alnsn 
   3381  1.2  alnsn ATF_TC_BODY(bpfjit_stx4, tc)
   3382  1.2  alnsn {
   3383  1.2  alnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3384  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3385  1.2  alnsn 
   3386  1.2  alnsn 	size_t k;
   3387  1.2  alnsn 	bpfjit_func_t code;
   3388  1.2  alnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3389  1.2  alnsn 
   3390  1.2  alnsn 	memset(insns, 0, sizeof(insns));
   3391  1.2  alnsn 
   3392  1.2  alnsn 	/* for each k do M[k] = k */
   3393  1.2  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3394  1.2  alnsn 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
   3395  1.2  alnsn 		insns[2*k].k      = 3*k;
   3396  1.2  alnsn 		insns[2*k+1].code = BPF_STX;
   3397  1.2  alnsn 		insns[2*k+1].k    = k;
   3398  1.2  alnsn 	}
   3399  1.2  alnsn 
   3400  1.2  alnsn 	/* load wirelen into A */
   3401  1.2  alnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3402  1.2  alnsn 
   3403  1.2  alnsn 	/* for each k, if (A == k + 1) return M[k] */
   3404  1.2  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3405  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3406  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3407  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3408  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3409  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3410  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3411  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3412  1.2  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3413  1.2  alnsn 	}
   3414  1.2  alnsn 
   3415  1.2  alnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3416  1.2  alnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3417  1.2  alnsn 
   3418  1.2  alnsn 	RZ(rump_init());
   3419  1.2  alnsn 
   3420  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3421  1.2  alnsn 
   3422  1.2  alnsn 	rump_schedule();
   3423  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3424  1.2  alnsn 	rump_unschedule();
   3425  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3426  1.2  alnsn 
   3427  1.2  alnsn 	for (k = 1; k <= sizeof(pkt); k++)
   3428  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3429  1.2  alnsn 
   3430  1.2  alnsn 	rump_schedule();
   3431  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3432  1.2  alnsn 	rump_unschedule();
   3433  1.2  alnsn }
   3434  1.2  alnsn 
   3435  1.2  alnsn ATF_TC(bpfjit_opt_ld_abs_1);
   3436  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
   3437  1.2  alnsn {
   3438  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3439  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3440  1.2  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3441  1.2  alnsn }
   3442  1.2  alnsn 
   3443  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
   3444  1.2  alnsn {
   3445  1.2  alnsn 	static struct bpf_insn insns[] = {
   3446  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3447  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3448  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3449  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3450  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3451  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3452  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3453  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3454  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3455  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3456  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3457  1.2  alnsn 	};
   3458  1.2  alnsn 
   3459  1.2  alnsn 	size_t i, j;
   3460  1.2  alnsn 	bpfjit_func_t code;
   3461  1.2  alnsn 	uint8_t pkt[2][34] = {
   3462  1.2  alnsn 		{
   3463  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3464  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3465  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3466  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3467  1.2  alnsn 		},
   3468  1.2  alnsn 		{
   3469  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3470  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3471  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3472  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3473  1.2  alnsn 		}
   3474  1.2  alnsn 	};
   3475  1.2  alnsn 
   3476  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3477  1.2  alnsn 
   3478  1.2  alnsn 	RZ(rump_init());
   3479  1.2  alnsn 
   3480  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3481  1.2  alnsn 
   3482  1.2  alnsn 	rump_schedule();
   3483  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3484  1.2  alnsn 	rump_unschedule();
   3485  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3486  1.2  alnsn 
   3487  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3488  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3489  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3490  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3491  1.2  alnsn 	}
   3492  1.2  alnsn 
   3493  1.2  alnsn 	rump_schedule();
   3494  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3495  1.2  alnsn 	rump_unschedule();
   3496  1.2  alnsn }
   3497  1.2  alnsn 
   3498  1.2  alnsn ATF_TC(bpfjit_opt_ld_abs_2);
   3499  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
   3500  1.2  alnsn {
   3501  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3502  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3503  1.2  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3504  1.2  alnsn }
   3505  1.2  alnsn 
   3506  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
   3507  1.2  alnsn {
   3508  1.2  alnsn 	static struct bpf_insn insns[] = {
   3509  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3510  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3511  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3512  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3513  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3514  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3515  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3516  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3517  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3518  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3519  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3520  1.2  alnsn 	};
   3521  1.2  alnsn 
   3522  1.2  alnsn 	size_t i, j;
   3523  1.2  alnsn 	bpfjit_func_t code;
   3524  1.2  alnsn 	uint8_t pkt[2][34] = {
   3525  1.2  alnsn 		{
   3526  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3527  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3528  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3529  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3530  1.2  alnsn 		},
   3531  1.2  alnsn 		{
   3532  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3533  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3534  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3535  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3536  1.2  alnsn 		}
   3537  1.2  alnsn 	};
   3538  1.2  alnsn 
   3539  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3540  1.2  alnsn 
   3541  1.2  alnsn 	RZ(rump_init());
   3542  1.2  alnsn 
   3543  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3544  1.2  alnsn 
   3545  1.2  alnsn 	rump_schedule();
   3546  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3547  1.2  alnsn 	rump_unschedule();
   3548  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3549  1.2  alnsn 
   3550  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3551  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3552  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3553  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3554  1.2  alnsn 	}
   3555  1.2  alnsn 
   3556  1.2  alnsn 	rump_schedule();
   3557  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3558  1.2  alnsn 	rump_unschedule();
   3559  1.2  alnsn }
   3560  1.2  alnsn 
   3561  1.2  alnsn ATF_TC(bpfjit_opt_ld_abs_3);
   3562  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
   3563  1.2  alnsn {
   3564  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3565  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3566  1.2  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3567  1.2  alnsn }
   3568  1.2  alnsn 
   3569  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
   3570  1.2  alnsn {
   3571  1.2  alnsn 	static struct bpf_insn insns[] = {
   3572  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3573  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3574  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3575  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
   3576  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
   3577  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3578  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3579  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3580  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3581  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3582  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3583  1.2  alnsn 	};
   3584  1.2  alnsn 
   3585  1.2  alnsn 	size_t i, j;
   3586  1.2  alnsn 	bpfjit_func_t code;
   3587  1.2  alnsn 	uint8_t pkt[2][34] = {
   3588  1.2  alnsn 		{
   3589  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3590  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3591  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3592  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3593  1.2  alnsn 		},
   3594  1.2  alnsn 		{
   3595  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3596  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3597  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3598  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3599  1.2  alnsn 		}
   3600  1.2  alnsn 	};
   3601  1.2  alnsn 
   3602  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3603  1.2  alnsn 
   3604  1.2  alnsn 	RZ(rump_init());
   3605  1.2  alnsn 
   3606  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3607  1.2  alnsn 
   3608  1.2  alnsn 	rump_schedule();
   3609  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3610  1.2  alnsn 	rump_unschedule();
   3611  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3612  1.2  alnsn 
   3613  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3614  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3615  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3616  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3617  1.2  alnsn 	}
   3618  1.2  alnsn 
   3619  1.2  alnsn 	rump_schedule();
   3620  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3621  1.2  alnsn 	rump_unschedule();
   3622  1.2  alnsn }
   3623  1.2  alnsn 
   3624  1.2  alnsn ATF_TC(bpfjit_opt_ld_ind_1);
   3625  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
   3626  1.2  alnsn {
   3627  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3628  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3629  1.2  alnsn 	    "applied to BPF_LD+BPF_IND");
   3630  1.2  alnsn }
   3631  1.2  alnsn 
   3632  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
   3633  1.2  alnsn {
   3634  1.2  alnsn 	static struct bpf_insn insns[] = {
   3635  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
   3636  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   3637  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3638  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
   3639  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3640  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3641  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3642  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3643  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3644  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3645  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3646  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3647  1.2  alnsn 	};
   3648  1.2  alnsn 
   3649  1.2  alnsn 	size_t i, j;
   3650  1.2  alnsn 	bpfjit_func_t code;
   3651  1.2  alnsn 	uint8_t pkt[2][34] = {
   3652  1.2  alnsn 		{
   3653  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3654  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3655  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3656  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3657  1.2  alnsn 		},
   3658  1.2  alnsn 		{
   3659  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3660  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3661  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3662  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3663  1.2  alnsn 		}
   3664  1.2  alnsn 	};
   3665  1.2  alnsn 
   3666  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3667  1.2  alnsn 
   3668  1.2  alnsn 	RZ(rump_init());
   3669  1.2  alnsn 
   3670  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3671  1.2  alnsn 
   3672  1.2  alnsn 	rump_schedule();
   3673  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3674  1.2  alnsn 	rump_unschedule();
   3675  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3676  1.2  alnsn 
   3677  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3678  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3679  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3680  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3681  1.2  alnsn 	}
   3682  1.2  alnsn 
   3683  1.2  alnsn 	rump_schedule();
   3684  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3685  1.2  alnsn 	rump_unschedule();
   3686  1.2  alnsn }
   3687  1.2  alnsn 
   3688  1.2  alnsn ATF_TC(bpfjit_opt_ld_ind_2);
   3689  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
   3690  1.2  alnsn {
   3691  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3692  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3693  1.2  alnsn 	    "applied to BPF_LD+BPF_IND");
   3694  1.2  alnsn }
   3695  1.2  alnsn 
   3696  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
   3697  1.2  alnsn {
   3698  1.2  alnsn 	static struct bpf_insn insns[] = {
   3699  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3700  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
   3701  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3702  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3703  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3704  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3705  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3706  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3707  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3708  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3709  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3710  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3711  1.2  alnsn 	};
   3712  1.2  alnsn 
   3713  1.2  alnsn 	size_t i, j;
   3714  1.2  alnsn 	bpfjit_func_t code;
   3715  1.2  alnsn 	uint8_t pkt[2][34] = {
   3716  1.2  alnsn 		{
   3717  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3718  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3719  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3720  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3721  1.2  alnsn 		},
   3722  1.2  alnsn 		{
   3723  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3724  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3725  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3726  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3727  1.2  alnsn 		}
   3728  1.2  alnsn 	};
   3729  1.2  alnsn 
   3730  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3731  1.2  alnsn 
   3732  1.2  alnsn 	RZ(rump_init());
   3733  1.2  alnsn 
   3734  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3735  1.2  alnsn 
   3736  1.2  alnsn 	rump_schedule();
   3737  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3738  1.2  alnsn 	rump_unschedule();
   3739  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3740  1.2  alnsn 
   3741  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3742  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3743  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3744  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3745  1.2  alnsn 	}
   3746  1.2  alnsn 
   3747  1.2  alnsn 	rump_schedule();
   3748  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3749  1.2  alnsn 	rump_unschedule();
   3750  1.2  alnsn }
   3751  1.2  alnsn 
   3752  1.2  alnsn ATF_TC(bpfjit_opt_ld_ind_3);
   3753  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
   3754  1.2  alnsn {
   3755  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3756  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3757  1.2  alnsn 	    "applied to BPF_LD+BPF_IND");
   3758  1.2  alnsn }
   3759  1.2  alnsn 
   3760  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
   3761  1.2  alnsn {
   3762  1.2  alnsn 	static struct bpf_insn insns[] = {
   3763  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
   3764  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3765  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3766  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3767  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3768  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3769  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3770  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3771  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3772  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3773  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3774  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3775  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3776  1.2  alnsn 	};
   3777  1.2  alnsn 
   3778  1.2  alnsn 	size_t i, j;
   3779  1.2  alnsn 	bpfjit_func_t code;
   3780  1.2  alnsn 	uint8_t pkt[2][34] = {
   3781  1.2  alnsn 		{
   3782  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3783  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3784  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3785  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3786  1.2  alnsn 		},
   3787  1.2  alnsn 		{
   3788  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3789  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3790  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3791  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3792  1.2  alnsn 		}
   3793  1.2  alnsn 	};
   3794  1.2  alnsn 
   3795  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3796  1.2  alnsn 
   3797  1.2  alnsn 	RZ(rump_init());
   3798  1.2  alnsn 
   3799  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3800  1.2  alnsn 
   3801  1.2  alnsn 	rump_schedule();
   3802  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3803  1.2  alnsn 	rump_unschedule();
   3804  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3805  1.2  alnsn 
   3806  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3807  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3808  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3809  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3810  1.2  alnsn 	}
   3811  1.2  alnsn 
   3812  1.2  alnsn 	rump_schedule();
   3813  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3814  1.2  alnsn 	rump_unschedule();
   3815  1.2  alnsn }
   3816  1.2  alnsn 
   3817  1.2  alnsn ATF_TC(bpfjit_opt_ld_ind_4);
   3818  1.2  alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
   3819  1.2  alnsn {
   3820  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3821  1.2  alnsn 	    "Test JIT compilation with length optimization "
   3822  1.2  alnsn 	    "applied to BPF_LD+BPF_IND");
   3823  1.2  alnsn }
   3824  1.2  alnsn 
   3825  1.2  alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
   3826  1.2  alnsn {
   3827  1.2  alnsn 	static struct bpf_insn insns[] = {
   3828  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
   3829  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
   3830  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3831  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3832  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3833  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3834  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3835  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3836  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3837  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3838  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3839  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3840  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3841  1.2  alnsn 	};
   3842  1.2  alnsn 
   3843  1.2  alnsn 	size_t i, j;
   3844  1.2  alnsn 	bpfjit_func_t code;
   3845  1.2  alnsn 	uint8_t pkt[2][34] = {
   3846  1.2  alnsn 		{
   3847  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3848  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3849  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3850  1.2  alnsn 			0x80, 0x03, 0x70, 0x23
   3851  1.2  alnsn 		},
   3852  1.2  alnsn 		{
   3853  1.2  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3854  1.2  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3855  1.2  alnsn 			0x80, 0x03, 0x70, 0x23,
   3856  1.2  alnsn 			0x80, 0x03, 0x70, 0x0f
   3857  1.2  alnsn 		}
   3858  1.2  alnsn 	};
   3859  1.2  alnsn 
   3860  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3861  1.2  alnsn 
   3862  1.2  alnsn 	RZ(rump_init());
   3863  1.2  alnsn 
   3864  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3865  1.2  alnsn 
   3866  1.2  alnsn 	rump_schedule();
   3867  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3868  1.2  alnsn 	rump_unschedule();
   3869  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3870  1.2  alnsn 
   3871  1.2  alnsn 	for (i = 0; i < 2; i++) {
   3872  1.2  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3873  1.2  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3874  1.2  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3875  1.2  alnsn 	}
   3876  1.2  alnsn 
   3877  1.2  alnsn 	rump_schedule();
   3878  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3879  1.2  alnsn 	rump_unschedule();
   3880  1.2  alnsn }
   3881  1.2  alnsn 
   3882  1.2  alnsn ATF_TC(bpfjit_abc_ja);
   3883  1.2  alnsn ATF_TC_HEAD(bpfjit_abc_ja, tc)
   3884  1.2  alnsn {
   3885  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3886  1.2  alnsn 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
   3887  1.2  alnsn }
   3888  1.2  alnsn 
   3889  1.2  alnsn ATF_TC_BODY(bpfjit_abc_ja, tc)
   3890  1.2  alnsn {
   3891  1.2  alnsn 	static struct bpf_insn insns[] = {
   3892  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   3893  1.2  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   3894  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
   3895  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3896  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
   3897  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3898  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   3899  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   3900  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   3901  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   3902  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   3903  1.2  alnsn 	};
   3904  1.2  alnsn 
   3905  1.2  alnsn 	bpfjit_func_t code;
   3906  1.2  alnsn 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
   3907  1.2  alnsn 
   3908  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3909  1.2  alnsn 
   3910  1.2  alnsn 	RZ(rump_init());
   3911  1.2  alnsn 
   3912  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3913  1.2  alnsn 
   3914  1.2  alnsn 	rump_schedule();
   3915  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3916  1.2  alnsn 	rump_unschedule();
   3917  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3918  1.2  alnsn 
   3919  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3920  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   3921  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   3922  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   3923  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   3924  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
   3925  1.2  alnsn 
   3926  1.2  alnsn 	rump_schedule();
   3927  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   3928  1.2  alnsn 	rump_unschedule();
   3929  1.2  alnsn }
   3930  1.2  alnsn 
   3931  1.2  alnsn ATF_TC(bpfjit_abc_ja_over);
   3932  1.2  alnsn ATF_TC_HEAD(bpfjit_abc_ja_over, tc)
   3933  1.2  alnsn {
   3934  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3935  1.2  alnsn 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
   3936  1.2  alnsn }
   3937  1.2  alnsn 
   3938  1.2  alnsn ATF_TC_BODY(bpfjit_abc_ja_over, tc)
   3939  1.2  alnsn {
   3940  1.2  alnsn 	static struct bpf_insn insns[] = {
   3941  1.2  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   3942  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
   3943  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3944  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3945  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
   3946  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   3947  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   3948  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   3949  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   3950  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   3951  1.2  alnsn 	};
   3952  1.2  alnsn 
   3953  1.2  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3954  1.2  alnsn 
   3955  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3956  1.2  alnsn 
   3957  1.2  alnsn 	RZ(rump_init());
   3958  1.2  alnsn 
   3959  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3960  1.2  alnsn 	ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
   3961  1.2  alnsn }
   3962  1.2  alnsn 
   3963  1.2  alnsn ATF_TC(bpfjit_abc_ld_chain);
   3964  1.2  alnsn ATF_TC_HEAD(bpfjit_abc_ld_chain, tc)
   3965  1.2  alnsn {
   3966  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   3967  1.2  alnsn 	    "Test ABC optimization of a chain of BPF_LD instructions "
   3968  1.2  alnsn 	    "with exits leading to a single BPF_RET");
   3969  1.2  alnsn }
   3970  1.2  alnsn 
   3971  1.2  alnsn ATF_TC_BODY(bpfjit_abc_ld_chain, tc)
   3972  1.2  alnsn {
   3973  1.2  alnsn 	static struct bpf_insn insns[] = {
   3974  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   3975  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
   3976  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
   3977  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
   3978  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
   3979  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
   3980  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 123456789),
   3981  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 987654321),
   3982  1.2  alnsn 	};
   3983  1.2  alnsn 
   3984  1.2  alnsn 	bpfjit_func_t code;
   3985  1.2  alnsn 	uint8_t pkt[10] = {};
   3986  1.2  alnsn 
   3987  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3988  1.2  alnsn 
   3989  1.2  alnsn 	RZ(rump_init());
   3990  1.2  alnsn 
   3991  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   3992  1.2  alnsn 
   3993  1.2  alnsn 	rump_schedule();
   3994  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   3995  1.2  alnsn 	rump_unschedule();
   3996  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   3997  1.2  alnsn 
   3998  1.2  alnsn 	/* Packet is too short. */
   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 
   4003  1.2  alnsn 	/* !(pkt[3] == 8) => return 123456789 */
   4004  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
   4005  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
   4006  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4007  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
   4008  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
   4009  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4010  1.2  alnsn 
   4011  1.2  alnsn 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
   4012  1.2  alnsn 	pkt[3] = 8;
   4013  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4014  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4015  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4016  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4017  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4018  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4019  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4020  1.2  alnsn 
   4021  1.2  alnsn 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
   4022  1.2  alnsn 	pkt[4] = pkt[5] = 1;
   4023  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4024  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4025  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4026  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4027  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4028  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4029  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4030  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4031  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4032  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
   4033  1.2  alnsn 
   4034  1.2  alnsn 	/* (pkt[6:4] > 6) => too short or return 123456789 */
   4035  1.2  alnsn 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
   4036  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4037  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4038  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4039  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4040  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4041  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4042  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4043  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4044  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4045  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
   4046  1.2  alnsn 
   4047  1.2  alnsn 	rump_schedule();
   4048  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   4049  1.2  alnsn 	rump_unschedule();
   4050  1.2  alnsn }
   4051  1.2  alnsn 
   4052  1.2  alnsn ATF_TC(bpfjit_examples_1);
   4053  1.2  alnsn ATF_TC_HEAD(bpfjit_examples_1, tc)
   4054  1.2  alnsn {
   4055  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   4056  1.2  alnsn 	    "Test the first example from bpf(4) - "
   4057  1.2  alnsn 	    "accept Reverse ARP requests");
   4058  1.2  alnsn }
   4059  1.2  alnsn 
   4060  1.2  alnsn ATF_TC_BODY(bpfjit_examples_1, tc)
   4061  1.2  alnsn {
   4062  1.2  alnsn 	/*
   4063  1.2  alnsn 	 * The following filter is taken from the Reverse ARP
   4064  1.2  alnsn 	 * Daemon. It accepts only Reverse ARP requests.
   4065  1.2  alnsn 	 */
   4066  1.2  alnsn 	struct bpf_insn insns[] = {
   4067  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4068  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
   4069  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4070  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
   4071  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 42),
   4072  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4073  1.2  alnsn 	};
   4074  1.2  alnsn 
   4075  1.2  alnsn 	bpfjit_func_t code;
   4076  1.2  alnsn 	uint8_t pkt[22] = {};
   4077  1.2  alnsn 
   4078  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4079  1.2  alnsn 
   4080  1.2  alnsn 	RZ(rump_init());
   4081  1.2  alnsn 
   4082  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   4083  1.2  alnsn 
   4084  1.2  alnsn 	rump_schedule();
   4085  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   4086  1.2  alnsn 	rump_unschedule();
   4087  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   4088  1.2  alnsn 
   4089  1.2  alnsn 	/* Packet is too short. */
   4090  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4091  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4092  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4093  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4094  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4095  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4096  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4097  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4098  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4099  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4100  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4101  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4102  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4103  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4104  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4105  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4106  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4107  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4108  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4109  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4110  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4111  1.2  alnsn 
   4112  1.2  alnsn 	/* The packet doesn't match. */
   4113  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4114  1.2  alnsn 
   4115  1.2  alnsn 	/* Still no match after setting the protocol field. */
   4116  1.2  alnsn 	pkt[12] = 0x80; pkt[13] = 0x35;
   4117  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4118  1.2  alnsn 
   4119  1.2  alnsn 	/* Set RARP message type. */
   4120  1.2  alnsn 	pkt[21] = 3;
   4121  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
   4122  1.2  alnsn 
   4123  1.2  alnsn 	/* Packet is too short. */
   4124  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4125  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4126  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4127  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4128  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4129  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4130  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4131  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4132  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4133  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4134  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4135  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4136  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4137  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4138  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4139  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4140  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4141  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4142  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4143  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4144  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4145  1.2  alnsn 
   4146  1.2  alnsn 	/* Change RARP message type. */
   4147  1.2  alnsn 	pkt[20] = 3;
   4148  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4149  1.2  alnsn 
   4150  1.2  alnsn 	rump_schedule();
   4151  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   4152  1.2  alnsn 	rump_unschedule();
   4153  1.2  alnsn }
   4154  1.2  alnsn 
   4155  1.2  alnsn ATF_TC(bpfjit_examples_2);
   4156  1.2  alnsn ATF_TC_HEAD(bpfjit_examples_2, tc)
   4157  1.2  alnsn {
   4158  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   4159  1.2  alnsn 	    "Test the second example from bpf(4) - "
   4160  1.2  alnsn 	    "accept IP packets between two specified hosts");
   4161  1.2  alnsn }
   4162  1.2  alnsn 
   4163  1.2  alnsn ATF_TC_BODY(bpfjit_examples_2, tc)
   4164  1.2  alnsn {
   4165  1.2  alnsn 	/*
   4166  1.2  alnsn 	 * This filter accepts only IP packets between host 128.3.112.15
   4167  1.2  alnsn 	 * and 128.3.112.35.
   4168  1.2  alnsn 	 */
   4169  1.2  alnsn 	static struct bpf_insn insns[] = {
   4170  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4171  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
   4172  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   4173  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   4174  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4175  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   4176  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   4177  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4178  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   4179  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4180  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4181  1.2  alnsn 	};
   4182  1.2  alnsn 
   4183  1.2  alnsn 	bpfjit_func_t code;
   4184  1.2  alnsn 	uint8_t pkt[34] = {};
   4185  1.2  alnsn 
   4186  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4187  1.2  alnsn 
   4188  1.2  alnsn 	RZ(rump_init());
   4189  1.2  alnsn 
   4190  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   4191  1.2  alnsn 
   4192  1.2  alnsn 	rump_schedule();
   4193  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   4194  1.2  alnsn 	rump_unschedule();
   4195  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   4196  1.2  alnsn 
   4197  1.2  alnsn 	/* Packet is too short. */
   4198  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4199  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4200  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4201  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4202  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4203  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4204  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4205  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4206  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4207  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4208  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4209  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4210  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4211  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4212  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4213  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4214  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4215  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4216  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4217  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4218  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4219  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4220  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4221  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4222  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4223  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4224  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4225  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4226  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4227  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4228  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4229  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4230  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4231  1.2  alnsn 
   4232  1.2  alnsn 	/* The packet doesn't match. */
   4233  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4234  1.2  alnsn 
   4235  1.2  alnsn 	/* Still no match after setting the protocol field. */
   4236  1.2  alnsn 	pkt[12] = 8;
   4237  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4238  1.2  alnsn 
   4239  1.2  alnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
   4240  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4241  1.2  alnsn 
   4242  1.2  alnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
   4243  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4244  1.2  alnsn 
   4245  1.2  alnsn 	/* Swap the ip addresses. */
   4246  1.2  alnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
   4247  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4248  1.2  alnsn 
   4249  1.2  alnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
   4250  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4251  1.2  alnsn 
   4252  1.2  alnsn 	/* Packet is too short. */
   4253  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4254  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4255  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4256  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4257  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4258  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4259  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4260  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4261  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4262  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4263  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4264  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4265  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4266  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4267  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4268  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4269  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4270  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4271  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4272  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4273  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4274  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4275  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4276  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4277  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4278  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4279  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4280  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4281  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4282  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4283  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4284  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4285  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4286  1.2  alnsn 
   4287  1.2  alnsn 	/* Change the protocol field. */
   4288  1.2  alnsn 	pkt[13] = 8;
   4289  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4290  1.2  alnsn 
   4291  1.2  alnsn 	rump_schedule();
   4292  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   4293  1.2  alnsn 	rump_unschedule();
   4294  1.2  alnsn }
   4295  1.2  alnsn 
   4296  1.2  alnsn ATF_TC(bpfjit_examples_3);
   4297  1.2  alnsn ATF_TC_HEAD(bpfjit_examples_3, tc)
   4298  1.2  alnsn {
   4299  1.2  alnsn 	atf_tc_set_md_var(tc, "descr",
   4300  1.2  alnsn 	    "Test the third example from bpf(4) - "
   4301  1.2  alnsn 	    "accept TCP finger packets");
   4302  1.2  alnsn }
   4303  1.2  alnsn 
   4304  1.2  alnsn ATF_TC_BODY(bpfjit_examples_3, tc)
   4305  1.2  alnsn {
   4306  1.2  alnsn 	/*
   4307  1.2  alnsn 	 * This filter returns only TCP finger packets.
   4308  1.2  alnsn 	 */
   4309  1.2  alnsn 	struct bpf_insn insns[] = {
   4310  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4311  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
   4312  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
   4313  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
   4314  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4315  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
   4316  1.2  alnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
   4317  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
   4318  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
   4319  1.2  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
   4320  1.2  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
   4321  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4322  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4323  1.2  alnsn 	};
   4324  1.2  alnsn 
   4325  1.2  alnsn 	bpfjit_func_t code;
   4326  1.2  alnsn 	uint8_t pkt[30] = {};
   4327  1.2  alnsn 
   4328  1.2  alnsn 	/* Set IP fragment offset to non-zero. */
   4329  1.2  alnsn 	pkt[20] = 1; pkt[21] = 1;
   4330  1.2  alnsn 
   4331  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4332  1.2  alnsn 
   4333  1.2  alnsn 	RZ(rump_init());
   4334  1.2  alnsn 
   4335  1.2  alnsn 	ATF_CHECK(prog_validate(insns, insn_count));
   4336  1.2  alnsn 
   4337  1.2  alnsn 	rump_schedule();
   4338  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   4339  1.2  alnsn 	rump_unschedule();
   4340  1.2  alnsn 	ATF_REQUIRE(code != NULL);
   4341  1.2  alnsn 
   4342  1.2  alnsn 	/* Packet is too short. */
   4343  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4344  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4345  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4346  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4347  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4348  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4349  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4350  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4351  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4352  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4353  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4354  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4355  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4356  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4357  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4358  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4359  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4360  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4361  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4362  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4363  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4364  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4365  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4366  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4367  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4368  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4369  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4370  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4371  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4372  1.2  alnsn 
   4373  1.2  alnsn 	/* The packet doesn't match. */
   4374  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4375  1.2  alnsn 
   4376  1.2  alnsn 	/* Still no match after setting the protocol field. */
   4377  1.2  alnsn 	pkt[12] = 8;
   4378  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4379  1.2  alnsn 
   4380  1.2  alnsn 	/* Get one step closer to the match. */
   4381  1.2  alnsn 	pkt[23] = 6;
   4382  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4383  1.2  alnsn 
   4384  1.2  alnsn 	/* Set IP fragment offset to zero. */
   4385  1.2  alnsn 	pkt[20] = 0x20; pkt[21] = 0;
   4386  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4387  1.2  alnsn 
   4388  1.2  alnsn 	/* Set IP header length to 12. */
   4389  1.2  alnsn 	pkt[14] = 0xd3;
   4390  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4391  1.2  alnsn 
   4392  1.2  alnsn 	/* Match one branch of the program. */
   4393  1.2  alnsn 	pkt[27] = 79;
   4394  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4395  1.2  alnsn 
   4396  1.2  alnsn 	/* Match the other branch of the program. */
   4397  1.2  alnsn 	pkt[29] = 79; pkt[27] = 0;
   4398  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4399  1.2  alnsn 
   4400  1.2  alnsn 	/* Packet is too short. */
   4401  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4402  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4403  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4404  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4405  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4406  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4407  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4408  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4409  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4410  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4411  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4412  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4413  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4414  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4415  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4416  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4417  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4418  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4419  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4420  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4421  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4422  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4423  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4424  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4425  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4426  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4427  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4428  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4429  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4430  1.2  alnsn 
   4431  1.2  alnsn 	/* Set IP header length to 16. Packet is too short. */
   4432  1.2  alnsn 	pkt[14] = 4;
   4433  1.2  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4434  1.2  alnsn 
   4435  1.2  alnsn 	rump_schedule();
   4436  1.2  alnsn 	rumpns_bpfjit_free_code(code);
   4437  1.2  alnsn 	rump_unschedule();
   4438  1.2  alnsn }
   4439  1.2  alnsn 
   4440  1.2  alnsn ATF_TC(bpfjit_cop_no_ctx);
   4441  1.2  alnsn ATF_TC_HEAD(bpfjit_cop_no_ctx, tc)
   4442  1.2  alnsn {
   4443  1.2  alnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
   4444  1.2  alnsn 	    "instruction can't be accepted without a context");
   4445  1.2  alnsn }
   4446  1.2  alnsn 
   4447  1.2  alnsn ATF_TC_BODY(bpfjit_cop_no_ctx, tc)
   4448  1.2  alnsn {
   4449  1.2  alnsn 	static struct bpf_insn insns[] = {
   4450  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_COP, 0),
   4451  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   4452  1.2  alnsn 	};
   4453  1.2  alnsn 
   4454  1.2  alnsn 	bpfjit_func_t code;
   4455  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4456  1.2  alnsn 
   4457  1.2  alnsn 	RZ(rump_init());
   4458  1.2  alnsn 
   4459  1.2  alnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
   4460  1.2  alnsn 
   4461  1.2  alnsn 	rump_schedule();
   4462  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   4463  1.2  alnsn 	rump_unschedule();
   4464  1.2  alnsn 	ATF_CHECK(code == NULL);
   4465  1.2  alnsn }
   4466  1.2  alnsn 
   4467  1.2  alnsn ATF_TC(bpfjit_copx_no_ctx);
   4468  1.2  alnsn ATF_TC_HEAD(bpfjit_copx_no_ctx, tc)
   4469  1.2  alnsn {
   4470  1.2  alnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
   4471  1.2  alnsn 	    "instruction can't be accepted without a context");
   4472  1.2  alnsn }
   4473  1.2  alnsn 
   4474  1.2  alnsn ATF_TC_BODY(bpfjit_copx_no_ctx, tc)
   4475  1.2  alnsn {
   4476  1.2  alnsn 	static struct bpf_insn insns[] = {
   4477  1.2  alnsn 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
   4478  1.2  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   4479  1.2  alnsn 	};
   4480  1.2  alnsn 
   4481  1.2  alnsn 	bpfjit_func_t code;
   4482  1.2  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4483  1.2  alnsn 
   4484  1.2  alnsn 	RZ(rump_init());
   4485  1.2  alnsn 
   4486  1.2  alnsn 	ATF_CHECK(!prog_validate(insns, insn_count));
   4487  1.2  alnsn 
   4488  1.2  alnsn 	rump_schedule();
   4489  1.2  alnsn 	code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
   4490  1.2  alnsn 	rump_unschedule();
   4491  1.2  alnsn 	ATF_CHECK(code == NULL);
   4492  1.1  alnsn }
   4493  1.1  alnsn 
   4494  1.1  alnsn ATF_TP_ADD_TCS(tp)
   4495  1.1  alnsn {
   4496  1.1  alnsn 
   4497  1.2  alnsn 	/*
   4498  1.2  alnsn 	 * For every new test please also add a similar test
   4499  1.2  alnsn 	 * to ../../lib/libbpfjit/t_bpfjit.c
   4500  1.2  alnsn 	 */
   4501  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_empty);
   4502  1.5  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ret_k);
   4503  1.5  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_bad_ret_k);
   4504  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
   4505  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
   4506  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
   4507  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
   4508  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
   4509  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
   4510  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
   4511  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
   4512  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
   4513  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
   4514  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
   4515  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_k);
   4516  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_k);
   4517  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_k);
   4518  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_k);
   4519  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_k);
   4520  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_k);
   4521  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_k);
   4522  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_k);
   4523  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
   4524  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
   4525  1.3  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_xor_k);
   4526  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
   4527  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
   4528  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
   4529  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
   4530  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
   4531  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
   4532  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
   4533  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
   4534  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
   4535  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
   4536  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
   4537  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
   4538  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
   4539  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
   4540  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
   4541  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
   4542  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_x);
   4543  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_x);
   4544  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_x);
   4545  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_x);
   4546  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_x);
   4547  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_x);
   4548  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_x);
   4549  1.4  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_x);
   4550  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
   4551  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
   4552  1.3  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_xor_x);
   4553  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
   4554  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
   4555  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
   4556  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
   4557  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
   4558  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
   4559  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
   4560  1.5  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid);
   4561  1.6  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_overflow);
   4562  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
   4563  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
   4564  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
   4565  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
   4566  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
   4567  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
   4568  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
   4569  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
   4570  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
   4571  1.7  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_x_uninitialised);
   4572  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
   4573  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
   4574  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
   4575  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
   4576  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
   4577  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
   4578  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
   4579  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_len);
   4580  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
   4581  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
   4582  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
   4583  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
   4584  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
   4585  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
   4586  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
   4587  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
   4588  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_st1);
   4589  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_st2);
   4590  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_st3);
   4591  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_st4);
   4592  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_st5);
   4593  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx1);
   4594  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx2);
   4595  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx3);
   4596  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_stx4);
   4597  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
   4598  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
   4599  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
   4600  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
   4601  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
   4602  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
   4603  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
   4604  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ja);
   4605  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ja_over);
   4606  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_abc_ld_chain);
   4607  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_1);
   4608  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_2);
   4609  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_examples_3);
   4610  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_cop_no_ctx);
   4611  1.2  alnsn 	ATF_TP_ADD_TC(tp, bpfjit_copx_no_ctx);
   4612  1.1  alnsn 
   4613  1.1  alnsn 	return atf_no_error();
   4614  1.1  alnsn }
   4615