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