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