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