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