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