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