Home | History | Annotate | Line # | Download | only in libbpfjit
t_bpfjit.c revision 1.10
      1  1.10  alnsn /*	$NetBSD: t_bpfjit.c,v 1.10 2015/02/11 23:17: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.10  alnsn __RCSID("$NetBSD: t_bpfjit.c,v 1.10 2015/02/11 23:17: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.6  alnsn ATF_TC(libbpfjit_jmp_jgt_k);
   1945   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
   1946   1.1  alnsn {
   1947   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   1948   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
   1949   1.1  alnsn }
   1950   1.1  alnsn 
   1951   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
   1952   1.1  alnsn {
   1953   1.1  alnsn 	static struct bpf_insn insns[] = {
   1954   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   1955   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
   1956   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   1957   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
   1958   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
   1959   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   1960   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
   1961   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   1962   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
   1963   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   1964   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   1965   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   1966   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
   1967   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   1968   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
   1969   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   1970   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   1971   1.1  alnsn 	};
   1972   1.1  alnsn 
   1973   1.2  rmind 	bpfjit_func_t code;
   1974   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   1975   1.1  alnsn 
   1976   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   1977   1.1  alnsn 
   1978   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   1979   1.1  alnsn 
   1980   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   1981   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   1982   1.1  alnsn 
   1983   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   1984   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   1985   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
   1986   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   1987   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   1988   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   1989   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   1990   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   1991   1.1  alnsn 
   1992   1.1  alnsn 	bpfjit_free_code(code);
   1993   1.1  alnsn }
   1994   1.1  alnsn 
   1995   1.6  alnsn ATF_TC(libbpfjit_jmp_jge_k);
   1996   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
   1997   1.1  alnsn {
   1998   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   1999   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
   2000   1.1  alnsn }
   2001   1.1  alnsn 
   2002   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
   2003   1.1  alnsn {
   2004   1.1  alnsn 	static struct bpf_insn insns[] = {
   2005   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2006   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
   2007   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2008   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
   2009   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
   2010   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2011   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
   2012   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2013   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
   2014   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2015   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2016   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2017   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
   2018   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2019   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
   2020   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2021   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2022   1.1  alnsn 	};
   2023   1.1  alnsn 
   2024   1.2  rmind 	bpfjit_func_t code;
   2025   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2026   1.1  alnsn 
   2027   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2028   1.1  alnsn 
   2029   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2030   1.1  alnsn 
   2031   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2032   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2033   1.1  alnsn 
   2034   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   2035   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   2036   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
   2037   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2038   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2039   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2040   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2041   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2042   1.1  alnsn 
   2043   1.1  alnsn 	bpfjit_free_code(code);
   2044   1.1  alnsn }
   2045   1.1  alnsn 
   2046   1.6  alnsn ATF_TC(libbpfjit_jmp_jeq_k);
   2047   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
   2048   1.1  alnsn {
   2049   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2050   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
   2051   1.1  alnsn }
   2052   1.1  alnsn 
   2053   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
   2054   1.1  alnsn {
   2055   1.1  alnsn 	static struct bpf_insn insns[] = {
   2056   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2057   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
   2058   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2059   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
   2060   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
   2061   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2062   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
   2063   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2064   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
   2065   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2066   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2067   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2068   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
   2069   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2070   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
   2071   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2072   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2073   1.1  alnsn 	};
   2074   1.1  alnsn 
   2075   1.2  rmind 	bpfjit_func_t code;
   2076   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2077   1.1  alnsn 
   2078   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2079   1.1  alnsn 
   2080   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2081   1.1  alnsn 
   2082   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2083   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2084   1.1  alnsn 
   2085   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
   2086   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
   2087   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
   2088   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2089   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2090   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2091   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2092   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2093   1.1  alnsn 
   2094   1.1  alnsn 	bpfjit_free_code(code);
   2095   1.1  alnsn }
   2096   1.1  alnsn 
   2097   1.6  alnsn ATF_TC(libbpfjit_jmp_jset_k);
   2098   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
   2099   1.1  alnsn {
   2100   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2101   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
   2102   1.1  alnsn }
   2103   1.1  alnsn 
   2104   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
   2105   1.1  alnsn {
   2106   1.1  alnsn 	static struct bpf_insn insns[] = {
   2107   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2108   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
   2109   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2110   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
   2111   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
   2112   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2113   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
   2114   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2115   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
   2116   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2117   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2118   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2119   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
   2120   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2121   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
   2122   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2123   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2124   1.1  alnsn 	};
   2125   1.1  alnsn 
   2126   1.2  rmind 	bpfjit_func_t code;
   2127   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2128   1.1  alnsn 
   2129   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2130   1.1  alnsn 
   2131   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2132   1.1  alnsn 
   2133   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2134   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2135   1.1  alnsn 
   2136   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   2137   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   2138   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
   2139   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2140   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
   2141   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2142   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2143   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2144   1.1  alnsn 
   2145   1.1  alnsn 	bpfjit_free_code(code);
   2146   1.1  alnsn }
   2147   1.1  alnsn 
   2148   1.6  alnsn ATF_TC(libbpfjit_jmp_modulo_k);
   2149   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
   2150   1.1  alnsn {
   2151   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2152   1.1  alnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
   2153   1.1  alnsn }
   2154   1.1  alnsn 
   2155   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
   2156   1.1  alnsn {
   2157   1.1  alnsn 	static struct bpf_insn insns[] = {
   2158   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
   2159   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
   2160   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
   2161   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2162   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
   2163   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2164   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
   2165   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2166   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
   2167   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
   2168   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
   2169   1.1  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
   2170   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2171   1.1  alnsn 
   2172   1.1  alnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
   2173   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
   2174   1.1  alnsn 
   2175   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
   2176   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2177   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
   2178   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2179   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
   2180   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2181   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
   2182   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
   2183   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
   2184   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   2185   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   2186   1.1  alnsn 	};
   2187   1.1  alnsn 
   2188   1.2  rmind 	bpfjit_func_t code;
   2189   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2190   1.1  alnsn 
   2191   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2192   1.1  alnsn 
   2193   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2194   1.1  alnsn 
   2195   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2196   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2197   1.1  alnsn 
   2198   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   2199   1.1  alnsn 
   2200   1.1  alnsn 	bpfjit_free_code(code);
   2201   1.1  alnsn }
   2202   1.1  alnsn 
   2203   1.6  alnsn ATF_TC(libbpfjit_jmp_jgt_x);
   2204   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
   2205   1.1  alnsn {
   2206   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2207   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
   2208   1.1  alnsn }
   2209   1.1  alnsn 
   2210   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
   2211   1.1  alnsn {
   2212   1.1  alnsn 	static struct bpf_insn insns[] = {
   2213   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2214   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
   2215   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2216   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2217   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
   2218   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2219   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
   2220   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
   2221   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2222   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
   2223   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
   2224   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2225   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
   2226   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
   2227   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2228   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2229   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2230   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2231   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
   2232   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2233   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   2234   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
   2235   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2236   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2237   1.1  alnsn 	};
   2238   1.1  alnsn 
   2239   1.2  rmind 	bpfjit_func_t code;
   2240   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2241   1.1  alnsn 
   2242   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2243   1.1  alnsn 
   2244   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2245   1.1  alnsn 
   2246   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2247   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2248   1.1  alnsn 
   2249   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   2250   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   2251   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
   2252   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2253   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2254   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2255   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2256   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2257   1.1  alnsn 
   2258   1.1  alnsn 	bpfjit_free_code(code);
   2259   1.1  alnsn }
   2260   1.1  alnsn 
   2261   1.6  alnsn ATF_TC(libbpfjit_jmp_jge_x);
   2262   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
   2263   1.1  alnsn {
   2264   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2265   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
   2266   1.1  alnsn }
   2267   1.1  alnsn 
   2268   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
   2269   1.1  alnsn {
   2270   1.1  alnsn 	static struct bpf_insn insns[] = {
   2271   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2272   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
   2273   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2274   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2275   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2276   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
   2277   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
   2278   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
   2279   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2280   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2281   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
   2282   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2283   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
   2284   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
   2285   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2286   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2287   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2288   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
   2289   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
   2290   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2291   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
   2292   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
   2293   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2294   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2295   1.1  alnsn 	};
   2296   1.1  alnsn 
   2297   1.2  rmind 	bpfjit_func_t code;
   2298   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2299   1.1  alnsn 
   2300   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2301   1.1  alnsn 
   2302   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2303   1.1  alnsn 
   2304   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2305   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2306   1.1  alnsn 
   2307   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   2308   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   2309   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
   2310   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2311   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2312   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2313   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2314   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2315   1.1  alnsn 
   2316   1.1  alnsn 	bpfjit_free_code(code);
   2317   1.1  alnsn }
   2318   1.1  alnsn 
   2319   1.6  alnsn ATF_TC(libbpfjit_jmp_jeq_x);
   2320   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
   2321   1.1  alnsn {
   2322   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2323   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
   2324   1.1  alnsn }
   2325   1.1  alnsn 
   2326   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
   2327   1.1  alnsn {
   2328   1.1  alnsn 	static struct bpf_insn insns[] = {
   2329   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2330   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
   2331   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
   2332   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2333   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2334   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
   2335   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
   2336   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
   2337   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2338   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2339   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
   2340   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2341   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
   2342   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
   2343   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2344   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2345   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2346   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
   2347   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
   2348   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2349   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
   2350   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2351   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2352   1.1  alnsn 	};
   2353   1.1  alnsn 
   2354   1.2  rmind 	bpfjit_func_t code;
   2355   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2356   1.1  alnsn 
   2357   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2358   1.1  alnsn 
   2359   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2360   1.1  alnsn 
   2361   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2362   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2363   1.1  alnsn 
   2364   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
   2365   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
   2366   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
   2367   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2368   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
   2369   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2370   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2371   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2372   1.1  alnsn 
   2373   1.1  alnsn 	bpfjit_free_code(code);
   2374   1.1  alnsn }
   2375   1.1  alnsn 
   2376   1.6  alnsn ATF_TC(libbpfjit_jmp_jset_x);
   2377   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
   2378   1.1  alnsn {
   2379   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2380   1.1  alnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
   2381   1.1  alnsn }
   2382   1.1  alnsn 
   2383   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
   2384   1.1  alnsn {
   2385   1.1  alnsn 	static struct bpf_insn insns[] = {
   2386   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2387   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
   2388   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
   2389   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2390   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
   2391   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
   2392   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
   2393   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2394   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
   2395   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
   2396   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2397   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
   2398   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
   2399   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2400   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2401   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2402   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
   2403   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
   2404   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2405   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
   2406   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
   2407   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2408   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
   2409   1.1  alnsn 	};
   2410   1.1  alnsn 
   2411   1.2  rmind 	bpfjit_func_t code;
   2412   1.1  alnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
   2413   1.1  alnsn 
   2414   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2415   1.1  alnsn 
   2416   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2417   1.1  alnsn 
   2418   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2419   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2420   1.1  alnsn 
   2421   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   2422   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
   2423   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
   2424   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
   2425   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
   2426   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
   2427   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
   2428   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2429   1.1  alnsn 
   2430   1.1  alnsn 	bpfjit_free_code(code);
   2431   1.1  alnsn }
   2432   1.1  alnsn 
   2433   1.6  alnsn ATF_TC(libbpfjit_jmp_modulo_x);
   2434   1.6  alnsn ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
   2435   1.1  alnsn {
   2436   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2437   1.1  alnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
   2438   1.1  alnsn }
   2439   1.1  alnsn 
   2440   1.6  alnsn ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
   2441   1.1  alnsn {
   2442   1.1  alnsn 	static struct bpf_insn insns[] = {
   2443   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
   2444   1.1  alnsn 		/* FFFFF770 << 4 = FFFFF770 */
   2445   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
   2446   1.1  alnsn 
   2447   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2448   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2449   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   2450   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2451   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   2452   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2453   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2454   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   2455   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
   2456   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2457   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2458   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
   2459   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2460   1.1  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
   2461   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   2462   1.1  alnsn 
   2463   1.1  alnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
   2464   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
   2465   1.1  alnsn 
   2466   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2467   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2468   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
   2469   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
   2470   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
   2471   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2472   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
   2473   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
   2474   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
   2475   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
   2476   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
   2477   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
   2478   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
   2479   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   2480   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   2481   1.1  alnsn 	};
   2482   1.1  alnsn 
   2483   1.2  rmind 	bpfjit_func_t code;
   2484   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2485   1.1  alnsn 
   2486   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2487   1.1  alnsn 
   2488   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2489   1.1  alnsn 
   2490   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2491   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2492   1.1  alnsn 
   2493   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   2494   1.1  alnsn 
   2495   1.1  alnsn 	bpfjit_free_code(code);
   2496   1.1  alnsn }
   2497   1.1  alnsn 
   2498   1.6  alnsn ATF_TC(libbpfjit_ld_abs);
   2499   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_abs, tc)
   2500   1.1  alnsn {
   2501   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2502   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS");
   2503   1.1  alnsn }
   2504   1.1  alnsn 
   2505   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_abs, tc)
   2506   1.1  alnsn {
   2507   1.1  alnsn 	static struct bpf_insn insns[3][2] = {
   2508   1.1  alnsn 		{
   2509   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   2510   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2511   1.1  alnsn 		},
   2512   1.1  alnsn 		{
   2513   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
   2514   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2515   1.1  alnsn 		},
   2516   1.1  alnsn 		{
   2517   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
   2518   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2519   1.1  alnsn 		}
   2520   1.1  alnsn 	};
   2521   1.1  alnsn 
   2522   1.1  alnsn 	static size_t lengths[3] = { 1, 2, 4 };
   2523   1.1  alnsn 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
   2524   1.1  alnsn 
   2525   1.1  alnsn 	size_t i, l;
   2526   1.1  alnsn 	uint8_t *pkt = deadbeef_at_5;
   2527   1.1  alnsn 	size_t pktsize = sizeof(deadbeef_at_5);
   2528   1.1  alnsn 
   2529   1.1  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2530   1.1  alnsn 
   2531   1.1  alnsn 	for (i = 0; i < 3; i++) {
   2532   1.2  rmind 		bpfjit_func_t code;
   2533   1.1  alnsn 
   2534   1.1  alnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2535   1.1  alnsn 
   2536   1.5  alnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2537   1.1  alnsn 		ATF_REQUIRE(code != NULL);
   2538   1.1  alnsn 
   2539   1.6  alnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
   2540   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2541   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2542   1.1  alnsn 		}
   2543   1.1  alnsn 
   2544   1.1  alnsn 		l = 5 + lengths[i];
   2545   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2546   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2547   1.1  alnsn 
   2548   1.1  alnsn 		l = pktsize;
   2549   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2550   1.1  alnsn 
   2551   1.1  alnsn 		bpfjit_free_code(code);
   2552   1.1  alnsn 	}
   2553   1.1  alnsn }
   2554   1.1  alnsn 
   2555   1.6  alnsn ATF_TC(libbpfjit_ld_abs_k_overflow);
   2556   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
   2557   1.1  alnsn {
   2558   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2559   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
   2560   1.1  alnsn }
   2561   1.1  alnsn 
   2562   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
   2563   1.1  alnsn {
   2564   1.1  alnsn 	static struct bpf_insn insns[12][3] = {
   2565   1.1  alnsn 		{
   2566   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   2567   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2568   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2569   1.1  alnsn 		},
   2570   1.1  alnsn 		{
   2571   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   2572   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2573   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2574   1.1  alnsn 		},
   2575   1.1  alnsn 		{
   2576   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   2577   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2578   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2579   1.1  alnsn 		},
   2580   1.1  alnsn 		{
   2581   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   2582   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2583   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2584   1.1  alnsn 		},
   2585   1.1  alnsn 		{
   2586   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   2587   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   2588   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2589   1.1  alnsn 		},
   2590   1.1  alnsn 		{
   2591   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
   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_B+BPF_ABS, 7),
   2597   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
   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_B+BPF_ABS, 7),
   2602   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
   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_B+BPF_ABS, 7),
   2607   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
   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_B+BPF_ABS, 7),
   2612   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
   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_B+BPF_ABS, 7),
   2617   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
   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_W+BPF_ABS, UINT32_MAX - 3),
   2623   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2624   1.1  alnsn 		}
   2625   1.1  alnsn 	};
   2626   1.1  alnsn 
   2627   1.1  alnsn 	int i;
   2628   1.1  alnsn 	uint8_t pkt[8] = { 0 };
   2629   1.1  alnsn 
   2630   1.1  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2631   1.1  alnsn 
   2632   1.1  alnsn 	for (i = 0; i < 3; i++) {
   2633   1.2  rmind 		bpfjit_func_t code;
   2634   1.1  alnsn 
   2635   1.1  alnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2636   1.1  alnsn 
   2637   1.5  alnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2638   1.1  alnsn 		ATF_REQUIRE(code != NULL);
   2639   1.1  alnsn 
   2640   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2641   1.1  alnsn 
   2642   1.1  alnsn 		bpfjit_free_code(code);
   2643   1.1  alnsn 	}
   2644   1.1  alnsn }
   2645   1.1  alnsn 
   2646   1.6  alnsn ATF_TC(libbpfjit_ld_ind);
   2647   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_ind, tc)
   2648   1.1  alnsn {
   2649   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2650   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND");
   2651   1.1  alnsn }
   2652   1.1  alnsn 
   2653   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_ind, tc)
   2654   1.1  alnsn {
   2655   1.1  alnsn 	static struct bpf_insn insns[6][3] = {
   2656   1.1  alnsn 		{
   2657   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2658   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   2659   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2660   1.1  alnsn 		},
   2661   1.1  alnsn 		{
   2662   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2663   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
   2664   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2665   1.1  alnsn 		},
   2666   1.1  alnsn 		{
   2667   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
   2668   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
   2669   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2670   1.1  alnsn 		},
   2671   1.1  alnsn 		{
   2672   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2673   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2674   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2675   1.1  alnsn 		},
   2676   1.1  alnsn 		{
   2677   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2678   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   2679   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2680   1.1  alnsn 		},
   2681   1.1  alnsn 		{
   2682   1.1  alnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2683   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
   2684   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
   2685   1.1  alnsn 		}
   2686   1.1  alnsn 	};
   2687   1.1  alnsn 
   2688   1.1  alnsn 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
   2689   1.1  alnsn 
   2690   1.1  alnsn 	static unsigned int expected[6] = {
   2691   1.1  alnsn 		0xde, 0xdead, 0xdeadbeef,
   2692   1.1  alnsn 		0xde, 0xdead, 0xdeadbeef
   2693   1.1  alnsn 	};
   2694   1.1  alnsn 
   2695   1.1  alnsn 	size_t i, l;
   2696   1.1  alnsn 	uint8_t *pkt = deadbeef_at_5;
   2697   1.1  alnsn 	size_t pktsize = sizeof(deadbeef_at_5);
   2698   1.1  alnsn 
   2699   1.1  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2700   1.1  alnsn 
   2701   1.1  alnsn 	for (i = 0; i < 3; i++) {
   2702   1.2  rmind 		bpfjit_func_t code;
   2703   1.1  alnsn 
   2704   1.1  alnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2705   1.1  alnsn 
   2706   1.5  alnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2707   1.1  alnsn 		ATF_REQUIRE(code != NULL);
   2708   1.1  alnsn 
   2709   1.6  alnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
   2710   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
   2711   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
   2712   1.1  alnsn 		}
   2713   1.1  alnsn 
   2714   1.1  alnsn 		l = 5 + lengths[i];
   2715   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2716   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
   2717   1.1  alnsn 
   2718   1.1  alnsn 		l = pktsize;
   2719   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
   2720   1.1  alnsn 
   2721   1.1  alnsn 		bpfjit_free_code(code);
   2722   1.1  alnsn 	}
   2723   1.1  alnsn }
   2724   1.1  alnsn 
   2725   1.6  alnsn ATF_TC(libbpfjit_ld_ind_k_overflow);
   2726   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
   2727   1.1  alnsn {
   2728   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2729   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
   2730   1.1  alnsn }
   2731   1.1  alnsn 
   2732   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
   2733   1.1  alnsn {
   2734   1.1  alnsn 	static struct bpf_insn insns[12][3] = {
   2735   1.1  alnsn 		{
   2736   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   2737   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2738   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2739   1.1  alnsn 		},
   2740   1.1  alnsn 		{
   2741   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   2742   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2743   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2744   1.1  alnsn 		},
   2745   1.1  alnsn 		{
   2746   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   2747   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2748   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2749   1.1  alnsn 		},
   2750   1.1  alnsn 		{
   2751   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   2752   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2753   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2754   1.1  alnsn 		},
   2755   1.1  alnsn 		{
   2756   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   2757   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
   2758   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2759   1.1  alnsn 		},
   2760   1.1  alnsn 		{
   2761   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
   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, 7),
   2767   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
   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_H+BPF_IND, 7),
   2772   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
   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_H+BPF_IND, 7),
   2777   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
   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_H+BPF_IND, 7),
   2782   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
   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_H+BPF_IND, 7),
   2787   1.1  alnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
   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_W+BPF_IND, UINT32_MAX - 3),
   2793   1.1  alnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
   2794   1.1  alnsn 		}
   2795   1.1  alnsn 	};
   2796   1.1  alnsn 
   2797   1.1  alnsn 	int i;
   2798   1.1  alnsn 	uint8_t pkt[8] = { 0 };
   2799   1.1  alnsn 
   2800   1.1  alnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
   2801   1.1  alnsn 
   2802   1.1  alnsn 	for (i = 0; i < 3; i++) {
   2803   1.2  rmind 		bpfjit_func_t code;
   2804   1.1  alnsn 
   2805   1.1  alnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
   2806   1.1  alnsn 
   2807   1.5  alnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
   2808   1.1  alnsn 		ATF_REQUIRE(code != NULL);
   2809   1.1  alnsn 
   2810   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   2811   1.1  alnsn 
   2812   1.1  alnsn 		bpfjit_free_code(code);
   2813   1.1  alnsn 	}
   2814   1.1  alnsn }
   2815   1.1  alnsn 
   2816   1.6  alnsn ATF_TC(libbpfjit_ld_ind_x_overflow1);
   2817   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
   2818   1.1  alnsn {
   2819   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2820   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2821   1.1  alnsn }
   2822   1.1  alnsn 
   2823   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
   2824   1.1  alnsn {
   2825   1.1  alnsn 	static struct bpf_insn insns[] = {
   2826   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2827   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2828   1.1  alnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   2829   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2830   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2831   1.1  alnsn 	};
   2832   1.1  alnsn 
   2833   1.1  alnsn 	size_t i;
   2834   1.2  rmind 	bpfjit_func_t code;
   2835   1.1  alnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2836   1.1  alnsn 
   2837   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2838   1.1  alnsn 
   2839   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2840   1.1  alnsn 
   2841   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2842   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2843   1.1  alnsn 
   2844   1.1  alnsn 	for (i = 1; i <= sizeof(pkt); i++) {
   2845   1.1  alnsn 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2846   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2847   1.1  alnsn 	}
   2848   1.1  alnsn 
   2849   1.1  alnsn 	bpfjit_free_code(code);
   2850   1.1  alnsn }
   2851   1.1  alnsn 
   2852   1.6  alnsn ATF_TC(libbpfjit_ld_ind_x_overflow2);
   2853   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
   2854   1.1  alnsn {
   2855   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2856   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
   2857   1.1  alnsn }
   2858   1.1  alnsn 
   2859   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
   2860   1.1  alnsn {
   2861   1.1  alnsn 	static struct bpf_insn insns[] = {
   2862   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
   2863   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
   2864   1.1  alnsn 		BPF_STMT(BPF_ST, 3),
   2865   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   2866   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
   2867   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2868   1.1  alnsn 	};
   2869   1.1  alnsn 
   2870   1.1  alnsn 	size_t i;
   2871   1.2  rmind 	bpfjit_func_t code;
   2872   1.1  alnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
   2873   1.1  alnsn 
   2874   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2875   1.1  alnsn 
   2876   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2877   1.1  alnsn 
   2878   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2879   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2880   1.1  alnsn 
   2881   1.1  alnsn 	for (i = 1; i <= sizeof(pkt); i++) {
   2882   1.1  alnsn 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
   2883   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
   2884   1.1  alnsn 	}
   2885   1.1  alnsn 
   2886   1.1  alnsn 	bpfjit_free_code(code);
   2887   1.1  alnsn }
   2888   1.1  alnsn 
   2889   1.6  alnsn ATF_TC(libbpfjit_ld_len);
   2890   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_len, tc)
   2891   1.1  alnsn {
   2892   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2893   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
   2894   1.1  alnsn }
   2895   1.1  alnsn 
   2896   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_len, tc)
   2897   1.1  alnsn {
   2898   1.1  alnsn 	static struct bpf_insn insns[] = {
   2899   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   2900   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2901   1.1  alnsn 	};
   2902   1.1  alnsn 
   2903   1.1  alnsn 	size_t i;
   2904   1.2  rmind 	bpfjit_func_t code;
   2905   1.1  alnsn 	uint8_t pkt[32]; /* the program doesn't read any data */
   2906   1.1  alnsn 
   2907   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2908   1.1  alnsn 
   2909   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2910   1.1  alnsn 
   2911   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2912   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2913   1.1  alnsn 
   2914   1.1  alnsn 	for (i = 0; i < sizeof(pkt); i++)
   2915   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   2916   1.1  alnsn 
   2917   1.1  alnsn 	bpfjit_free_code(code);
   2918   1.1  alnsn }
   2919   1.1  alnsn 
   2920   1.6  alnsn ATF_TC(libbpfjit_ld_imm);
   2921   1.6  alnsn ATF_TC_HEAD(libbpfjit_ld_imm, tc)
   2922   1.1  alnsn {
   2923   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2924   1.1  alnsn 	    "Test JIT compilation of BPF_LD+BPF_IMM");
   2925   1.1  alnsn }
   2926   1.1  alnsn 
   2927   1.6  alnsn ATF_TC_BODY(libbpfjit_ld_imm, tc)
   2928   1.1  alnsn {
   2929   1.1  alnsn 	static struct bpf_insn insns[] = {
   2930   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
   2931   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2932   1.1  alnsn 	};
   2933   1.1  alnsn 
   2934   1.2  rmind 	bpfjit_func_t code;
   2935   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2936   1.1  alnsn 
   2937   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2938   1.1  alnsn 
   2939   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2940   1.1  alnsn 
   2941   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2942   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2943   1.1  alnsn 
   2944   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   2945   1.1  alnsn 
   2946   1.1  alnsn 	bpfjit_free_code(code);
   2947   1.1  alnsn }
   2948   1.1  alnsn 
   2949   1.6  alnsn ATF_TC(libbpfjit_ldx_imm1);
   2950   1.6  alnsn ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
   2951   1.1  alnsn {
   2952   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2953   1.1  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   2954   1.1  alnsn }
   2955   1.1  alnsn 
   2956   1.6  alnsn ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
   2957   1.1  alnsn {
   2958   1.1  alnsn 	static struct bpf_insn insns[] = {
   2959   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
   2960   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   2961   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   2962   1.1  alnsn 	};
   2963   1.1  alnsn 
   2964   1.2  rmind 	bpfjit_func_t code;
   2965   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2966   1.1  alnsn 
   2967   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   2968   1.1  alnsn 
   2969   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   2970   1.1  alnsn 
   2971   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   2972   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   2973   1.1  alnsn 
   2974   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
   2975   1.1  alnsn 
   2976   1.1  alnsn 	bpfjit_free_code(code);
   2977   1.1  alnsn }
   2978   1.1  alnsn 
   2979   1.6  alnsn ATF_TC(libbpfjit_ldx_imm2);
   2980   1.6  alnsn ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
   2981   1.1  alnsn {
   2982   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   2983   1.1  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
   2984   1.1  alnsn }
   2985   1.1  alnsn 
   2986   1.6  alnsn ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
   2987   1.1  alnsn {
   2988   1.1  alnsn 	static struct bpf_insn insns[] = {
   2989   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
   2990   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   2991   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   2992   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   2993   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   2994   1.1  alnsn 	};
   2995   1.1  alnsn 
   2996   1.2  rmind 	bpfjit_func_t code;
   2997   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   2998   1.1  alnsn 
   2999   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3000   1.1  alnsn 
   3001   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3002   1.1  alnsn 
   3003   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3004   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3005   1.1  alnsn 
   3006   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   3007   1.1  alnsn 
   3008   1.1  alnsn 	bpfjit_free_code(code);
   3009   1.1  alnsn }
   3010   1.1  alnsn 
   3011   1.6  alnsn ATF_TC(libbpfjit_ldx_len1);
   3012   1.6  alnsn ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
   3013   1.1  alnsn {
   3014   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3015   1.1  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   3016   1.1  alnsn }
   3017   1.1  alnsn 
   3018   1.6  alnsn ATF_TC_BODY(libbpfjit_ldx_len1, tc)
   3019   1.1  alnsn {
   3020   1.1  alnsn 	static struct bpf_insn insns[] = {
   3021   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3022   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3023   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3024   1.1  alnsn 	};
   3025   1.1  alnsn 
   3026   1.1  alnsn 	size_t i;
   3027   1.2  rmind 	bpfjit_func_t code;
   3028   1.1  alnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
   3029   1.1  alnsn 
   3030   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3031   1.1  alnsn 
   3032   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3033   1.1  alnsn 
   3034   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3035   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3036   1.1  alnsn 
   3037   1.1  alnsn 	for (i = 1; i < sizeof(pkt); i++) {
   3038   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
   3039   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
   3040   1.1  alnsn 	}
   3041   1.1  alnsn 
   3042   1.1  alnsn 	bpfjit_free_code(code);
   3043   1.1  alnsn }
   3044   1.1  alnsn 
   3045   1.6  alnsn ATF_TC(libbpfjit_ldx_len2);
   3046   1.6  alnsn ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
   3047   1.1  alnsn {
   3048   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3049   1.1  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
   3050   1.1  alnsn }
   3051   1.1  alnsn 
   3052   1.6  alnsn ATF_TC_BODY(libbpfjit_ldx_len2, tc)
   3053   1.1  alnsn {
   3054   1.1  alnsn 	static struct bpf_insn insns[] = {
   3055   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3056   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
   3057   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
   3058   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
   3059   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
   3060   1.1  alnsn 	};
   3061   1.1  alnsn 
   3062   1.2  rmind 	bpfjit_func_t code;
   3063   1.1  alnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
   3064   1.1  alnsn 
   3065   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3066   1.1  alnsn 
   3067   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3068   1.1  alnsn 
   3069   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3070   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3071   1.1  alnsn 
   3072   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
   3073   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
   3074   1.1  alnsn 
   3075   1.1  alnsn 	bpfjit_free_code(code);
   3076   1.1  alnsn }
   3077   1.1  alnsn 
   3078   1.6  alnsn ATF_TC(libbpfjit_ldx_msh);
   3079   1.6  alnsn ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
   3080   1.1  alnsn {
   3081   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3082   1.1  alnsn 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
   3083   1.1  alnsn }
   3084   1.1  alnsn 
   3085   1.6  alnsn ATF_TC_BODY(libbpfjit_ldx_msh, tc)
   3086   1.1  alnsn {
   3087   1.1  alnsn 	static struct bpf_insn insns[] = {
   3088   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
   3089   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3090   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3091   1.1  alnsn 	};
   3092   1.1  alnsn 
   3093   1.2  rmind 	bpfjit_func_t code;
   3094   1.1  alnsn 	uint8_t pkt[2] = { 0, 0x7a };
   3095   1.1  alnsn 
   3096   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3097   1.1  alnsn 
   3098   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3099   1.1  alnsn 
   3100   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3101   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3102   1.1  alnsn 
   3103   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
   3104   1.1  alnsn 
   3105   1.1  alnsn 	bpfjit_free_code(code);
   3106   1.1  alnsn }
   3107   1.1  alnsn 
   3108   1.6  alnsn ATF_TC(libbpfjit_misc_tax);
   3109   1.6  alnsn ATF_TC_HEAD(libbpfjit_misc_tax, tc)
   3110   1.1  alnsn {
   3111   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3112   1.1  alnsn 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
   3113   1.1  alnsn }
   3114   1.1  alnsn 
   3115   1.6  alnsn ATF_TC_BODY(libbpfjit_misc_tax, tc)
   3116   1.1  alnsn {
   3117   1.1  alnsn 	static struct bpf_insn insns[] = {
   3118   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
   3119   1.1  alnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
   3120   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
   3121   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3122   1.1  alnsn 	};
   3123   1.1  alnsn 
   3124   1.2  rmind 	bpfjit_func_t code;
   3125   1.1  alnsn 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
   3126   1.1  alnsn 
   3127   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3128   1.1  alnsn 
   3129   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3130   1.1  alnsn 
   3131   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3132   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3133   1.1  alnsn 
   3134   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
   3135   1.1  alnsn 
   3136   1.1  alnsn 	bpfjit_free_code(code);
   3137   1.1  alnsn }
   3138   1.1  alnsn 
   3139   1.6  alnsn ATF_TC(libbpfjit_misc_txa);
   3140   1.6  alnsn ATF_TC_HEAD(libbpfjit_misc_txa, tc)
   3141   1.1  alnsn {
   3142   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3143   1.1  alnsn 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
   3144   1.1  alnsn }
   3145   1.1  alnsn 
   3146   1.6  alnsn ATF_TC_BODY(libbpfjit_misc_txa, tc)
   3147   1.1  alnsn {
   3148   1.1  alnsn 	static struct bpf_insn insns[] = {
   3149   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
   3150   1.1  alnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3151   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3152   1.1  alnsn 	};
   3153   1.1  alnsn 
   3154   1.2  rmind 	bpfjit_func_t code;
   3155   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3156   1.1  alnsn 
   3157   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3158   1.1  alnsn 
   3159   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3160   1.1  alnsn 
   3161   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3162   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3163   1.1  alnsn 
   3164   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
   3165   1.1  alnsn 
   3166   1.1  alnsn 	bpfjit_free_code(code);
   3167   1.1  alnsn }
   3168   1.1  alnsn 
   3169   1.6  alnsn ATF_TC(libbpfjit_st1);
   3170   1.6  alnsn ATF_TC_HEAD(libbpfjit_st1, tc)
   3171   1.1  alnsn {
   3172   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3173   1.1  alnsn 	    "Test JIT compilation of BPF_ST");
   3174   1.1  alnsn }
   3175   1.1  alnsn 
   3176   1.6  alnsn ATF_TC_BODY(libbpfjit_st1, tc)
   3177   1.1  alnsn {
   3178   1.1  alnsn 	static struct bpf_insn insns[] = {
   3179   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3180   1.1  alnsn 		BPF_STMT(BPF_ST, 0),
   3181   1.6  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
   3182   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3183   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3184   1.1  alnsn 	};
   3185   1.1  alnsn 
   3186   1.1  alnsn 	size_t i;
   3187   1.2  rmind 	bpfjit_func_t code;
   3188   1.1  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3189   1.1  alnsn 
   3190   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3191   1.1  alnsn 
   3192   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3193   1.1  alnsn 
   3194   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3195   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3196   1.1  alnsn 
   3197   1.1  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3198   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3199   1.1  alnsn 
   3200   1.1  alnsn 	bpfjit_free_code(code);
   3201   1.1  alnsn }
   3202   1.1  alnsn 
   3203   1.6  alnsn ATF_TC(libbpfjit_st2);
   3204   1.6  alnsn ATF_TC_HEAD(libbpfjit_st2, tc)
   3205   1.1  alnsn {
   3206   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3207   1.1  alnsn 	    "Test JIT compilation of BPF_ST");
   3208   1.1  alnsn }
   3209   1.1  alnsn 
   3210   1.6  alnsn ATF_TC_BODY(libbpfjit_st2, tc)
   3211   1.1  alnsn {
   3212   1.1  alnsn 	static struct bpf_insn insns[] = {
   3213   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3214   1.1  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3215   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3216   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3217   1.1  alnsn 	};
   3218   1.1  alnsn 
   3219   1.2  rmind 	bpfjit_func_t code;
   3220   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3221   1.1  alnsn 
   3222   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3223   1.1  alnsn 
   3224   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3225   1.1  alnsn 
   3226   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3227   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3228   1.1  alnsn 
   3229   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3230   1.1  alnsn 
   3231   1.1  alnsn 	bpfjit_free_code(code);
   3232   1.1  alnsn }
   3233   1.1  alnsn 
   3234   1.6  alnsn ATF_TC(libbpfjit_st3);
   3235   1.6  alnsn ATF_TC_HEAD(libbpfjit_st3, tc)
   3236   1.1  alnsn {
   3237   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3238   1.1  alnsn 	    "Test JIT compilation of BPF_ST");
   3239   1.1  alnsn }
   3240   1.1  alnsn 
   3241   1.6  alnsn ATF_TC_BODY(libbpfjit_st3, tc)
   3242   1.1  alnsn {
   3243   1.1  alnsn 	static struct bpf_insn insns[] = {
   3244   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3245   1.1  alnsn 		BPF_STMT(BPF_ST, 0),
   3246   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3247   1.1  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3248   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3249   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3250   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3251   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3252   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
   3253   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3254   1.1  alnsn 	};
   3255   1.1  alnsn 
   3256   1.2  rmind 	bpfjit_func_t code;
   3257   1.1  alnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
   3258   1.1  alnsn 
   3259   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3260   1.1  alnsn 
   3261   1.1  alnsn 	ATF_REQUIRE(BPF_MEMWORDS > 1);
   3262   1.1  alnsn 
   3263   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3264   1.1  alnsn 
   3265   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3266   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3267   1.1  alnsn 
   3268   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3269   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3270   1.1  alnsn 
   3271   1.1  alnsn 	bpfjit_free_code(code);
   3272   1.1  alnsn }
   3273   1.1  alnsn 
   3274   1.6  alnsn ATF_TC(libbpfjit_st4);
   3275   1.6  alnsn ATF_TC_HEAD(libbpfjit_st4, tc)
   3276   1.1  alnsn {
   3277   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3278   1.1  alnsn 	    "Test JIT compilation of BPF_ST");
   3279   1.1  alnsn }
   3280   1.1  alnsn 
   3281   1.6  alnsn ATF_TC_BODY(libbpfjit_st4, tc)
   3282   1.1  alnsn {
   3283   1.1  alnsn 	static struct bpf_insn insns[] = {
   3284   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
   3285   1.1  alnsn 		BPF_STMT(BPF_ST, 5),
   3286   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
   3287   1.1  alnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
   3288   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
   3289   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
   3290   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
   3291   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3292   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_MEM, 5),
   3293   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3294   1.1  alnsn 	};
   3295   1.1  alnsn 
   3296   1.2  rmind 	bpfjit_func_t code;
   3297   1.1  alnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
   3298   1.1  alnsn 
   3299   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3300   1.1  alnsn 
   3301   1.1  alnsn 	ATF_REQUIRE(BPF_MEMWORDS > 6);
   3302   1.1  alnsn 
   3303   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3304   1.1  alnsn 
   3305   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3306   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3307   1.1  alnsn 
   3308   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
   3309   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
   3310   1.1  alnsn 
   3311   1.1  alnsn 	bpfjit_free_code(code);
   3312   1.1  alnsn }
   3313   1.1  alnsn 
   3314   1.6  alnsn ATF_TC(libbpfjit_st5);
   3315   1.6  alnsn ATF_TC_HEAD(libbpfjit_st5, tc)
   3316   1.1  alnsn {
   3317   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3318   1.1  alnsn 	    "Test JIT compilation of BPF_ST");
   3319   1.1  alnsn }
   3320   1.1  alnsn 
   3321   1.6  alnsn ATF_TC_BODY(libbpfjit_st5, tc)
   3322   1.1  alnsn {
   3323   1.1  alnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3324   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3325   1.1  alnsn 
   3326   1.1  alnsn 	size_t k;
   3327   1.2  rmind 	bpfjit_func_t code;
   3328   1.1  alnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3329   1.1  alnsn 
   3330   1.1  alnsn 	memset(insns, 0, sizeof(insns));
   3331   1.1  alnsn 
   3332   1.1  alnsn 	/* for each k do M[k] = k */
   3333   1.1  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3334   1.1  alnsn 		insns[2*k].code   = BPF_LD+BPF_IMM;
   3335   1.1  alnsn 		insns[2*k].k      = 3*k;
   3336   1.1  alnsn 		insns[2*k+1].code = BPF_ST;
   3337   1.1  alnsn 		insns[2*k+1].k    = k;
   3338   1.1  alnsn 	}
   3339   1.1  alnsn 
   3340   1.1  alnsn 	/* load wirelen into A */
   3341   1.1  alnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3342   1.1  alnsn 
   3343   1.1  alnsn 	/* for each k, if (A == k + 1) return M[k] */
   3344   1.1  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3345   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3346   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3347   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3348   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3349   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3350   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3351   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3352   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3353   1.1  alnsn 	}
   3354   1.1  alnsn 
   3355   1.1  alnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3356   1.1  alnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3357   1.1  alnsn 
   3358   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3359   1.1  alnsn 
   3360   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3361   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3362   1.1  alnsn 
   3363   1.1  alnsn 	for (k = 1; k <= sizeof(pkt); k++)
   3364   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3365   1.1  alnsn 
   3366   1.1  alnsn 	bpfjit_free_code(code);
   3367   1.1  alnsn }
   3368   1.1  alnsn 
   3369   1.6  alnsn ATF_TC(libbpfjit_stx1);
   3370   1.6  alnsn ATF_TC_HEAD(libbpfjit_stx1, tc)
   3371   1.1  alnsn {
   3372   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3373   1.1  alnsn 	    "Test JIT compilation of BPF_STX");
   3374   1.1  alnsn }
   3375   1.1  alnsn 
   3376   1.6  alnsn ATF_TC_BODY(libbpfjit_stx1, tc)
   3377   1.1  alnsn {
   3378   1.1  alnsn 	static struct bpf_insn insns[] = {
   3379   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3380   1.1  alnsn 		BPF_STMT(BPF_STX, 0),
   3381   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3382   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3383   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3384   1.1  alnsn 	};
   3385   1.1  alnsn 
   3386   1.1  alnsn 	size_t i;
   3387   1.2  rmind 	bpfjit_func_t code;
   3388   1.1  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3389   1.1  alnsn 
   3390   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3391   1.1  alnsn 
   3392   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3393   1.1  alnsn 
   3394   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3395   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3396   1.1  alnsn 
   3397   1.1  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3398   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
   3399   1.1  alnsn 
   3400   1.1  alnsn 	bpfjit_free_code(code);
   3401   1.1  alnsn }
   3402   1.1  alnsn 
   3403   1.6  alnsn ATF_TC(libbpfjit_stx2);
   3404   1.6  alnsn ATF_TC_HEAD(libbpfjit_stx2, tc)
   3405   1.1  alnsn {
   3406   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3407   1.1  alnsn 	    "Test JIT compilation of BPF_STX");
   3408   1.1  alnsn }
   3409   1.1  alnsn 
   3410   1.6  alnsn ATF_TC_BODY(libbpfjit_stx2, tc)
   3411   1.1  alnsn {
   3412   1.1  alnsn 	static struct bpf_insn insns[] = {
   3413   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3414   1.1  alnsn 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
   3415   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
   3416   1.1  alnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
   3417   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3418   1.1  alnsn 	};
   3419   1.1  alnsn 
   3420   1.2  rmind 	bpfjit_func_t code;
   3421   1.1  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   3422   1.1  alnsn 
   3423   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3424   1.1  alnsn 
   3425   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3426   1.1  alnsn 
   3427   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3428   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3429   1.1  alnsn 
   3430   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3431   1.1  alnsn 
   3432   1.1  alnsn 	bpfjit_free_code(code);
   3433   1.1  alnsn }
   3434   1.1  alnsn 
   3435   1.6  alnsn ATF_TC(libbpfjit_stx3);
   3436   1.6  alnsn ATF_TC_HEAD(libbpfjit_stx3, tc)
   3437   1.1  alnsn {
   3438   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3439   1.1  alnsn 	    "Test JIT compilation of BPF_STX");
   3440   1.1  alnsn }
   3441   1.1  alnsn 
   3442   1.6  alnsn ATF_TC_BODY(libbpfjit_stx3, tc)
   3443   1.1  alnsn {
   3444   1.1  alnsn 	static struct bpf_insn insns[] = {
   3445   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
   3446   1.1  alnsn 		BPF_STMT(BPF_STX, 5),
   3447   1.1  alnsn 		BPF_STMT(BPF_STX, 2),
   3448   1.1  alnsn 		BPF_STMT(BPF_STX, 3),
   3449   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
   3450   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3451   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
   3452   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3453   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
   3454   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3455   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
   3456   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3457   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
   3458   1.1  alnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
   3459   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
   3460   1.1  alnsn 	};
   3461   1.1  alnsn 
   3462   1.1  alnsn 	size_t i;
   3463   1.2  rmind 	bpfjit_func_t code;
   3464   1.1  alnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
   3465   1.1  alnsn 
   3466   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3467   1.1  alnsn 
   3468   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3469   1.1  alnsn 
   3470   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3471   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3472   1.1  alnsn 
   3473   1.1  alnsn 	for (i = 1; i <= sizeof(pkt); i++)
   3474   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
   3475   1.1  alnsn 
   3476   1.1  alnsn 	bpfjit_free_code(code);
   3477   1.1  alnsn }
   3478   1.1  alnsn 
   3479   1.6  alnsn ATF_TC(libbpfjit_stx4);
   3480   1.6  alnsn ATF_TC_HEAD(libbpfjit_stx4, tc)
   3481   1.1  alnsn {
   3482   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3483   1.1  alnsn 	    "Test JIT compilation of BPF_STX");
   3484   1.1  alnsn }
   3485   1.1  alnsn 
   3486   1.6  alnsn ATF_TC_BODY(libbpfjit_stx4, tc)
   3487   1.1  alnsn {
   3488   1.1  alnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
   3489   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3490   1.1  alnsn 
   3491   1.1  alnsn 	size_t k;
   3492   1.2  rmind 	bpfjit_func_t code;
   3493   1.1  alnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
   3494   1.1  alnsn 
   3495   1.1  alnsn 	memset(insns, 0, sizeof(insns));
   3496   1.1  alnsn 
   3497   1.1  alnsn 	/* for each k do M[k] = k */
   3498   1.1  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3499   1.1  alnsn 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
   3500   1.1  alnsn 		insns[2*k].k      = 3*k;
   3501   1.1  alnsn 		insns[2*k+1].code = BPF_STX;
   3502   1.1  alnsn 		insns[2*k+1].k    = k;
   3503   1.1  alnsn 	}
   3504   1.1  alnsn 
   3505   1.1  alnsn 	/* load wirelen into A */
   3506   1.1  alnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
   3507   1.1  alnsn 
   3508   1.1  alnsn 	/* for each k, if (A == k + 1) return M[k] */
   3509   1.1  alnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
   3510   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
   3511   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
   3512   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
   3513   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
   3514   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
   3515   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
   3516   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
   3517   1.1  alnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
   3518   1.1  alnsn 	}
   3519   1.1  alnsn 
   3520   1.1  alnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
   3521   1.1  alnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
   3522   1.1  alnsn 
   3523   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3524   1.1  alnsn 
   3525   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3526   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3527   1.1  alnsn 
   3528   1.1  alnsn 	for (k = 1; k <= sizeof(pkt); k++)
   3529   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
   3530   1.1  alnsn 
   3531   1.1  alnsn 	bpfjit_free_code(code);
   3532   1.1  alnsn }
   3533   1.1  alnsn 
   3534   1.6  alnsn ATF_TC(libbpfjit_opt_ld_abs_1);
   3535   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
   3536   1.1  alnsn {
   3537   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3538   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3539   1.1  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3540   1.1  alnsn }
   3541   1.1  alnsn 
   3542   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
   3543   1.1  alnsn {
   3544   1.1  alnsn 	static struct bpf_insn insns[] = {
   3545   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3546   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3547   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3548   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3549   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3550   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3551   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3552   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3553   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3554   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3555   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3556   1.1  alnsn 	};
   3557   1.1  alnsn 
   3558   1.1  alnsn 	size_t i, j;
   3559   1.2  rmind 	bpfjit_func_t code;
   3560   1.1  alnsn 	uint8_t pkt[2][34] = {
   3561   1.1  alnsn 		{
   3562   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3563   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3564   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3565   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3566   1.1  alnsn 		},
   3567   1.1  alnsn 		{
   3568   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3569   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3570   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3571   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3572   1.1  alnsn 		}
   3573   1.1  alnsn 	};
   3574   1.1  alnsn 
   3575   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3576   1.1  alnsn 
   3577   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3578   1.1  alnsn 
   3579   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3580   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3581   1.1  alnsn 
   3582   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3583   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3584   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3585   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3586   1.1  alnsn 	}
   3587   1.1  alnsn 
   3588   1.1  alnsn 	bpfjit_free_code(code);
   3589   1.1  alnsn }
   3590   1.1  alnsn 
   3591   1.6  alnsn ATF_TC(libbpfjit_opt_ld_abs_2);
   3592   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
   3593   1.1  alnsn {
   3594   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3595   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3596   1.1  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3597   1.1  alnsn }
   3598   1.1  alnsn 
   3599   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
   3600   1.1  alnsn {
   3601   1.1  alnsn 	static struct bpf_insn insns[] = {
   3602   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3603   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3604   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3605   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3606   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3607   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3608   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3609   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3610   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3611   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3612   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3613   1.1  alnsn 	};
   3614   1.1  alnsn 
   3615   1.1  alnsn 	size_t i, j;
   3616   1.2  rmind 	bpfjit_func_t code;
   3617   1.1  alnsn 	uint8_t pkt[2][34] = {
   3618   1.1  alnsn 		{
   3619   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3620   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3621   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3622   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3623   1.1  alnsn 		},
   3624   1.1  alnsn 		{
   3625   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3626   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3627   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3628   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3629   1.1  alnsn 		}
   3630   1.1  alnsn 	};
   3631   1.1  alnsn 
   3632   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3633   1.1  alnsn 
   3634   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3635   1.1  alnsn 
   3636   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3637   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3638   1.1  alnsn 
   3639   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3640   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3641   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3642   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3643   1.1  alnsn 	}
   3644   1.1  alnsn 
   3645   1.1  alnsn 	bpfjit_free_code(code);
   3646   1.1  alnsn }
   3647   1.1  alnsn 
   3648   1.6  alnsn ATF_TC(libbpfjit_opt_ld_abs_3);
   3649   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
   3650   1.1  alnsn {
   3651   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3652   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3653   1.1  alnsn 	    "applied to BPF_LD+BPF_ABS");
   3654   1.1  alnsn }
   3655   1.1  alnsn 
   3656   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
   3657   1.1  alnsn {
   3658   1.1  alnsn 	static struct bpf_insn insns[] = {
   3659   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   3660   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3661   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3662   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
   3663   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
   3664   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   3665   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3666   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   3667   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3668   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3669   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3670   1.1  alnsn 	};
   3671   1.1  alnsn 
   3672   1.1  alnsn 	size_t i, j;
   3673   1.2  rmind 	bpfjit_func_t code;
   3674   1.1  alnsn 	uint8_t pkt[2][34] = {
   3675   1.1  alnsn 		{
   3676   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3677   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3678   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3679   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3680   1.1  alnsn 		},
   3681   1.1  alnsn 		{
   3682   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3683   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3684   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3685   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3686   1.1  alnsn 		}
   3687   1.1  alnsn 	};
   3688   1.1  alnsn 
   3689   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3690   1.1  alnsn 
   3691   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3692   1.1  alnsn 
   3693   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3694   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3695   1.1  alnsn 
   3696   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3697   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3698   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3699   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3700   1.1  alnsn 	}
   3701   1.1  alnsn 
   3702   1.1  alnsn 	bpfjit_free_code(code);
   3703   1.1  alnsn }
   3704   1.1  alnsn 
   3705   1.6  alnsn ATF_TC(libbpfjit_opt_ld_ind_1);
   3706   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
   3707   1.1  alnsn {
   3708   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3709   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3710   1.1  alnsn 	    "applied to BPF_LD+BPF_IND");
   3711   1.1  alnsn }
   3712   1.1  alnsn 
   3713   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
   3714   1.1  alnsn {
   3715   1.1  alnsn 	static struct bpf_insn insns[] = {
   3716   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
   3717   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
   3718   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
   3719   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
   3720   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3721   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3722   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   3723   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   3724   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
   3725   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   3726   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3727   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3728   1.1  alnsn 	};
   3729   1.1  alnsn 
   3730   1.1  alnsn 	size_t i, j;
   3731   1.2  rmind 	bpfjit_func_t code;
   3732   1.1  alnsn 	uint8_t pkt[2][34] = {
   3733   1.1  alnsn 		{
   3734   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3735   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3736   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3737   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3738   1.1  alnsn 		},
   3739   1.1  alnsn 		{
   3740   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3741   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3742   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3743   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3744   1.1  alnsn 		}
   3745   1.1  alnsn 	};
   3746   1.1  alnsn 
   3747   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3748   1.1  alnsn 
   3749   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3750   1.1  alnsn 
   3751   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3752   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3753   1.1  alnsn 
   3754   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3755   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3756   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3757   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3758   1.1  alnsn 	}
   3759   1.1  alnsn 
   3760   1.1  alnsn 	bpfjit_free_code(code);
   3761   1.1  alnsn }
   3762   1.1  alnsn 
   3763   1.6  alnsn ATF_TC(libbpfjit_opt_ld_ind_2);
   3764   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
   3765   1.1  alnsn {
   3766   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3767   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3768   1.1  alnsn 	    "applied to BPF_LD+BPF_IND");
   3769   1.1  alnsn }
   3770   1.1  alnsn 
   3771   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
   3772   1.1  alnsn {
   3773   1.1  alnsn 	static struct bpf_insn insns[] = {
   3774   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3775   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
   3776   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   3777   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3778   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
   3779   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
   3780   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
   3781   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
   3782   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3783   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3784   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3785   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3786   1.1  alnsn 	};
   3787   1.1  alnsn 
   3788   1.1  alnsn 	size_t i, j;
   3789   1.2  rmind 	bpfjit_func_t code;
   3790   1.1  alnsn 	uint8_t pkt[2][34] = {
   3791   1.1  alnsn 		{
   3792   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3793   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3794   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3795   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3796   1.1  alnsn 		},
   3797   1.1  alnsn 		{
   3798   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3799   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3800   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3801   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3802   1.1  alnsn 		}
   3803   1.1  alnsn 	};
   3804   1.1  alnsn 
   3805   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3806   1.1  alnsn 
   3807   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3808   1.1  alnsn 
   3809   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3810   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3811   1.1  alnsn 
   3812   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3813   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3814   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3815   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3816   1.1  alnsn 	}
   3817   1.1  alnsn 
   3818   1.1  alnsn 	bpfjit_free_code(code);
   3819   1.1  alnsn }
   3820   1.1  alnsn 
   3821   1.6  alnsn ATF_TC(libbpfjit_opt_ld_ind_3);
   3822   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
   3823   1.1  alnsn {
   3824   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3825   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3826   1.1  alnsn 	    "applied to BPF_LD+BPF_IND");
   3827   1.1  alnsn }
   3828   1.1  alnsn 
   3829   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
   3830   1.1  alnsn {
   3831   1.1  alnsn 	static struct bpf_insn insns[] = {
   3832   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
   3833   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3834   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3835   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3836   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3837   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3838   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
   3839   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3840   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3841   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3842   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3843   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3844   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3845   1.1  alnsn 	};
   3846   1.1  alnsn 
   3847   1.1  alnsn 	size_t i, j;
   3848   1.2  rmind 	bpfjit_func_t code;
   3849   1.1  alnsn 	uint8_t pkt[2][34] = {
   3850   1.1  alnsn 		{
   3851   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3852   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3853   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3854   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3855   1.1  alnsn 		},
   3856   1.1  alnsn 		{
   3857   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3858   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3859   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3860   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3861   1.1  alnsn 		}
   3862   1.1  alnsn 	};
   3863   1.1  alnsn 
   3864   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3865   1.1  alnsn 
   3866   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3867   1.1  alnsn 
   3868   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3869   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3870   1.1  alnsn 
   3871   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3872   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3873   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3874   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3875   1.1  alnsn 	}
   3876   1.1  alnsn 
   3877   1.1  alnsn 	bpfjit_free_code(code);
   3878   1.1  alnsn }
   3879   1.1  alnsn 
   3880   1.6  alnsn ATF_TC(libbpfjit_opt_ld_ind_4);
   3881   1.6  alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
   3882   1.1  alnsn {
   3883   1.1  alnsn 	atf_tc_set_md_var(tc, "descr",
   3884   1.1  alnsn 	    "Test JIT compilation with length optimization "
   3885   1.1  alnsn 	    "applied to BPF_LD+BPF_IND");
   3886   1.1  alnsn }
   3887   1.1  alnsn 
   3888   1.6  alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
   3889   1.1  alnsn {
   3890   1.1  alnsn 	static struct bpf_insn insns[] = {
   3891   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
   3892   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
   3893   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
   3894   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3895   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
   3896   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
   3897   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
   3898   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
   3899   1.1  alnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
   3900   1.1  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
   3901   1.1  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
   3902   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3903   1.1  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3904   1.1  alnsn 	};
   3905   1.1  alnsn 
   3906   1.1  alnsn 	size_t i, j;
   3907   1.2  rmind 	bpfjit_func_t code;
   3908   1.1  alnsn 	uint8_t pkt[2][34] = {
   3909   1.1  alnsn 		{
   3910   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3911   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3912   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f,
   3913   1.1  alnsn 			0x80, 0x03, 0x70, 0x23
   3914   1.1  alnsn 		},
   3915   1.1  alnsn 		{
   3916   1.1  alnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
   3917   1.1  alnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   3918   1.1  alnsn 			0x80, 0x03, 0x70, 0x23,
   3919   1.1  alnsn 			0x80, 0x03, 0x70, 0x0f
   3920   1.1  alnsn 		}
   3921   1.1  alnsn 	};
   3922   1.1  alnsn 
   3923   1.1  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3924   1.1  alnsn 
   3925   1.1  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3926   1.1  alnsn 
   3927   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3928   1.1  alnsn 	ATF_REQUIRE(code != NULL);
   3929   1.1  alnsn 
   3930   1.1  alnsn 	for (i = 0; i < 2; i++) {
   3931   1.1  alnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
   3932   1.5  alnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
   3933   1.5  alnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
   3934   1.1  alnsn 	}
   3935   1.1  alnsn 
   3936   1.1  alnsn 	bpfjit_free_code(code);
   3937   1.1  alnsn }
   3938   1.1  alnsn 
   3939   1.6  alnsn ATF_TC(libbpfjit_abc_ja);
   3940   1.6  alnsn ATF_TC_HEAD(libbpfjit_abc_ja, tc)
   3941   1.3  alnsn {
   3942   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   3943   1.3  alnsn 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
   3944   1.3  alnsn }
   3945   1.3  alnsn 
   3946   1.6  alnsn ATF_TC_BODY(libbpfjit_abc_ja, tc)
   3947   1.3  alnsn {
   3948   1.3  alnsn 	static struct bpf_insn insns[] = {
   3949   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   3950   1.3  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   3951   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
   3952   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3953   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
   3954   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
   3955   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   3956   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   3957   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   3958   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
   3959   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   3960   1.3  alnsn 	};
   3961   1.3  alnsn 
   3962   1.3  alnsn 	bpfjit_func_t code;
   3963   1.3  alnsn 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
   3964   1.3  alnsn 
   3965   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   3966   1.3  alnsn 
   3967   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   3968   1.3  alnsn 
   3969   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   3970   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   3971   1.3  alnsn 
   3972   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   3973   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   3974   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   3975   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   3976   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   3977   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
   3978   1.3  alnsn 
   3979   1.3  alnsn 	bpfjit_free_code(code);
   3980   1.3  alnsn }
   3981   1.3  alnsn 
   3982   1.6  alnsn ATF_TC(libbpfjit_abc_ja_over);
   3983   1.6  alnsn ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
   3984   1.3  alnsn {
   3985   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   3986   1.3  alnsn 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
   3987   1.3  alnsn }
   3988   1.3  alnsn 
   3989   1.6  alnsn ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
   3990   1.3  alnsn {
   3991   1.3  alnsn 	static struct bpf_insn insns[] = {
   3992   1.3  alnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
   3993   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
   3994   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   3995   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   3996   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
   3997   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
   3998   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
   3999   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
   4000   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
   4001   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
   4002   1.3  alnsn 	};
   4003   1.3  alnsn 
   4004   1.3  alnsn 	bpfjit_func_t code;
   4005   1.3  alnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
   4006   1.3  alnsn 
   4007   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4008   1.3  alnsn 
   4009   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   4010   1.3  alnsn 
   4011   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4012   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   4013   1.3  alnsn 
   4014   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
   4015   1.3  alnsn 
   4016   1.3  alnsn 	bpfjit_free_code(code);
   4017   1.3  alnsn }
   4018   1.3  alnsn 
   4019   1.6  alnsn ATF_TC(libbpfjit_abc_ld_chain);
   4020   1.6  alnsn ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
   4021   1.3  alnsn {
   4022   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   4023   1.3  alnsn 	    "Test ABC optimization of a chain of BPF_LD instructions "
   4024   1.3  alnsn 	    "with exits leading to a single BPF_RET");
   4025   1.3  alnsn }
   4026   1.3  alnsn 
   4027   1.6  alnsn ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
   4028   1.3  alnsn {
   4029   1.3  alnsn 	static struct bpf_insn insns[] = {
   4030   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
   4031   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
   4032   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
   4033   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
   4034   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
   4035   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
   4036   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 123456789),
   4037   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 987654321),
   4038   1.3  alnsn 	};
   4039   1.3  alnsn 
   4040   1.3  alnsn 	bpfjit_func_t code;
   4041   1.3  alnsn 	uint8_t pkt[10] = {};
   4042   1.3  alnsn 
   4043   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4044   1.3  alnsn 
   4045   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   4046   1.3  alnsn 
   4047   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4048   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   4049   1.3  alnsn 
   4050   1.3  alnsn 	/* Packet is too short. */
   4051   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4052   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4053   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4054   1.3  alnsn 
   4055   1.3  alnsn 	/* !(pkt[3] == 8) => return 123456789 */
   4056   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
   4057   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
   4058   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4059   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
   4060   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
   4061   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4062   1.3  alnsn 
   4063   1.3  alnsn 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
   4064   1.3  alnsn 	pkt[3] = 8;
   4065   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4066   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4067   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4068   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4069   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4070   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
   4071   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
   4072   1.3  alnsn 
   4073   1.3  alnsn 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
   4074   1.3  alnsn 	pkt[4] = pkt[5] = 1;
   4075   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4076   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4077   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4078   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4079   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4080   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4081   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4082   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4083   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4084   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
   4085   1.3  alnsn 
   4086   1.3  alnsn 	/* (pkt[6:4] > 6) => too short or return 123456789 */
   4087   1.3  alnsn 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
   4088   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4089   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4090   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4091   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4092   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4093   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4094   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4095   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4096   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4097   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
   4098   1.3  alnsn 
   4099   1.3  alnsn 	bpfjit_free_code(code);
   4100   1.3  alnsn }
   4101   1.3  alnsn 
   4102   1.6  alnsn ATF_TC(libbpfjit_examples_1);
   4103   1.6  alnsn ATF_TC_HEAD(libbpfjit_examples_1, tc)
   4104   1.3  alnsn {
   4105   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   4106   1.3  alnsn 	    "Test the first example from bpf(4) - "
   4107   1.3  alnsn 	    "accept Reverse ARP requests");
   4108   1.3  alnsn }
   4109   1.3  alnsn 
   4110   1.6  alnsn ATF_TC_BODY(libbpfjit_examples_1, tc)
   4111   1.3  alnsn {
   4112   1.3  alnsn 	/*
   4113   1.3  alnsn 	 * The following filter is taken from the Reverse ARP
   4114   1.3  alnsn 	 * Daemon. It accepts only Reverse ARP requests.
   4115   1.3  alnsn 	 */
   4116   1.3  alnsn 	struct bpf_insn insns[] = {
   4117   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4118   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
   4119   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4120   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
   4121   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 42),
   4122   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4123   1.3  alnsn 	};
   4124   1.3  alnsn 
   4125   1.3  alnsn 	bpfjit_func_t code;
   4126   1.3  alnsn 	uint8_t pkt[22] = {};
   4127   1.3  alnsn 
   4128   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4129   1.3  alnsn 
   4130   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   4131   1.3  alnsn 
   4132   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4133   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   4134   1.3  alnsn 
   4135   1.3  alnsn 	/* Packet is too short. */
   4136   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4137   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4138   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4139   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4140   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4141   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4142   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4143   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4144   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4145   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4146   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4147   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4148   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4149   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4150   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4151   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4152   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4153   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4154   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4155   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4156   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4157   1.3  alnsn 
   4158   1.3  alnsn 	/* The packet doesn't match. */
   4159   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4160   1.3  alnsn 
   4161   1.3  alnsn 	/* Still no match after setting the protocol field. */
   4162   1.3  alnsn 	pkt[12] = 0x80; pkt[13] = 0x35;
   4163   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4164   1.3  alnsn 
   4165   1.3  alnsn 	/* Set RARP message type. */
   4166   1.3  alnsn 	pkt[21] = 3;
   4167   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
   4168   1.3  alnsn 
   4169   1.3  alnsn 	/* Packet is too short. */
   4170   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4171   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4172   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4173   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4174   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4175   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4176   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4177   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4178   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4179   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4180   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4181   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4182   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4183   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4184   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4185   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4186   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4187   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4188   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4189   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4190   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4191   1.3  alnsn 
   4192   1.3  alnsn 	/* Change RARP message type. */
   4193   1.3  alnsn 	pkt[20] = 3;
   4194   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4195   1.3  alnsn 
   4196   1.3  alnsn 	bpfjit_free_code(code);
   4197   1.3  alnsn }
   4198   1.3  alnsn 
   4199   1.6  alnsn ATF_TC(libbpfjit_examples_2);
   4200   1.6  alnsn ATF_TC_HEAD(libbpfjit_examples_2, tc)
   4201   1.3  alnsn {
   4202   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   4203   1.3  alnsn 	    "Test the second example from bpf(4) - "
   4204   1.3  alnsn 	    "accept IP packets between two specified hosts");
   4205   1.3  alnsn }
   4206   1.3  alnsn 
   4207   1.6  alnsn ATF_TC_BODY(libbpfjit_examples_2, tc)
   4208   1.3  alnsn {
   4209   1.3  alnsn 	/*
   4210   1.3  alnsn 	 * This filter accepts only IP packets between host 128.3.112.15
   4211   1.3  alnsn 	 * and 128.3.112.35.
   4212   1.3  alnsn 	 */
   4213   1.3  alnsn 	static struct bpf_insn insns[] = {
   4214   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4215   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
   4216   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
   4217   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
   4218   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4219   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
   4220   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
   4221   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
   4222   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
   4223   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4224   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4225   1.3  alnsn 	};
   4226   1.3  alnsn 
   4227   1.3  alnsn 	bpfjit_func_t code;
   4228   1.3  alnsn 	uint8_t pkt[34] = {};
   4229   1.3  alnsn 
   4230   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4231   1.3  alnsn 
   4232   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   4233   1.3  alnsn 
   4234   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4235   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   4236   1.3  alnsn 
   4237   1.3  alnsn 	/* Packet is too short. */
   4238   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4239   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4240   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4241   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4242   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4243   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4244   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4245   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4246   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4247   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4248   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4249   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4250   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4251   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4252   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4253   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4254   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4255   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4256   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4257   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4258   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4259   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4260   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4261   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4262   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4263   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4264   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4265   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4266   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4267   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4268   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4269   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4270   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4271   1.3  alnsn 
   4272   1.3  alnsn 	/* The packet doesn't match. */
   4273   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4274   1.3  alnsn 
   4275   1.3  alnsn 	/* Still no match after setting the protocol field. */
   4276   1.3  alnsn 	pkt[12] = 8;
   4277   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4278   1.3  alnsn 
   4279   1.3  alnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
   4280   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4281   1.3  alnsn 
   4282   1.3  alnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
   4283   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4284   1.3  alnsn 
   4285   1.3  alnsn 	/* Swap the ip addresses. */
   4286   1.3  alnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
   4287   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4288   1.3  alnsn 
   4289   1.3  alnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
   4290   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
   4291   1.3  alnsn 
   4292   1.3  alnsn 	/* Packet is too short. */
   4293   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4294   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4295   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4296   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4297   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4298   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4299   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4300   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4301   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4302   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4303   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4304   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4305   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4306   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4307   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4308   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4309   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4310   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4311   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4312   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4313   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4314   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4315   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4316   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4317   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4318   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4319   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4320   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4321   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4322   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4323   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
   4324   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
   4325   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
   4326   1.3  alnsn 
   4327   1.3  alnsn 	/* Change the protocol field. */
   4328   1.3  alnsn 	pkt[13] = 8;
   4329   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
   4330   1.3  alnsn 
   4331   1.3  alnsn 	bpfjit_free_code(code);
   4332   1.3  alnsn }
   4333   1.3  alnsn 
   4334   1.6  alnsn ATF_TC(libbpfjit_examples_3);
   4335   1.6  alnsn ATF_TC_HEAD(libbpfjit_examples_3, tc)
   4336   1.3  alnsn {
   4337   1.3  alnsn 	atf_tc_set_md_var(tc, "descr",
   4338   1.3  alnsn 	    "Test the third example from bpf(4) - "
   4339   1.3  alnsn 	    "accept TCP finger packets");
   4340   1.3  alnsn }
   4341   1.3  alnsn 
   4342   1.6  alnsn ATF_TC_BODY(libbpfjit_examples_3, tc)
   4343   1.3  alnsn {
   4344   1.3  alnsn 	/*
   4345   1.3  alnsn 	 * This filter returns only TCP finger packets.
   4346   1.3  alnsn 	 */
   4347   1.3  alnsn 	struct bpf_insn insns[] = {
   4348   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
   4349   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
   4350   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
   4351   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
   4352   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
   4353   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
   4354   1.3  alnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
   4355   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
   4356   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
   4357   1.3  alnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
   4358   1.3  alnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
   4359   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
   4360   1.3  alnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
   4361   1.3  alnsn 	};
   4362   1.3  alnsn 
   4363   1.3  alnsn 	bpfjit_func_t code;
   4364   1.3  alnsn 	uint8_t pkt[30] = {};
   4365   1.3  alnsn 
   4366   1.3  alnsn 	/* Set IP fragment offset to non-zero. */
   4367   1.3  alnsn 	pkt[20] = 1; pkt[21] = 1;
   4368   1.3  alnsn 
   4369   1.3  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4370   1.3  alnsn 
   4371   1.3  alnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
   4372   1.3  alnsn 
   4373   1.5  alnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
   4374   1.3  alnsn 	ATF_REQUIRE(code != NULL);
   4375   1.3  alnsn 
   4376   1.3  alnsn 	/* Packet is too short. */
   4377   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4378   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4379   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4380   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4381   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4382   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4383   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4384   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4385   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4386   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4387   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4388   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4389   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4390   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4391   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4392   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4393   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4394   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4395   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4396   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4397   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4398   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4399   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4400   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4401   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4402   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4403   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4404   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4405   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4406   1.3  alnsn 
   4407   1.3  alnsn 	/* The packet doesn't match. */
   4408   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4409   1.3  alnsn 
   4410   1.3  alnsn 	/* Still no match after setting the protocol field. */
   4411   1.3  alnsn 	pkt[12] = 8;
   4412   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4413   1.3  alnsn 
   4414   1.3  alnsn 	/* Get one step closer to the match. */
   4415   1.3  alnsn 	pkt[23] = 6;
   4416   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4417   1.3  alnsn 
   4418   1.3  alnsn 	/* Set IP fragment offset to zero. */
   4419   1.3  alnsn 	pkt[20] = 0x20; pkt[21] = 0;
   4420   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4421   1.3  alnsn 
   4422   1.3  alnsn 	/* Set IP header length to 12. */
   4423   1.3  alnsn 	pkt[14] = 0xd3;
   4424   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4425   1.3  alnsn 
   4426   1.3  alnsn 	/* Match one branch of the program. */
   4427   1.3  alnsn 	pkt[27] = 79;
   4428   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4429   1.3  alnsn 
   4430   1.3  alnsn 	/* Match the other branch of the program. */
   4431   1.3  alnsn 	pkt[29] = 79; pkt[27] = 0;
   4432   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
   4433   1.3  alnsn 
   4434   1.3  alnsn 	/* Packet is too short. */
   4435   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
   4436   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
   4437   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
   4438   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
   4439   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
   4440   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
   4441   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
   4442   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
   4443   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
   4444   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
   4445   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
   4446   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
   4447   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
   4448   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
   4449   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
   4450   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
   4451   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
   4452   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
   4453   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
   4454   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
   4455   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
   4456   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
   4457   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
   4458   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
   4459   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
   4460   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
   4461   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
   4462   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
   4463   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
   4464   1.3  alnsn 
   4465   1.3  alnsn 	/* Set IP header length to 16. Packet is too short. */
   4466   1.3  alnsn 	pkt[14] = 4;
   4467   1.5  alnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
   4468   1.3  alnsn 
   4469   1.3  alnsn 	bpfjit_free_code(code);
   4470   1.3  alnsn }
   4471   1.3  alnsn 
   4472   1.6  alnsn ATF_TC(libbpfjit_cop_no_ctx);
   4473   1.6  alnsn ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
   4474   1.5  alnsn {
   4475   1.5  alnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
   4476   1.5  alnsn 	    "instruction can't be accepted without a context");
   4477   1.5  alnsn }
   4478   1.5  alnsn 
   4479   1.6  alnsn ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
   4480   1.5  alnsn {
   4481   1.5  alnsn 	static struct bpf_insn insns[] = {
   4482   1.5  alnsn 		BPF_STMT(BPF_MISC+BPF_COP, 0),
   4483   1.5  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   4484   1.5  alnsn 	};
   4485   1.5  alnsn 
   4486   1.5  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4487   1.5  alnsn 
   4488   1.5  alnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
   4489   1.5  alnsn 
   4490   1.5  alnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
   4491   1.5  alnsn }
   4492   1.5  alnsn 
   4493   1.6  alnsn ATF_TC(libbpfjit_copx_no_ctx);
   4494   1.6  alnsn ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
   4495   1.5  alnsn {
   4496   1.5  alnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
   4497   1.5  alnsn 	    "instruction can't be accepted without a context");
   4498   1.5  alnsn }
   4499   1.5  alnsn 
   4500   1.6  alnsn ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
   4501   1.5  alnsn {
   4502   1.5  alnsn 	static struct bpf_insn insns[] = {
   4503   1.5  alnsn 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
   4504   1.5  alnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
   4505   1.5  alnsn 	};
   4506   1.5  alnsn 
   4507   1.5  alnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
   4508   1.5  alnsn 
   4509   1.5  alnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
   4510   1.5  alnsn 
   4511   1.5  alnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
   4512   1.5  alnsn }
   4513   1.5  alnsn 
   4514   1.1  alnsn ATF_TP_ADD_TCS(tp)
   4515   1.1  alnsn {
   4516   1.1  alnsn 
   4517   1.6  alnsn 	/*
   4518   1.6  alnsn 	 * For every new test please also add a similar test
   4519   1.6  alnsn 	 * to ../../net/bpfjit/t_bpfjit.c
   4520   1.6  alnsn 	 */
   4521   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_empty);
   4522   1.9  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ret_k);
   4523   1.9  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_bad_ret_k);
   4524   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
   4525   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
   4526   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
   4527   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
   4528   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
   4529   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
   4530   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
   4531   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
   4532   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
   4533   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
   4534   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
   4535   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
   4536   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
   4537   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
   4538   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
   4539   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
   4540   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
   4541   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
   4542   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
   4543   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
   4544   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
   4545   1.7  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
   4546   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
   4547   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
   4548   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
   4549   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
   4550   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
   4551   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
   4552   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
   4553   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
   4554   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
   4555   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
   4556   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
   4557   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
   4558   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
   4559   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
   4560   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
   4561   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
   4562   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
   4563   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
   4564   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
   4565   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
   4566   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
   4567   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
   4568   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
   4569   1.8  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
   4570   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
   4571   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
   4572   1.7  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
   4573   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
   4574   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
   4575   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
   4576   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
   4577   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
   4578   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
   4579   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
   4580  1.10  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_invalid);
   4581   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
   4582   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
   4583   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
   4584   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
   4585   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
   4586   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
   4587   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
   4588   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
   4589   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
   4590   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
   4591   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
   4592   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
   4593   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
   4594   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
   4595   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
   4596   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
   4597   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
   4598   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
   4599   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
   4600   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
   4601   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
   4602   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
   4603   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
   4604   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
   4605   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
   4606   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st1);
   4607   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st2);
   4608   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st3);
   4609   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st4);
   4610   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st5);
   4611   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx1);
   4612   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx2);
   4613   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx3);
   4614   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx4);
   4615   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
   4616   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
   4617   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
   4618   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
   4619   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
   4620   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
   4621   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
   4622   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
   4623   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
   4624   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
   4625   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
   4626   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
   4627   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
   4628   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
   4629   1.6  alnsn 	ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
   4630   1.1  alnsn 
   4631   1.1  alnsn 	return atf_no_error();
   4632   1.1  alnsn }
   4633