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