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