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