xref: /netbsd-src/tests/lib/libbpfjit/t_bpfjit.c (revision e58149cdf7e55d374a86ff10f936fec47b31cc7a)
1*e58149cdSmrg /*	$NetBSD: t_bpfjit.c,v 1.15 2023/08/07 23:29:58 mrg Exp $ */
265b4b421Salnsn 
365b4b421Salnsn /*-
46d5b9045Salnsn  * Copyright (c) 2011-2012, 2014-2015 Alexander Nasonov.
565b4b421Salnsn  * All rights reserved.
665b4b421Salnsn  *
765b4b421Salnsn  * Redistribution and use in source and binary forms, with or without
865b4b421Salnsn  * modification, are permitted provided that the following conditions
965b4b421Salnsn  * are met:
1065b4b421Salnsn  *
1165b4b421Salnsn  * 1. Redistributions of source code must retain the above copyright
1265b4b421Salnsn  *    notice, this list of conditions and the following disclaimer.
1365b4b421Salnsn  * 2. Redistributions in binary form must reproduce the above copyright
1465b4b421Salnsn  *    notice, this list of conditions and the following disclaimer in
1565b4b421Salnsn  *    the documentation and/or other materials provided with the
1665b4b421Salnsn  *    distribution.
1765b4b421Salnsn  *
1865b4b421Salnsn  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1965b4b421Salnsn  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2065b4b421Salnsn  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2165b4b421Salnsn  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
2265b4b421Salnsn  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2365b4b421Salnsn  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
2465b4b421Salnsn  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2565b4b421Salnsn  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2665b4b421Salnsn  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2765b4b421Salnsn  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2865b4b421Salnsn  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2965b4b421Salnsn  * SUCH DAMAGE.
3065b4b421Salnsn  */
3165b4b421Salnsn 
3265b4b421Salnsn #include <sys/cdefs.h>
33*e58149cdSmrg __RCSID("$NetBSD: t_bpfjit.c,v 1.15 2023/08/07 23:29:58 mrg Exp $");
3465b4b421Salnsn 
3565b4b421Salnsn #include <atf-c.h>
3665b4b421Salnsn #include <stdint.h>
3765b4b421Salnsn #include <string.h>
3865b4b421Salnsn 
39d0748eb9Srmind #include <net/bpf.h>
40d0748eb9Srmind #include <net/bpfjit.h>
41d0748eb9Srmind 
4265b4b421Salnsn static uint8_t deadbeef_at_5[16] = {
4365b4b421Salnsn 	0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
4465b4b421Salnsn };
4565b4b421Salnsn 
4619fed70dSalnsn static inline
jitcall(bpfjit_func_t fn,const uint8_t * pkt,unsigned int wirelen,unsigned int buflen)4719fed70dSalnsn unsigned int jitcall(bpfjit_func_t fn,
4819fed70dSalnsn     const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
4919fed70dSalnsn {
5019fed70dSalnsn 	bpf_args_t args;
5119fed70dSalnsn 
5219fed70dSalnsn 	args.pkt = pkt;
5319fed70dSalnsn 	args.wirelen = wirelen;
5419fed70dSalnsn 	args.buflen = buflen;
5519fed70dSalnsn 
5619fed70dSalnsn 	return fn(NULL, &args);
5719fed70dSalnsn }
58d0748eb9Srmind 
59658efa86Salnsn ATF_TC(libbpfjit_empty);
ATF_TC_HEAD(libbpfjit_empty,tc)60658efa86Salnsn ATF_TC_HEAD(libbpfjit_empty, tc)
6165b4b421Salnsn {
6265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
63658efa86Salnsn 	    "Test that JIT compilation of an empty bpf program fails");
6465b4b421Salnsn }
6565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_empty,tc)66658efa86Salnsn ATF_TC_BODY(libbpfjit_empty, tc)
6765b4b421Salnsn {
68*e58149cdSmrg 	struct bpf_insn dummy = { 0 };
6965b4b421Salnsn 
709dc6430cSalnsn 	ATF_CHECK(!bpf_validate(&dummy, 0));
7119fed70dSalnsn 	ATF_CHECK(bpfjit_generate_code(NULL, &dummy, 0) == NULL);
7265b4b421Salnsn }
7365b4b421Salnsn 
74b43344f3Salnsn ATF_TC(libbpfjit_ret_k);
ATF_TC_HEAD(libbpfjit_ret_k,tc)75b43344f3Salnsn ATF_TC_HEAD(libbpfjit_ret_k, tc)
76b43344f3Salnsn {
77b43344f3Salnsn 	atf_tc_set_md_var(tc, "descr",
78b43344f3Salnsn 	    "Test JIT compilation of a trivial bpf program");
79b43344f3Salnsn }
80b43344f3Salnsn 
ATF_TC_BODY(libbpfjit_ret_k,tc)81b43344f3Salnsn ATF_TC_BODY(libbpfjit_ret_k, tc)
82b43344f3Salnsn {
83b43344f3Salnsn 	static struct bpf_insn insns[] = {
84b43344f3Salnsn 		BPF_STMT(BPF_RET+BPF_K, 17)
85b43344f3Salnsn 	};
86b43344f3Salnsn 
87b43344f3Salnsn 	bpfjit_func_t code;
88b43344f3Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
89b43344f3Salnsn 
90b43344f3Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
91b43344f3Salnsn 
92b43344f3Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
93b43344f3Salnsn 
94b43344f3Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
95b43344f3Salnsn 	ATF_REQUIRE(code != NULL);
96b43344f3Salnsn 
97b43344f3Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 17);
98b43344f3Salnsn 
99b43344f3Salnsn 	bpfjit_free_code(code);
100b43344f3Salnsn }
101b43344f3Salnsn 
102b43344f3Salnsn ATF_TC(libbpfjit_bad_ret_k);
ATF_TC_HEAD(libbpfjit_bad_ret_k,tc)103b43344f3Salnsn ATF_TC_HEAD(libbpfjit_bad_ret_k, tc)
104b43344f3Salnsn {
105b43344f3Salnsn 	atf_tc_set_md_var(tc, "descr",
106b43344f3Salnsn 	    "Test that JIT compilation of a program with bad BPF_RET fails");
107b43344f3Salnsn }
108b43344f3Salnsn 
ATF_TC_BODY(libbpfjit_bad_ret_k,tc)109b43344f3Salnsn ATF_TC_BODY(libbpfjit_bad_ret_k, tc)
110b43344f3Salnsn {
111b43344f3Salnsn 	static struct bpf_insn insns[] = {
112b43344f3Salnsn 		BPF_STMT(BPF_RET+BPF_K+0x8000, 13)
113b43344f3Salnsn 	};
114b43344f3Salnsn 
115b43344f3Salnsn 	bpfjit_func_t code;
116b43344f3Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
117b43344f3Salnsn 
118b43344f3Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
119b43344f3Salnsn 
120b43344f3Salnsn 	/*
121b43344f3Salnsn 	 * The point of this test is checking a bad instruction of
122b43344f3Salnsn 	 * a valid class and with a valid BPF_RVAL data.
123b43344f3Salnsn 	 */
124b43344f3Salnsn 	const uint16_t rcode = insns[0].code;
125b43344f3Salnsn 	ATF_CHECK(BPF_CLASS(rcode) == BPF_RET &&
126b43344f3Salnsn 	    (BPF_RVAL(rcode) == BPF_K || BPF_RVAL(rcode) == BPF_A));
127b43344f3Salnsn 
128b43344f3Salnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
129b43344f3Salnsn 
130b43344f3Salnsn 	/* Current implementation generates code. */
131b43344f3Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
132b43344f3Salnsn 	ATF_REQUIRE(code != NULL);
133b43344f3Salnsn 
134b43344f3Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 13);
135b43344f3Salnsn 
136b43344f3Salnsn 	bpfjit_free_code(code);
137b43344f3Salnsn }
138b43344f3Salnsn 
139658efa86Salnsn ATF_TC(libbpfjit_alu_add_k);
ATF_TC_HEAD(libbpfjit_alu_add_k,tc)140658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_add_k, tc)
14165b4b421Salnsn {
14265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
14365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
14465b4b421Salnsn }
14565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_add_k,tc)146658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_add_k, tc)
14765b4b421Salnsn {
14865b4b421Salnsn 	static struct bpf_insn insns[] = {
14965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
15065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
15165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
15265b4b421Salnsn 	};
15365b4b421Salnsn 
154d0748eb9Srmind 	bpfjit_func_t code;
15565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
15665b4b421Salnsn 
15765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
15865b4b421Salnsn 
15965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
16065b4b421Salnsn 
16119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
16265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
16365b4b421Salnsn 
16419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
16565b4b421Salnsn 
16665b4b421Salnsn 	bpfjit_free_code(code);
16765b4b421Salnsn }
16865b4b421Salnsn 
169658efa86Salnsn ATF_TC(libbpfjit_alu_sub_k);
ATF_TC_HEAD(libbpfjit_alu_sub_k,tc)170658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_sub_k, tc)
17165b4b421Salnsn {
17265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
17365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
17465b4b421Salnsn }
17565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_sub_k,tc)176658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_sub_k, tc)
17765b4b421Salnsn {
17865b4b421Salnsn 	static struct bpf_insn insns[] = {
17965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 1),
18065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
18165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
18265b4b421Salnsn 	};
18365b4b421Salnsn 
184d0748eb9Srmind 	bpfjit_func_t code;
18565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
18665b4b421Salnsn 
18765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
18865b4b421Salnsn 
18965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
19065b4b421Salnsn 
19119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
19265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
19365b4b421Salnsn 
19419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
19565b4b421Salnsn 
19665b4b421Salnsn 	bpfjit_free_code(code);
19765b4b421Salnsn }
19865b4b421Salnsn 
199658efa86Salnsn ATF_TC(libbpfjit_alu_mul_k);
ATF_TC_HEAD(libbpfjit_alu_mul_k,tc)200658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_mul_k, tc)
20165b4b421Salnsn {
20265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
20365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
20465b4b421Salnsn }
20565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_mul_k,tc)206658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_mul_k, tc)
20765b4b421Salnsn {
20865b4b421Salnsn 	static struct bpf_insn insns[] = {
20965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
21065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
21165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
21265b4b421Salnsn 	};
21365b4b421Salnsn 
214d0748eb9Srmind 	bpfjit_func_t code;
21565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
21665b4b421Salnsn 
21765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
21865b4b421Salnsn 
21965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
22065b4b421Salnsn 
22119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
22265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
22365b4b421Salnsn 
22419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
22565b4b421Salnsn 
22665b4b421Salnsn 	bpfjit_free_code(code);
22765b4b421Salnsn }
22865b4b421Salnsn 
229658efa86Salnsn ATF_TC(libbpfjit_alu_div0_k);
ATF_TC_HEAD(libbpfjit_alu_div0_k,tc)230658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div0_k, tc)
23165b4b421Salnsn {
23265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
23365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
23465b4b421Salnsn }
23565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div0_k,tc)236658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div0_k, tc)
23765b4b421Salnsn {
23865b4b421Salnsn 	static struct bpf_insn insns[] = {
23965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
24065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
24165b4b421Salnsn 	};
24265b4b421Salnsn 
243d0748eb9Srmind 	bpfjit_func_t code;
24465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
24565b4b421Salnsn 
24665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
24765b4b421Salnsn 
24865b4b421Salnsn 	//ATF_CHECK(bpf_validate(insns, insn_count));
24965b4b421Salnsn 
25019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
25165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
25265b4b421Salnsn 
25319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
25465b4b421Salnsn 
25565b4b421Salnsn 	bpfjit_free_code(code);
25665b4b421Salnsn }
25765b4b421Salnsn 
258658efa86Salnsn ATF_TC(libbpfjit_alu_div1_k);
ATF_TC_HEAD(libbpfjit_alu_div1_k,tc)259658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div1_k, tc)
26065b4b421Salnsn {
26165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
26265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
26365b4b421Salnsn }
26465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div1_k,tc)265658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div1_k, tc)
26665b4b421Salnsn {
26765b4b421Salnsn 	static struct bpf_insn insns[] = {
26865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
26965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
27065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
27165b4b421Salnsn 	};
27265b4b421Salnsn 
273d0748eb9Srmind 	bpfjit_func_t code;
27465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
27565b4b421Salnsn 
27665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
27765b4b421Salnsn 
27865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
27965b4b421Salnsn 
28019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
28165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
28265b4b421Salnsn 
28319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
28465b4b421Salnsn 
28565b4b421Salnsn 	bpfjit_free_code(code);
28665b4b421Salnsn }
28765b4b421Salnsn 
288658efa86Salnsn ATF_TC(libbpfjit_alu_div2_k);
ATF_TC_HEAD(libbpfjit_alu_div2_k,tc)289658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div2_k, tc)
29065b4b421Salnsn {
29165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
29265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
29365b4b421Salnsn }
29465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div2_k,tc)295658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div2_k, tc)
29665b4b421Salnsn {
29765b4b421Salnsn 	static struct bpf_insn insns[] = {
29865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
29965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
30065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
30165b4b421Salnsn 	};
30265b4b421Salnsn 
303d0748eb9Srmind 	bpfjit_func_t code;
30465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
30565b4b421Salnsn 
30665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
30765b4b421Salnsn 
30865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
30965b4b421Salnsn 
31019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
31165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
31265b4b421Salnsn 
31319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
31465b4b421Salnsn 
31565b4b421Salnsn 	bpfjit_free_code(code);
31665b4b421Salnsn }
31765b4b421Salnsn 
318658efa86Salnsn ATF_TC(libbpfjit_alu_div4_k);
ATF_TC_HEAD(libbpfjit_alu_div4_k,tc)319658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div4_k, tc)
32065b4b421Salnsn {
32165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
32265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
32365b4b421Salnsn }
32465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div4_k,tc)325658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div4_k, tc)
32665b4b421Salnsn {
32765b4b421Salnsn 	static struct bpf_insn insns[] = {
32865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
32965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
33065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
33165b4b421Salnsn 	};
33265b4b421Salnsn 
333d0748eb9Srmind 	bpfjit_func_t code;
33465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
33565b4b421Salnsn 
33665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
33765b4b421Salnsn 
33865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
33965b4b421Salnsn 
34019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
34165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
34265b4b421Salnsn 
34319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
34465b4b421Salnsn 
34565b4b421Salnsn 	bpfjit_free_code(code);
34665b4b421Salnsn }
34765b4b421Salnsn 
348658efa86Salnsn ATF_TC(libbpfjit_alu_div10_k);
ATF_TC_HEAD(libbpfjit_alu_div10_k,tc)349658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div10_k, tc)
35065b4b421Salnsn {
35165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
35265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
35365b4b421Salnsn }
35465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div10_k,tc)355658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div10_k, tc)
35665b4b421Salnsn {
35765b4b421Salnsn 	static struct bpf_insn insns[] = {
35865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
35965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
36065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
36165b4b421Salnsn 	};
36265b4b421Salnsn 
363d0748eb9Srmind 	bpfjit_func_t code;
36465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
36565b4b421Salnsn 
36665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
36765b4b421Salnsn 
36865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
36965b4b421Salnsn 
37019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
37165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
37265b4b421Salnsn 
37319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
37465b4b421Salnsn 
37565b4b421Salnsn 	bpfjit_free_code(code);
37665b4b421Salnsn }
37765b4b421Salnsn 
378658efa86Salnsn ATF_TC(libbpfjit_alu_div10000_k);
ATF_TC_HEAD(libbpfjit_alu_div10000_k,tc)379658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div10000_k, tc)
38065b4b421Salnsn {
38165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
38265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
38365b4b421Salnsn }
38465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div10000_k,tc)385658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div10000_k, tc)
38665b4b421Salnsn {
38765b4b421Salnsn 	static struct bpf_insn insns[] = {
38865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
38965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
39065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
39165b4b421Salnsn 	};
39265b4b421Salnsn 
393d0748eb9Srmind 	bpfjit_func_t code;
39465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
39565b4b421Salnsn 
39665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
39765b4b421Salnsn 
39865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
39965b4b421Salnsn 
40019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
40165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
40265b4b421Salnsn 
40319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
40465b4b421Salnsn 
40565b4b421Salnsn 	bpfjit_free_code(code);
40665b4b421Salnsn }
40765b4b421Salnsn 
408658efa86Salnsn ATF_TC(libbpfjit_alu_div7609801_k);
ATF_TC_HEAD(libbpfjit_alu_div7609801_k,tc)409658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div7609801_k, tc)
41065b4b421Salnsn {
41165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
41265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
41365b4b421Salnsn }
41465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div7609801_k,tc)415658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div7609801_k, tc)
41665b4b421Salnsn {
41765b4b421Salnsn 	static struct bpf_insn insns[] = {
41865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
41965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
42065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
42165b4b421Salnsn 	};
42265b4b421Salnsn 
423d0748eb9Srmind 	bpfjit_func_t code;
42465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
42565b4b421Salnsn 
42665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
42765b4b421Salnsn 
42865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
42965b4b421Salnsn 
43019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
43165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
43265b4b421Salnsn 
43319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
43465b4b421Salnsn 
43565b4b421Salnsn 	bpfjit_free_code(code);
43665b4b421Salnsn }
43765b4b421Salnsn 
438658efa86Salnsn ATF_TC(libbpfjit_alu_div80000000_k);
ATF_TC_HEAD(libbpfjit_alu_div80000000_k,tc)439658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div80000000_k, tc)
44065b4b421Salnsn {
44165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
44265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
44365b4b421Salnsn }
44465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div80000000_k,tc)445658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div80000000_k, tc)
44665b4b421Salnsn {
44765b4b421Salnsn 	static struct bpf_insn insns[] = {
44865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
44965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
45065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
45165b4b421Salnsn 	};
45265b4b421Salnsn 
453d0748eb9Srmind 	bpfjit_func_t code;
45465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
45565b4b421Salnsn 
45665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
45765b4b421Salnsn 
45865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
45965b4b421Salnsn 
46019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
46165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
46265b4b421Salnsn 
46319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
46465b4b421Salnsn 
46565b4b421Salnsn 	bpfjit_free_code(code);
46665b4b421Salnsn }
46765b4b421Salnsn 
468a234612aSalnsn ATF_TC(libbpfjit_alu_mod0_k);
ATF_TC_HEAD(libbpfjit_alu_mod0_k,tc)469a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod0_k, tc)
470a234612aSalnsn {
471a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
472a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0");
473a234612aSalnsn }
474a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod0_k,tc)475a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod0_k, tc)
476a234612aSalnsn {
477a234612aSalnsn 	static struct bpf_insn insns[] = {
478a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0),
479a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
480a234612aSalnsn 	};
481a234612aSalnsn 
482a234612aSalnsn 	bpfjit_func_t code;
483a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
484a234612aSalnsn 
485a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
486a234612aSalnsn 
487a234612aSalnsn 	//ATF_CHECK(bpf_validate(insns, insn_count));
488a234612aSalnsn 
489a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
490a234612aSalnsn 	ATF_REQUIRE(code != NULL);
491a234612aSalnsn 
492a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
493a234612aSalnsn 
494a234612aSalnsn 	bpfjit_free_code(code);
495a234612aSalnsn }
496a234612aSalnsn 
497a234612aSalnsn ATF_TC(libbpfjit_alu_mod1_k);
ATF_TC_HEAD(libbpfjit_alu_mod1_k,tc)498a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod1_k, tc)
499a234612aSalnsn {
500a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
501a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1");
502a234612aSalnsn }
503a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod1_k,tc)504a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod1_k, tc)
505a234612aSalnsn {
506a234612aSalnsn 	static struct bpf_insn insns[] = {
507a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
508a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1),
509a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
510a234612aSalnsn 	};
511a234612aSalnsn 
512a234612aSalnsn 	bpfjit_func_t code;
513a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
514a234612aSalnsn 
515a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
516a234612aSalnsn 
517a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
518a234612aSalnsn 
519a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
520a234612aSalnsn 	ATF_REQUIRE(code != NULL);
521a234612aSalnsn 
522a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
523a234612aSalnsn 
524a234612aSalnsn 	bpfjit_free_code(code);
525a234612aSalnsn }
526a234612aSalnsn 
527a234612aSalnsn ATF_TC(libbpfjit_alu_mod2_k);
ATF_TC_HEAD(libbpfjit_alu_mod2_k,tc)528a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod2_k, tc)
529a234612aSalnsn {
530a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
531a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2");
532a234612aSalnsn }
533a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod2_k,tc)534a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod2_k, tc)
535a234612aSalnsn {
536a234612aSalnsn 	static struct bpf_insn insns[] = {
537a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
538a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2),
539a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
540a234612aSalnsn 	};
541a234612aSalnsn 
542a234612aSalnsn 	bpfjit_func_t code;
543a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
544a234612aSalnsn 
545a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
546a234612aSalnsn 
547a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
548a234612aSalnsn 
549a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
550a234612aSalnsn 	ATF_REQUIRE(code != NULL);
551a234612aSalnsn 
552a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
553a234612aSalnsn 
554a234612aSalnsn 	bpfjit_free_code(code);
555a234612aSalnsn }
556a234612aSalnsn 
557a234612aSalnsn ATF_TC(libbpfjit_alu_mod4_k);
ATF_TC_HEAD(libbpfjit_alu_mod4_k,tc)558a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod4_k, tc)
559a234612aSalnsn {
560a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
561a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4");
562a234612aSalnsn }
563a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod4_k,tc)564a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod4_k, tc)
565a234612aSalnsn {
566a234612aSalnsn 	static struct bpf_insn insns[] = {
567a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
568a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4),
569a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
570a234612aSalnsn 	};
571a234612aSalnsn 
572a234612aSalnsn 	bpfjit_func_t code;
573a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
574a234612aSalnsn 
575a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
576a234612aSalnsn 
577a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
578a234612aSalnsn 
579a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
580a234612aSalnsn 	ATF_REQUIRE(code != NULL);
581a234612aSalnsn 
582a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
583a234612aSalnsn 
584a234612aSalnsn 	bpfjit_free_code(code);
585a234612aSalnsn }
586a234612aSalnsn 
587a234612aSalnsn ATF_TC(libbpfjit_alu_mod10_k);
ATF_TC_HEAD(libbpfjit_alu_mod10_k,tc)588a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod10_k, tc)
589a234612aSalnsn {
590a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
591a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10");
592a234612aSalnsn }
593a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod10_k,tc)594a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod10_k, tc)
595a234612aSalnsn {
596a234612aSalnsn 	static struct bpf_insn insns[] = {
597a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
598a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10),
599a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
600a234612aSalnsn 	};
601a234612aSalnsn 
602a234612aSalnsn 	bpfjit_func_t code;
603a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
604a234612aSalnsn 
605a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
606a234612aSalnsn 
607a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
608a234612aSalnsn 
609a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
610a234612aSalnsn 	ATF_REQUIRE(code != NULL);
611a234612aSalnsn 
612a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
613a234612aSalnsn 
614a234612aSalnsn 	bpfjit_free_code(code);
615a234612aSalnsn }
616a234612aSalnsn 
617a234612aSalnsn ATF_TC(libbpfjit_alu_mod10000_k);
ATF_TC_HEAD(libbpfjit_alu_mod10000_k,tc)618a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod10000_k, tc)
619a234612aSalnsn {
620a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
621a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10000");
622a234612aSalnsn }
623a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod10000_k,tc)624a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod10000_k, tc)
625a234612aSalnsn {
626a234612aSalnsn 	static struct bpf_insn insns[] = {
627a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
628a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10000),
629a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
630a234612aSalnsn 	};
631a234612aSalnsn 
632a234612aSalnsn 	bpfjit_func_t code;
633a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
634a234612aSalnsn 
635a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
636a234612aSalnsn 
637a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
638a234612aSalnsn 
639a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
640a234612aSalnsn 	ATF_REQUIRE(code != NULL);
641a234612aSalnsn 
642a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
643a234612aSalnsn 
644a234612aSalnsn 	bpfjit_free_code(code);
645a234612aSalnsn }
646a234612aSalnsn 
647a234612aSalnsn ATF_TC(libbpfjit_alu_mod7609801_k);
ATF_TC_HEAD(libbpfjit_alu_mod7609801_k,tc)648a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod7609801_k, tc)
649a234612aSalnsn {
650a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
651a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_mod+BPF_K with k=7609801");
652a234612aSalnsn }
653a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod7609801_k,tc)654a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod7609801_k, tc)
655a234612aSalnsn {
656a234612aSalnsn 	static struct bpf_insn insns[] = {
657a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
658a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(7609801)),
659a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
660a234612aSalnsn 	};
661a234612aSalnsn 
662a234612aSalnsn 	bpfjit_func_t code;
663a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
664a234612aSalnsn 
665a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
666a234612aSalnsn 
667a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
668a234612aSalnsn 
669a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
670a234612aSalnsn 	ATF_REQUIRE(code != NULL);
671a234612aSalnsn 
672a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
673a234612aSalnsn 
674a234612aSalnsn 	bpfjit_free_code(code);
675a234612aSalnsn }
676a234612aSalnsn 
677a234612aSalnsn ATF_TC(libbpfjit_alu_mod80000000_k);
ATF_TC_HEAD(libbpfjit_alu_mod80000000_k,tc)678a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod80000000_k, tc)
679a234612aSalnsn {
680a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
681a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0x80000000");
682a234612aSalnsn }
683a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod80000000_k,tc)684a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod80000000_k, tc)
685a234612aSalnsn {
686a234612aSalnsn 	static struct bpf_insn insns[] = {
687a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
688a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(0x80000000)),
689a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
690a234612aSalnsn 	};
691a234612aSalnsn 
692a234612aSalnsn 	bpfjit_func_t code;
693a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
694a234612aSalnsn 
695a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
696a234612aSalnsn 
697a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
698a234612aSalnsn 
699a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
700a234612aSalnsn 	ATF_REQUIRE(code != NULL);
701a234612aSalnsn 
702a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
703a234612aSalnsn 
704a234612aSalnsn 	bpfjit_free_code(code);
705a234612aSalnsn }
706a234612aSalnsn 
707658efa86Salnsn ATF_TC(libbpfjit_alu_and_k);
ATF_TC_HEAD(libbpfjit_alu_and_k,tc)708658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_and_k, tc)
70965b4b421Salnsn {
71065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
71165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
71265b4b421Salnsn }
71365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_and_k,tc)714658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_and_k, tc)
71565b4b421Salnsn {
71665b4b421Salnsn 	static struct bpf_insn insns[] = {
71765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
71865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
71965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
72065b4b421Salnsn 	};
72165b4b421Salnsn 
722d0748eb9Srmind 	bpfjit_func_t code;
72365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
72465b4b421Salnsn 
72565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
72665b4b421Salnsn 
72765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
72865b4b421Salnsn 
72919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
73065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
73165b4b421Salnsn 
73219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
73365b4b421Salnsn 
73465b4b421Salnsn 	bpfjit_free_code(code);
73565b4b421Salnsn }
73665b4b421Salnsn 
737658efa86Salnsn ATF_TC(libbpfjit_alu_or_k);
ATF_TC_HEAD(libbpfjit_alu_or_k,tc)738658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_or_k, tc)
73965b4b421Salnsn {
74065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
74165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
74265b4b421Salnsn }
74365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_or_k,tc)744658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_or_k, tc)
74565b4b421Salnsn {
74665b4b421Salnsn 	static struct bpf_insn insns[] = {
74765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
74865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
74965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
75065b4b421Salnsn 	};
75165b4b421Salnsn 
752d0748eb9Srmind 	bpfjit_func_t code;
75365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
75465b4b421Salnsn 
75565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
75665b4b421Salnsn 
75765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
75865b4b421Salnsn 
75919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
76065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
76165b4b421Salnsn 
76219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
76365b4b421Salnsn 
76465b4b421Salnsn 	bpfjit_free_code(code);
76565b4b421Salnsn }
76665b4b421Salnsn 
767b61069b6Salnsn ATF_TC(libbpfjit_alu_xor_k);
ATF_TC_HEAD(libbpfjit_alu_xor_k,tc)768b61069b6Salnsn ATF_TC_HEAD(libbpfjit_alu_xor_k, tc)
769b61069b6Salnsn {
770b61069b6Salnsn 	atf_tc_set_md_var(tc, "descr",
771b61069b6Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K");
772b61069b6Salnsn }
773b61069b6Salnsn 
ATF_TC_BODY(libbpfjit_alu_xor_k,tc)774b61069b6Salnsn ATF_TC_BODY(libbpfjit_alu_xor_k, tc)
775b61069b6Salnsn {
776b61069b6Salnsn 	static struct bpf_insn insns[] = {
777b61069b6Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
778b61069b6Salnsn 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0x0000b1e0),
779b61069b6Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
780b61069b6Salnsn 	};
781b61069b6Salnsn 
782b61069b6Salnsn 	bpfjit_func_t code;
783b61069b6Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
784b61069b6Salnsn 
785b61069b6Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
786b61069b6Salnsn 
787b61069b6Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
788b61069b6Salnsn 
789b61069b6Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
790b61069b6Salnsn 	ATF_REQUIRE(code != NULL);
791b61069b6Salnsn 
792b61069b6Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
793b61069b6Salnsn 
794b61069b6Salnsn 	bpfjit_free_code(code);
795b61069b6Salnsn }
796b61069b6Salnsn 
797658efa86Salnsn ATF_TC(libbpfjit_alu_lsh_k);
ATF_TC_HEAD(libbpfjit_alu_lsh_k,tc)798658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_lsh_k, tc)
79965b4b421Salnsn {
80065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
80165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
80265b4b421Salnsn }
80365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_lsh_k,tc)804658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_lsh_k, tc)
80565b4b421Salnsn {
80665b4b421Salnsn 	static struct bpf_insn insns[] = {
80765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
80865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
80965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
81065b4b421Salnsn 	};
81165b4b421Salnsn 
812d0748eb9Srmind 	bpfjit_func_t code;
81365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
81465b4b421Salnsn 
81565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
81665b4b421Salnsn 
81765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
81865b4b421Salnsn 
81919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
82065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
82165b4b421Salnsn 
82219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
82365b4b421Salnsn 
82465b4b421Salnsn 	bpfjit_free_code(code);
82565b4b421Salnsn }
82665b4b421Salnsn 
827658efa86Salnsn ATF_TC(libbpfjit_alu_lsh0_k);
ATF_TC_HEAD(libbpfjit_alu_lsh0_k,tc)828658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_lsh0_k, tc)
82965b4b421Salnsn {
83065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
83165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
83265b4b421Salnsn }
83365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_lsh0_k,tc)834658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_lsh0_k, tc)
83565b4b421Salnsn {
83665b4b421Salnsn 	static struct bpf_insn insns[] = {
83765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
83865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
83965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
84065b4b421Salnsn 	};
84165b4b421Salnsn 
842d0748eb9Srmind 	bpfjit_func_t code;
84365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
84465b4b421Salnsn 
84565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
84665b4b421Salnsn 
84765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
84865b4b421Salnsn 
84919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
85065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
85165b4b421Salnsn 
85219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
85365b4b421Salnsn 
85465b4b421Salnsn 	bpfjit_free_code(code);
85565b4b421Salnsn }
85665b4b421Salnsn 
857658efa86Salnsn ATF_TC(libbpfjit_alu_rsh_k);
ATF_TC_HEAD(libbpfjit_alu_rsh_k,tc)858658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_rsh_k, tc)
85965b4b421Salnsn {
86065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
86165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
86265b4b421Salnsn }
86365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_rsh_k,tc)864658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_rsh_k, tc)
86565b4b421Salnsn {
86665b4b421Salnsn 	static struct bpf_insn insns[] = {
86765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
86865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
86965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
87065b4b421Salnsn 	};
87165b4b421Salnsn 
872d0748eb9Srmind 	bpfjit_func_t code;
87365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
87465b4b421Salnsn 
87565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
87665b4b421Salnsn 
87765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
87865b4b421Salnsn 
87919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
88065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
88165b4b421Salnsn 
88219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
88365b4b421Salnsn 
88465b4b421Salnsn 	bpfjit_free_code(code);
88565b4b421Salnsn }
88665b4b421Salnsn 
887658efa86Salnsn ATF_TC(libbpfjit_alu_rsh0_k);
ATF_TC_HEAD(libbpfjit_alu_rsh0_k,tc)888658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_rsh0_k, tc)
88965b4b421Salnsn {
89065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
89165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
89265b4b421Salnsn }
89365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_rsh0_k,tc)894658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_rsh0_k, tc)
89565b4b421Salnsn {
89665b4b421Salnsn 	static struct bpf_insn insns[] = {
89765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
89865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
89965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
90065b4b421Salnsn 	};
90165b4b421Salnsn 
902d0748eb9Srmind 	bpfjit_func_t code;
90365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
90465b4b421Salnsn 
90565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
90665b4b421Salnsn 
90765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
90865b4b421Salnsn 
90919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
91065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
91165b4b421Salnsn 
91219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
91365b4b421Salnsn 
91465b4b421Salnsn 	bpfjit_free_code(code);
91565b4b421Salnsn }
91665b4b421Salnsn 
917658efa86Salnsn ATF_TC(libbpfjit_alu_modulo_k);
ATF_TC_HEAD(libbpfjit_alu_modulo_k,tc)918658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_modulo_k, tc)
91965b4b421Salnsn {
92065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
92165b4b421Salnsn 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
92265b4b421Salnsn }
92365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_modulo_k,tc)924658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_modulo_k, tc)
92565b4b421Salnsn {
92665b4b421Salnsn 	static struct bpf_insn insns[] = {
92765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
92865b4b421Salnsn 
92965b4b421Salnsn 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
93065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
93165b4b421Salnsn 
93265b4b421Salnsn 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
93365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
93465b4b421Salnsn 
93565b4b421Salnsn 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
93665b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
93765b4b421Salnsn 
93865b4b421Salnsn 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
93965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
94065b4b421Salnsn 
94165b4b421Salnsn 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
94265b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
94365b4b421Salnsn 
94465b4b421Salnsn 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
94565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
94665b4b421Salnsn 
94765b4b421Salnsn 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
94865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
94965b4b421Salnsn 
95065b4b421Salnsn 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
95165b4b421Salnsn 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
95265b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
95365b4b421Salnsn 
95465b4b421Salnsn 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
95565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
95665b4b421Salnsn 
95765b4b421Salnsn 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
95865b4b421Salnsn 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
95965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
96065b4b421Salnsn 
96165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
96265b4b421Salnsn 	};
96365b4b421Salnsn 
964d0748eb9Srmind 	bpfjit_func_t code;
96565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
96665b4b421Salnsn 
96765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
96865b4b421Salnsn 
96965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
97065b4b421Salnsn 
97119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
97265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
97365b4b421Salnsn 
97419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
97519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
97665b4b421Salnsn 
97765b4b421Salnsn 
97865b4b421Salnsn 	bpfjit_free_code(code);
97965b4b421Salnsn }
98065b4b421Salnsn 
981658efa86Salnsn ATF_TC(libbpfjit_alu_add_x);
ATF_TC_HEAD(libbpfjit_alu_add_x,tc)982658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_add_x, tc)
98365b4b421Salnsn {
98465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
98565b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
98665b4b421Salnsn }
98765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_add_x,tc)988658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_add_x, tc)
98965b4b421Salnsn {
99065b4b421Salnsn 	static struct bpf_insn insns[] = {
99165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
99265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
99365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
99465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
99565b4b421Salnsn 	};
99665b4b421Salnsn 
997d0748eb9Srmind 	bpfjit_func_t code;
99865b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
99965b4b421Salnsn 
100065b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
100165b4b421Salnsn 
100265b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
100365b4b421Salnsn 
100419fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
100565b4b421Salnsn 	ATF_REQUIRE(code != NULL);
100665b4b421Salnsn 
100719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
100865b4b421Salnsn 
100965b4b421Salnsn 	bpfjit_free_code(code);
101065b4b421Salnsn }
101165b4b421Salnsn 
1012658efa86Salnsn ATF_TC(libbpfjit_alu_sub_x);
ATF_TC_HEAD(libbpfjit_alu_sub_x,tc)1013658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_sub_x, tc)
101465b4b421Salnsn {
101565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
101665b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
101765b4b421Salnsn }
101865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_sub_x,tc)1019658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_sub_x, tc)
102065b4b421Salnsn {
102165b4b421Salnsn 	static struct bpf_insn insns[] = {
102265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 1),
102365b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
102465b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
102565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
102665b4b421Salnsn 	};
102765b4b421Salnsn 
1028d0748eb9Srmind 	bpfjit_func_t code;
102965b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
103065b4b421Salnsn 
103165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
103265b4b421Salnsn 
103365b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
103465b4b421Salnsn 
103519fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
103665b4b421Salnsn 	ATF_REQUIRE(code != NULL);
103765b4b421Salnsn 
103819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
103965b4b421Salnsn 
104065b4b421Salnsn 	bpfjit_free_code(code);
104165b4b421Salnsn }
104265b4b421Salnsn 
1043658efa86Salnsn ATF_TC(libbpfjit_alu_mul_x);
ATF_TC_HEAD(libbpfjit_alu_mul_x,tc)1044658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_mul_x, tc)
104565b4b421Salnsn {
104665b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
104765b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
104865b4b421Salnsn }
104965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_mul_x,tc)1050658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_mul_x, tc)
105165b4b421Salnsn {
105265b4b421Salnsn 	static struct bpf_insn insns[] = {
105365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
105465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
105565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
105665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
105765b4b421Salnsn 	};
105865b4b421Salnsn 
1059d0748eb9Srmind 	bpfjit_func_t code;
106065b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
106165b4b421Salnsn 
106265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
106365b4b421Salnsn 
106465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
106565b4b421Salnsn 
106619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
106765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
106865b4b421Salnsn 
106919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
107065b4b421Salnsn 
107165b4b421Salnsn 	bpfjit_free_code(code);
107265b4b421Salnsn }
107365b4b421Salnsn 
1074658efa86Salnsn ATF_TC(libbpfjit_alu_div0_x);
ATF_TC_HEAD(libbpfjit_alu_div0_x,tc)1075658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div0_x, tc)
107665b4b421Salnsn {
107765b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
107865b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
107965b4b421Salnsn }
108065b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div0_x,tc)1081658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div0_x, tc)
108265b4b421Salnsn {
108365b4b421Salnsn 	static struct bpf_insn insns[] = {
108465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
108565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
108665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
108765b4b421Salnsn 	};
108865b4b421Salnsn 
1089d0748eb9Srmind 	bpfjit_func_t code;
109065b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
109165b4b421Salnsn 
109265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
109365b4b421Salnsn 
109465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
109565b4b421Salnsn 
109619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
109765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
109865b4b421Salnsn 
109919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
110065b4b421Salnsn 
110165b4b421Salnsn 	bpfjit_free_code(code);
110265b4b421Salnsn }
110365b4b421Salnsn 
1104658efa86Salnsn ATF_TC(libbpfjit_alu_div1_x);
ATF_TC_HEAD(libbpfjit_alu_div1_x,tc)1105658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div1_x, tc)
110665b4b421Salnsn {
110765b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
110865b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
110965b4b421Salnsn }
111065b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div1_x,tc)1111658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div1_x, tc)
111265b4b421Salnsn {
111365b4b421Salnsn 	static struct bpf_insn insns[] = {
111465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
111565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
111665b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
111765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
111865b4b421Salnsn 	};
111965b4b421Salnsn 
1120d0748eb9Srmind 	bpfjit_func_t code;
112165b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
112265b4b421Salnsn 
112365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
112465b4b421Salnsn 
112565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
112665b4b421Salnsn 
112719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
112865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
112965b4b421Salnsn 
113019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
113165b4b421Salnsn 
113265b4b421Salnsn 	bpfjit_free_code(code);
113365b4b421Salnsn }
113465b4b421Salnsn 
1135658efa86Salnsn ATF_TC(libbpfjit_alu_div2_x);
ATF_TC_HEAD(libbpfjit_alu_div2_x,tc)1136658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div2_x, tc)
113765b4b421Salnsn {
113865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
113965b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
114065b4b421Salnsn }
114165b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div2_x,tc)1142658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div2_x, tc)
114365b4b421Salnsn {
114465b4b421Salnsn 	static struct bpf_insn insns[] = {
114565b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
114665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
114765b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
114865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
114965b4b421Salnsn 	};
115065b4b421Salnsn 
1151d0748eb9Srmind 	bpfjit_func_t code;
115265b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
115365b4b421Salnsn 
115465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
115565b4b421Salnsn 
115665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
115765b4b421Salnsn 
115819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
115965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
116065b4b421Salnsn 
116119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
116265b4b421Salnsn 
116365b4b421Salnsn 	bpfjit_free_code(code);
116465b4b421Salnsn }
116565b4b421Salnsn 
1166658efa86Salnsn ATF_TC(libbpfjit_alu_div4_x);
ATF_TC_HEAD(libbpfjit_alu_div4_x,tc)1167658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div4_x, tc)
116865b4b421Salnsn {
116965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
117065b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
117165b4b421Salnsn }
117265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div4_x,tc)1173658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div4_x, tc)
117465b4b421Salnsn {
117565b4b421Salnsn 	static struct bpf_insn insns[] = {
117665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
117765b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
117865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
117965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
118065b4b421Salnsn 	};
118165b4b421Salnsn 
1182d0748eb9Srmind 	bpfjit_func_t code;
118365b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
118465b4b421Salnsn 
118565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
118665b4b421Salnsn 
118765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
118865b4b421Salnsn 
118919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
119065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
119165b4b421Salnsn 
119219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
119365b4b421Salnsn 
119465b4b421Salnsn 	bpfjit_free_code(code);
119565b4b421Salnsn }
119665b4b421Salnsn 
1197658efa86Salnsn ATF_TC(libbpfjit_alu_div10_x);
ATF_TC_HEAD(libbpfjit_alu_div10_x,tc)1198658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div10_x, tc)
119965b4b421Salnsn {
120065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
120165b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
120265b4b421Salnsn }
120365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div10_x,tc)1204658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div10_x, tc)
120565b4b421Salnsn {
120665b4b421Salnsn 	static struct bpf_insn insns[] = {
120765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
120865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
120965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
121065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
121165b4b421Salnsn 	};
121265b4b421Salnsn 
1213d0748eb9Srmind 	bpfjit_func_t code;
121465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
121565b4b421Salnsn 
121665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
121765b4b421Salnsn 
121865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
121965b4b421Salnsn 
122019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
122165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
122265b4b421Salnsn 
122319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
122465b4b421Salnsn 
122565b4b421Salnsn 	bpfjit_free_code(code);
122665b4b421Salnsn }
122765b4b421Salnsn 
1228658efa86Salnsn ATF_TC(libbpfjit_alu_div10000_x);
ATF_TC_HEAD(libbpfjit_alu_div10000_x,tc)1229658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div10000_x, tc)
123065b4b421Salnsn {
123165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
123265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
123365b4b421Salnsn }
123465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div10000_x,tc)1235658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div10000_x, tc)
123665b4b421Salnsn {
123765b4b421Salnsn 	static struct bpf_insn insns[] = {
123865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
123965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
124065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
124165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
124265b4b421Salnsn 	};
124365b4b421Salnsn 
1244d0748eb9Srmind 	bpfjit_func_t code;
124565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
124665b4b421Salnsn 
124765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
124865b4b421Salnsn 
124965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
125065b4b421Salnsn 
125119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
125265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
125365b4b421Salnsn 
125419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
125565b4b421Salnsn 
125665b4b421Salnsn 	bpfjit_free_code(code);
125765b4b421Salnsn }
125865b4b421Salnsn 
1259658efa86Salnsn ATF_TC(libbpfjit_alu_div7609801_x);
ATF_TC_HEAD(libbpfjit_alu_div7609801_x,tc)1260658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div7609801_x, tc)
126165b4b421Salnsn {
126265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
126365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
126465b4b421Salnsn }
126565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div7609801_x,tc)1266658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div7609801_x, tc)
126765b4b421Salnsn {
126865b4b421Salnsn 	static struct bpf_insn insns[] = {
126965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
127065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
127165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
127265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
127365b4b421Salnsn 	};
127465b4b421Salnsn 
1275d0748eb9Srmind 	bpfjit_func_t code;
127665b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
127765b4b421Salnsn 
127865b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
127965b4b421Salnsn 
128065b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
128165b4b421Salnsn 
128219fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
128365b4b421Salnsn 	ATF_REQUIRE(code != NULL);
128465b4b421Salnsn 
128519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
128665b4b421Salnsn 
128765b4b421Salnsn 	bpfjit_free_code(code);
128865b4b421Salnsn }
128965b4b421Salnsn 
1290658efa86Salnsn ATF_TC(libbpfjit_alu_div80000000_x);
ATF_TC_HEAD(libbpfjit_alu_div80000000_x,tc)1291658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_div80000000_x, tc)
129265b4b421Salnsn {
129365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
129465b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
129565b4b421Salnsn }
129665b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_div80000000_x,tc)1297658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_div80000000_x, tc)
129865b4b421Salnsn {
129965b4b421Salnsn 	static struct bpf_insn insns[] = {
1300a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
130165b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
130265b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
130365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
130465b4b421Salnsn 	};
130565b4b421Salnsn 
1306d0748eb9Srmind 	bpfjit_func_t code;
130765b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
130865b4b421Salnsn 
130965b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
131065b4b421Salnsn 
131165b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
131265b4b421Salnsn 
131319fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
131465b4b421Salnsn 	ATF_REQUIRE(code != NULL);
131565b4b421Salnsn 
131619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
131765b4b421Salnsn 
131865b4b421Salnsn 	bpfjit_free_code(code);
131965b4b421Salnsn }
132065b4b421Salnsn 
1321a234612aSalnsn ATF_TC(libbpfjit_alu_mod0_x);
ATF_TC_HEAD(libbpfjit_alu_mod0_x,tc)1322a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod0_x, tc)
1323a234612aSalnsn {
1324a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1325a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0");
1326a234612aSalnsn }
1327a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod0_x,tc)1328a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod0_x, tc)
1329a234612aSalnsn {
1330a234612aSalnsn 	static struct bpf_insn insns[] = {
1331a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1332a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1333a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1334a234612aSalnsn 	};
1335a234612aSalnsn 
1336a234612aSalnsn 	bpfjit_func_t code;
1337a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1338a234612aSalnsn 
1339a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1340a234612aSalnsn 
1341a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1342a234612aSalnsn 
1343a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1344a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1345a234612aSalnsn 
1346a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1347a234612aSalnsn 
1348a234612aSalnsn 	bpfjit_free_code(code);
1349a234612aSalnsn }
1350a234612aSalnsn 
1351a234612aSalnsn ATF_TC(libbpfjit_alu_mod1_x);
ATF_TC_HEAD(libbpfjit_alu_mod1_x,tc)1352a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod1_x, tc)
1353a234612aSalnsn {
1354a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1355a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=1");
1356a234612aSalnsn }
1357a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod1_x,tc)1358a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod1_x, tc)
1359a234612aSalnsn {
1360a234612aSalnsn 	static struct bpf_insn insns[] = {
1361a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1362a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1363a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1364a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1365a234612aSalnsn 	};
1366a234612aSalnsn 
1367a234612aSalnsn 	bpfjit_func_t code;
1368a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1369a234612aSalnsn 
1370a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1371a234612aSalnsn 
1372a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1373a234612aSalnsn 
1374a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1375a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1376a234612aSalnsn 
1377a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1378a234612aSalnsn 
1379a234612aSalnsn 	bpfjit_free_code(code);
1380a234612aSalnsn }
1381a234612aSalnsn 
1382a234612aSalnsn ATF_TC(libbpfjit_alu_mod2_x);
ATF_TC_HEAD(libbpfjit_alu_mod2_x,tc)1383a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod2_x, tc)
1384a234612aSalnsn {
1385a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1386a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=2");
1387a234612aSalnsn }
1388a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod2_x,tc)1389a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod2_x, tc)
1390a234612aSalnsn {
1391a234612aSalnsn 	static struct bpf_insn insns[] = {
1392a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, 7),
1393a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1394a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1395a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1396a234612aSalnsn 	};
1397a234612aSalnsn 
1398a234612aSalnsn 	bpfjit_func_t code;
1399a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1400a234612aSalnsn 
1401a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1402a234612aSalnsn 
1403a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1404a234612aSalnsn 
1405a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1406a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1407a234612aSalnsn 
1408a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1409a234612aSalnsn 
1410a234612aSalnsn 	bpfjit_free_code(code);
1411a234612aSalnsn }
1412a234612aSalnsn 
1413a234612aSalnsn ATF_TC(libbpfjit_alu_mod4_x);
ATF_TC_HEAD(libbpfjit_alu_mod4_x,tc)1414a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod4_x, tc)
1415a234612aSalnsn {
1416a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1417a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=4");
1418a234612aSalnsn }
1419a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod4_x,tc)1420a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod4_x, tc)
1421a234612aSalnsn {
1422a234612aSalnsn 	static struct bpf_insn insns[] = {
1423a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1424a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1425a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1426a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1427a234612aSalnsn 	};
1428a234612aSalnsn 
1429a234612aSalnsn 	bpfjit_func_t code;
1430a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1431a234612aSalnsn 
1432a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1433a234612aSalnsn 
1434a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1435a234612aSalnsn 
1436a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1437a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1438a234612aSalnsn 
1439a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
1440a234612aSalnsn 
1441a234612aSalnsn 	bpfjit_free_code(code);
1442a234612aSalnsn }
1443a234612aSalnsn 
1444a234612aSalnsn ATF_TC(libbpfjit_alu_mod10_x);
ATF_TC_HEAD(libbpfjit_alu_mod10_x,tc)1445a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod10_x, tc)
1446a234612aSalnsn {
1447a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1448a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10");
1449a234612aSalnsn }
1450a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod10_x,tc)1451a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod10_x, tc)
1452a234612aSalnsn {
1453a234612aSalnsn 	static struct bpf_insn insns[] = {
1454a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1455a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1456a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1457a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1458a234612aSalnsn 	};
1459a234612aSalnsn 
1460a234612aSalnsn 	bpfjit_func_t code;
1461a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1462a234612aSalnsn 
1463a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1464a234612aSalnsn 
1465a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1466a234612aSalnsn 
1467a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1468a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1469a234612aSalnsn 
1470a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
1471a234612aSalnsn 
1472a234612aSalnsn 	bpfjit_free_code(code);
1473a234612aSalnsn }
1474a234612aSalnsn 
1475a234612aSalnsn ATF_TC(libbpfjit_alu_mod10000_x);
ATF_TC_HEAD(libbpfjit_alu_mod10000_x,tc)1476a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod10000_x, tc)
1477a234612aSalnsn {
1478a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1479a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10000");
1480a234612aSalnsn }
1481a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod10000_x,tc)1482a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod10000_x, tc)
1483a234612aSalnsn {
1484a234612aSalnsn 	static struct bpf_insn insns[] = {
1485a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1486a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1487a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1488a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1489a234612aSalnsn 	};
1490a234612aSalnsn 
1491a234612aSalnsn 	bpfjit_func_t code;
1492a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1493a234612aSalnsn 
1494a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1495a234612aSalnsn 
1496a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1497a234612aSalnsn 
1498a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1499a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1500a234612aSalnsn 
1501a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
1502a234612aSalnsn 
1503a234612aSalnsn 	bpfjit_free_code(code);
1504a234612aSalnsn }
1505a234612aSalnsn 
1506a234612aSalnsn ATF_TC(libbpfjit_alu_mod7609801_x);
ATF_TC_HEAD(libbpfjit_alu_mod7609801_x,tc)1507a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod7609801_x, tc)
1508a234612aSalnsn {
1509a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1510a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=7609801");
1511a234612aSalnsn }
1512a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod7609801_x,tc)1513a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod7609801_x, tc)
1514a234612aSalnsn {
1515a234612aSalnsn 	static struct bpf_insn insns[] = {
1516a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1517a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1518a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1519a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1520a234612aSalnsn 	};
1521a234612aSalnsn 
1522a234612aSalnsn 	bpfjit_func_t code;
1523a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1524a234612aSalnsn 
1525a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1526a234612aSalnsn 
1527a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1528a234612aSalnsn 
1529a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1530a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1531a234612aSalnsn 
1532a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
1533a234612aSalnsn 
1534a234612aSalnsn 	bpfjit_free_code(code);
1535a234612aSalnsn }
1536a234612aSalnsn 
1537a234612aSalnsn ATF_TC(libbpfjit_alu_mod80000000_x);
ATF_TC_HEAD(libbpfjit_alu_mod80000000_x,tc)1538a234612aSalnsn ATF_TC_HEAD(libbpfjit_alu_mod80000000_x, tc)
1539a234612aSalnsn {
1540a234612aSalnsn 	atf_tc_set_md_var(tc, "descr",
1541a234612aSalnsn 	    "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0x80000000");
1542a234612aSalnsn }
1543a234612aSalnsn 
ATF_TC_BODY(libbpfjit_alu_mod80000000_x,tc)1544a234612aSalnsn ATF_TC_BODY(libbpfjit_alu_mod80000000_x, tc)
1545a234612aSalnsn {
1546a234612aSalnsn 	static struct bpf_insn insns[] = {
1547a234612aSalnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1548a234612aSalnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1549a234612aSalnsn 		BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1550a234612aSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1551a234612aSalnsn 	};
1552a234612aSalnsn 
1553a234612aSalnsn 	bpfjit_func_t code;
1554a234612aSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1555a234612aSalnsn 
1556a234612aSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1557a234612aSalnsn 
1558a234612aSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1559a234612aSalnsn 
1560a234612aSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1561a234612aSalnsn 	ATF_REQUIRE(code != NULL);
1562a234612aSalnsn 
1563a234612aSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
1564a234612aSalnsn 
1565a234612aSalnsn 	bpfjit_free_code(code);
1566a234612aSalnsn }
1567a234612aSalnsn 
1568658efa86Salnsn ATF_TC(libbpfjit_alu_and_x);
ATF_TC_HEAD(libbpfjit_alu_and_x,tc)1569658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_and_x, tc)
157065b4b421Salnsn {
157165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
157265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
157365b4b421Salnsn }
157465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_and_x,tc)1575658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_and_x, tc)
157665b4b421Salnsn {
157765b4b421Salnsn 	static struct bpf_insn insns[] = {
157865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
157965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
158065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
158165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
158265b4b421Salnsn 	};
158365b4b421Salnsn 
1584d0748eb9Srmind 	bpfjit_func_t code;
158565b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
158665b4b421Salnsn 
158765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
158865b4b421Salnsn 
158965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
159065b4b421Salnsn 
159119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
159265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
159365b4b421Salnsn 
159419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
159565b4b421Salnsn 
159665b4b421Salnsn 	bpfjit_free_code(code);
159765b4b421Salnsn }
159865b4b421Salnsn 
1599658efa86Salnsn ATF_TC(libbpfjit_alu_or_x);
ATF_TC_HEAD(libbpfjit_alu_or_x,tc)1600658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_or_x, tc)
160165b4b421Salnsn {
160265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
160365b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
160465b4b421Salnsn }
160565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_or_x,tc)1606658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_or_x, tc)
160765b4b421Salnsn {
160865b4b421Salnsn 	static struct bpf_insn insns[] = {
160965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
161065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
161165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
161265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
161365b4b421Salnsn 	};
161465b4b421Salnsn 
1615d0748eb9Srmind 	bpfjit_func_t code;
161665b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
161765b4b421Salnsn 
161865b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
161965b4b421Salnsn 
162065b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
162165b4b421Salnsn 
162219fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
162365b4b421Salnsn 	ATF_REQUIRE(code != NULL);
162465b4b421Salnsn 
162519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
162665b4b421Salnsn 
162765b4b421Salnsn 	bpfjit_free_code(code);
162865b4b421Salnsn }
162965b4b421Salnsn 
1630b61069b6Salnsn ATF_TC(libbpfjit_alu_xor_x);
ATF_TC_HEAD(libbpfjit_alu_xor_x,tc)1631b61069b6Salnsn ATF_TC_HEAD(libbpfjit_alu_xor_x, tc)
1632b61069b6Salnsn {
1633b61069b6Salnsn 	atf_tc_set_md_var(tc, "descr",
1634b61069b6Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X");
1635b61069b6Salnsn }
1636b61069b6Salnsn 
ATF_TC_BODY(libbpfjit_alu_xor_x,tc)1637b61069b6Salnsn ATF_TC_BODY(libbpfjit_alu_xor_x, tc)
1638b61069b6Salnsn {
1639b61069b6Salnsn 	static struct bpf_insn insns[] = {
1640b61069b6Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
1641b61069b6Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000b1e0),
1642b61069b6Salnsn 		BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0),
1643b61069b6Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
1644b61069b6Salnsn 	};
1645b61069b6Salnsn 
1646b61069b6Salnsn 	bpfjit_func_t code;
1647b61069b6Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
1648b61069b6Salnsn 
1649b61069b6Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1650b61069b6Salnsn 
1651b61069b6Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1652b61069b6Salnsn 
1653b61069b6Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
1654b61069b6Salnsn 	ATF_REQUIRE(code != NULL);
1655b61069b6Salnsn 
1656b61069b6Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1657b61069b6Salnsn 
1658b61069b6Salnsn 	bpfjit_free_code(code);
1659b61069b6Salnsn }
1660b61069b6Salnsn 
1661658efa86Salnsn ATF_TC(libbpfjit_alu_lsh_x);
ATF_TC_HEAD(libbpfjit_alu_lsh_x,tc)1662658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_lsh_x, tc)
166365b4b421Salnsn {
166465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
166565b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
166665b4b421Salnsn }
166765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_lsh_x,tc)1668658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_lsh_x, tc)
166965b4b421Salnsn {
167065b4b421Salnsn 	static struct bpf_insn insns[] = {
167165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
167265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
167365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
167465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
167565b4b421Salnsn 	};
167665b4b421Salnsn 
1677d0748eb9Srmind 	bpfjit_func_t code;
167865b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
167965b4b421Salnsn 
168065b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
168165b4b421Salnsn 
168265b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
168365b4b421Salnsn 
168419fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
168565b4b421Salnsn 	ATF_REQUIRE(code != NULL);
168665b4b421Salnsn 
168719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
168865b4b421Salnsn 
168965b4b421Salnsn 	bpfjit_free_code(code);
169065b4b421Salnsn }
169165b4b421Salnsn 
1692658efa86Salnsn ATF_TC(libbpfjit_alu_lsh0_x);
ATF_TC_HEAD(libbpfjit_alu_lsh0_x,tc)1693658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_lsh0_x, tc)
169465b4b421Salnsn {
169565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
169665b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
169765b4b421Salnsn }
169865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_lsh0_x,tc)1699658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_lsh0_x, tc)
170065b4b421Salnsn {
170165b4b421Salnsn 	static struct bpf_insn insns[] = {
170265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
170365b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
170465b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
170565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
170665b4b421Salnsn 	};
170765b4b421Salnsn 
1708d0748eb9Srmind 	bpfjit_func_t code;
170965b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
171065b4b421Salnsn 
171165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
171265b4b421Salnsn 
171365b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
171465b4b421Salnsn 
171519fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
171665b4b421Salnsn 	ATF_REQUIRE(code != NULL);
171765b4b421Salnsn 
171819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
171965b4b421Salnsn 
172065b4b421Salnsn 	bpfjit_free_code(code);
172165b4b421Salnsn }
172265b4b421Salnsn 
1723658efa86Salnsn ATF_TC(libbpfjit_alu_rsh_x);
ATF_TC_HEAD(libbpfjit_alu_rsh_x,tc)1724658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_rsh_x, tc)
172565b4b421Salnsn {
172665b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
172765b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
172865b4b421Salnsn }
172965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_rsh_x,tc)1730658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_rsh_x, tc)
173165b4b421Salnsn {
173265b4b421Salnsn 	static struct bpf_insn insns[] = {
173365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
173465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
173565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
173665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
173765b4b421Salnsn 	};
173865b4b421Salnsn 
1739d0748eb9Srmind 	bpfjit_func_t code;
174065b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
174165b4b421Salnsn 
174265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
174365b4b421Salnsn 
174465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
174565b4b421Salnsn 
174619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
174765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
174865b4b421Salnsn 
174919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
175065b4b421Salnsn 
175165b4b421Salnsn 	bpfjit_free_code(code);
175265b4b421Salnsn }
175365b4b421Salnsn 
1754658efa86Salnsn ATF_TC(libbpfjit_alu_rsh0_x);
ATF_TC_HEAD(libbpfjit_alu_rsh0_x,tc)1755658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_rsh0_x, tc)
175665b4b421Salnsn {
175765b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
175865b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
175965b4b421Salnsn }
176065b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_rsh0_x,tc)1761658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_rsh0_x, tc)
176265b4b421Salnsn {
176365b4b421Salnsn 	static struct bpf_insn insns[] = {
176465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
176565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
176665b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
176765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
176865b4b421Salnsn 	};
176965b4b421Salnsn 
1770d0748eb9Srmind 	bpfjit_func_t code;
177165b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
177265b4b421Salnsn 
177365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
177465b4b421Salnsn 
177565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
177665b4b421Salnsn 
177719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
177865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
177965b4b421Salnsn 
178019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
178165b4b421Salnsn 
178265b4b421Salnsn 	bpfjit_free_code(code);
178365b4b421Salnsn }
178465b4b421Salnsn 
1785658efa86Salnsn ATF_TC(libbpfjit_alu_modulo_x);
ATF_TC_HEAD(libbpfjit_alu_modulo_x,tc)1786658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_modulo_x, tc)
178765b4b421Salnsn {
178865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
178965b4b421Salnsn 	    "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
179065b4b421Salnsn }
179165b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_modulo_x,tc)1792658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_modulo_x, tc)
179365b4b421Salnsn {
179465b4b421Salnsn 	static struct bpf_insn insns[] = {
179565b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
179665b4b421Salnsn 
179765b4b421Salnsn 		/* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
179865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
179965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
180065b4b421Salnsn 
180165b4b421Salnsn 		/* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
180265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
180365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
180465b4b421Salnsn 
180565b4b421Salnsn 		/* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
180665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
180765b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
180865b4b421Salnsn 
180965b4b421Salnsn 		/* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
181065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
181165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
181265b4b421Salnsn 
181365b4b421Salnsn 		/* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
181465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
181565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
181665b4b421Salnsn 
181765b4b421Salnsn 		/* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
181865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
181965b4b421Salnsn 
182065b4b421Salnsn 		/* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
182165b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
182265b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
182365b4b421Salnsn 
182465b4b421Salnsn 		/* F000009A,42218C74 >> 3 = 1E000013,48443180 */
182565b4b421Salnsn 		/* 00000000,42218C74 >> 3 = 00000000,08443180 */
182665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
182765b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
182865b4b421Salnsn 
182965b4b421Salnsn 		/* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
183065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
183165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
183265b4b421Salnsn 
183365b4b421Salnsn 		/* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
183465b4b421Salnsn 		/* 00000000,93818280 / DEAD = 00000000,0000A994 */
183565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
183665b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
183765b4b421Salnsn 
183865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
183965b4b421Salnsn 	};
184065b4b421Salnsn 
1841d0748eb9Srmind 	bpfjit_func_t code;
184265b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
184365b4b421Salnsn 
184465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
184565b4b421Salnsn 
184665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
184765b4b421Salnsn 
184819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
184965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
185065b4b421Salnsn 
185119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
185219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
185365b4b421Salnsn 
185465b4b421Salnsn 
185565b4b421Salnsn 	bpfjit_free_code(code);
185665b4b421Salnsn }
185765b4b421Salnsn 
1858658efa86Salnsn ATF_TC(libbpfjit_alu_neg);
ATF_TC_HEAD(libbpfjit_alu_neg,tc)1859658efa86Salnsn ATF_TC_HEAD(libbpfjit_alu_neg, tc)
186065b4b421Salnsn {
186165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
186265b4b421Salnsn 	    "Test JIT compilation of BPF_ALU+BPF_NEG");
186365b4b421Salnsn }
186465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_alu_neg,tc)1865658efa86Salnsn ATF_TC_BODY(libbpfjit_alu_neg, tc)
186665b4b421Salnsn {
186765b4b421Salnsn 	static struct bpf_insn insns[] = {
186865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 777),
186965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_NEG, 0),
187065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
187165b4b421Salnsn 	};
187265b4b421Salnsn 
1873d0748eb9Srmind 	bpfjit_func_t code;
187465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
187565b4b421Salnsn 
187665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
187765b4b421Salnsn 
187865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
187965b4b421Salnsn 
188019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
188165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
188265b4b421Salnsn 
188319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0u-777u);
188465b4b421Salnsn 
188565b4b421Salnsn 	bpfjit_free_code(code);
188665b4b421Salnsn }
188765b4b421Salnsn 
1888658efa86Salnsn ATF_TC(libbpfjit_jmp_ja);
ATF_TC_HEAD(libbpfjit_jmp_ja,tc)1889658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_ja, tc)
189065b4b421Salnsn {
189165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
189265b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JA");
189365b4b421Salnsn }
189465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_ja,tc)1895658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_ja, tc)
189665b4b421Salnsn {
189765b4b421Salnsn 	static struct bpf_insn insns[] = {
189865b4b421Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
189965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
190065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
190165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
190265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
190365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
190465b4b421Salnsn 	};
190565b4b421Salnsn 
1906d0748eb9Srmind 	bpfjit_func_t code;
190765b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
190865b4b421Salnsn 
190965b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
191065b4b421Salnsn 
191165b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
191265b4b421Salnsn 
191319fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
191465b4b421Salnsn 	ATF_REQUIRE(code != NULL);
191565b4b421Salnsn 
191619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
191765b4b421Salnsn 
191865b4b421Salnsn 	bpfjit_free_code(code);
191965b4b421Salnsn }
192065b4b421Salnsn 
19219dc6430cSalnsn ATF_TC(libbpfjit_jmp_ja_invalid);
ATF_TC_HEAD(libbpfjit_jmp_ja_invalid,tc)19229dc6430cSalnsn ATF_TC_HEAD(libbpfjit_jmp_ja_invalid, tc)
19239dc6430cSalnsn {
19249dc6430cSalnsn 	atf_tc_set_md_var(tc, "descr",
19259dc6430cSalnsn 	    "Test BPF_JMP+BPF_JA to invalid destination");
19269dc6430cSalnsn }
19279dc6430cSalnsn 
ATF_TC_BODY(libbpfjit_jmp_ja_invalid,tc)19289dc6430cSalnsn ATF_TC_BODY(libbpfjit_jmp_ja_invalid, tc)
19299dc6430cSalnsn {
19309dc6430cSalnsn 	static struct bpf_insn insns[] = {
19319dc6430cSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 4),
19329dc6430cSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
19339dc6430cSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
19349dc6430cSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
19359dc6430cSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
19369dc6430cSalnsn 	};
19379dc6430cSalnsn 
19389dc6430cSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
19399dc6430cSalnsn 
19409dc6430cSalnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
19419dc6430cSalnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
19429dc6430cSalnsn }
19439dc6430cSalnsn 
1944bc33ca73Salnsn ATF_TC(libbpfjit_jmp_ja_overflow);
ATF_TC_HEAD(libbpfjit_jmp_ja_overflow,tc)1945bc33ca73Salnsn ATF_TC_HEAD(libbpfjit_jmp_ja_overflow, tc)
1946bc33ca73Salnsn {
1947bc33ca73Salnsn 	atf_tc_set_md_var(tc, "descr",
1948bc33ca73Salnsn 	    "Test BPF_JMP+BPF_JA with negative offset");
1949bc33ca73Salnsn }
1950bc33ca73Salnsn 
ATF_TC_BODY(libbpfjit_jmp_ja_overflow,tc)1951bc33ca73Salnsn ATF_TC_BODY(libbpfjit_jmp_ja_overflow, tc)
1952bc33ca73Salnsn {
1953bc33ca73Salnsn 	static struct bpf_insn insns[] = {
1954bc33ca73Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
1955bc33ca73Salnsn 		BPF_STMT(BPF_RET+BPF_K, 777),
1956bc33ca73Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, UINT32_MAX - 1), // -2
1957bc33ca73Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0)
1958bc33ca73Salnsn 	};
1959bc33ca73Salnsn 
1960bc33ca73Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1961bc33ca73Salnsn 
1962bc33ca73Salnsn 	/* Jumps with negative offsets work in userspace ... */
1963bc33ca73Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
1964bc33ca73Salnsn 
1965bc33ca73Salnsn 	/* .. but not for bpfjit. */
1966bc33ca73Salnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
1967bc33ca73Salnsn }
1968bc33ca73Salnsn 
1969658efa86Salnsn ATF_TC(libbpfjit_jmp_jgt_k);
ATF_TC_HEAD(libbpfjit_jmp_jgt_k,tc)1970658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
197165b4b421Salnsn {
197265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
197365b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
197465b4b421Salnsn }
197565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jgt_k,tc)1976658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
197765b4b421Salnsn {
197865b4b421Salnsn 	static struct bpf_insn insns[] = {
197965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
198065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
198165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
198265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
198365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
198465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
198565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
198665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
198765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
198865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
198965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
199065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
199165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
199265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
199365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
199465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
199565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
199665b4b421Salnsn 	};
199765b4b421Salnsn 
1998d0748eb9Srmind 	bpfjit_func_t code;
199965b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
200065b4b421Salnsn 
200165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
200265b4b421Salnsn 
200365b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
200465b4b421Salnsn 
200519fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
200665b4b421Salnsn 	ATF_REQUIRE(code != NULL);
200765b4b421Salnsn 
200819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
200919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
201019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
201119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
201219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
201319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
201419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
201519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
201665b4b421Salnsn 
201765b4b421Salnsn 	bpfjit_free_code(code);
201865b4b421Salnsn }
201965b4b421Salnsn 
2020658efa86Salnsn ATF_TC(libbpfjit_jmp_jge_k);
ATF_TC_HEAD(libbpfjit_jmp_jge_k,tc)2021658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
202265b4b421Salnsn {
202365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
202465b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
202565b4b421Salnsn }
202665b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jge_k,tc)2027658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
202865b4b421Salnsn {
202965b4b421Salnsn 	static struct bpf_insn insns[] = {
203065b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
203165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
203265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
203365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
203465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
203565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
203665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
203765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
203865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
203965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
204065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
204165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
204265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
204365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
204465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
204565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
204665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
204765b4b421Salnsn 	};
204865b4b421Salnsn 
2049d0748eb9Srmind 	bpfjit_func_t code;
205065b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
205165b4b421Salnsn 
205265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
205365b4b421Salnsn 
205465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
205565b4b421Salnsn 
205619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
205765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
205865b4b421Salnsn 
205919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
206019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
206119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
206219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
206319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
206419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
206519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
206619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
206765b4b421Salnsn 
206865b4b421Salnsn 	bpfjit_free_code(code);
206965b4b421Salnsn }
207065b4b421Salnsn 
2071658efa86Salnsn ATF_TC(libbpfjit_jmp_jeq_k);
ATF_TC_HEAD(libbpfjit_jmp_jeq_k,tc)2072658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
207365b4b421Salnsn {
207465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
207565b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
207665b4b421Salnsn }
207765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jeq_k,tc)2078658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
207965b4b421Salnsn {
208065b4b421Salnsn 	static struct bpf_insn insns[] = {
208165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
208265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
208365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
208465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
208565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
208665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
208765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
208865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
208965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
209065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
209165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
209265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
209365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
209465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
209565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
209665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
209765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
209865b4b421Salnsn 	};
209965b4b421Salnsn 
2100d0748eb9Srmind 	bpfjit_func_t code;
210165b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
210265b4b421Salnsn 
210365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
210465b4b421Salnsn 
210565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
210665b4b421Salnsn 
210719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
210865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
210965b4b421Salnsn 
211019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
211119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
211219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
211319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
211419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
211519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
211619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
211719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
211865b4b421Salnsn 
211965b4b421Salnsn 	bpfjit_free_code(code);
212065b4b421Salnsn }
212165b4b421Salnsn 
2122658efa86Salnsn ATF_TC(libbpfjit_jmp_jset_k);
ATF_TC_HEAD(libbpfjit_jmp_jset_k,tc)2123658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
212465b4b421Salnsn {
212565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
212665b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
212765b4b421Salnsn }
212865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jset_k,tc)2129658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
213065b4b421Salnsn {
213165b4b421Salnsn 	static struct bpf_insn insns[] = {
213265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
213365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
213465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
213565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
213665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
213765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
213865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
213965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
214065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
214165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
214265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
214365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
214465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
214565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
214665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
214765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
214865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
214965b4b421Salnsn 	};
215065b4b421Salnsn 
2151d0748eb9Srmind 	bpfjit_func_t code;
215265b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
215365b4b421Salnsn 
215465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
215565b4b421Salnsn 
215665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
215765b4b421Salnsn 
215819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
215965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
216065b4b421Salnsn 
216119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
216219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
216319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
216419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
216519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
216619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
216719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
216819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
216965b4b421Salnsn 
217065b4b421Salnsn 	bpfjit_free_code(code);
217165b4b421Salnsn }
217265b4b421Salnsn 
2173658efa86Salnsn ATF_TC(libbpfjit_jmp_modulo_k);
ATF_TC_HEAD(libbpfjit_jmp_modulo_k,tc)2174658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
217565b4b421Salnsn {
217665b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
217765b4b421Salnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
217865b4b421Salnsn }
217965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_modulo_k,tc)2180658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
218165b4b421Salnsn {
218265b4b421Salnsn 	static struct bpf_insn insns[] = {
218365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
218465b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
218565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
218665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
218765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
218865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
218965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
219065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
219165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
219265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
219365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
219465b4b421Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
219565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
219665b4b421Salnsn 
219765b4b421Salnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
219865b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
219965b4b421Salnsn 
220065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
220165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
220265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
220365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
220465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
220565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
220665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
220765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
220865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
220965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
221065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
221165b4b421Salnsn 	};
221265b4b421Salnsn 
2213d0748eb9Srmind 	bpfjit_func_t code;
221465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
221565b4b421Salnsn 
221665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
221765b4b421Salnsn 
221865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
221965b4b421Salnsn 
222019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
222165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
222265b4b421Salnsn 
222319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
222465b4b421Salnsn 
222565b4b421Salnsn 	bpfjit_free_code(code);
222665b4b421Salnsn }
222765b4b421Salnsn 
2228658efa86Salnsn ATF_TC(libbpfjit_jmp_jgt_x);
ATF_TC_HEAD(libbpfjit_jmp_jgt_x,tc)2229658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
223065b4b421Salnsn {
223165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
223265b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
223365b4b421Salnsn }
223465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jgt_x,tc)2235658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
223665b4b421Salnsn {
223765b4b421Salnsn 	static struct bpf_insn insns[] = {
223865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
223965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
224065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
224165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
224265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
224365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
224465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
224565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
224665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
224765b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
224865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
224965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
225065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
225165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
225265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
225365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
225465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
225565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
225665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
225765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
225865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
225965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
226065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
226165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
226265b4b421Salnsn 	};
226365b4b421Salnsn 
2264d0748eb9Srmind 	bpfjit_func_t code;
226565b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
226665b4b421Salnsn 
226765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
226865b4b421Salnsn 
226965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
227065b4b421Salnsn 
227119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
227265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
227365b4b421Salnsn 
227419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
227519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
227619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
227719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
227819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
227919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
228019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
228119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
228265b4b421Salnsn 
228365b4b421Salnsn 	bpfjit_free_code(code);
228465b4b421Salnsn }
228565b4b421Salnsn 
2286658efa86Salnsn ATF_TC(libbpfjit_jmp_jge_x);
ATF_TC_HEAD(libbpfjit_jmp_jge_x,tc)2287658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
228865b4b421Salnsn {
228965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
229065b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
229165b4b421Salnsn }
229265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jge_x,tc)2293658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
229465b4b421Salnsn {
229565b4b421Salnsn 	static struct bpf_insn insns[] = {
229665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
229765b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
229865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
229965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
230065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
230165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
230265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
230365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
230465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
230565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
230665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
230765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
230865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
230965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
231065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
231165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
231265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
231365b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
231465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
231565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
231665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
231765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
231865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
231965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
232065b4b421Salnsn 	};
232165b4b421Salnsn 
2322d0748eb9Srmind 	bpfjit_func_t code;
232365b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
232465b4b421Salnsn 
232565b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
232665b4b421Salnsn 
232765b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
232865b4b421Salnsn 
232919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
233065b4b421Salnsn 	ATF_REQUIRE(code != NULL);
233165b4b421Salnsn 
233219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
233319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
233419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
233519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
233619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
233719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
233819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
233919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
234065b4b421Salnsn 
234165b4b421Salnsn 	bpfjit_free_code(code);
234265b4b421Salnsn }
234365b4b421Salnsn 
2344658efa86Salnsn ATF_TC(libbpfjit_jmp_jeq_x);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x,tc)2345658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
234665b4b421Salnsn {
234765b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
234865b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
234965b4b421Salnsn }
235065b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jeq_x,tc)2351658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
235265b4b421Salnsn {
235365b4b421Salnsn 	static struct bpf_insn insns[] = {
235465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
235565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
235665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
23573228cf99Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
235865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
235965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
236065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
236165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
236265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
23633228cf99Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
23643228cf99Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
23653228cf99Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
236665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
236765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
236865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
236965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
23703228cf99Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
237165b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
237265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
237365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
23743228cf99Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
23753228cf99Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8),
23763228cf99Salnsn 		BPF_STMT(BPF_RET+BPF_K, 9)
237765b4b421Salnsn 	};
237865b4b421Salnsn 
2379d0748eb9Srmind 	bpfjit_func_t code;
238065b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
238165b4b421Salnsn 
238265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
238365b4b421Salnsn 
238465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
238565b4b421Salnsn 
238619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
238765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
238865b4b421Salnsn 
23893228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 8);
23903228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 8);
23913228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 2);
23923228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 8);
23933228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 3);
23943228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 9);
23953228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 6);
23963228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 1);
239765b4b421Salnsn 
239865b4b421Salnsn 	bpfjit_free_code(code);
239965b4b421Salnsn }
240065b4b421Salnsn 
2401658efa86Salnsn ATF_TC(libbpfjit_jmp_jset_x);
ATF_TC_HEAD(libbpfjit_jmp_jset_x,tc)2402658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
240365b4b421Salnsn {
240465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
240565b4b421Salnsn 	    "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
240665b4b421Salnsn }
240765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jset_x,tc)2408658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
240965b4b421Salnsn {
241065b4b421Salnsn 	static struct bpf_insn insns[] = {
241165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
241265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
241365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
241465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
241565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
241665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
241765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
241865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
241965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
242065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
242165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
242265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
242365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
242465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
242565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
242665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
242765b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
242865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
242965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
243065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
243165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
243265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
243365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 8)
243465b4b421Salnsn 	};
243565b4b421Salnsn 
2436d0748eb9Srmind 	bpfjit_func_t code;
243765b4b421Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
243865b4b421Salnsn 
243965b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
244065b4b421Salnsn 
244165b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
244265b4b421Salnsn 
244319fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
244465b4b421Salnsn 	ATF_REQUIRE(code != NULL);
244565b4b421Salnsn 
244619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
244719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
244819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
244919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
245019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
245119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
245219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
245319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
245465b4b421Salnsn 
245565b4b421Salnsn 	bpfjit_free_code(code);
245665b4b421Salnsn }
245765b4b421Salnsn 
24584bf0e499Salnsn ATF_TC(libbpfjit_jmp_jeq_x_noinit_ax);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_ax,tc)24594bf0e499Salnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_ax, tc)
24603228cf99Salnsn {
24613228cf99Salnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
24624bf0e499Salnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X");
24633228cf99Salnsn }
24643228cf99Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_ax,tc)24654bf0e499Salnsn ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_ax, tc)
24663228cf99Salnsn {
24673228cf99Salnsn 	static struct bpf_insn insns[] = {
24683228cf99Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
24694bf0e499Salnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
24704bf0e499Salnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
24713228cf99Salnsn 	};
24723228cf99Salnsn 
24733228cf99Salnsn 	bpfjit_func_t code;
24743228cf99Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
24753228cf99Salnsn 
24763228cf99Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
24773228cf99Salnsn 
24783228cf99Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
24793228cf99Salnsn 
24803228cf99Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
24813228cf99Salnsn 	ATF_REQUIRE(code != NULL);
24823228cf99Salnsn 
24833228cf99Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
24843228cf99Salnsn 
24853228cf99Salnsn 	bpfjit_free_code(code);
24863228cf99Salnsn }
24873228cf99Salnsn 
24886d5b9045Salnsn ATF_TC(libbpfjit_jmp_jeq_x_noinit_a);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_a,tc)24896d5b9045Salnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_a, tc)
24906d5b9045Salnsn {
24916d5b9045Salnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
24926d5b9045Salnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A");
24936d5b9045Salnsn }
24946d5b9045Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_a,tc)24956d5b9045Salnsn ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_a, tc)
24966d5b9045Salnsn {
24976d5b9045Salnsn 	static struct bpf_insn insns[] = {
24986d5b9045Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0), /* X > 0 */
24996d5b9045Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
25006d5b9045Salnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
25016d5b9045Salnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
25026d5b9045Salnsn 	};
25036d5b9045Salnsn 
25046d5b9045Salnsn 	bpfjit_func_t code;
25056d5b9045Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
25066d5b9045Salnsn 
25076d5b9045Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
25086d5b9045Salnsn 
25096d5b9045Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
25106d5b9045Salnsn 
25116d5b9045Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
25126d5b9045Salnsn 	ATF_REQUIRE(code != NULL);
25136d5b9045Salnsn 
25146d5b9045Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
25156d5b9045Salnsn 
25166d5b9045Salnsn 	bpfjit_free_code(code);
25176d5b9045Salnsn }
25186d5b9045Salnsn 
25196d5b9045Salnsn ATF_TC(libbpfjit_jmp_jeq_x_noinit_x);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_x,tc)25206d5b9045Salnsn ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_x, tc)
25216d5b9045Salnsn {
25226d5b9045Salnsn 	atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
25236d5b9045Salnsn 	    "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
25246d5b9045Salnsn }
25256d5b9045Salnsn 
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_x,tc)25266d5b9045Salnsn ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_x, tc)
25276d5b9045Salnsn {
25286d5b9045Salnsn 	static struct bpf_insn insns[] = {
25296d5b9045Salnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0), /* A > 0 */
25306d5b9045Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
25316d5b9045Salnsn 		BPF_STMT(BPF_RET+BPF_K, 10),
25326d5b9045Salnsn 		BPF_STMT(BPF_RET+BPF_K, 11)
25336d5b9045Salnsn 	};
25346d5b9045Salnsn 
25356d5b9045Salnsn 	bpfjit_func_t code;
25366d5b9045Salnsn 	uint8_t pkt[8]; /* the program doesn't read any data */
25376d5b9045Salnsn 
25386d5b9045Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
25396d5b9045Salnsn 
25406d5b9045Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
25416d5b9045Salnsn 
25426d5b9045Salnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
25436d5b9045Salnsn 	ATF_REQUIRE(code != NULL);
25446d5b9045Salnsn 
25456d5b9045Salnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
25466d5b9045Salnsn 
25476d5b9045Salnsn 	bpfjit_free_code(code);
25486d5b9045Salnsn }
25496d5b9045Salnsn 
2550658efa86Salnsn ATF_TC(libbpfjit_jmp_modulo_x);
ATF_TC_HEAD(libbpfjit_jmp_modulo_x,tc)2551658efa86Salnsn ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
255265b4b421Salnsn {
255365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
255465b4b421Salnsn 	    "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
255565b4b421Salnsn }
255665b4b421Salnsn 
ATF_TC_BODY(libbpfjit_jmp_modulo_x,tc)2557658efa86Salnsn ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
255865b4b421Salnsn {
255965b4b421Salnsn 	static struct bpf_insn insns[] = {
256065b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
256165b4b421Salnsn 		/* FFFFF770 << 4 = FFFFF770 */
256265b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
256365b4b421Salnsn 
256465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
256565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
256665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
256765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
256865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
256965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
257065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
257165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
257265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
257365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
257465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
257565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
257665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
257765b4b421Salnsn 		BPF_STMT(BPF_JMP+BPF_JA, 1),
257865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
257965b4b421Salnsn 
258065b4b421Salnsn 		/* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
258165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
258265b4b421Salnsn 
258365b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
258465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
258565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 4),
258665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
258765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 5),
258865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
258965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
259065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 6),
259165b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
259265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
259365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
259465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
259565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
259665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
259765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
259865b4b421Salnsn 	};
259965b4b421Salnsn 
2600d0748eb9Srmind 	bpfjit_func_t code;
260165b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
260265b4b421Salnsn 
260365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
260465b4b421Salnsn 
260565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
260665b4b421Salnsn 
260719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
260865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
260965b4b421Salnsn 
261019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
261165b4b421Salnsn 
261265b4b421Salnsn 	bpfjit_free_code(code);
261365b4b421Salnsn }
261465b4b421Salnsn 
2615658efa86Salnsn ATF_TC(libbpfjit_ld_abs);
ATF_TC_HEAD(libbpfjit_ld_abs,tc)2616658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_abs, tc)
261765b4b421Salnsn {
261865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
261965b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS");
262065b4b421Salnsn }
262165b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_abs,tc)2622658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_abs, tc)
262365b4b421Salnsn {
262465b4b421Salnsn 	static struct bpf_insn insns[3][2] = {
262565b4b421Salnsn 		{
262665b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
262765b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
262865b4b421Salnsn 		},
262965b4b421Salnsn 		{
263065b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
263165b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
263265b4b421Salnsn 		},
263365b4b421Salnsn 		{
263465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
263565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
263665b4b421Salnsn 		}
263765b4b421Salnsn 	};
263865b4b421Salnsn 
263965b4b421Salnsn 	static size_t lengths[3] = { 1, 2, 4 };
264065b4b421Salnsn 	static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
264165b4b421Salnsn 
264265b4b421Salnsn 	size_t i, l;
264365b4b421Salnsn 	uint8_t *pkt = deadbeef_at_5;
264465b4b421Salnsn 	size_t pktsize = sizeof(deadbeef_at_5);
264565b4b421Salnsn 
264665b4b421Salnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
264765b4b421Salnsn 
264865b4b421Salnsn 	for (i = 0; i < 3; i++) {
2649d0748eb9Srmind 		bpfjit_func_t code;
265065b4b421Salnsn 
265165b4b421Salnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
265265b4b421Salnsn 
265319fed70dSalnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
265465b4b421Salnsn 		ATF_REQUIRE(code != NULL);
265565b4b421Salnsn 
2656658efa86Salnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
265719fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
265819fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
265965b4b421Salnsn 		}
266065b4b421Salnsn 
266165b4b421Salnsn 		l = 5 + lengths[i];
266219fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
266319fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
266465b4b421Salnsn 
266565b4b421Salnsn 		l = pktsize;
266619fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
266765b4b421Salnsn 
266865b4b421Salnsn 		bpfjit_free_code(code);
266965b4b421Salnsn 	}
267065b4b421Salnsn }
267165b4b421Salnsn 
2672658efa86Salnsn ATF_TC(libbpfjit_ld_abs_k_overflow);
ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow,tc)2673658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
267465b4b421Salnsn {
267565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
267665b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
267765b4b421Salnsn }
267865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_abs_k_overflow,tc)2679658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
268065b4b421Salnsn {
268165b4b421Salnsn 	static struct bpf_insn insns[12][3] = {
268265b4b421Salnsn 		{
268365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
268465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
268565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
268665b4b421Salnsn 		},
268765b4b421Salnsn 		{
268865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
268965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
269065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
269165b4b421Salnsn 		},
269265b4b421Salnsn 		{
269365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
269465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
269565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
269665b4b421Salnsn 		},
269765b4b421Salnsn 		{
269865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
269965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
270065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
270165b4b421Salnsn 		},
270265b4b421Salnsn 		{
270365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
270465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
270565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
270665b4b421Salnsn 		},
270765b4b421Salnsn 		{
270865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
270965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
271165b4b421Salnsn 		},
271265b4b421Salnsn 		{
271365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
271565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
271665b4b421Salnsn 		},
271765b4b421Salnsn 		{
271865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
272065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
272165b4b421Salnsn 		},
272265b4b421Salnsn 		{
272365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
272465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
272565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
272665b4b421Salnsn 		},
272765b4b421Salnsn 		{
272865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
272965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
273065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
273165b4b421Salnsn 		},
273265b4b421Salnsn 		{
273365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
273465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
273565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
273665b4b421Salnsn 		},
273765b4b421Salnsn 		{
273865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
273965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
274065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
274165b4b421Salnsn 		}
274265b4b421Salnsn 	};
274365b4b421Salnsn 
274465b4b421Salnsn 	int i;
274565b4b421Salnsn 	uint8_t pkt[8] = { 0 };
274665b4b421Salnsn 
274765b4b421Salnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
274865b4b421Salnsn 
274965b4b421Salnsn 	for (i = 0; i < 3; i++) {
2750d0748eb9Srmind 		bpfjit_func_t code;
275165b4b421Salnsn 
275265b4b421Salnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
275365b4b421Salnsn 
275419fed70dSalnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
275565b4b421Salnsn 		ATF_REQUIRE(code != NULL);
275665b4b421Salnsn 
275719fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
275865b4b421Salnsn 
275965b4b421Salnsn 		bpfjit_free_code(code);
276065b4b421Salnsn 	}
276165b4b421Salnsn }
276265b4b421Salnsn 
2763658efa86Salnsn ATF_TC(libbpfjit_ld_ind);
ATF_TC_HEAD(libbpfjit_ld_ind,tc)2764658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_ind, tc)
276565b4b421Salnsn {
276665b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
276765b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_IND");
276865b4b421Salnsn }
276965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_ind,tc)2770658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_ind, tc)
277165b4b421Salnsn {
277265b4b421Salnsn 	static struct bpf_insn insns[6][3] = {
277365b4b421Salnsn 		{
277465b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
277565b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
277665b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
277765b4b421Salnsn 		},
277865b4b421Salnsn 		{
277965b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
278065b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
278165b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
278265b4b421Salnsn 		},
278365b4b421Salnsn 		{
278465b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
278565b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
278665b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
278765b4b421Salnsn 		},
278865b4b421Salnsn 		{
278965b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
279065b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
279165b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
279265b4b421Salnsn 		},
279365b4b421Salnsn 		{
279465b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
279565b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
279665b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
279765b4b421Salnsn 		},
279865b4b421Salnsn 		{
279965b4b421Salnsn 			BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
280065b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
280165b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_A, 0)
280265b4b421Salnsn 		}
280365b4b421Salnsn 	};
280465b4b421Salnsn 
280565b4b421Salnsn 	static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
280665b4b421Salnsn 
280765b4b421Salnsn 	static unsigned int expected[6] = {
280865b4b421Salnsn 		0xde, 0xdead, 0xdeadbeef,
280965b4b421Salnsn 		0xde, 0xdead, 0xdeadbeef
281065b4b421Salnsn 	};
281165b4b421Salnsn 
281265b4b421Salnsn 	size_t i, l;
281365b4b421Salnsn 	uint8_t *pkt = deadbeef_at_5;
281465b4b421Salnsn 	size_t pktsize = sizeof(deadbeef_at_5);
281565b4b421Salnsn 
281665b4b421Salnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
281765b4b421Salnsn 
281865b4b421Salnsn 	for (i = 0; i < 3; i++) {
2819d0748eb9Srmind 		bpfjit_func_t code;
282065b4b421Salnsn 
282165b4b421Salnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
282265b4b421Salnsn 
282319fed70dSalnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
282465b4b421Salnsn 		ATF_REQUIRE(code != NULL);
282565b4b421Salnsn 
2826658efa86Salnsn 		for (l = 1; l < 5 + lengths[i]; l++) {
282719fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt, l, l) == 0);
282819fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
282965b4b421Salnsn 		}
283065b4b421Salnsn 
283165b4b421Salnsn 		l = 5 + lengths[i];
283219fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
283319fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
283465b4b421Salnsn 
283565b4b421Salnsn 		l = pktsize;
283619fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
283765b4b421Salnsn 
283865b4b421Salnsn 		bpfjit_free_code(code);
283965b4b421Salnsn 	}
284065b4b421Salnsn }
284165b4b421Salnsn 
2842658efa86Salnsn ATF_TC(libbpfjit_ld_ind_k_overflow);
ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow,tc)2843658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
284465b4b421Salnsn {
284565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
284665b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
284765b4b421Salnsn }
284865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_ind_k_overflow,tc)2849658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
285065b4b421Salnsn {
285165b4b421Salnsn 	static struct bpf_insn insns[12][3] = {
285265b4b421Salnsn 		{
285365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
285465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
285565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
285665b4b421Salnsn 		},
285765b4b421Salnsn 		{
285865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
285965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
286065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
286165b4b421Salnsn 		},
286265b4b421Salnsn 		{
286365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
286465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
286565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
286665b4b421Salnsn 		},
286765b4b421Salnsn 		{
286865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
286965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
287065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
287165b4b421Salnsn 		},
287265b4b421Salnsn 		{
287365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
287465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
287565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
287665b4b421Salnsn 		},
287765b4b421Salnsn 		{
287865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
287965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
288165b4b421Salnsn 		},
288265b4b421Salnsn 		{
288365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
288565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
288665b4b421Salnsn 		},
288765b4b421Salnsn 		{
288865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
289065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
289165b4b421Salnsn 		},
289265b4b421Salnsn 		{
289365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
289465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
289565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
289665b4b421Salnsn 		},
289765b4b421Salnsn 		{
289865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
289965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
290065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
290165b4b421Salnsn 		},
290265b4b421Salnsn 		{
290365b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
290465b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
290565b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
290665b4b421Salnsn 		},
290765b4b421Salnsn 		{
290865b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
290965b4b421Salnsn 			BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
291065b4b421Salnsn 			BPF_STMT(BPF_RET+BPF_K, 1)
291165b4b421Salnsn 		}
291265b4b421Salnsn 	};
291365b4b421Salnsn 
291465b4b421Salnsn 	int i;
291565b4b421Salnsn 	uint8_t pkt[8] = { 0 };
291665b4b421Salnsn 
291765b4b421Salnsn 	size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
291865b4b421Salnsn 
291965b4b421Salnsn 	for (i = 0; i < 3; i++) {
2920d0748eb9Srmind 		bpfjit_func_t code;
292165b4b421Salnsn 
292265b4b421Salnsn 		ATF_CHECK(bpf_validate(insns[i], insn_count));
292365b4b421Salnsn 
292419fed70dSalnsn 		code = bpfjit_generate_code(NULL, insns[i], insn_count);
292565b4b421Salnsn 		ATF_REQUIRE(code != NULL);
292665b4b421Salnsn 
292719fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
292865b4b421Salnsn 
292965b4b421Salnsn 		bpfjit_free_code(code);
293065b4b421Salnsn 	}
293165b4b421Salnsn }
293265b4b421Salnsn 
2933658efa86Salnsn ATF_TC(libbpfjit_ld_ind_x_overflow1);
ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1,tc)2934658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
293565b4b421Salnsn {
293665b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
293765b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
293865b4b421Salnsn }
293965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1,tc)2940658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
294165b4b421Salnsn {
294265b4b421Salnsn 	static struct bpf_insn insns[] = {
294365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
294465b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
294565b4b421Salnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
294665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
294765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
294865b4b421Salnsn 	};
294965b4b421Salnsn 
295065b4b421Salnsn 	size_t i;
2951d0748eb9Srmind 	bpfjit_func_t code;
295265b4b421Salnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
295365b4b421Salnsn 
295465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
295565b4b421Salnsn 
295665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
295765b4b421Salnsn 
295819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
295965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
296065b4b421Salnsn 
296165b4b421Salnsn 	for (i = 1; i <= sizeof(pkt); i++) {
296265b4b421Salnsn 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
296319fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
296465b4b421Salnsn 	}
296565b4b421Salnsn 
296665b4b421Salnsn 	bpfjit_free_code(code);
296765b4b421Salnsn }
296865b4b421Salnsn 
2969658efa86Salnsn ATF_TC(libbpfjit_ld_ind_x_overflow2);
ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2,tc)2970658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
297165b4b421Salnsn {
297265b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
297365b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
297465b4b421Salnsn }
297565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2,tc)2976658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
297765b4b421Salnsn {
297865b4b421Salnsn 	static struct bpf_insn insns[] = {
297965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_LEN, 0),
298065b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
298165b4b421Salnsn 		BPF_STMT(BPF_ST, 3),
298265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
298365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
298465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
298565b4b421Salnsn 	};
298665b4b421Salnsn 
298765b4b421Salnsn 	size_t i;
2988d0748eb9Srmind 	bpfjit_func_t code;
298965b4b421Salnsn 	uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
299065b4b421Salnsn 
299165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
299265b4b421Salnsn 
299365b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
299465b4b421Salnsn 
299519fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
299665b4b421Salnsn 	ATF_REQUIRE(code != NULL);
299765b4b421Salnsn 
299865b4b421Salnsn 	for (i = 1; i <= sizeof(pkt); i++) {
299965b4b421Salnsn 		ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
300019fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
300165b4b421Salnsn 	}
300265b4b421Salnsn 
300365b4b421Salnsn 	bpfjit_free_code(code);
300465b4b421Salnsn }
300565b4b421Salnsn 
3006658efa86Salnsn ATF_TC(libbpfjit_ld_len);
ATF_TC_HEAD(libbpfjit_ld_len,tc)3007658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_len, tc)
300865b4b421Salnsn {
300965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
301065b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
301165b4b421Salnsn }
301265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_len,tc)3013658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_len, tc)
301465b4b421Salnsn {
301565b4b421Salnsn 	static struct bpf_insn insns[] = {
301665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
301765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
301865b4b421Salnsn 	};
301965b4b421Salnsn 
302065b4b421Salnsn 	size_t i;
3021d0748eb9Srmind 	bpfjit_func_t code;
302265b4b421Salnsn 	uint8_t pkt[32]; /* the program doesn't read any data */
302365b4b421Salnsn 
302465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
302565b4b421Salnsn 
302665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
302765b4b421Salnsn 
302819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
302965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
303065b4b421Salnsn 
303165b4b421Salnsn 	for (i = 0; i < sizeof(pkt); i++)
303219fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
303365b4b421Salnsn 
303465b4b421Salnsn 	bpfjit_free_code(code);
303565b4b421Salnsn }
303665b4b421Salnsn 
3037658efa86Salnsn ATF_TC(libbpfjit_ld_imm);
ATF_TC_HEAD(libbpfjit_ld_imm,tc)3038658efa86Salnsn ATF_TC_HEAD(libbpfjit_ld_imm, tc)
303965b4b421Salnsn {
304065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
304165b4b421Salnsn 	    "Test JIT compilation of BPF_LD+BPF_IMM");
304265b4b421Salnsn }
304365b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ld_imm,tc)3044658efa86Salnsn ATF_TC_BODY(libbpfjit_ld_imm, tc)
304565b4b421Salnsn {
304665b4b421Salnsn 	static struct bpf_insn insns[] = {
304765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
304865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
304965b4b421Salnsn 	};
305065b4b421Salnsn 
3051d0748eb9Srmind 	bpfjit_func_t code;
305265b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
305365b4b421Salnsn 
305465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
305565b4b421Salnsn 
305665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
305765b4b421Salnsn 
305819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
305965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
306065b4b421Salnsn 
306119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
306265b4b421Salnsn 
306365b4b421Salnsn 	bpfjit_free_code(code);
306465b4b421Salnsn }
306565b4b421Salnsn 
3066658efa86Salnsn ATF_TC(libbpfjit_ldx_imm1);
ATF_TC_HEAD(libbpfjit_ldx_imm1,tc)3067658efa86Salnsn ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
306865b4b421Salnsn {
306965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
307065b4b421Salnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
307165b4b421Salnsn }
307265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ldx_imm1,tc)3073658efa86Salnsn ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
307465b4b421Salnsn {
307565b4b421Salnsn 	static struct bpf_insn insns[] = {
307665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
307765b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
307865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
307965b4b421Salnsn 	};
308065b4b421Salnsn 
3081d0748eb9Srmind 	bpfjit_func_t code;
308265b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
308365b4b421Salnsn 
308465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
308565b4b421Salnsn 
308665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
308765b4b421Salnsn 
308819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
308965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
309065b4b421Salnsn 
309119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
309265b4b421Salnsn 
309365b4b421Salnsn 	bpfjit_free_code(code);
309465b4b421Salnsn }
309565b4b421Salnsn 
3096658efa86Salnsn ATF_TC(libbpfjit_ldx_imm2);
ATF_TC_HEAD(libbpfjit_ldx_imm2,tc)3097658efa86Salnsn ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
309865b4b421Salnsn {
309965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
310065b4b421Salnsn 	    "Test JIT compilation of BPF_LDX+BPF_IMM");
310165b4b421Salnsn }
310265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ldx_imm2,tc)3103658efa86Salnsn ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
310465b4b421Salnsn {
310565b4b421Salnsn 	static struct bpf_insn insns[] = {
310665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
310765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
310865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
310965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
311065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
311165b4b421Salnsn 	};
311265b4b421Salnsn 
3113d0748eb9Srmind 	bpfjit_func_t code;
311465b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
311565b4b421Salnsn 
311665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
311765b4b421Salnsn 
311865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
311965b4b421Salnsn 
312019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
312165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
312265b4b421Salnsn 
312319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
312465b4b421Salnsn 
312565b4b421Salnsn 	bpfjit_free_code(code);
312665b4b421Salnsn }
312765b4b421Salnsn 
3128658efa86Salnsn ATF_TC(libbpfjit_ldx_len1);
ATF_TC_HEAD(libbpfjit_ldx_len1,tc)3129658efa86Salnsn ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
313065b4b421Salnsn {
313165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
313265b4b421Salnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
313365b4b421Salnsn }
313465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ldx_len1,tc)3135658efa86Salnsn ATF_TC_BODY(libbpfjit_ldx_len1, tc)
313665b4b421Salnsn {
313765b4b421Salnsn 	static struct bpf_insn insns[] = {
313865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
313965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
314065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
314165b4b421Salnsn 	};
314265b4b421Salnsn 
314365b4b421Salnsn 	size_t i;
3144d0748eb9Srmind 	bpfjit_func_t code;
314565b4b421Salnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
314665b4b421Salnsn 
314765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
314865b4b421Salnsn 
314965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
315065b4b421Salnsn 
315119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
315265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
315365b4b421Salnsn 
315465b4b421Salnsn 	for (i = 1; i < sizeof(pkt); i++) {
315519fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, 1) == i);
315619fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
315765b4b421Salnsn 	}
315865b4b421Salnsn 
315965b4b421Salnsn 	bpfjit_free_code(code);
316065b4b421Salnsn }
316165b4b421Salnsn 
3162658efa86Salnsn ATF_TC(libbpfjit_ldx_len2);
ATF_TC_HEAD(libbpfjit_ldx_len2,tc)3163658efa86Salnsn ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
316465b4b421Salnsn {
316565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
316665b4b421Salnsn 	    "Test JIT compilation of BPF_LDX+BPF_LEN");
316765b4b421Salnsn }
316865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ldx_len2,tc)3169658efa86Salnsn ATF_TC_BODY(libbpfjit_ldx_len2, tc)
317065b4b421Salnsn {
317165b4b421Salnsn 	static struct bpf_insn insns[] = {
317265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
317365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 5),
317465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
317565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 7),
317665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
317765b4b421Salnsn 	};
317865b4b421Salnsn 
3179d0748eb9Srmind 	bpfjit_func_t code;
318065b4b421Salnsn 	uint8_t pkt[5]; /* the program doesn't read any data */
318165b4b421Salnsn 
318265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
318365b4b421Salnsn 
318465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
318565b4b421Salnsn 
318619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
318765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
318865b4b421Salnsn 
318919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
319019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
319165b4b421Salnsn 
319265b4b421Salnsn 	bpfjit_free_code(code);
319365b4b421Salnsn }
319465b4b421Salnsn 
3195658efa86Salnsn ATF_TC(libbpfjit_ldx_msh);
ATF_TC_HEAD(libbpfjit_ldx_msh,tc)3196658efa86Salnsn ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
319765b4b421Salnsn {
319865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
319965b4b421Salnsn 	    "Test JIT compilation of BPF_LDX+BPF_MSH");
320065b4b421Salnsn }
320165b4b421Salnsn 
ATF_TC_BODY(libbpfjit_ldx_msh,tc)3202658efa86Salnsn ATF_TC_BODY(libbpfjit_ldx_msh, tc)
320365b4b421Salnsn {
320465b4b421Salnsn 	static struct bpf_insn insns[] = {
320565b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
320665b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
320765b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
320865b4b421Salnsn 	};
320965b4b421Salnsn 
3210d0748eb9Srmind 	bpfjit_func_t code;
321165b4b421Salnsn 	uint8_t pkt[2] = { 0, 0x7a };
321265b4b421Salnsn 
321365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
321465b4b421Salnsn 
321565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
321665b4b421Salnsn 
321719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
321865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
321965b4b421Salnsn 
322019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
322165b4b421Salnsn 
322265b4b421Salnsn 	bpfjit_free_code(code);
322365b4b421Salnsn }
322465b4b421Salnsn 
3225658efa86Salnsn ATF_TC(libbpfjit_misc_tax);
ATF_TC_HEAD(libbpfjit_misc_tax,tc)3226658efa86Salnsn ATF_TC_HEAD(libbpfjit_misc_tax, tc)
322765b4b421Salnsn {
322865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
322965b4b421Salnsn 	    "Test JIT compilation of BPF_MISC+BPF_TAX");
323065b4b421Salnsn }
323165b4b421Salnsn 
ATF_TC_BODY(libbpfjit_misc_tax,tc)3232658efa86Salnsn ATF_TC_BODY(libbpfjit_misc_tax, tc)
323365b4b421Salnsn {
323465b4b421Salnsn 	static struct bpf_insn insns[] = {
323565b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_IMM, 3),
323665b4b421Salnsn 		BPF_STMT(BPF_MISC+BPF_TAX, 0),
323765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
323865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
323965b4b421Salnsn 	};
324065b4b421Salnsn 
3241d0748eb9Srmind 	bpfjit_func_t code;
324265b4b421Salnsn 	uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
324365b4b421Salnsn 
324465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
324565b4b421Salnsn 
324665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
324765b4b421Salnsn 
324819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
324965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
325065b4b421Salnsn 
325119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
325265b4b421Salnsn 
325365b4b421Salnsn 	bpfjit_free_code(code);
325465b4b421Salnsn }
325565b4b421Salnsn 
3256658efa86Salnsn ATF_TC(libbpfjit_misc_txa);
ATF_TC_HEAD(libbpfjit_misc_txa,tc)3257658efa86Salnsn ATF_TC_HEAD(libbpfjit_misc_txa, tc)
325865b4b421Salnsn {
325965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
326065b4b421Salnsn 	    "Test JIT compilation of BPF_MISC+BPF_TXA");
326165b4b421Salnsn }
326265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_misc_txa,tc)3263658efa86Salnsn ATF_TC_BODY(libbpfjit_misc_txa, tc)
326465b4b421Salnsn {
326565b4b421Salnsn 	static struct bpf_insn insns[] = {
326665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
326765b4b421Salnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
326865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
326965b4b421Salnsn 	};
327065b4b421Salnsn 
3271d0748eb9Srmind 	bpfjit_func_t code;
327265b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
327365b4b421Salnsn 
327465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
327565b4b421Salnsn 
327665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
327765b4b421Salnsn 
327819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
327965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
328065b4b421Salnsn 
328119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
328265b4b421Salnsn 
328365b4b421Salnsn 	bpfjit_free_code(code);
328465b4b421Salnsn }
328565b4b421Salnsn 
3286658efa86Salnsn ATF_TC(libbpfjit_st1);
ATF_TC_HEAD(libbpfjit_st1,tc)3287658efa86Salnsn ATF_TC_HEAD(libbpfjit_st1, tc)
328865b4b421Salnsn {
328965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
329065b4b421Salnsn 	    "Test JIT compilation of BPF_ST");
329165b4b421Salnsn }
329265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_st1,tc)3293658efa86Salnsn ATF_TC_BODY(libbpfjit_st1, tc)
329465b4b421Salnsn {
329565b4b421Salnsn 	static struct bpf_insn insns[] = {
329665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
329765b4b421Salnsn 		BPF_STMT(BPF_ST, 0),
3298658efa86Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
329965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
330065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
330165b4b421Salnsn 	};
330265b4b421Salnsn 
330365b4b421Salnsn 	size_t i;
3304d0748eb9Srmind 	bpfjit_func_t code;
330565b4b421Salnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
330665b4b421Salnsn 
330765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
330865b4b421Salnsn 
330965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
331065b4b421Salnsn 
331119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
331265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
331365b4b421Salnsn 
331465b4b421Salnsn 	for (i = 1; i <= sizeof(pkt); i++)
331519fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
331665b4b421Salnsn 
331765b4b421Salnsn 	bpfjit_free_code(code);
331865b4b421Salnsn }
331965b4b421Salnsn 
3320658efa86Salnsn ATF_TC(libbpfjit_st2);
ATF_TC_HEAD(libbpfjit_st2,tc)3321658efa86Salnsn ATF_TC_HEAD(libbpfjit_st2, tc)
332265b4b421Salnsn {
332365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
332465b4b421Salnsn 	    "Test JIT compilation of BPF_ST");
332565b4b421Salnsn }
332665b4b421Salnsn 
ATF_TC_BODY(libbpfjit_st2,tc)3327658efa86Salnsn ATF_TC_BODY(libbpfjit_st2, tc)
332865b4b421Salnsn {
332965b4b421Salnsn 	static struct bpf_insn insns[] = {
333065b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
333165b4b421Salnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
333265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
333365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
333465b4b421Salnsn 	};
333565b4b421Salnsn 
3336d0748eb9Srmind 	bpfjit_func_t code;
333765b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
333865b4b421Salnsn 
333965b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
334065b4b421Salnsn 
334165b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
334265b4b421Salnsn 
334319fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
334465b4b421Salnsn 	ATF_REQUIRE(code != NULL);
334565b4b421Salnsn 
334619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
334765b4b421Salnsn 
334865b4b421Salnsn 	bpfjit_free_code(code);
334965b4b421Salnsn }
335065b4b421Salnsn 
3351658efa86Salnsn ATF_TC(libbpfjit_st3);
ATF_TC_HEAD(libbpfjit_st3,tc)3352658efa86Salnsn ATF_TC_HEAD(libbpfjit_st3, tc)
335365b4b421Salnsn {
335465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
335565b4b421Salnsn 	    "Test JIT compilation of BPF_ST");
335665b4b421Salnsn }
335765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_st3,tc)3358658efa86Salnsn ATF_TC_BODY(libbpfjit_st3, tc)
335965b4b421Salnsn {
336065b4b421Salnsn 	static struct bpf_insn insns[] = {
336165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
336265b4b421Salnsn 		BPF_STMT(BPF_ST, 0),
336365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
336465b4b421Salnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
336565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
336665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
336765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
336865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
336965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, 0),
337065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
337165b4b421Salnsn 	};
337265b4b421Salnsn 
3373d0748eb9Srmind 	bpfjit_func_t code;
337465b4b421Salnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
337565b4b421Salnsn 
337665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
337765b4b421Salnsn 
337865b4b421Salnsn 	ATF_REQUIRE(BPF_MEMWORDS > 1);
337965b4b421Salnsn 
338065b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
338165b4b421Salnsn 
338219fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
338365b4b421Salnsn 	ATF_REQUIRE(code != NULL);
338465b4b421Salnsn 
338519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
338619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
338765b4b421Salnsn 
338865b4b421Salnsn 	bpfjit_free_code(code);
338965b4b421Salnsn }
339065b4b421Salnsn 
3391658efa86Salnsn ATF_TC(libbpfjit_st4);
ATF_TC_HEAD(libbpfjit_st4,tc)3392658efa86Salnsn ATF_TC_HEAD(libbpfjit_st4, tc)
339365b4b421Salnsn {
339465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
339565b4b421Salnsn 	    "Test JIT compilation of BPF_ST");
339665b4b421Salnsn }
339765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_st4,tc)3398658efa86Salnsn ATF_TC_BODY(libbpfjit_st4, tc)
339965b4b421Salnsn {
340065b4b421Salnsn 	static struct bpf_insn insns[] = {
340165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
340265b4b421Salnsn 		BPF_STMT(BPF_ST, 5),
340365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
340465b4b421Salnsn 		BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
340565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
340665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
340765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
340865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
340965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_MEM, 5),
341065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
341165b4b421Salnsn 	};
341265b4b421Salnsn 
3413d0748eb9Srmind 	bpfjit_func_t code;
341465b4b421Salnsn 	uint8_t pkt[2]; /* the program doesn't read any data */
341565b4b421Salnsn 
341665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
341765b4b421Salnsn 
341865b4b421Salnsn 	ATF_REQUIRE(BPF_MEMWORDS > 6);
341965b4b421Salnsn 
342065b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
342165b4b421Salnsn 
342219fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
342365b4b421Salnsn 	ATF_REQUIRE(code != NULL);
342465b4b421Salnsn 
342519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
342619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
342765b4b421Salnsn 
342865b4b421Salnsn 	bpfjit_free_code(code);
342965b4b421Salnsn }
343065b4b421Salnsn 
3431658efa86Salnsn ATF_TC(libbpfjit_st5);
ATF_TC_HEAD(libbpfjit_st5,tc)3432658efa86Salnsn ATF_TC_HEAD(libbpfjit_st5, tc)
343365b4b421Salnsn {
343465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
343565b4b421Salnsn 	    "Test JIT compilation of BPF_ST");
343665b4b421Salnsn }
343765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_st5,tc)3438658efa86Salnsn ATF_TC_BODY(libbpfjit_st5, tc)
343965b4b421Salnsn {
344065b4b421Salnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
344165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
344265b4b421Salnsn 
344365b4b421Salnsn 	size_t k;
3444d0748eb9Srmind 	bpfjit_func_t code;
344565b4b421Salnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
344665b4b421Salnsn 
344765b4b421Salnsn 	memset(insns, 0, sizeof(insns));
344865b4b421Salnsn 
344965b4b421Salnsn 	/* for each k do M[k] = k */
345065b4b421Salnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
345165b4b421Salnsn 		insns[2*k].code   = BPF_LD+BPF_IMM;
345265b4b421Salnsn 		insns[2*k].k      = 3*k;
345365b4b421Salnsn 		insns[2*k+1].code = BPF_ST;
345465b4b421Salnsn 		insns[2*k+1].k    = k;
345565b4b421Salnsn 	}
345665b4b421Salnsn 
345765b4b421Salnsn 	/* load wirelen into A */
345865b4b421Salnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
345965b4b421Salnsn 
346065b4b421Salnsn 	/* for each k, if (A == k + 1) return M[k] */
346165b4b421Salnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
346265b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
346365b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
346465b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
346565b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
346665b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
346765b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
346865b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
346965b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
347065b4b421Salnsn 	}
347165b4b421Salnsn 
347265b4b421Salnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
347365b4b421Salnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
347465b4b421Salnsn 
347565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
347665b4b421Salnsn 
347719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
347865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
347965b4b421Salnsn 
348065b4b421Salnsn 	for (k = 1; k <= sizeof(pkt); k++)
348119fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
348265b4b421Salnsn 
348365b4b421Salnsn 	bpfjit_free_code(code);
348465b4b421Salnsn }
348565b4b421Salnsn 
3486658efa86Salnsn ATF_TC(libbpfjit_stx1);
ATF_TC_HEAD(libbpfjit_stx1,tc)3487658efa86Salnsn ATF_TC_HEAD(libbpfjit_stx1, tc)
348865b4b421Salnsn {
348965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
349065b4b421Salnsn 	    "Test JIT compilation of BPF_STX");
349165b4b421Salnsn }
349265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_stx1,tc)3493658efa86Salnsn ATF_TC_BODY(libbpfjit_stx1, tc)
349465b4b421Salnsn {
349565b4b421Salnsn 	static struct bpf_insn insns[] = {
349665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
349765b4b421Salnsn 		BPF_STMT(BPF_STX, 0),
349865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
349965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
350065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
350165b4b421Salnsn 	};
350265b4b421Salnsn 
350365b4b421Salnsn 	size_t i;
3504d0748eb9Srmind 	bpfjit_func_t code;
350565b4b421Salnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
350665b4b421Salnsn 
350765b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
350865b4b421Salnsn 
350965b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
351065b4b421Salnsn 
351119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
351265b4b421Salnsn 	ATF_REQUIRE(code != NULL);
351365b4b421Salnsn 
351465b4b421Salnsn 	for (i = 1; i <= sizeof(pkt); i++)
351519fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
351665b4b421Salnsn 
351765b4b421Salnsn 	bpfjit_free_code(code);
351865b4b421Salnsn }
351965b4b421Salnsn 
3520658efa86Salnsn ATF_TC(libbpfjit_stx2);
ATF_TC_HEAD(libbpfjit_stx2,tc)3521658efa86Salnsn ATF_TC_HEAD(libbpfjit_stx2, tc)
352265b4b421Salnsn {
352365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
352465b4b421Salnsn 	    "Test JIT compilation of BPF_STX");
352565b4b421Salnsn }
352665b4b421Salnsn 
ATF_TC_BODY(libbpfjit_stx2,tc)3527658efa86Salnsn ATF_TC_BODY(libbpfjit_stx2, tc)
352865b4b421Salnsn {
352965b4b421Salnsn 	static struct bpf_insn insns[] = {
353065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
353165b4b421Salnsn 		BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
353265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
353365b4b421Salnsn 		BPF_STMT(BPF_MISC+BPF_TXA, 0),
353465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
353565b4b421Salnsn 	};
353665b4b421Salnsn 
3537d0748eb9Srmind 	bpfjit_func_t code;
353865b4b421Salnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
353965b4b421Salnsn 
354065b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
354165b4b421Salnsn 
354265b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
354365b4b421Salnsn 
354419fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
354565b4b421Salnsn 	ATF_REQUIRE(code != NULL);
354665b4b421Salnsn 
354719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
354865b4b421Salnsn 
354965b4b421Salnsn 	bpfjit_free_code(code);
355065b4b421Salnsn }
355165b4b421Salnsn 
3552658efa86Salnsn ATF_TC(libbpfjit_stx3);
ATF_TC_HEAD(libbpfjit_stx3,tc)3553658efa86Salnsn ATF_TC_HEAD(libbpfjit_stx3, tc)
355465b4b421Salnsn {
355565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
355665b4b421Salnsn 	    "Test JIT compilation of BPF_STX");
355765b4b421Salnsn }
355865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_stx3,tc)3559658efa86Salnsn ATF_TC_BODY(libbpfjit_stx3, tc)
356065b4b421Salnsn {
356165b4b421Salnsn 	static struct bpf_insn insns[] = {
356265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
356365b4b421Salnsn 		BPF_STMT(BPF_STX, 5),
356465b4b421Salnsn 		BPF_STMT(BPF_STX, 2),
356565b4b421Salnsn 		BPF_STMT(BPF_STX, 3),
356665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
356765b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
356865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
356965b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357065b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
357165b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357265b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
357365b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357465b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
357565b4b421Salnsn 		BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_A, 0)
357765b4b421Salnsn 	};
357865b4b421Salnsn 
357965b4b421Salnsn 	size_t i;
3580d0748eb9Srmind 	bpfjit_func_t code;
358165b4b421Salnsn 	uint8_t pkt[16]; /* the program doesn't read any data */
358265b4b421Salnsn 
358365b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
358465b4b421Salnsn 
358565b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
358665b4b421Salnsn 
358719fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
358865b4b421Salnsn 	ATF_REQUIRE(code != NULL);
358965b4b421Salnsn 
359065b4b421Salnsn 	for (i = 1; i <= sizeof(pkt); i++)
359119fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
359265b4b421Salnsn 
359365b4b421Salnsn 	bpfjit_free_code(code);
359465b4b421Salnsn }
359565b4b421Salnsn 
3596658efa86Salnsn ATF_TC(libbpfjit_stx4);
ATF_TC_HEAD(libbpfjit_stx4,tc)3597658efa86Salnsn ATF_TC_HEAD(libbpfjit_stx4, tc)
359865b4b421Salnsn {
359965b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
360065b4b421Salnsn 	    "Test JIT compilation of BPF_STX");
360165b4b421Salnsn }
360265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_stx4,tc)3603658efa86Salnsn ATF_TC_BODY(libbpfjit_stx4, tc)
360465b4b421Salnsn {
360565b4b421Salnsn 	struct bpf_insn insns[5*BPF_MEMWORDS+2];
360665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
360765b4b421Salnsn 
360865b4b421Salnsn 	size_t k;
3609d0748eb9Srmind 	bpfjit_func_t code;
361065b4b421Salnsn 	uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
361165b4b421Salnsn 
361265b4b421Salnsn 	memset(insns, 0, sizeof(insns));
361365b4b421Salnsn 
361465b4b421Salnsn 	/* for each k do M[k] = k */
361565b4b421Salnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
361665b4b421Salnsn 		insns[2*k].code   = BPF_LDX+BPF_W+BPF_IMM;
361765b4b421Salnsn 		insns[2*k].k      = 3*k;
361865b4b421Salnsn 		insns[2*k+1].code = BPF_STX;
361965b4b421Salnsn 		insns[2*k+1].k    = k;
362065b4b421Salnsn 	}
362165b4b421Salnsn 
362265b4b421Salnsn 	/* load wirelen into A */
362365b4b421Salnsn 	insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
362465b4b421Salnsn 
362565b4b421Salnsn 	/* for each k, if (A == k + 1) return M[k] */
362665b4b421Salnsn 	for (k = 0; k < BPF_MEMWORDS; k++) {
362765b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
362865b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].k    = k+1;
362965b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].jt   = 0;
363065b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+1].jf   = 2;
363165b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
363265b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+2].k    = k;
363365b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
363465b4b421Salnsn 		insns[2*BPF_MEMWORDS+3*k+3].k    = 0;
363565b4b421Salnsn 	}
363665b4b421Salnsn 
363765b4b421Salnsn 	insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
363865b4b421Salnsn 	insns[5*BPF_MEMWORDS+1].k    = UINT32_MAX;
363965b4b421Salnsn 
364065b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
364165b4b421Salnsn 
364219fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
364365b4b421Salnsn 	ATF_REQUIRE(code != NULL);
364465b4b421Salnsn 
364565b4b421Salnsn 	for (k = 1; k <= sizeof(pkt); k++)
364619fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
364765b4b421Salnsn 
364865b4b421Salnsn 	bpfjit_free_code(code);
364965b4b421Salnsn }
365065b4b421Salnsn 
3651658efa86Salnsn ATF_TC(libbpfjit_opt_ld_abs_1);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_1,tc)3652658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
365365b4b421Salnsn {
365465b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
365565b4b421Salnsn 	    "Test JIT compilation with length optimization "
365665b4b421Salnsn 	    "applied to BPF_LD+BPF_ABS");
365765b4b421Salnsn }
365865b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_abs_1,tc)3659658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
366065b4b421Salnsn {
366165b4b421Salnsn 	static struct bpf_insn insns[] = {
366265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
366365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
366465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
366565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
366665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
366765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
366865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
366965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
367065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
367165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
367265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
367365b4b421Salnsn 	};
367465b4b421Salnsn 
367565b4b421Salnsn 	size_t i, j;
3676d0748eb9Srmind 	bpfjit_func_t code;
367765b4b421Salnsn 	uint8_t pkt[2][34] = {
367865b4b421Salnsn 		{
367965b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
368065b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
368165b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
368265b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
368365b4b421Salnsn 		},
368465b4b421Salnsn 		{
368565b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
368665b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
368765b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
368865b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
368965b4b421Salnsn 		}
369065b4b421Salnsn 	};
369165b4b421Salnsn 
369265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
369365b4b421Salnsn 
369465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
369565b4b421Salnsn 
369619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
369765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
369865b4b421Salnsn 
369965b4b421Salnsn 	for (i = 0; i < 2; i++) {
370065b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
370119fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
370219fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
370365b4b421Salnsn 	}
370465b4b421Salnsn 
370565b4b421Salnsn 	bpfjit_free_code(code);
370665b4b421Salnsn }
370765b4b421Salnsn 
3708658efa86Salnsn ATF_TC(libbpfjit_opt_ld_abs_2);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_2,tc)3709658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
371065b4b421Salnsn {
371165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
371265b4b421Salnsn 	    "Test JIT compilation with length optimization "
371365b4b421Salnsn 	    "applied to BPF_LD+BPF_ABS");
371465b4b421Salnsn }
371565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_abs_2,tc)3716658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
371765b4b421Salnsn {
371865b4b421Salnsn 	static struct bpf_insn insns[] = {
371965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
372065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
372165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
372265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
372365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
372465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
372565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
372665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
372765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
372865b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
372965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
373065b4b421Salnsn 	};
373165b4b421Salnsn 
373265b4b421Salnsn 	size_t i, j;
3733d0748eb9Srmind 	bpfjit_func_t code;
373465b4b421Salnsn 	uint8_t pkt[2][34] = {
373565b4b421Salnsn 		{
373665b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
373765b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
373865b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
373965b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
374065b4b421Salnsn 		},
374165b4b421Salnsn 		{
374265b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
374365b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
374465b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
374565b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
374665b4b421Salnsn 		}
374765b4b421Salnsn 	};
374865b4b421Salnsn 
374965b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
375065b4b421Salnsn 
375165b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
375265b4b421Salnsn 
375319fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
375465b4b421Salnsn 	ATF_REQUIRE(code != NULL);
375565b4b421Salnsn 
375665b4b421Salnsn 	for (i = 0; i < 2; i++) {
375765b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
375819fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
375919fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
376065b4b421Salnsn 	}
376165b4b421Salnsn 
376265b4b421Salnsn 	bpfjit_free_code(code);
376365b4b421Salnsn }
376465b4b421Salnsn 
3765658efa86Salnsn ATF_TC(libbpfjit_opt_ld_abs_3);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_3,tc)3766658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
376765b4b421Salnsn {
376865b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
376965b4b421Salnsn 	    "Test JIT compilation with length optimization "
377065b4b421Salnsn 	    "applied to BPF_LD+BPF_ABS");
377165b4b421Salnsn }
377265b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_abs_3,tc)3773658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
377465b4b421Salnsn {
377565b4b421Salnsn 	static struct bpf_insn insns[] = {
377665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
377765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
377865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
377965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
378065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
378165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
378265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
378365b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
378465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
378565b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
378665b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
378765b4b421Salnsn 	};
378865b4b421Salnsn 
378965b4b421Salnsn 	size_t i, j;
3790d0748eb9Srmind 	bpfjit_func_t code;
379165b4b421Salnsn 	uint8_t pkt[2][34] = {
379265b4b421Salnsn 		{
379365b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
379465b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
379565b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
379665b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
379765b4b421Salnsn 		},
379865b4b421Salnsn 		{
379965b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
380065b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
380165b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
380265b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
380365b4b421Salnsn 		}
380465b4b421Salnsn 	};
380565b4b421Salnsn 
380665b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
380765b4b421Salnsn 
380865b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
380965b4b421Salnsn 
381019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
381165b4b421Salnsn 	ATF_REQUIRE(code != NULL);
381265b4b421Salnsn 
381365b4b421Salnsn 	for (i = 0; i < 2; i++) {
381465b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
381519fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
381619fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
381765b4b421Salnsn 	}
381865b4b421Salnsn 
381965b4b421Salnsn 	bpfjit_free_code(code);
382065b4b421Salnsn }
382165b4b421Salnsn 
3822658efa86Salnsn ATF_TC(libbpfjit_opt_ld_ind_1);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_1,tc)3823658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
382465b4b421Salnsn {
382565b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
382665b4b421Salnsn 	    "Test JIT compilation with length optimization "
382765b4b421Salnsn 	    "applied to BPF_LD+BPF_IND");
382865b4b421Salnsn }
382965b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_ind_1,tc)3830658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
383165b4b421Salnsn {
383265b4b421Salnsn 	static struct bpf_insn insns[] = {
383365b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
383465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
383565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
383665b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
383765b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
383865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
383965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
384065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
384165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
384265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
384365b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
384465b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
384565b4b421Salnsn 	};
384665b4b421Salnsn 
384765b4b421Salnsn 	size_t i, j;
3848d0748eb9Srmind 	bpfjit_func_t code;
384965b4b421Salnsn 	uint8_t pkt[2][34] = {
385065b4b421Salnsn 		{
385165b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
385265b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
385365b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
385465b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
385565b4b421Salnsn 		},
385665b4b421Salnsn 		{
385765b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
385865b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
385965b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
386065b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
386165b4b421Salnsn 		}
386265b4b421Salnsn 	};
386365b4b421Salnsn 
386465b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
386565b4b421Salnsn 
386665b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
386765b4b421Salnsn 
386819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
386965b4b421Salnsn 	ATF_REQUIRE(code != NULL);
387065b4b421Salnsn 
387165b4b421Salnsn 	for (i = 0; i < 2; i++) {
387265b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
387319fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
387419fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
387565b4b421Salnsn 	}
387665b4b421Salnsn 
387765b4b421Salnsn 	bpfjit_free_code(code);
387865b4b421Salnsn }
387965b4b421Salnsn 
3880658efa86Salnsn ATF_TC(libbpfjit_opt_ld_ind_2);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_2,tc)3881658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
388265b4b421Salnsn {
388365b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
388465b4b421Salnsn 	    "Test JIT compilation with length optimization "
388565b4b421Salnsn 	    "applied to BPF_LD+BPF_IND");
388665b4b421Salnsn }
388765b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_ind_2,tc)3888658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
388965b4b421Salnsn {
389065b4b421Salnsn 	static struct bpf_insn insns[] = {
389165b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
389265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
389365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
389465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
389565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
389665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
389765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
389865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
389965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
390065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
390165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
390265b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
390365b4b421Salnsn 	};
390465b4b421Salnsn 
390565b4b421Salnsn 	size_t i, j;
3906d0748eb9Srmind 	bpfjit_func_t code;
390765b4b421Salnsn 	uint8_t pkt[2][34] = {
390865b4b421Salnsn 		{
390965b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
391065b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
391165b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
391265b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
391365b4b421Salnsn 		},
391465b4b421Salnsn 		{
391565b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
391665b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
391765b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
391865b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
391965b4b421Salnsn 		}
392065b4b421Salnsn 	};
392165b4b421Salnsn 
392265b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
392365b4b421Salnsn 
392465b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
392565b4b421Salnsn 
392619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
392765b4b421Salnsn 	ATF_REQUIRE(code != NULL);
392865b4b421Salnsn 
392965b4b421Salnsn 	for (i = 0; i < 2; i++) {
393065b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
393119fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
393219fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
393365b4b421Salnsn 	}
393465b4b421Salnsn 
393565b4b421Salnsn 	bpfjit_free_code(code);
393665b4b421Salnsn }
393765b4b421Salnsn 
3938658efa86Salnsn ATF_TC(libbpfjit_opt_ld_ind_3);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_3,tc)3939658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
394065b4b421Salnsn {
394165b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
394265b4b421Salnsn 	    "Test JIT compilation with length optimization "
394365b4b421Salnsn 	    "applied to BPF_LD+BPF_IND");
394465b4b421Salnsn }
394565b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_ind_3,tc)3946658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
394765b4b421Salnsn {
394865b4b421Salnsn 	static struct bpf_insn insns[] = {
394965b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
395065b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
395165b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
395265b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
395365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
395465b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
395565b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
395665b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
395765b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
395865b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
395965b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
396065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
396165b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
396265b4b421Salnsn 	};
396365b4b421Salnsn 
396465b4b421Salnsn 	size_t i, j;
3965d0748eb9Srmind 	bpfjit_func_t code;
396665b4b421Salnsn 	uint8_t pkt[2][34] = {
396765b4b421Salnsn 		{
396865b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
396965b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
397065b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
397165b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
397265b4b421Salnsn 		},
397365b4b421Salnsn 		{
397465b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
397565b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
397665b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
397765b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
397865b4b421Salnsn 		}
397965b4b421Salnsn 	};
398065b4b421Salnsn 
398165b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
398265b4b421Salnsn 
398365b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
398465b4b421Salnsn 
398519fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
398665b4b421Salnsn 	ATF_REQUIRE(code != NULL);
398765b4b421Salnsn 
398865b4b421Salnsn 	for (i = 0; i < 2; i++) {
398965b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
399019fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
399119fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
399265b4b421Salnsn 	}
399365b4b421Salnsn 
399465b4b421Salnsn 	bpfjit_free_code(code);
399565b4b421Salnsn }
399665b4b421Salnsn 
3997658efa86Salnsn ATF_TC(libbpfjit_opt_ld_ind_4);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_4,tc)3998658efa86Salnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
399965b4b421Salnsn {
400065b4b421Salnsn 	atf_tc_set_md_var(tc, "descr",
400165b4b421Salnsn 	    "Test JIT compilation with length optimization "
400265b4b421Salnsn 	    "applied to BPF_LD+BPF_IND");
400365b4b421Salnsn }
400465b4b421Salnsn 
ATF_TC_BODY(libbpfjit_opt_ld_ind_4,tc)4005658efa86Salnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
400665b4b421Salnsn {
400765b4b421Salnsn 	static struct bpf_insn insns[] = {
400865b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
400965b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
401065b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
401165b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
401265b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
401365b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
401465b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
401565b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
401665b4b421Salnsn 		BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
401765b4b421Salnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
401865b4b421Salnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
401965b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
402065b4b421Salnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
402165b4b421Salnsn 	};
402265b4b421Salnsn 
402365b4b421Salnsn 	size_t i, j;
4024d0748eb9Srmind 	bpfjit_func_t code;
402565b4b421Salnsn 	uint8_t pkt[2][34] = {
402665b4b421Salnsn 		{
402765b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
402865b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
402965b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f,
403065b4b421Salnsn 			0x80, 0x03, 0x70, 0x23
403165b4b421Salnsn 		},
403265b4b421Salnsn 		{
403365b4b421Salnsn 			0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
403465b4b421Salnsn 			14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
403565b4b421Salnsn 			0x80, 0x03, 0x70, 0x23,
403665b4b421Salnsn 			0x80, 0x03, 0x70, 0x0f
403765b4b421Salnsn 		}
403865b4b421Salnsn 	};
403965b4b421Salnsn 
404065b4b421Salnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
404165b4b421Salnsn 
404265b4b421Salnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
404365b4b421Salnsn 
404419fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
404565b4b421Salnsn 	ATF_REQUIRE(code != NULL);
404665b4b421Salnsn 
404765b4b421Salnsn 	for (i = 0; i < 2; i++) {
404865b4b421Salnsn 		for (j = 1; j < sizeof(pkt[i]); j++)
404919fed70dSalnsn 			ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
405019fed70dSalnsn 		ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
405165b4b421Salnsn 	}
405265b4b421Salnsn 
405365b4b421Salnsn 	bpfjit_free_code(code);
405465b4b421Salnsn }
405565b4b421Salnsn 
4056658efa86Salnsn ATF_TC(libbpfjit_abc_ja);
ATF_TC_HEAD(libbpfjit_abc_ja,tc)4057658efa86Salnsn ATF_TC_HEAD(libbpfjit_abc_ja, tc)
405802f87fcdSalnsn {
405902f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
406002f87fcdSalnsn 	    "Test ABC optimization with a single BPF_JMP+BPF_JA");
406102f87fcdSalnsn }
406202f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_abc_ja,tc)4063658efa86Salnsn ATF_TC_BODY(libbpfjit_abc_ja, tc)
406402f87fcdSalnsn {
406502f87fcdSalnsn 	static struct bpf_insn insns[] = {
406602f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
406702f87fcdSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
406802f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
406902f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
407002f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
407102f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_A, 0),
407202f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
407302f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
407402f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
407502f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
407602f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
407702f87fcdSalnsn 	};
407802f87fcdSalnsn 
407902f87fcdSalnsn 	bpfjit_func_t code;
408002f87fcdSalnsn 	uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
408102f87fcdSalnsn 
408202f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
408302f87fcdSalnsn 
408402f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
408502f87fcdSalnsn 
408619fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
408702f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
408802f87fcdSalnsn 
408919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
409019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
409119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
409219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
409319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
409419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
409502f87fcdSalnsn 
409602f87fcdSalnsn 	bpfjit_free_code(code);
409702f87fcdSalnsn }
409802f87fcdSalnsn 
4099658efa86Salnsn ATF_TC(libbpfjit_abc_ja_over);
ATF_TC_HEAD(libbpfjit_abc_ja_over,tc)4100658efa86Salnsn ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
410102f87fcdSalnsn {
410202f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
410302f87fcdSalnsn 	    "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
410402f87fcdSalnsn }
410502f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_abc_ja_over,tc)4106658efa86Salnsn ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
410702f87fcdSalnsn {
410802f87fcdSalnsn 	static struct bpf_insn insns[] = {
410902f87fcdSalnsn 		BPF_STMT(BPF_JMP+BPF_JA, 2),
411002f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
411102f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
411202f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
411302f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
411402f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 1),
411502f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
411602f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 2),
411702f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
411802f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 3),
411902f87fcdSalnsn 	};
412002f87fcdSalnsn 
412102f87fcdSalnsn 	bpfjit_func_t code;
412202f87fcdSalnsn 	uint8_t pkt[1]; /* the program doesn't read any data */
412302f87fcdSalnsn 
412402f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
412502f87fcdSalnsn 
412602f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
412702f87fcdSalnsn 
412819fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
412902f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
413002f87fcdSalnsn 
413119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
413202f87fcdSalnsn 
413302f87fcdSalnsn 	bpfjit_free_code(code);
413402f87fcdSalnsn }
413502f87fcdSalnsn 
4136658efa86Salnsn ATF_TC(libbpfjit_abc_ld_chain);
ATF_TC_HEAD(libbpfjit_abc_ld_chain,tc)4137658efa86Salnsn ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
413802f87fcdSalnsn {
413902f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
414002f87fcdSalnsn 	    "Test ABC optimization of a chain of BPF_LD instructions "
414102f87fcdSalnsn 	    "with exits leading to a single BPF_RET");
414202f87fcdSalnsn }
414302f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_abc_ld_chain,tc)4144658efa86Salnsn ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
414502f87fcdSalnsn {
414602f87fcdSalnsn 	static struct bpf_insn insns[] = {
414702f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
414802f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
414902f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
415002f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
415102f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
415202f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
415302f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 123456789),
415402f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 987654321),
415502f87fcdSalnsn 	};
415602f87fcdSalnsn 
415702f87fcdSalnsn 	bpfjit_func_t code;
415802f87fcdSalnsn 	uint8_t pkt[10] = {};
415902f87fcdSalnsn 
416002f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
416102f87fcdSalnsn 
416202f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
416302f87fcdSalnsn 
416419fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
416502f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
416602f87fcdSalnsn 
416702f87fcdSalnsn 	/* Packet is too short. */
416819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
416919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
417019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
417102f87fcdSalnsn 
417202f87fcdSalnsn 	/* !(pkt[3] == 8) => return 123456789 */
417319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
417419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
417519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
417619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
417719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
417819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
417902f87fcdSalnsn 
418002f87fcdSalnsn 	/* !(pkt[4:2] >= 7) => too short or return 123456789 */
418102f87fcdSalnsn 	pkt[3] = 8;
418219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
418319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
418419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
418519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
418619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
418719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
418819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
418902f87fcdSalnsn 
419002f87fcdSalnsn 	/* !(pkt[6:4] > 6) => too short or return 987654321 */
419102f87fcdSalnsn 	pkt[4] = pkt[5] = 1;
419219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
419319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
419419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
419519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
419619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
419719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
419819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
419919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
420019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
420119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
420202f87fcdSalnsn 
420302f87fcdSalnsn 	/* (pkt[6:4] > 6) => too short or return 123456789 */
420402f87fcdSalnsn 	pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
420519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
420619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
420719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
420819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
420919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
421019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
421119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
421219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
421319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
421419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
421502f87fcdSalnsn 
421602f87fcdSalnsn 	bpfjit_free_code(code);
421702f87fcdSalnsn }
421802f87fcdSalnsn 
4219658efa86Salnsn ATF_TC(libbpfjit_examples_1);
ATF_TC_HEAD(libbpfjit_examples_1,tc)4220658efa86Salnsn ATF_TC_HEAD(libbpfjit_examples_1, tc)
422102f87fcdSalnsn {
422202f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
422302f87fcdSalnsn 	    "Test the first example from bpf(4) - "
422402f87fcdSalnsn 	    "accept Reverse ARP requests");
422502f87fcdSalnsn }
422602f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_examples_1,tc)4227658efa86Salnsn ATF_TC_BODY(libbpfjit_examples_1, tc)
422802f87fcdSalnsn {
422902f87fcdSalnsn 	/*
423002f87fcdSalnsn 	 * The following filter is taken from the Reverse ARP
423102f87fcdSalnsn 	 * Daemon. It accepts only Reverse ARP requests.
423202f87fcdSalnsn 	 */
423302f87fcdSalnsn 	struct bpf_insn insns[] = {
423402f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
423502f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
423602f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
423702f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
423802f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 42),
423902f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
424002f87fcdSalnsn 	};
424102f87fcdSalnsn 
424202f87fcdSalnsn 	bpfjit_func_t code;
424302f87fcdSalnsn 	uint8_t pkt[22] = {};
424402f87fcdSalnsn 
424502f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
424602f87fcdSalnsn 
424702f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
424802f87fcdSalnsn 
424919fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
425002f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
425102f87fcdSalnsn 
425202f87fcdSalnsn 	/* Packet is too short. */
425319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
425419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
425519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
425619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
425719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
425819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
425919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
426019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
426119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
426219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
426319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
426419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
426519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
426619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
426719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
426819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
426919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
427019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
427119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
427219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
427319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
427402f87fcdSalnsn 
427502f87fcdSalnsn 	/* The packet doesn't match. */
427619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
427702f87fcdSalnsn 
427802f87fcdSalnsn 	/* Still no match after setting the protocol field. */
427902f87fcdSalnsn 	pkt[12] = 0x80; pkt[13] = 0x35;
428019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
428102f87fcdSalnsn 
428202f87fcdSalnsn 	/* Set RARP message type. */
428302f87fcdSalnsn 	pkt[21] = 3;
428419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
428502f87fcdSalnsn 
428602f87fcdSalnsn 	/* Packet is too short. */
428719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
428819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
428919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
429019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
429119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
429219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
429319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
429419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
429519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
429619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
429719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
429819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
429919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
430019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
430119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
430219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
430319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
430419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
430519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
430619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
430719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
430802f87fcdSalnsn 
430902f87fcdSalnsn 	/* Change RARP message type. */
431002f87fcdSalnsn 	pkt[20] = 3;
431119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
431202f87fcdSalnsn 
431302f87fcdSalnsn 	bpfjit_free_code(code);
431402f87fcdSalnsn }
431502f87fcdSalnsn 
4316658efa86Salnsn ATF_TC(libbpfjit_examples_2);
ATF_TC_HEAD(libbpfjit_examples_2,tc)4317658efa86Salnsn ATF_TC_HEAD(libbpfjit_examples_2, tc)
431802f87fcdSalnsn {
431902f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
432002f87fcdSalnsn 	    "Test the second example from bpf(4) - "
432102f87fcdSalnsn 	    "accept IP packets between two specified hosts");
432202f87fcdSalnsn }
432302f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_examples_2,tc)4324658efa86Salnsn ATF_TC_BODY(libbpfjit_examples_2, tc)
432502f87fcdSalnsn {
432602f87fcdSalnsn 	/*
432702f87fcdSalnsn 	 * This filter accepts only IP packets between host 128.3.112.15
432802f87fcdSalnsn 	 * and 128.3.112.35.
432902f87fcdSalnsn 	 */
433002f87fcdSalnsn 	static struct bpf_insn insns[] = {
433102f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
433202f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
433302f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
433402f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
433502f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
433602f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
433702f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
433802f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
433902f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
434002f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
434102f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
434202f87fcdSalnsn 	};
434302f87fcdSalnsn 
434402f87fcdSalnsn 	bpfjit_func_t code;
434502f87fcdSalnsn 	uint8_t pkt[34] = {};
434602f87fcdSalnsn 
434702f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
434802f87fcdSalnsn 
434902f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
435002f87fcdSalnsn 
435119fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
435202f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
435302f87fcdSalnsn 
435402f87fcdSalnsn 	/* Packet is too short. */
435519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
435619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
435719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
435819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
435919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
436019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
436119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
436219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
436319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
436419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
436519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
436619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
436719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
436819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
436919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
437019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
437119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
437219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
437319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
437419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
437519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
437619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
437719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
437819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
437919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
438019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
438119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
438219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
438319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
438419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
438519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
438619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
438719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
438802f87fcdSalnsn 
438902f87fcdSalnsn 	/* The packet doesn't match. */
439019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439102f87fcdSalnsn 
439202f87fcdSalnsn 	/* Still no match after setting the protocol field. */
439302f87fcdSalnsn 	pkt[12] = 8;
439419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439502f87fcdSalnsn 
439602f87fcdSalnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
439719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439802f87fcdSalnsn 
439902f87fcdSalnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
440019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
440102f87fcdSalnsn 
440202f87fcdSalnsn 	/* Swap the ip addresses. */
440302f87fcdSalnsn 	pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
440419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
440502f87fcdSalnsn 
440602f87fcdSalnsn 	pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
440719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
440802f87fcdSalnsn 
440902f87fcdSalnsn 	/* Packet is too short. */
441019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
441119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
441219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
441319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
441419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
441519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
441619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
441719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
441819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
441919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
442019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
442119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
442219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
442319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
442419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
442519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
442619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
442719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
442819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
442919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
443019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
443119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
443219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
443319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
443419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
443519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
443619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
443719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
443819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
443919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
444019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
444119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
444219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
444302f87fcdSalnsn 
444402f87fcdSalnsn 	/* Change the protocol field. */
444502f87fcdSalnsn 	pkt[13] = 8;
444619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
444702f87fcdSalnsn 
444802f87fcdSalnsn 	bpfjit_free_code(code);
444902f87fcdSalnsn }
445002f87fcdSalnsn 
4451658efa86Salnsn ATF_TC(libbpfjit_examples_3);
ATF_TC_HEAD(libbpfjit_examples_3,tc)4452658efa86Salnsn ATF_TC_HEAD(libbpfjit_examples_3, tc)
445302f87fcdSalnsn {
445402f87fcdSalnsn 	atf_tc_set_md_var(tc, "descr",
445502f87fcdSalnsn 	    "Test the third example from bpf(4) - "
445602f87fcdSalnsn 	    "accept TCP finger packets");
445702f87fcdSalnsn }
445802f87fcdSalnsn 
ATF_TC_BODY(libbpfjit_examples_3,tc)4459658efa86Salnsn ATF_TC_BODY(libbpfjit_examples_3, tc)
446002f87fcdSalnsn {
446102f87fcdSalnsn 	/*
446202f87fcdSalnsn 	 * This filter returns only TCP finger packets.
446302f87fcdSalnsn 	 */
446402f87fcdSalnsn 	struct bpf_insn insns[] = {
446502f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
446602f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
446702f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
446802f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
446902f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
447002f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
447102f87fcdSalnsn 		BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
447202f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
447302f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
447402f87fcdSalnsn 		BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
447502f87fcdSalnsn 		BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
447602f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
447702f87fcdSalnsn 		BPF_STMT(BPF_RET+BPF_K, 0),
447802f87fcdSalnsn 	};
447902f87fcdSalnsn 
448002f87fcdSalnsn 	bpfjit_func_t code;
448102f87fcdSalnsn 	uint8_t pkt[30] = {};
448202f87fcdSalnsn 
448302f87fcdSalnsn 	/* Set IP fragment offset to non-zero. */
448402f87fcdSalnsn 	pkt[20] = 1; pkt[21] = 1;
448502f87fcdSalnsn 
448602f87fcdSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
448702f87fcdSalnsn 
448802f87fcdSalnsn 	ATF_CHECK(bpf_validate(insns, insn_count));
448902f87fcdSalnsn 
449019fed70dSalnsn 	code = bpfjit_generate_code(NULL, insns, insn_count);
449102f87fcdSalnsn 	ATF_REQUIRE(code != NULL);
449202f87fcdSalnsn 
449302f87fcdSalnsn 	/* Packet is too short. */
449419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
449519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
449619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
449719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
449819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
449919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
450019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
450119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
450219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
450319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
450419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
450519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
450619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
450719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
450819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
450919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
451019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
451119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
451219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
451319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
451419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
451519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
451619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
451719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
451819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
451919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
452019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
452119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
452219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
452302f87fcdSalnsn 
452402f87fcdSalnsn 	/* The packet doesn't match. */
452519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
452602f87fcdSalnsn 
452702f87fcdSalnsn 	/* Still no match after setting the protocol field. */
452802f87fcdSalnsn 	pkt[12] = 8;
452919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453002f87fcdSalnsn 
453102f87fcdSalnsn 	/* Get one step closer to the match. */
453202f87fcdSalnsn 	pkt[23] = 6;
453319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453402f87fcdSalnsn 
453502f87fcdSalnsn 	/* Set IP fragment offset to zero. */
453602f87fcdSalnsn 	pkt[20] = 0x20; pkt[21] = 0;
453719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453802f87fcdSalnsn 
453902f87fcdSalnsn 	/* Set IP header length to 12. */
454002f87fcdSalnsn 	pkt[14] = 0xd3;
454119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
454202f87fcdSalnsn 
454302f87fcdSalnsn 	/* Match one branch of the program. */
454402f87fcdSalnsn 	pkt[27] = 79;
454519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
454602f87fcdSalnsn 
454702f87fcdSalnsn 	/* Match the other branch of the program. */
454802f87fcdSalnsn 	pkt[29] = 79; pkt[27] = 0;
454919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
455002f87fcdSalnsn 
455102f87fcdSalnsn 	/* Packet is too short. */
455219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
455319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
455419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
455519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
455619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
455719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
455819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
455919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
456019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
456119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
456219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
456319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
456419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
456519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
456619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
456719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
456819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
456919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
457019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
457119fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
457219fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
457319fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
457419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
457519fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
457619fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
457719fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
457819fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
457919fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
458019fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
458102f87fcdSalnsn 
458202f87fcdSalnsn 	/* Set IP header length to 16. Packet is too short. */
458302f87fcdSalnsn 	pkt[14] = 4;
458419fed70dSalnsn 	ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
458502f87fcdSalnsn 
458602f87fcdSalnsn 	bpfjit_free_code(code);
458702f87fcdSalnsn }
458802f87fcdSalnsn 
4589658efa86Salnsn ATF_TC(libbpfjit_cop_no_ctx);
ATF_TC_HEAD(libbpfjit_cop_no_ctx,tc)4590658efa86Salnsn ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
459119fed70dSalnsn {
459219fed70dSalnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
459319fed70dSalnsn 	    "instruction can't be accepted without a context");
459419fed70dSalnsn }
459519fed70dSalnsn 
ATF_TC_BODY(libbpfjit_cop_no_ctx,tc)4596658efa86Salnsn ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
459719fed70dSalnsn {
459819fed70dSalnsn 	static struct bpf_insn insns[] = {
459919fed70dSalnsn 		BPF_STMT(BPF_MISC+BPF_COP, 0),
460019fed70dSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
460119fed70dSalnsn 	};
460219fed70dSalnsn 
460319fed70dSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
460419fed70dSalnsn 
460519fed70dSalnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
460619fed70dSalnsn 
460719fed70dSalnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
460819fed70dSalnsn }
460919fed70dSalnsn 
4610658efa86Salnsn ATF_TC(libbpfjit_copx_no_ctx);
ATF_TC_HEAD(libbpfjit_copx_no_ctx,tc)4611658efa86Salnsn ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
461219fed70dSalnsn {
461319fed70dSalnsn 	atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
461419fed70dSalnsn 	    "instruction can't be accepted without a context");
461519fed70dSalnsn }
461619fed70dSalnsn 
ATF_TC_BODY(libbpfjit_copx_no_ctx,tc)4617658efa86Salnsn ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
461819fed70dSalnsn {
461919fed70dSalnsn 	static struct bpf_insn insns[] = {
462019fed70dSalnsn 		BPF_STMT(BPF_MISC+BPF_COPX, 0),
462119fed70dSalnsn 		BPF_STMT(BPF_RET+BPF_K, 7)
462219fed70dSalnsn 	};
462319fed70dSalnsn 
462419fed70dSalnsn 	size_t insn_count = sizeof(insns) / sizeof(insns[0]);
462519fed70dSalnsn 
462619fed70dSalnsn 	ATF_CHECK(!bpf_validate(insns, insn_count));
462719fed70dSalnsn 
462819fed70dSalnsn 	ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
462919fed70dSalnsn }
463019fed70dSalnsn 
ATF_TP_ADD_TCS(tp)463165b4b421Salnsn ATF_TP_ADD_TCS(tp)
463265b4b421Salnsn {
463365b4b421Salnsn 
4634658efa86Salnsn 	/*
4635658efa86Salnsn 	 * For every new test please also add a similar test
4636658efa86Salnsn 	 * to ../../net/bpfjit/t_bpfjit.c
4637658efa86Salnsn 	 */
4638658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_empty);
4639b43344f3Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ret_k);
4640b43344f3Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_bad_ret_k);
4641658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
4642658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
4643658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
4644658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
4645658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
4646658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
4647658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
4648658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
4649658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
4650658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
4651658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
4652a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
4653a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
4654a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
4655a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
4656a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
4657a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
4658a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
4659a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
4660658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
4661658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
4662b61069b6Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
4663658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
4664658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
4665658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
4666658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
4667658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
4668658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
4669658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
4670658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
4671658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
4672658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
4673658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
4674658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
4675658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
4676658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
4677658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
4678658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
4679a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
4680a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
4681a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
4682a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
4683a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
4684a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
4685a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
4686a234612aSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
4687658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
4688658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
4689b61069b6Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
4690658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
4691658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
4692658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
4693658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
4694658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
4695658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
4696658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
46979dc6430cSalnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_invalid);
4698bc33ca73Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_overflow);
4699658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
4700658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
4701658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
4702658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
4703658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
4704658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
4705658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
4706658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
4707658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
47084bf0e499Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_ax);
47096d5b9045Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_a);
47106d5b9045Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_x);
4711658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
4712658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
4713658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
4714658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
4715658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
4716658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
4717658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
4718658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
4719658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
4720658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
4721658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
4722658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
4723658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
4724658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
4725658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
4726658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
4727658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st1);
4728658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st2);
4729658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st3);
4730658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st4);
4731658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_st5);
4732658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx1);
4733658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx2);
4734658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx3);
4735658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_stx4);
4736658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
4737658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
4738658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
4739658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
4740658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
4741658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
4742658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
4743658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
4744658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
4745658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
4746658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
4747658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
4748658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
4749658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
4750658efa86Salnsn 	ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
475165b4b421Salnsn 
475265b4b421Salnsn 	return atf_no_error();
475365b4b421Salnsn }
4754