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