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