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