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