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