1*640235e2SEnji Cooper /* $NetBSD: t_bpfjit.c,v 1.14 2015/02/14 22:40:18 alnsn Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper /*-
4*640235e2SEnji Cooper * Copyright (c) 2011-2012, 2014-2015 Alexander Nasonov.
557718be8SEnji Cooper * All rights reserved.
657718be8SEnji Cooper *
757718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without
857718be8SEnji Cooper * modification, are permitted provided that the following conditions
957718be8SEnji Cooper * are met:
1057718be8SEnji Cooper *
1157718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright
1257718be8SEnji Cooper * notice, this list of conditions and the following disclaimer.
1357718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1457718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in
1557718be8SEnji Cooper * the documentation and/or other materials provided with the
1657718be8SEnji Cooper * distribution.
1757718be8SEnji Cooper *
1857718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1957718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2057718be8SEnji Cooper * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2157718be8SEnji Cooper * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2257718be8SEnji Cooper * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2357718be8SEnji Cooper * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
2457718be8SEnji Cooper * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2557718be8SEnji Cooper * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2657718be8SEnji Cooper * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2757718be8SEnji Cooper * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
2857718be8SEnji Cooper * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2957718be8SEnji Cooper * SUCH DAMAGE.
3057718be8SEnji Cooper */
3157718be8SEnji Cooper
3257718be8SEnji Cooper #include <sys/cdefs.h>
33*640235e2SEnji Cooper __RCSID("$NetBSD: t_bpfjit.c,v 1.14 2015/02/14 22:40:18 alnsn Exp $");
3457718be8SEnji Cooper
3557718be8SEnji Cooper #include <atf-c.h>
3657718be8SEnji Cooper #include <stdint.h>
3757718be8SEnji Cooper #include <string.h>
3857718be8SEnji Cooper
3957718be8SEnji Cooper #include <net/bpf.h>
4057718be8SEnji Cooper #include <net/bpfjit.h>
4157718be8SEnji Cooper
4257718be8SEnji Cooper static uint8_t deadbeef_at_5[16] = {
4357718be8SEnji Cooper 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
4457718be8SEnji Cooper };
4557718be8SEnji Cooper
4657718be8SEnji Cooper static inline
jitcall(bpfjit_func_t fn,const uint8_t * pkt,unsigned int wirelen,unsigned int buflen)4757718be8SEnji Cooper unsigned int jitcall(bpfjit_func_t fn,
4857718be8SEnji Cooper const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
4957718be8SEnji Cooper {
5057718be8SEnji Cooper bpf_args_t args;
5157718be8SEnji Cooper
5257718be8SEnji Cooper args.pkt = pkt;
5357718be8SEnji Cooper args.wirelen = wirelen;
5457718be8SEnji Cooper args.buflen = buflen;
5557718be8SEnji Cooper
5657718be8SEnji Cooper return fn(NULL, &args);
5757718be8SEnji Cooper }
5857718be8SEnji Cooper
5957718be8SEnji Cooper ATF_TC(libbpfjit_empty);
ATF_TC_HEAD(libbpfjit_empty,tc)6057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_empty, tc)
6157718be8SEnji Cooper {
6257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
6357718be8SEnji Cooper "Test that JIT compilation of an empty bpf program fails");
6457718be8SEnji Cooper }
6557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_empty,tc)6657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_empty, tc)
6757718be8SEnji Cooper {
6857718be8SEnji Cooper struct bpf_insn dummy;
6957718be8SEnji Cooper
70*640235e2SEnji Cooper ATF_CHECK(!bpf_validate(&dummy, 0));
7157718be8SEnji Cooper ATF_CHECK(bpfjit_generate_code(NULL, &dummy, 0) == NULL);
7257718be8SEnji Cooper }
7357718be8SEnji Cooper
74*640235e2SEnji Cooper ATF_TC(libbpfjit_ret_k);
ATF_TC_HEAD(libbpfjit_ret_k,tc)75*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_ret_k, tc)
76*640235e2SEnji Cooper {
77*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
78*640235e2SEnji Cooper "Test JIT compilation of a trivial bpf program");
79*640235e2SEnji Cooper }
80*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_ret_k,tc)81*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_ret_k, tc)
82*640235e2SEnji Cooper {
83*640235e2SEnji Cooper static struct bpf_insn insns[] = {
84*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 17)
85*640235e2SEnji Cooper };
86*640235e2SEnji Cooper
87*640235e2SEnji Cooper bpfjit_func_t code;
88*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
89*640235e2SEnji Cooper
90*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
91*640235e2SEnji Cooper
92*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
93*640235e2SEnji Cooper
94*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
95*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
96*640235e2SEnji Cooper
97*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 17);
98*640235e2SEnji Cooper
99*640235e2SEnji Cooper bpfjit_free_code(code);
100*640235e2SEnji Cooper }
101*640235e2SEnji Cooper
102*640235e2SEnji Cooper ATF_TC(libbpfjit_bad_ret_k);
ATF_TC_HEAD(libbpfjit_bad_ret_k,tc)103*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_bad_ret_k, tc)
104*640235e2SEnji Cooper {
105*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
106*640235e2SEnji Cooper "Test that JIT compilation of a program with bad BPF_RET fails");
107*640235e2SEnji Cooper }
108*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_bad_ret_k,tc)109*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_bad_ret_k, tc)
110*640235e2SEnji Cooper {
111*640235e2SEnji Cooper static struct bpf_insn insns[] = {
112*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K+0x8000, 13)
113*640235e2SEnji Cooper };
114*640235e2SEnji Cooper
115*640235e2SEnji Cooper bpfjit_func_t code;
116*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
117*640235e2SEnji Cooper
118*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
119*640235e2SEnji Cooper
120*640235e2SEnji Cooper /*
121*640235e2SEnji Cooper * The point of this test is checking a bad instruction of
122*640235e2SEnji Cooper * a valid class and with a valid BPF_RVAL data.
123*640235e2SEnji Cooper */
124*640235e2SEnji Cooper const uint16_t rcode = insns[0].code;
125*640235e2SEnji Cooper ATF_CHECK(BPF_CLASS(rcode) == BPF_RET &&
126*640235e2SEnji Cooper (BPF_RVAL(rcode) == BPF_K || BPF_RVAL(rcode) == BPF_A));
127*640235e2SEnji Cooper
128*640235e2SEnji Cooper ATF_CHECK(!bpf_validate(insns, insn_count));
129*640235e2SEnji Cooper
130*640235e2SEnji Cooper /* Current implementation generates code. */
131*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
132*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
133*640235e2SEnji Cooper
134*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 13);
135*640235e2SEnji Cooper
136*640235e2SEnji Cooper bpfjit_free_code(code);
137*640235e2SEnji Cooper }
138*640235e2SEnji Cooper
13957718be8SEnji Cooper ATF_TC(libbpfjit_alu_add_k);
ATF_TC_HEAD(libbpfjit_alu_add_k,tc)14057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_add_k, tc)
14157718be8SEnji Cooper {
14257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
14357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
14457718be8SEnji Cooper }
14557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_add_k,tc)14657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_add_k, tc)
14757718be8SEnji Cooper {
14857718be8SEnji Cooper static struct bpf_insn insns[] = {
14957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
15057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
15157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
15257718be8SEnji Cooper };
15357718be8SEnji Cooper
15457718be8SEnji Cooper bpfjit_func_t code;
15557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
15657718be8SEnji Cooper
15757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
15857718be8SEnji Cooper
15957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
16057718be8SEnji Cooper
16157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
16257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
16357718be8SEnji Cooper
16457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
16557718be8SEnji Cooper
16657718be8SEnji Cooper bpfjit_free_code(code);
16757718be8SEnji Cooper }
16857718be8SEnji Cooper
16957718be8SEnji Cooper ATF_TC(libbpfjit_alu_sub_k);
ATF_TC_HEAD(libbpfjit_alu_sub_k,tc)17057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_sub_k, tc)
17157718be8SEnji Cooper {
17257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
17357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
17457718be8SEnji Cooper }
17557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_sub_k,tc)17657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_sub_k, tc)
17757718be8SEnji Cooper {
17857718be8SEnji Cooper static struct bpf_insn insns[] = {
17957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 1),
18057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
18157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
18257718be8SEnji Cooper };
18357718be8SEnji Cooper
18457718be8SEnji Cooper bpfjit_func_t code;
18557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
18657718be8SEnji Cooper
18757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
18857718be8SEnji Cooper
18957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
19057718be8SEnji Cooper
19157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
19257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
19357718be8SEnji Cooper
19457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
19557718be8SEnji Cooper
19657718be8SEnji Cooper bpfjit_free_code(code);
19757718be8SEnji Cooper }
19857718be8SEnji Cooper
19957718be8SEnji Cooper ATF_TC(libbpfjit_alu_mul_k);
ATF_TC_HEAD(libbpfjit_alu_mul_k,tc)20057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mul_k, tc)
20157718be8SEnji Cooper {
20257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
20357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
20457718be8SEnji Cooper }
20557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mul_k,tc)20657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mul_k, tc)
20757718be8SEnji Cooper {
20857718be8SEnji Cooper static struct bpf_insn insns[] = {
20957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
21057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
21157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
21257718be8SEnji Cooper };
21357718be8SEnji Cooper
21457718be8SEnji Cooper bpfjit_func_t code;
21557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
21657718be8SEnji Cooper
21757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
21857718be8SEnji Cooper
21957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
22057718be8SEnji Cooper
22157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
22257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
22357718be8SEnji Cooper
22457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
22557718be8SEnji Cooper
22657718be8SEnji Cooper bpfjit_free_code(code);
22757718be8SEnji Cooper }
22857718be8SEnji Cooper
22957718be8SEnji Cooper ATF_TC(libbpfjit_alu_div0_k);
ATF_TC_HEAD(libbpfjit_alu_div0_k,tc)23057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div0_k, tc)
23157718be8SEnji Cooper {
23257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
23357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
23457718be8SEnji Cooper }
23557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div0_k,tc)23657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div0_k, tc)
23757718be8SEnji Cooper {
23857718be8SEnji Cooper static struct bpf_insn insns[] = {
23957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
24057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
24157718be8SEnji Cooper };
24257718be8SEnji Cooper
24357718be8SEnji Cooper bpfjit_func_t code;
24457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
24557718be8SEnji Cooper
24657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
24757718be8SEnji Cooper
24857718be8SEnji Cooper //ATF_CHECK(bpf_validate(insns, insn_count));
24957718be8SEnji Cooper
25057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
25157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
25257718be8SEnji Cooper
25357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
25457718be8SEnji Cooper
25557718be8SEnji Cooper bpfjit_free_code(code);
25657718be8SEnji Cooper }
25757718be8SEnji Cooper
25857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div1_k);
ATF_TC_HEAD(libbpfjit_alu_div1_k,tc)25957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div1_k, tc)
26057718be8SEnji Cooper {
26157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
26257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
26357718be8SEnji Cooper }
26457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div1_k,tc)26557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div1_k, tc)
26657718be8SEnji Cooper {
26757718be8SEnji Cooper static struct bpf_insn insns[] = {
26857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
26957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
27057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
27157718be8SEnji Cooper };
27257718be8SEnji Cooper
27357718be8SEnji Cooper bpfjit_func_t code;
27457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
27557718be8SEnji Cooper
27657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
27757718be8SEnji Cooper
27857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
27957718be8SEnji Cooper
28057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
28157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
28257718be8SEnji Cooper
28357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
28457718be8SEnji Cooper
28557718be8SEnji Cooper bpfjit_free_code(code);
28657718be8SEnji Cooper }
28757718be8SEnji Cooper
28857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div2_k);
ATF_TC_HEAD(libbpfjit_alu_div2_k,tc)28957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div2_k, tc)
29057718be8SEnji Cooper {
29157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
29257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
29357718be8SEnji Cooper }
29457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div2_k,tc)29557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div2_k, tc)
29657718be8SEnji Cooper {
29757718be8SEnji Cooper static struct bpf_insn insns[] = {
29857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
29957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
30057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
30157718be8SEnji Cooper };
30257718be8SEnji Cooper
30357718be8SEnji Cooper bpfjit_func_t code;
30457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
30557718be8SEnji Cooper
30657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
30757718be8SEnji Cooper
30857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
30957718be8SEnji Cooper
31057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
31157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
31257718be8SEnji Cooper
31357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
31457718be8SEnji Cooper
31557718be8SEnji Cooper bpfjit_free_code(code);
31657718be8SEnji Cooper }
31757718be8SEnji Cooper
31857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div4_k);
ATF_TC_HEAD(libbpfjit_alu_div4_k,tc)31957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div4_k, tc)
32057718be8SEnji Cooper {
32157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
32257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
32357718be8SEnji Cooper }
32457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div4_k,tc)32557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div4_k, tc)
32657718be8SEnji Cooper {
32757718be8SEnji Cooper static struct bpf_insn insns[] = {
32857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
32957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
33057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
33157718be8SEnji Cooper };
33257718be8SEnji Cooper
33357718be8SEnji Cooper bpfjit_func_t code;
33457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
33557718be8SEnji Cooper
33657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
33757718be8SEnji Cooper
33857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
33957718be8SEnji Cooper
34057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
34157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
34257718be8SEnji Cooper
34357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
34457718be8SEnji Cooper
34557718be8SEnji Cooper bpfjit_free_code(code);
34657718be8SEnji Cooper }
34757718be8SEnji Cooper
34857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10_k);
ATF_TC_HEAD(libbpfjit_alu_div10_k,tc)34957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10_k, tc)
35057718be8SEnji Cooper {
35157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
35257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
35357718be8SEnji Cooper }
35457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div10_k,tc)35557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10_k, tc)
35657718be8SEnji Cooper {
35757718be8SEnji Cooper static struct bpf_insn insns[] = {
35857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
35957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
36057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
36157718be8SEnji Cooper };
36257718be8SEnji Cooper
36357718be8SEnji Cooper bpfjit_func_t code;
36457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
36557718be8SEnji Cooper
36657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
36757718be8SEnji Cooper
36857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
36957718be8SEnji Cooper
37057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
37157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
37257718be8SEnji Cooper
37357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
37457718be8SEnji Cooper
37557718be8SEnji Cooper bpfjit_free_code(code);
37657718be8SEnji Cooper }
37757718be8SEnji Cooper
37857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10000_k);
ATF_TC_HEAD(libbpfjit_alu_div10000_k,tc)37957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10000_k, tc)
38057718be8SEnji Cooper {
38157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
38257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
38357718be8SEnji Cooper }
38457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div10000_k,tc)38557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10000_k, tc)
38657718be8SEnji Cooper {
38757718be8SEnji Cooper static struct bpf_insn insns[] = {
38857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
38957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
39057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
39157718be8SEnji Cooper };
39257718be8SEnji Cooper
39357718be8SEnji Cooper bpfjit_func_t code;
39457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
39557718be8SEnji Cooper
39657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
39757718be8SEnji Cooper
39857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
39957718be8SEnji Cooper
40057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
40157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
40257718be8SEnji Cooper
40357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
40457718be8SEnji Cooper
40557718be8SEnji Cooper bpfjit_free_code(code);
40657718be8SEnji Cooper }
40757718be8SEnji Cooper
40857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div7609801_k);
ATF_TC_HEAD(libbpfjit_alu_div7609801_k,tc)40957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div7609801_k, tc)
41057718be8SEnji Cooper {
41157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
41257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
41357718be8SEnji Cooper }
41457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div7609801_k,tc)41557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div7609801_k, tc)
41657718be8SEnji Cooper {
41757718be8SEnji Cooper static struct bpf_insn insns[] = {
41857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
41957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
42057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
42157718be8SEnji Cooper };
42257718be8SEnji Cooper
42357718be8SEnji Cooper bpfjit_func_t code;
42457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
42557718be8SEnji Cooper
42657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
42757718be8SEnji Cooper
42857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
42957718be8SEnji Cooper
43057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
43157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
43257718be8SEnji Cooper
43357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
43457718be8SEnji Cooper
43557718be8SEnji Cooper bpfjit_free_code(code);
43657718be8SEnji Cooper }
43757718be8SEnji Cooper
43857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div80000000_k);
ATF_TC_HEAD(libbpfjit_alu_div80000000_k,tc)43957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div80000000_k, tc)
44057718be8SEnji Cooper {
44157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
44257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
44357718be8SEnji Cooper }
44457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div80000000_k,tc)44557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div80000000_k, tc)
44657718be8SEnji Cooper {
44757718be8SEnji Cooper static struct bpf_insn insns[] = {
44857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
44957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
45057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
45157718be8SEnji Cooper };
45257718be8SEnji Cooper
45357718be8SEnji Cooper bpfjit_func_t code;
45457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
45557718be8SEnji Cooper
45657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
45757718be8SEnji Cooper
45857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
45957718be8SEnji Cooper
46057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
46157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
46257718be8SEnji Cooper
46357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
46457718be8SEnji Cooper
46557718be8SEnji Cooper bpfjit_free_code(code);
46657718be8SEnji Cooper }
46757718be8SEnji Cooper
468*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod0_k);
ATF_TC_HEAD(libbpfjit_alu_mod0_k,tc)469*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod0_k, tc)
470*640235e2SEnji Cooper {
471*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
472*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0");
473*640235e2SEnji Cooper }
474*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod0_k,tc)475*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod0_k, tc)
476*640235e2SEnji Cooper {
477*640235e2SEnji Cooper static struct bpf_insn insns[] = {
478*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0),
479*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
480*640235e2SEnji Cooper };
481*640235e2SEnji Cooper
482*640235e2SEnji Cooper bpfjit_func_t code;
483*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
484*640235e2SEnji Cooper
485*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
486*640235e2SEnji Cooper
487*640235e2SEnji Cooper //ATF_CHECK(bpf_validate(insns, insn_count));
488*640235e2SEnji Cooper
489*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
490*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
491*640235e2SEnji Cooper
492*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
493*640235e2SEnji Cooper
494*640235e2SEnji Cooper bpfjit_free_code(code);
495*640235e2SEnji Cooper }
496*640235e2SEnji Cooper
497*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod1_k);
ATF_TC_HEAD(libbpfjit_alu_mod1_k,tc)498*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod1_k, tc)
499*640235e2SEnji Cooper {
500*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
501*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1");
502*640235e2SEnji Cooper }
503*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod1_k,tc)504*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod1_k, tc)
505*640235e2SEnji Cooper {
506*640235e2SEnji Cooper static struct bpf_insn insns[] = {
507*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
508*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1),
509*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
510*640235e2SEnji Cooper };
511*640235e2SEnji Cooper
512*640235e2SEnji Cooper bpfjit_func_t code;
513*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
514*640235e2SEnji Cooper
515*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
516*640235e2SEnji Cooper
517*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
518*640235e2SEnji Cooper
519*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
520*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
521*640235e2SEnji Cooper
522*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
523*640235e2SEnji Cooper
524*640235e2SEnji Cooper bpfjit_free_code(code);
525*640235e2SEnji Cooper }
526*640235e2SEnji Cooper
527*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod2_k);
ATF_TC_HEAD(libbpfjit_alu_mod2_k,tc)528*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod2_k, tc)
529*640235e2SEnji Cooper {
530*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
531*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2");
532*640235e2SEnji Cooper }
533*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod2_k,tc)534*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod2_k, tc)
535*640235e2SEnji Cooper {
536*640235e2SEnji Cooper static struct bpf_insn insns[] = {
537*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
538*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2),
539*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
540*640235e2SEnji Cooper };
541*640235e2SEnji Cooper
542*640235e2SEnji Cooper bpfjit_func_t code;
543*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
544*640235e2SEnji Cooper
545*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
546*640235e2SEnji Cooper
547*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
548*640235e2SEnji Cooper
549*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
550*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
551*640235e2SEnji Cooper
552*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
553*640235e2SEnji Cooper
554*640235e2SEnji Cooper bpfjit_free_code(code);
555*640235e2SEnji Cooper }
556*640235e2SEnji Cooper
557*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod4_k);
ATF_TC_HEAD(libbpfjit_alu_mod4_k,tc)558*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod4_k, tc)
559*640235e2SEnji Cooper {
560*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
561*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4");
562*640235e2SEnji Cooper }
563*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod4_k,tc)564*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod4_k, tc)
565*640235e2SEnji Cooper {
566*640235e2SEnji Cooper static struct bpf_insn insns[] = {
567*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
568*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4),
569*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
570*640235e2SEnji Cooper };
571*640235e2SEnji Cooper
572*640235e2SEnji Cooper bpfjit_func_t code;
573*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
574*640235e2SEnji Cooper
575*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
576*640235e2SEnji Cooper
577*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
578*640235e2SEnji Cooper
579*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
580*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
581*640235e2SEnji Cooper
582*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
583*640235e2SEnji Cooper
584*640235e2SEnji Cooper bpfjit_free_code(code);
585*640235e2SEnji Cooper }
586*640235e2SEnji Cooper
587*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod10_k);
ATF_TC_HEAD(libbpfjit_alu_mod10_k,tc)588*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod10_k, tc)
589*640235e2SEnji Cooper {
590*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
591*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10");
592*640235e2SEnji Cooper }
593*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod10_k,tc)594*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod10_k, tc)
595*640235e2SEnji Cooper {
596*640235e2SEnji Cooper static struct bpf_insn insns[] = {
597*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
598*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10),
599*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
600*640235e2SEnji Cooper };
601*640235e2SEnji Cooper
602*640235e2SEnji Cooper bpfjit_func_t code;
603*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
604*640235e2SEnji Cooper
605*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
606*640235e2SEnji Cooper
607*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
608*640235e2SEnji Cooper
609*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
610*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
611*640235e2SEnji Cooper
612*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
613*640235e2SEnji Cooper
614*640235e2SEnji Cooper bpfjit_free_code(code);
615*640235e2SEnji Cooper }
616*640235e2SEnji Cooper
617*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod10000_k);
ATF_TC_HEAD(libbpfjit_alu_mod10000_k,tc)618*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod10000_k, tc)
619*640235e2SEnji Cooper {
620*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
621*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10000");
622*640235e2SEnji Cooper }
623*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod10000_k,tc)624*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod10000_k, tc)
625*640235e2SEnji Cooper {
626*640235e2SEnji Cooper static struct bpf_insn insns[] = {
627*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
628*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10000),
629*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
630*640235e2SEnji Cooper };
631*640235e2SEnji Cooper
632*640235e2SEnji Cooper bpfjit_func_t code;
633*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
634*640235e2SEnji Cooper
635*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
636*640235e2SEnji Cooper
637*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
638*640235e2SEnji Cooper
639*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
640*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
641*640235e2SEnji Cooper
642*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
643*640235e2SEnji Cooper
644*640235e2SEnji Cooper bpfjit_free_code(code);
645*640235e2SEnji Cooper }
646*640235e2SEnji Cooper
647*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod7609801_k);
ATF_TC_HEAD(libbpfjit_alu_mod7609801_k,tc)648*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod7609801_k, tc)
649*640235e2SEnji Cooper {
650*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
651*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_mod+BPF_K with k=7609801");
652*640235e2SEnji Cooper }
653*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod7609801_k,tc)654*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod7609801_k, tc)
655*640235e2SEnji Cooper {
656*640235e2SEnji Cooper static struct bpf_insn insns[] = {
657*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
658*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(7609801)),
659*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
660*640235e2SEnji Cooper };
661*640235e2SEnji Cooper
662*640235e2SEnji Cooper bpfjit_func_t code;
663*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
664*640235e2SEnji Cooper
665*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
666*640235e2SEnji Cooper
667*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
668*640235e2SEnji Cooper
669*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
670*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
671*640235e2SEnji Cooper
672*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
673*640235e2SEnji Cooper
674*640235e2SEnji Cooper bpfjit_free_code(code);
675*640235e2SEnji Cooper }
676*640235e2SEnji Cooper
677*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod80000000_k);
ATF_TC_HEAD(libbpfjit_alu_mod80000000_k,tc)678*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod80000000_k, tc)
679*640235e2SEnji Cooper {
680*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
681*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0x80000000");
682*640235e2SEnji Cooper }
683*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod80000000_k,tc)684*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod80000000_k, tc)
685*640235e2SEnji Cooper {
686*640235e2SEnji Cooper static struct bpf_insn insns[] = {
687*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
688*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(0x80000000)),
689*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
690*640235e2SEnji Cooper };
691*640235e2SEnji Cooper
692*640235e2SEnji Cooper bpfjit_func_t code;
693*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
694*640235e2SEnji Cooper
695*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
696*640235e2SEnji Cooper
697*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
698*640235e2SEnji Cooper
699*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
700*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
701*640235e2SEnji Cooper
702*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
703*640235e2SEnji Cooper
704*640235e2SEnji Cooper bpfjit_free_code(code);
705*640235e2SEnji Cooper }
706*640235e2SEnji Cooper
70757718be8SEnji Cooper ATF_TC(libbpfjit_alu_and_k);
ATF_TC_HEAD(libbpfjit_alu_and_k,tc)70857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_and_k, tc)
70957718be8SEnji Cooper {
71057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
71157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
71257718be8SEnji Cooper }
71357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_and_k,tc)71457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_and_k, tc)
71557718be8SEnji Cooper {
71657718be8SEnji Cooper static struct bpf_insn insns[] = {
71757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
71857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
71957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
72057718be8SEnji Cooper };
72157718be8SEnji Cooper
72257718be8SEnji Cooper bpfjit_func_t code;
72357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
72457718be8SEnji Cooper
72557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
72657718be8SEnji Cooper
72757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
72857718be8SEnji Cooper
72957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
73057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
73157718be8SEnji Cooper
73257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
73357718be8SEnji Cooper
73457718be8SEnji Cooper bpfjit_free_code(code);
73557718be8SEnji Cooper }
73657718be8SEnji Cooper
73757718be8SEnji Cooper ATF_TC(libbpfjit_alu_or_k);
ATF_TC_HEAD(libbpfjit_alu_or_k,tc)73857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_or_k, tc)
73957718be8SEnji Cooper {
74057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
74157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
74257718be8SEnji Cooper }
74357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_or_k,tc)74457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_or_k, tc)
74557718be8SEnji Cooper {
74657718be8SEnji Cooper static struct bpf_insn insns[] = {
74757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
74857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
74957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
75057718be8SEnji Cooper };
75157718be8SEnji Cooper
75257718be8SEnji Cooper bpfjit_func_t code;
75357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
75457718be8SEnji Cooper
75557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
75657718be8SEnji Cooper
75757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
75857718be8SEnji Cooper
75957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
76057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
76157718be8SEnji Cooper
76257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
76357718be8SEnji Cooper
76457718be8SEnji Cooper bpfjit_free_code(code);
76557718be8SEnji Cooper }
76657718be8SEnji Cooper
767*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_xor_k);
ATF_TC_HEAD(libbpfjit_alu_xor_k,tc)768*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_xor_k, tc)
769*640235e2SEnji Cooper {
770*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
771*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K");
772*640235e2SEnji Cooper }
773*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_xor_k,tc)774*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_xor_k, tc)
775*640235e2SEnji Cooper {
776*640235e2SEnji Cooper static struct bpf_insn insns[] = {
777*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
778*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0x0000b1e0),
779*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
780*640235e2SEnji Cooper };
781*640235e2SEnji Cooper
782*640235e2SEnji Cooper bpfjit_func_t code;
783*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
784*640235e2SEnji Cooper
785*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
786*640235e2SEnji Cooper
787*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
788*640235e2SEnji Cooper
789*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
790*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
791*640235e2SEnji Cooper
792*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
793*640235e2SEnji Cooper
794*640235e2SEnji Cooper bpfjit_free_code(code);
795*640235e2SEnji Cooper }
796*640235e2SEnji Cooper
79757718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh_k);
ATF_TC_HEAD(libbpfjit_alu_lsh_k,tc)79857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh_k, tc)
79957718be8SEnji Cooper {
80057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
80157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
80257718be8SEnji Cooper }
80357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_lsh_k,tc)80457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh_k, tc)
80557718be8SEnji Cooper {
80657718be8SEnji Cooper static struct bpf_insn insns[] = {
80757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
80857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
80957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
81057718be8SEnji Cooper };
81157718be8SEnji Cooper
81257718be8SEnji Cooper bpfjit_func_t code;
81357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
81457718be8SEnji Cooper
81557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
81657718be8SEnji Cooper
81757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
81857718be8SEnji Cooper
81957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
82057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
82157718be8SEnji Cooper
82257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
82357718be8SEnji Cooper
82457718be8SEnji Cooper bpfjit_free_code(code);
82557718be8SEnji Cooper }
82657718be8SEnji Cooper
82757718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh0_k);
ATF_TC_HEAD(libbpfjit_alu_lsh0_k,tc)82857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh0_k, tc)
82957718be8SEnji Cooper {
83057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
83157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
83257718be8SEnji Cooper }
83357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_lsh0_k,tc)83457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh0_k, tc)
83557718be8SEnji Cooper {
83657718be8SEnji Cooper static struct bpf_insn insns[] = {
83757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
83857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
83957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
84057718be8SEnji Cooper };
84157718be8SEnji Cooper
84257718be8SEnji Cooper bpfjit_func_t code;
84357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
84457718be8SEnji Cooper
84557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
84657718be8SEnji Cooper
84757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
84857718be8SEnji Cooper
84957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
85057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
85157718be8SEnji Cooper
85257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
85357718be8SEnji Cooper
85457718be8SEnji Cooper bpfjit_free_code(code);
85557718be8SEnji Cooper }
85657718be8SEnji Cooper
85757718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh_k);
ATF_TC_HEAD(libbpfjit_alu_rsh_k,tc)85857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh_k, tc)
85957718be8SEnji Cooper {
86057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
86157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
86257718be8SEnji Cooper }
86357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_rsh_k,tc)86457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh_k, tc)
86557718be8SEnji Cooper {
86657718be8SEnji Cooper static struct bpf_insn insns[] = {
86757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
86857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
86957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
87057718be8SEnji Cooper };
87157718be8SEnji Cooper
87257718be8SEnji Cooper bpfjit_func_t code;
87357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
87457718be8SEnji Cooper
87557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
87657718be8SEnji Cooper
87757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
87857718be8SEnji Cooper
87957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
88057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
88157718be8SEnji Cooper
88257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
88357718be8SEnji Cooper
88457718be8SEnji Cooper bpfjit_free_code(code);
88557718be8SEnji Cooper }
88657718be8SEnji Cooper
88757718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh0_k);
ATF_TC_HEAD(libbpfjit_alu_rsh0_k,tc)88857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh0_k, tc)
88957718be8SEnji Cooper {
89057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
89157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
89257718be8SEnji Cooper }
89357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_rsh0_k,tc)89457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh0_k, tc)
89557718be8SEnji Cooper {
89657718be8SEnji Cooper static struct bpf_insn insns[] = {
89757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
89857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
89957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
90057718be8SEnji Cooper };
90157718be8SEnji Cooper
90257718be8SEnji Cooper bpfjit_func_t code;
90357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
90457718be8SEnji Cooper
90557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
90657718be8SEnji Cooper
90757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
90857718be8SEnji Cooper
90957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
91057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
91157718be8SEnji Cooper
91257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
91357718be8SEnji Cooper
91457718be8SEnji Cooper bpfjit_free_code(code);
91557718be8SEnji Cooper }
91657718be8SEnji Cooper
91757718be8SEnji Cooper ATF_TC(libbpfjit_alu_modulo_k);
ATF_TC_HEAD(libbpfjit_alu_modulo_k,tc)91857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_modulo_k, tc)
91957718be8SEnji Cooper {
92057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
92157718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
92257718be8SEnji Cooper }
92357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_modulo_k,tc)92457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_modulo_k, tc)
92557718be8SEnji Cooper {
92657718be8SEnji Cooper static struct bpf_insn insns[] = {
92757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
92857718be8SEnji Cooper
92957718be8SEnji Cooper /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
93057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
93157718be8SEnji Cooper
93257718be8SEnji Cooper /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
93357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
93457718be8SEnji Cooper
93557718be8SEnji Cooper /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
93657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
93757718be8SEnji Cooper
93857718be8SEnji Cooper /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
93957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
94057718be8SEnji Cooper
94157718be8SEnji Cooper /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
94257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
94357718be8SEnji Cooper
94457718be8SEnji Cooper /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
94557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
94657718be8SEnji Cooper
94757718be8SEnji Cooper /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
94857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
94957718be8SEnji Cooper
95057718be8SEnji Cooper /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
95157718be8SEnji Cooper /* 00000000,42218C74 >> 3 = 00000000,08443180 */
95257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
95357718be8SEnji Cooper
95457718be8SEnji Cooper /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
95557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
95657718be8SEnji Cooper
95757718be8SEnji Cooper /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
95857718be8SEnji Cooper /* 00000000,93818280 / DEAD = 00000000,0000A994 */
95957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
96057718be8SEnji Cooper
96157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
96257718be8SEnji Cooper };
96357718be8SEnji Cooper
96457718be8SEnji Cooper bpfjit_func_t code;
96557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
96657718be8SEnji Cooper
96757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
96857718be8SEnji Cooper
96957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
97057718be8SEnji Cooper
97157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
97257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
97357718be8SEnji Cooper
97457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
97557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
97657718be8SEnji Cooper
97757718be8SEnji Cooper
97857718be8SEnji Cooper bpfjit_free_code(code);
97957718be8SEnji Cooper }
98057718be8SEnji Cooper
98157718be8SEnji Cooper ATF_TC(libbpfjit_alu_add_x);
ATF_TC_HEAD(libbpfjit_alu_add_x,tc)98257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_add_x, tc)
98357718be8SEnji Cooper {
98457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
98557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
98657718be8SEnji Cooper }
98757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_add_x,tc)98857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_add_x, tc)
98957718be8SEnji Cooper {
99057718be8SEnji Cooper static struct bpf_insn insns[] = {
99157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
99257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
99357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
99457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
99557718be8SEnji Cooper };
99657718be8SEnji Cooper
99757718be8SEnji Cooper bpfjit_func_t code;
99857718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
99957718be8SEnji Cooper
100057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
100157718be8SEnji Cooper
100257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
100357718be8SEnji Cooper
100457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
100557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
100657718be8SEnji Cooper
100757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 5);
100857718be8SEnji Cooper
100957718be8SEnji Cooper bpfjit_free_code(code);
101057718be8SEnji Cooper }
101157718be8SEnji Cooper
101257718be8SEnji Cooper ATF_TC(libbpfjit_alu_sub_x);
ATF_TC_HEAD(libbpfjit_alu_sub_x,tc)101357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_sub_x, tc)
101457718be8SEnji Cooper {
101557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
101657718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
101757718be8SEnji Cooper }
101857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_sub_x,tc)101957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_sub_x, tc)
102057718be8SEnji Cooper {
102157718be8SEnji Cooper static struct bpf_insn insns[] = {
102257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 1),
102357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
102457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
102557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
102657718be8SEnji Cooper };
102757718be8SEnji Cooper
102857718be8SEnji Cooper bpfjit_func_t code;
102957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
103057718be8SEnji Cooper
103157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
103257718be8SEnji Cooper
103357718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
103457718be8SEnji Cooper
103557718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
103657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
103757718be8SEnji Cooper
103857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
103957718be8SEnji Cooper
104057718be8SEnji Cooper bpfjit_free_code(code);
104157718be8SEnji Cooper }
104257718be8SEnji Cooper
104357718be8SEnji Cooper ATF_TC(libbpfjit_alu_mul_x);
ATF_TC_HEAD(libbpfjit_alu_mul_x,tc)104457718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mul_x, tc)
104557718be8SEnji Cooper {
104657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
104757718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
104857718be8SEnji Cooper }
104957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mul_x,tc)105057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mul_x, tc)
105157718be8SEnji Cooper {
105257718be8SEnji Cooper static struct bpf_insn insns[] = {
105357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
105457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
105557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
105657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
105757718be8SEnji Cooper };
105857718be8SEnji Cooper
105957718be8SEnji Cooper bpfjit_func_t code;
106057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
106157718be8SEnji Cooper
106257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
106357718be8SEnji Cooper
106457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
106557718be8SEnji Cooper
106657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
106757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
106857718be8SEnji Cooper
106957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0xfffffffd));
107057718be8SEnji Cooper
107157718be8SEnji Cooper bpfjit_free_code(code);
107257718be8SEnji Cooper }
107357718be8SEnji Cooper
107457718be8SEnji Cooper ATF_TC(libbpfjit_alu_div0_x);
ATF_TC_HEAD(libbpfjit_alu_div0_x,tc)107557718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div0_x, tc)
107657718be8SEnji Cooper {
107757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
107857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
107957718be8SEnji Cooper }
108057718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div0_x,tc)108157718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div0_x, tc)
108257718be8SEnji Cooper {
108357718be8SEnji Cooper static struct bpf_insn insns[] = {
108457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
108557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
108657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
108757718be8SEnji Cooper };
108857718be8SEnji Cooper
108957718be8SEnji Cooper bpfjit_func_t code;
109057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
109157718be8SEnji Cooper
109257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
109357718be8SEnji Cooper
109457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
109557718be8SEnji Cooper
109657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
109757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
109857718be8SEnji Cooper
109957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
110057718be8SEnji Cooper
110157718be8SEnji Cooper bpfjit_free_code(code);
110257718be8SEnji Cooper }
110357718be8SEnji Cooper
110457718be8SEnji Cooper ATF_TC(libbpfjit_alu_div1_x);
ATF_TC_HEAD(libbpfjit_alu_div1_x,tc)110557718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div1_x, tc)
110657718be8SEnji Cooper {
110757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
110857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
110957718be8SEnji Cooper }
111057718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div1_x,tc)111157718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div1_x, tc)
111257718be8SEnji Cooper {
111357718be8SEnji Cooper static struct bpf_insn insns[] = {
111457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
111557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
111657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
111757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
111857718be8SEnji Cooper };
111957718be8SEnji Cooper
112057718be8SEnji Cooper bpfjit_func_t code;
112157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
112257718be8SEnji Cooper
112357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
112457718be8SEnji Cooper
112557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
112657718be8SEnji Cooper
112757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
112857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
112957718be8SEnji Cooper
113057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
113157718be8SEnji Cooper
113257718be8SEnji Cooper bpfjit_free_code(code);
113357718be8SEnji Cooper }
113457718be8SEnji Cooper
113557718be8SEnji Cooper ATF_TC(libbpfjit_alu_div2_x);
ATF_TC_HEAD(libbpfjit_alu_div2_x,tc)113657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div2_x, tc)
113757718be8SEnji Cooper {
113857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
113957718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
114057718be8SEnji Cooper }
114157718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div2_x,tc)114257718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div2_x, tc)
114357718be8SEnji Cooper {
114457718be8SEnji Cooper static struct bpf_insn insns[] = {
114557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
114657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
114757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
114857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
114957718be8SEnji Cooper };
115057718be8SEnji Cooper
115157718be8SEnji Cooper bpfjit_func_t code;
115257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
115357718be8SEnji Cooper
115457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
115557718be8SEnji Cooper
115657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
115757718be8SEnji Cooper
115857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
115957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
116057718be8SEnji Cooper
116157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
116257718be8SEnji Cooper
116357718be8SEnji Cooper bpfjit_free_code(code);
116457718be8SEnji Cooper }
116557718be8SEnji Cooper
116657718be8SEnji Cooper ATF_TC(libbpfjit_alu_div4_x);
ATF_TC_HEAD(libbpfjit_alu_div4_x,tc)116757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div4_x, tc)
116857718be8SEnji Cooper {
116957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
117057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
117157718be8SEnji Cooper }
117257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div4_x,tc)117357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div4_x, tc)
117457718be8SEnji Cooper {
117557718be8SEnji Cooper static struct bpf_insn insns[] = {
117657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
117757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
117857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
117957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
118057718be8SEnji Cooper };
118157718be8SEnji Cooper
118257718be8SEnji Cooper bpfjit_func_t code;
118357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
118457718be8SEnji Cooper
118557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
118657718be8SEnji Cooper
118757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
118857718be8SEnji Cooper
118957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
119057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
119157718be8SEnji Cooper
119257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x3fffffff));
119357718be8SEnji Cooper
119457718be8SEnji Cooper bpfjit_free_code(code);
119557718be8SEnji Cooper }
119657718be8SEnji Cooper
119757718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10_x);
ATF_TC_HEAD(libbpfjit_alu_div10_x,tc)119857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10_x, tc)
119957718be8SEnji Cooper {
120057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
120157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
120257718be8SEnji Cooper }
120357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div10_x,tc)120457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10_x, tc)
120557718be8SEnji Cooper {
120657718be8SEnji Cooper static struct bpf_insn insns[] = {
120757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
120857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
120957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
121057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
121157718be8SEnji Cooper };
121257718be8SEnji Cooper
121357718be8SEnji Cooper bpfjit_func_t code;
121457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
121557718be8SEnji Cooper
121657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
121757718be8SEnji Cooper
121857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
121957718be8SEnji Cooper
122057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
122157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
122257718be8SEnji Cooper
122357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484384));
122457718be8SEnji Cooper
122557718be8SEnji Cooper bpfjit_free_code(code);
122657718be8SEnji Cooper }
122757718be8SEnji Cooper
122857718be8SEnji Cooper ATF_TC(libbpfjit_alu_div10000_x);
ATF_TC_HEAD(libbpfjit_alu_div10000_x,tc)122957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div10000_x, tc)
123057718be8SEnji Cooper {
123157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
123257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
123357718be8SEnji Cooper }
123457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div10000_x,tc)123557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div10000_x, tc)
123657718be8SEnji Cooper {
123757718be8SEnji Cooper static struct bpf_insn insns[] = {
123857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
123957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
124057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
124157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
124257718be8SEnji Cooper };
124357718be8SEnji Cooper
124457718be8SEnji Cooper bpfjit_func_t code;
124557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
124657718be8SEnji Cooper
124757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
124857718be8SEnji Cooper
124957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
125057718be8SEnji Cooper
125157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
125257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
125357718be8SEnji Cooper
125457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(429484));
125557718be8SEnji Cooper
125657718be8SEnji Cooper bpfjit_free_code(code);
125757718be8SEnji Cooper }
125857718be8SEnji Cooper
125957718be8SEnji Cooper ATF_TC(libbpfjit_alu_div7609801_x);
ATF_TC_HEAD(libbpfjit_alu_div7609801_x,tc)126057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div7609801_x, tc)
126157718be8SEnji Cooper {
126257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
126357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
126457718be8SEnji Cooper }
126557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div7609801_x,tc)126657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div7609801_x, tc)
126757718be8SEnji Cooper {
126857718be8SEnji Cooper static struct bpf_insn insns[] = {
126957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
127057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
127157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
127257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
127357718be8SEnji Cooper };
127457718be8SEnji Cooper
127557718be8SEnji Cooper bpfjit_func_t code;
127657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
127757718be8SEnji Cooper
127857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
127957718be8SEnji Cooper
128057718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
128157718be8SEnji Cooper
128257718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
128357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
128457718be8SEnji Cooper
128557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 564);
128657718be8SEnji Cooper
128757718be8SEnji Cooper bpfjit_free_code(code);
128857718be8SEnji Cooper }
128957718be8SEnji Cooper
129057718be8SEnji Cooper ATF_TC(libbpfjit_alu_div80000000_x);
ATF_TC_HEAD(libbpfjit_alu_div80000000_x,tc)129157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_div80000000_x, tc)
129257718be8SEnji Cooper {
129357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
129457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
129557718be8SEnji Cooper }
129657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_div80000000_x,tc)129757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_div80000000_x, tc)
129857718be8SEnji Cooper {
129957718be8SEnji Cooper static struct bpf_insn insns[] = {
1300*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
130157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
130257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
130357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
130457718be8SEnji Cooper };
130557718be8SEnji Cooper
130657718be8SEnji Cooper bpfjit_func_t code;
130757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
130857718be8SEnji Cooper
130957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
131057718be8SEnji Cooper
131157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
131257718be8SEnji Cooper
131357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
131457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
131557718be8SEnji Cooper
131657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
131757718be8SEnji Cooper
131857718be8SEnji Cooper bpfjit_free_code(code);
131957718be8SEnji Cooper }
132057718be8SEnji Cooper
1321*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod0_x);
ATF_TC_HEAD(libbpfjit_alu_mod0_x,tc)1322*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod0_x, tc)
1323*640235e2SEnji Cooper {
1324*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1325*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0");
1326*640235e2SEnji Cooper }
1327*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod0_x,tc)1328*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod0_x, tc)
1329*640235e2SEnji Cooper {
1330*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1331*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1332*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1333*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1334*640235e2SEnji Cooper };
1335*640235e2SEnji Cooper
1336*640235e2SEnji Cooper bpfjit_func_t code;
1337*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1338*640235e2SEnji Cooper
1339*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1340*640235e2SEnji Cooper
1341*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1342*640235e2SEnji Cooper
1343*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1344*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1345*640235e2SEnji Cooper
1346*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1347*640235e2SEnji Cooper
1348*640235e2SEnji Cooper bpfjit_free_code(code);
1349*640235e2SEnji Cooper }
1350*640235e2SEnji Cooper
1351*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod1_x);
ATF_TC_HEAD(libbpfjit_alu_mod1_x,tc)1352*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod1_x, tc)
1353*640235e2SEnji Cooper {
1354*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1355*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=1");
1356*640235e2SEnji Cooper }
1357*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod1_x,tc)1358*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod1_x, tc)
1359*640235e2SEnji Cooper {
1360*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1361*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
1362*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1363*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1364*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1365*640235e2SEnji Cooper };
1366*640235e2SEnji Cooper
1367*640235e2SEnji Cooper bpfjit_func_t code;
1368*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1369*640235e2SEnji Cooper
1370*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1371*640235e2SEnji Cooper
1372*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1373*640235e2SEnji Cooper
1374*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1375*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1376*640235e2SEnji Cooper
1377*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
1378*640235e2SEnji Cooper
1379*640235e2SEnji Cooper bpfjit_free_code(code);
1380*640235e2SEnji Cooper }
1381*640235e2SEnji Cooper
1382*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod2_x);
ATF_TC_HEAD(libbpfjit_alu_mod2_x,tc)1383*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod2_x, tc)
1384*640235e2SEnji Cooper {
1385*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1386*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=2");
1387*640235e2SEnji Cooper }
1388*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod2_x,tc)1389*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod2_x, tc)
1390*640235e2SEnji Cooper {
1391*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1392*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
1393*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1394*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1395*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1396*640235e2SEnji Cooper };
1397*640235e2SEnji Cooper
1398*640235e2SEnji Cooper bpfjit_func_t code;
1399*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1400*640235e2SEnji Cooper
1401*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1402*640235e2SEnji Cooper
1403*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1404*640235e2SEnji Cooper
1405*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1406*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1407*640235e2SEnji Cooper
1408*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
1409*640235e2SEnji Cooper
1410*640235e2SEnji Cooper bpfjit_free_code(code);
1411*640235e2SEnji Cooper }
1412*640235e2SEnji Cooper
1413*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod4_x);
ATF_TC_HEAD(libbpfjit_alu_mod4_x,tc)1414*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod4_x, tc)
1415*640235e2SEnji Cooper {
1416*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1417*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=4");
1418*640235e2SEnji Cooper }
1419*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod4_x,tc)1420*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod4_x, tc)
1421*640235e2SEnji Cooper {
1422*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1423*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1424*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1425*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1426*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1427*640235e2SEnji Cooper };
1428*640235e2SEnji Cooper
1429*640235e2SEnji Cooper bpfjit_func_t code;
1430*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1431*640235e2SEnji Cooper
1432*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1433*640235e2SEnji Cooper
1434*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1435*640235e2SEnji Cooper
1436*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1437*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1438*640235e2SEnji Cooper
1439*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3);
1440*640235e2SEnji Cooper
1441*640235e2SEnji Cooper bpfjit_free_code(code);
1442*640235e2SEnji Cooper }
1443*640235e2SEnji Cooper
1444*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod10_x);
ATF_TC_HEAD(libbpfjit_alu_mod10_x,tc)1445*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod10_x, tc)
1446*640235e2SEnji Cooper {
1447*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1448*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10");
1449*640235e2SEnji Cooper }
1450*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod10_x,tc)1451*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod10_x, tc)
1452*640235e2SEnji Cooper {
1453*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1454*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1455*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1456*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1457*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1458*640235e2SEnji Cooper };
1459*640235e2SEnji Cooper
1460*640235e2SEnji Cooper bpfjit_func_t code;
1461*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1462*640235e2SEnji Cooper
1463*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1464*640235e2SEnji Cooper
1465*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1466*640235e2SEnji Cooper
1467*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1468*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1469*640235e2SEnji Cooper
1470*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 9);
1471*640235e2SEnji Cooper
1472*640235e2SEnji Cooper bpfjit_free_code(code);
1473*640235e2SEnji Cooper }
1474*640235e2SEnji Cooper
1475*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod10000_x);
ATF_TC_HEAD(libbpfjit_alu_mod10000_x,tc)1476*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod10000_x, tc)
1477*640235e2SEnji Cooper {
1478*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1479*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10000");
1480*640235e2SEnji Cooper }
1481*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod10000_x,tc)1482*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod10000_x, tc)
1483*640235e2SEnji Cooper {
1484*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1485*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1486*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1487*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1488*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1489*640235e2SEnji Cooper };
1490*640235e2SEnji Cooper
1491*640235e2SEnji Cooper bpfjit_func_t code;
1492*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1493*640235e2SEnji Cooper
1494*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1495*640235e2SEnji Cooper
1496*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1497*640235e2SEnji Cooper
1498*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1499*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1500*640235e2SEnji Cooper
1501*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 3849);
1502*640235e2SEnji Cooper
1503*640235e2SEnji Cooper bpfjit_free_code(code);
1504*640235e2SEnji Cooper }
1505*640235e2SEnji Cooper
1506*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod7609801_x);
ATF_TC_HEAD(libbpfjit_alu_mod7609801_x,tc)1507*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod7609801_x, tc)
1508*640235e2SEnji Cooper {
1509*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1510*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=7609801");
1511*640235e2SEnji Cooper }
1512*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod7609801_x,tc)1513*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod7609801_x, tc)
1514*640235e2SEnji Cooper {
1515*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1516*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1517*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1518*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1519*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1520*640235e2SEnji Cooper };
1521*640235e2SEnji Cooper
1522*640235e2SEnji Cooper bpfjit_func_t code;
1523*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1524*640235e2SEnji Cooper
1525*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1526*640235e2SEnji Cooper
1527*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1528*640235e2SEnji Cooper
1529*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1530*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1531*640235e2SEnji Cooper
1532*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(3039531));
1533*640235e2SEnji Cooper
1534*640235e2SEnji Cooper bpfjit_free_code(code);
1535*640235e2SEnji Cooper }
1536*640235e2SEnji Cooper
1537*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_mod80000000_x);
ATF_TC_HEAD(libbpfjit_alu_mod80000000_x,tc)1538*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_mod80000000_x, tc)
1539*640235e2SEnji Cooper {
1540*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1541*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0x80000000");
1542*640235e2SEnji Cooper }
1543*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_mod80000000_x,tc)1544*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_mod80000000_x, tc)
1545*640235e2SEnji Cooper {
1546*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1547*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1548*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1549*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1550*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1551*640235e2SEnji Cooper };
1552*640235e2SEnji Cooper
1553*640235e2SEnji Cooper bpfjit_func_t code;
1554*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1555*640235e2SEnji Cooper
1556*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1557*640235e2SEnji Cooper
1558*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1559*640235e2SEnji Cooper
1560*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1561*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1562*640235e2SEnji Cooper
1563*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x7fffffde));
1564*640235e2SEnji Cooper
1565*640235e2SEnji Cooper bpfjit_free_code(code);
1566*640235e2SEnji Cooper }
1567*640235e2SEnji Cooper
156857718be8SEnji Cooper ATF_TC(libbpfjit_alu_and_x);
ATF_TC_HEAD(libbpfjit_alu_and_x,tc)156957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_and_x, tc)
157057718be8SEnji Cooper {
157157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
157257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
157357718be8SEnji Cooper }
157457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_and_x,tc)157557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_and_x, tc)
157657718be8SEnji Cooper {
157757718be8SEnji Cooper static struct bpf_insn insns[] = {
157857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
157957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
158057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
158157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
158257718be8SEnji Cooper };
158357718be8SEnji Cooper
158457718be8SEnji Cooper bpfjit_func_t code;
158557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
158657718be8SEnji Cooper
158757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
158857718be8SEnji Cooper
158957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
159057718be8SEnji Cooper
159157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
159257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
159357718be8SEnji Cooper
159457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == (0xdead&0xbeef));
159557718be8SEnji Cooper
159657718be8SEnji Cooper bpfjit_free_code(code);
159757718be8SEnji Cooper }
159857718be8SEnji Cooper
159957718be8SEnji Cooper ATF_TC(libbpfjit_alu_or_x);
ATF_TC_HEAD(libbpfjit_alu_or_x,tc)160057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_or_x, tc)
160157718be8SEnji Cooper {
160257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
160357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
160457718be8SEnji Cooper }
160557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_or_x,tc)160657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_or_x, tc)
160757718be8SEnji Cooper {
160857718be8SEnji Cooper static struct bpf_insn insns[] = {
160957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
161057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
161157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
161257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
161357718be8SEnji Cooper };
161457718be8SEnji Cooper
161557718be8SEnji Cooper bpfjit_func_t code;
161657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
161757718be8SEnji Cooper
161857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
161957718be8SEnji Cooper
162057718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
162157718be8SEnji Cooper
162257718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
162357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
162457718be8SEnji Cooper
162557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
162657718be8SEnji Cooper
162757718be8SEnji Cooper bpfjit_free_code(code);
162857718be8SEnji Cooper }
162957718be8SEnji Cooper
1630*640235e2SEnji Cooper ATF_TC(libbpfjit_alu_xor_x);
ATF_TC_HEAD(libbpfjit_alu_xor_x,tc)1631*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_xor_x, tc)
1632*640235e2SEnji Cooper {
1633*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1634*640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X");
1635*640235e2SEnji Cooper }
1636*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_xor_x,tc)1637*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_alu_xor_x, tc)
1638*640235e2SEnji Cooper {
1639*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1640*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
1641*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000b1e0),
1642*640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0),
1643*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1644*640235e2SEnji Cooper };
1645*640235e2SEnji Cooper
1646*640235e2SEnji Cooper bpfjit_func_t code;
1647*640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1648*640235e2SEnji Cooper
1649*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1650*640235e2SEnji Cooper
1651*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1652*640235e2SEnji Cooper
1653*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
1654*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
1655*640235e2SEnji Cooper
1656*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
1657*640235e2SEnji Cooper
1658*640235e2SEnji Cooper bpfjit_free_code(code);
1659*640235e2SEnji Cooper }
1660*640235e2SEnji Cooper
166157718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh_x);
ATF_TC_HEAD(libbpfjit_alu_lsh_x,tc)166257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh_x, tc)
166357718be8SEnji Cooper {
166457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
166557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
166657718be8SEnji Cooper }
166757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_lsh_x,tc)166857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh_x, tc)
166957718be8SEnji Cooper {
167057718be8SEnji Cooper static struct bpf_insn insns[] = {
167157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
167257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
167357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
167457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
167557718be8SEnji Cooper };
167657718be8SEnji Cooper
167757718be8SEnji Cooper bpfjit_func_t code;
167857718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
167957718be8SEnji Cooper
168057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
168157718be8SEnji Cooper
168257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
168357718be8SEnji Cooper
168457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
168557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
168657718be8SEnji Cooper
168757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xbeef0000);
168857718be8SEnji Cooper
168957718be8SEnji Cooper bpfjit_free_code(code);
169057718be8SEnji Cooper }
169157718be8SEnji Cooper
169257718be8SEnji Cooper ATF_TC(libbpfjit_alu_lsh0_x);
ATF_TC_HEAD(libbpfjit_alu_lsh0_x,tc)169357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_lsh0_x, tc)
169457718be8SEnji Cooper {
169557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
169657718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
169757718be8SEnji Cooper }
169857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_lsh0_x,tc)169957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_lsh0_x, tc)
170057718be8SEnji Cooper {
170157718be8SEnji Cooper static struct bpf_insn insns[] = {
170257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
170357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
170457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
170557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
170657718be8SEnji Cooper };
170757718be8SEnji Cooper
170857718be8SEnji Cooper bpfjit_func_t code;
170957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
171057718be8SEnji Cooper
171157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
171257718be8SEnji Cooper
171357718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
171457718be8SEnji Cooper
171557718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
171657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
171757718be8SEnji Cooper
171857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
171957718be8SEnji Cooper
172057718be8SEnji Cooper bpfjit_free_code(code);
172157718be8SEnji Cooper }
172257718be8SEnji Cooper
172357718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh_x);
ATF_TC_HEAD(libbpfjit_alu_rsh_x,tc)172457718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh_x, tc)
172557718be8SEnji Cooper {
172657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
172757718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
172857718be8SEnji Cooper }
172957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_rsh_x,tc)173057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh_x, tc)
173157718be8SEnji Cooper {
173257718be8SEnji Cooper static struct bpf_insn insns[] = {
173357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
173457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
173557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
173657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
173757718be8SEnji Cooper };
173857718be8SEnji Cooper
173957718be8SEnji Cooper bpfjit_func_t code;
174057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
174157718be8SEnji Cooper
174257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
174357718be8SEnji Cooper
174457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
174557718be8SEnji Cooper
174657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
174757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
174857718be8SEnji Cooper
174957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0x0000dead);
175057718be8SEnji Cooper
175157718be8SEnji Cooper bpfjit_free_code(code);
175257718be8SEnji Cooper }
175357718be8SEnji Cooper
175457718be8SEnji Cooper ATF_TC(libbpfjit_alu_rsh0_x);
ATF_TC_HEAD(libbpfjit_alu_rsh0_x,tc)175557718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_rsh0_x, tc)
175657718be8SEnji Cooper {
175757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
175857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
175957718be8SEnji Cooper }
176057718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_rsh0_x,tc)176157718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_rsh0_x, tc)
176257718be8SEnji Cooper {
176357718be8SEnji Cooper static struct bpf_insn insns[] = {
176457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
176557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
176657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
176757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
176857718be8SEnji Cooper };
176957718be8SEnji Cooper
177057718be8SEnji Cooper bpfjit_func_t code;
177157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
177257718be8SEnji Cooper
177357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
177457718be8SEnji Cooper
177557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
177657718be8SEnji Cooper
177757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
177857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
177957718be8SEnji Cooper
178057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0xdeadbeef);
178157718be8SEnji Cooper
178257718be8SEnji Cooper bpfjit_free_code(code);
178357718be8SEnji Cooper }
178457718be8SEnji Cooper
178557718be8SEnji Cooper ATF_TC(libbpfjit_alu_modulo_x);
ATF_TC_HEAD(libbpfjit_alu_modulo_x,tc)178657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_modulo_x, tc)
178757718be8SEnji Cooper {
178857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
178957718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
179057718be8SEnji Cooper }
179157718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_modulo_x,tc)179257718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_modulo_x, tc)
179357718be8SEnji Cooper {
179457718be8SEnji Cooper static struct bpf_insn insns[] = {
179557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
179657718be8SEnji Cooper
179757718be8SEnji Cooper /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
179857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
179957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
180057718be8SEnji Cooper
180157718be8SEnji Cooper /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
180257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
180357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
180457718be8SEnji Cooper
180557718be8SEnji Cooper /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
180657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
180757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
180857718be8SEnji Cooper
180957718be8SEnji Cooper /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
181057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
181157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
181257718be8SEnji Cooper
181357718be8SEnji Cooper /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
181457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
181557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
181657718be8SEnji Cooper
181757718be8SEnji Cooper /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
181857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
181957718be8SEnji Cooper
182057718be8SEnji Cooper /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
182157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
182257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
182357718be8SEnji Cooper
182457718be8SEnji Cooper /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
182557718be8SEnji Cooper /* 00000000,42218C74 >> 3 = 00000000,08443180 */
182657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
182757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
182857718be8SEnji Cooper
182957718be8SEnji Cooper /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
183057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
183157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
183257718be8SEnji Cooper
183357718be8SEnji Cooper /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
183457718be8SEnji Cooper /* 00000000,93818280 / DEAD = 00000000,0000A994 */
183557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
183657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
183757718be8SEnji Cooper
183857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
183957718be8SEnji Cooper };
184057718be8SEnji Cooper
184157718be8SEnji Cooper bpfjit_func_t code;
184257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
184357718be8SEnji Cooper
184457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
184557718be8SEnji Cooper
184657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
184757718be8SEnji Cooper
184857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
184957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
185057718be8SEnji Cooper
185157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
185257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
185357718be8SEnji Cooper
185457718be8SEnji Cooper
185557718be8SEnji Cooper bpfjit_free_code(code);
185657718be8SEnji Cooper }
185757718be8SEnji Cooper
185857718be8SEnji Cooper ATF_TC(libbpfjit_alu_neg);
ATF_TC_HEAD(libbpfjit_alu_neg,tc)185957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_alu_neg, tc)
186057718be8SEnji Cooper {
186157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
186257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_NEG");
186357718be8SEnji Cooper }
186457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_alu_neg,tc)186557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_alu_neg, tc)
186657718be8SEnji Cooper {
186757718be8SEnji Cooper static struct bpf_insn insns[] = {
186857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 777),
186957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
187057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
187157718be8SEnji Cooper };
187257718be8SEnji Cooper
187357718be8SEnji Cooper bpfjit_func_t code;
187457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
187557718be8SEnji Cooper
187657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
187757718be8SEnji Cooper
187857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
187957718be8SEnji Cooper
188057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
188157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
188257718be8SEnji Cooper
188357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0u-777u);
188457718be8SEnji Cooper
188557718be8SEnji Cooper bpfjit_free_code(code);
188657718be8SEnji Cooper }
188757718be8SEnji Cooper
188857718be8SEnji Cooper ATF_TC(libbpfjit_jmp_ja);
ATF_TC_HEAD(libbpfjit_jmp_ja,tc)188957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_ja, tc)
189057718be8SEnji Cooper {
189157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
189257718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JA");
189357718be8SEnji Cooper }
189457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_ja,tc)189557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_ja, tc)
189657718be8SEnji Cooper {
189757718be8SEnji Cooper static struct bpf_insn insns[] = {
189857718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
189957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
190057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
190157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
190257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
190357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
190457718be8SEnji Cooper };
190557718be8SEnji Cooper
190657718be8SEnji Cooper bpfjit_func_t code;
190757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
190857718be8SEnji Cooper
190957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
191057718be8SEnji Cooper
191157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
191257718be8SEnji Cooper
191357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
191457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
191557718be8SEnji Cooper
191657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
191757718be8SEnji Cooper
191857718be8SEnji Cooper bpfjit_free_code(code);
191957718be8SEnji Cooper }
192057718be8SEnji Cooper
1921*640235e2SEnji Cooper ATF_TC(libbpfjit_jmp_ja_invalid);
ATF_TC_HEAD(libbpfjit_jmp_ja_invalid,tc)1922*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_ja_invalid, tc)
1923*640235e2SEnji Cooper {
1924*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1925*640235e2SEnji Cooper "Test BPF_JMP+BPF_JA to invalid destination");
1926*640235e2SEnji Cooper }
1927*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_ja_invalid,tc)1928*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_ja_invalid, tc)
1929*640235e2SEnji Cooper {
1930*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1931*640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 4),
1932*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
1933*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
1934*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
1935*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
1936*640235e2SEnji Cooper };
1937*640235e2SEnji Cooper
1938*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1939*640235e2SEnji Cooper
1940*640235e2SEnji Cooper ATF_CHECK(!bpf_validate(insns, insn_count));
1941*640235e2SEnji Cooper ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
1942*640235e2SEnji Cooper }
1943*640235e2SEnji Cooper
1944*640235e2SEnji Cooper ATF_TC(libbpfjit_jmp_ja_overflow);
ATF_TC_HEAD(libbpfjit_jmp_ja_overflow,tc)1945*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_ja_overflow, tc)
1946*640235e2SEnji Cooper {
1947*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1948*640235e2SEnji Cooper "Test BPF_JMP+BPF_JA with negative offset");
1949*640235e2SEnji Cooper }
1950*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_ja_overflow,tc)1951*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_ja_overflow, tc)
1952*640235e2SEnji Cooper {
1953*640235e2SEnji Cooper static struct bpf_insn insns[] = {
1954*640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
1955*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 777),
1956*640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, UINT32_MAX - 1), // -2
1957*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0)
1958*640235e2SEnji Cooper };
1959*640235e2SEnji Cooper
1960*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1961*640235e2SEnji Cooper
1962*640235e2SEnji Cooper /* Jumps with negative offsets work in userspace ... */
1963*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
1964*640235e2SEnji Cooper
1965*640235e2SEnji Cooper /* .. but not for bpfjit. */
1966*640235e2SEnji Cooper ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
1967*640235e2SEnji Cooper }
1968*640235e2SEnji Cooper
196957718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jgt_k);
ATF_TC_HEAD(libbpfjit_jmp_jgt_k,tc)197057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jgt_k, tc)
197157718be8SEnji Cooper {
197257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
197357718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
197457718be8SEnji Cooper }
197557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jgt_k,tc)197657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jgt_k, tc)
197757718be8SEnji Cooper {
197857718be8SEnji Cooper static struct bpf_insn insns[] = {
197957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
198057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
198157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
198257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
198357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
198457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
198557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
198657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
198757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
198857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
198957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
199057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
199157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
199257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
199357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
199457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
199557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
199657718be8SEnji Cooper };
199757718be8SEnji Cooper
199857718be8SEnji Cooper bpfjit_func_t code;
199957718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
200057718be8SEnji Cooper
200157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
200257718be8SEnji Cooper
200357718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
200457718be8SEnji Cooper
200557718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
200657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
200757718be8SEnji Cooper
200857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
200957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
201057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
201157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
201257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
201357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
201457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
201557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
201657718be8SEnji Cooper
201757718be8SEnji Cooper bpfjit_free_code(code);
201857718be8SEnji Cooper }
201957718be8SEnji Cooper
202057718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jge_k);
ATF_TC_HEAD(libbpfjit_jmp_jge_k,tc)202157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jge_k, tc)
202257718be8SEnji Cooper {
202357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
202457718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
202557718be8SEnji Cooper }
202657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jge_k,tc)202757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jge_k, tc)
202857718be8SEnji Cooper {
202957718be8SEnji Cooper static struct bpf_insn insns[] = {
203057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
203157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
203257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
203357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
203457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
203557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
203657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
203757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
203857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
203957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
204057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
204157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
204257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
204357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
204457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
204557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
204657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
204757718be8SEnji Cooper };
204857718be8SEnji Cooper
204957718be8SEnji Cooper bpfjit_func_t code;
205057718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
205157718be8SEnji Cooper
205257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
205357718be8SEnji Cooper
205457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
205557718be8SEnji Cooper
205657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
205757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
205857718be8SEnji Cooper
205957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
206057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
206157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
206257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
206357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
206457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
206557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
206657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
206757718be8SEnji Cooper
206857718be8SEnji Cooper bpfjit_free_code(code);
206957718be8SEnji Cooper }
207057718be8SEnji Cooper
207157718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_k);
ATF_TC_HEAD(libbpfjit_jmp_jeq_k,tc)207257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_k, tc)
207357718be8SEnji Cooper {
207457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
207557718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
207657718be8SEnji Cooper }
207757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jeq_k,tc)207857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_k, tc)
207957718be8SEnji Cooper {
208057718be8SEnji Cooper static struct bpf_insn insns[] = {
208157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
208257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
208357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
208457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
208557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
208657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
208757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
208857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
208957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
209057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
209157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
209257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
209357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
209457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
209557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
209657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
209757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
209857718be8SEnji Cooper };
209957718be8SEnji Cooper
210057718be8SEnji Cooper bpfjit_func_t code;
210157718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
210257718be8SEnji Cooper
210357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
210457718be8SEnji Cooper
210557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
210657718be8SEnji Cooper
210757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
210857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
210957718be8SEnji Cooper
211057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
211157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
211257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
211357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
211457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
211557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
211657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
211757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
211857718be8SEnji Cooper
211957718be8SEnji Cooper bpfjit_free_code(code);
212057718be8SEnji Cooper }
212157718be8SEnji Cooper
212257718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jset_k);
ATF_TC_HEAD(libbpfjit_jmp_jset_k,tc)212357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jset_k, tc)
212457718be8SEnji Cooper {
212557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
212657718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
212757718be8SEnji Cooper }
212857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jset_k,tc)212957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jset_k, tc)
213057718be8SEnji Cooper {
213157718be8SEnji Cooper static struct bpf_insn insns[] = {
213257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
213357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
213457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
213557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
213657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
213757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
213857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
213957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
214057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
214157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
214257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
214357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
214457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
214557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
214657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
214757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
214857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
214957718be8SEnji Cooper };
215057718be8SEnji Cooper
215157718be8SEnji Cooper bpfjit_func_t code;
215257718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
215357718be8SEnji Cooper
215457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
215557718be8SEnji Cooper
215657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
215757718be8SEnji Cooper
215857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
215957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
216057718be8SEnji Cooper
216157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
216257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
216357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
216457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
216557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
216657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
216757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
216857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
216957718be8SEnji Cooper
217057718be8SEnji Cooper bpfjit_free_code(code);
217157718be8SEnji Cooper }
217257718be8SEnji Cooper
217357718be8SEnji Cooper ATF_TC(libbpfjit_jmp_modulo_k);
ATF_TC_HEAD(libbpfjit_jmp_modulo_k,tc)217457718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_modulo_k, tc)
217557718be8SEnji Cooper {
217657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
217757718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
217857718be8SEnji Cooper }
217957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_modulo_k,tc)218057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_modulo_k, tc)
218157718be8SEnji Cooper {
218257718be8SEnji Cooper static struct bpf_insn insns[] = {
218357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
218457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
218557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
218657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
218757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
218857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
218957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
219057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
219157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
219257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
219357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
219457718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
219557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
219657718be8SEnji Cooper
219757718be8SEnji Cooper /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
219857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
219957718be8SEnji Cooper
220057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
220157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
220257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
220357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
220457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
220557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
220657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
220757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
220857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
220957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
221057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
221157718be8SEnji Cooper };
221257718be8SEnji Cooper
221357718be8SEnji Cooper bpfjit_func_t code;
221457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
221557718be8SEnji Cooper
221657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
221757718be8SEnji Cooper
221857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
221957718be8SEnji Cooper
222057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
222157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
222257718be8SEnji Cooper
222357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
222457718be8SEnji Cooper
222557718be8SEnji Cooper bpfjit_free_code(code);
222657718be8SEnji Cooper }
222757718be8SEnji Cooper
222857718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jgt_x);
ATF_TC_HEAD(libbpfjit_jmp_jgt_x,tc)222957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jgt_x, tc)
223057718be8SEnji Cooper {
223157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
223257718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
223357718be8SEnji Cooper }
223457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jgt_x,tc)223557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jgt_x, tc)
223657718be8SEnji Cooper {
223757718be8SEnji Cooper static struct bpf_insn insns[] = {
223857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
223957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
224057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
224157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
224257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
224357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
224457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
224557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
224657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
224757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
224857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
224957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
225057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
225157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
225257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
225357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
225457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
225557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
225657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
225757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
225857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
225957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
226057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
226157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
226257718be8SEnji Cooper };
226357718be8SEnji Cooper
226457718be8SEnji Cooper bpfjit_func_t code;
226557718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
226657718be8SEnji Cooper
226757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
226857718be8SEnji Cooper
226957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
227057718be8SEnji Cooper
227157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
227257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
227357718be8SEnji Cooper
227457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
227557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
227657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
227757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
227857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
227957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
228057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
228157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
228257718be8SEnji Cooper
228357718be8SEnji Cooper bpfjit_free_code(code);
228457718be8SEnji Cooper }
228557718be8SEnji Cooper
228657718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jge_x);
ATF_TC_HEAD(libbpfjit_jmp_jge_x,tc)228757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jge_x, tc)
228857718be8SEnji Cooper {
228957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
229057718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
229157718be8SEnji Cooper }
229257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jge_x,tc)229357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jge_x, tc)
229457718be8SEnji Cooper {
229557718be8SEnji Cooper static struct bpf_insn insns[] = {
229657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
229757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
229857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
229957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
230057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
230157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
230257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
230357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
230457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
230557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
230657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
230757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
230857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
230957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
231057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
231157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
231257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
231357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
231457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
231557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
231657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
231757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
231857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
231957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
232057718be8SEnji Cooper };
232157718be8SEnji Cooper
232257718be8SEnji Cooper bpfjit_func_t code;
232357718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
232457718be8SEnji Cooper
232557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
232657718be8SEnji Cooper
232757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
232857718be8SEnji Cooper
232957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
233057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
233157718be8SEnji Cooper
233257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
233357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
233457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
233557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
233657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
233757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
233857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
233957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
234057718be8SEnji Cooper
234157718be8SEnji Cooper bpfjit_free_code(code);
234257718be8SEnji Cooper }
234357718be8SEnji Cooper
234457718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_x);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x,tc)234557718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_x, tc)
234657718be8SEnji Cooper {
234757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
234857718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
234957718be8SEnji Cooper }
235057718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jeq_x,tc)235157718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_x, tc)
235257718be8SEnji Cooper {
235357718be8SEnji Cooper static struct bpf_insn insns[] = {
235457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
235557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
235657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2357*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
235857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
235957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
236057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
236157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
236257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
2363*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2364*640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2365*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
236657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
236757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
236857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
236957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
2370*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
237157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
237257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
237357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
2374*640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2375*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8),
2376*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 9)
237757718be8SEnji Cooper };
237857718be8SEnji Cooper
237957718be8SEnji Cooper bpfjit_func_t code;
238057718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
238157718be8SEnji Cooper
238257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
238357718be8SEnji Cooper
238457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
238557718be8SEnji Cooper
238657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
238757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
238857718be8SEnji Cooper
2389*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 8);
2390*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 8);
2391*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 2);
2392*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 8);
2393*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 3);
2394*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 9);
2395*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 6);
2396*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 1);
239757718be8SEnji Cooper
239857718be8SEnji Cooper bpfjit_free_code(code);
239957718be8SEnji Cooper }
240057718be8SEnji Cooper
240157718be8SEnji Cooper ATF_TC(libbpfjit_jmp_jset_x);
ATF_TC_HEAD(libbpfjit_jmp_jset_x,tc)240257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jset_x, tc)
240357718be8SEnji Cooper {
240457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
240557718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
240657718be8SEnji Cooper }
240757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jset_x,tc)240857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jset_x, tc)
240957718be8SEnji Cooper {
241057718be8SEnji Cooper static struct bpf_insn insns[] = {
241157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
241257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
241357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
241457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
241557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
241657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
241757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
241857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
241957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
242057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
242157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
242257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
242357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
242457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
242557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
242657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
242757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
242857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
242957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
243057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
243157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
243257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
243357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
243457718be8SEnji Cooper };
243557718be8SEnji Cooper
243657718be8SEnji Cooper bpfjit_func_t code;
243757718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
243857718be8SEnji Cooper
243957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
244057718be8SEnji Cooper
244157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
244257718be8SEnji Cooper
244357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
244457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
244557718be8SEnji Cooper
244657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
244757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
244857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
244957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
245057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
245157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
245257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
245357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
245457718be8SEnji Cooper
245557718be8SEnji Cooper bpfjit_free_code(code);
245657718be8SEnji Cooper }
245757718be8SEnji Cooper
2458*640235e2SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_x_noinit_ax);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_ax,tc)2459*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_ax, tc)
2460*640235e2SEnji Cooper {
2461*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2462*640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X");
2463*640235e2SEnji Cooper }
2464*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_ax,tc)2465*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_ax, tc)
2466*640235e2SEnji Cooper {
2467*640235e2SEnji Cooper static struct bpf_insn insns[] = {
2468*640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2469*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2470*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2471*640235e2SEnji Cooper };
2472*640235e2SEnji Cooper
2473*640235e2SEnji Cooper bpfjit_func_t code;
2474*640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2475*640235e2SEnji Cooper
2476*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2477*640235e2SEnji Cooper
2478*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
2479*640235e2SEnji Cooper
2480*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
2481*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2482*640235e2SEnji Cooper
2483*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
2484*640235e2SEnji Cooper
2485*640235e2SEnji Cooper bpfjit_free_code(code);
2486*640235e2SEnji Cooper }
2487*640235e2SEnji Cooper
2488*640235e2SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_x_noinit_a);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_a,tc)2489*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_a, tc)
2490*640235e2SEnji Cooper {
2491*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2492*640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A");
2493*640235e2SEnji Cooper }
2494*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_a,tc)2495*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_a, tc)
2496*640235e2SEnji Cooper {
2497*640235e2SEnji Cooper static struct bpf_insn insns[] = {
2498*640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0), /* X > 0 */
2499*640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2500*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2501*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2502*640235e2SEnji Cooper };
2503*640235e2SEnji Cooper
2504*640235e2SEnji Cooper bpfjit_func_t code;
2505*640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2506*640235e2SEnji Cooper
2507*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2508*640235e2SEnji Cooper
2509*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
2510*640235e2SEnji Cooper
2511*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
2512*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2513*640235e2SEnji Cooper
2514*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2515*640235e2SEnji Cooper
2516*640235e2SEnji Cooper bpfjit_free_code(code);
2517*640235e2SEnji Cooper }
2518*640235e2SEnji Cooper
2519*640235e2SEnji Cooper ATF_TC(libbpfjit_jmp_jeq_x_noinit_x);
ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_x,tc)2520*640235e2SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_jeq_x_noinit_x, tc)
2521*640235e2SEnji Cooper {
2522*640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2523*640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
2524*640235e2SEnji Cooper }
2525*640235e2SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_x,tc)2526*640235e2SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_jeq_x_noinit_x, tc)
2527*640235e2SEnji Cooper {
2528*640235e2SEnji Cooper static struct bpf_insn insns[] = {
2529*640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0), /* A > 0 */
2530*640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2531*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2532*640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2533*640235e2SEnji Cooper };
2534*640235e2SEnji Cooper
2535*640235e2SEnji Cooper bpfjit_func_t code;
2536*640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2537*640235e2SEnji Cooper
2538*640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2539*640235e2SEnji Cooper
2540*640235e2SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
2541*640235e2SEnji Cooper
2542*640235e2SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
2543*640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2544*640235e2SEnji Cooper
2545*640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2546*640235e2SEnji Cooper
2547*640235e2SEnji Cooper bpfjit_free_code(code);
2548*640235e2SEnji Cooper }
2549*640235e2SEnji Cooper
255057718be8SEnji Cooper ATF_TC(libbpfjit_jmp_modulo_x);
ATF_TC_HEAD(libbpfjit_jmp_modulo_x,tc)255157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
255257718be8SEnji Cooper {
255357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
255457718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
255557718be8SEnji Cooper }
255657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_jmp_modulo_x,tc)255757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
255857718be8SEnji Cooper {
255957718be8SEnji Cooper static struct bpf_insn insns[] = {
256057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
256157718be8SEnji Cooper /* FFFFF770 << 4 = FFFFF770 */
256257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
256357718be8SEnji Cooper
256457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
256557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
256657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
256757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
256857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
256957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
257057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
257157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
257257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
257357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
257457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
257557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
257657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
257757718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
257857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
257957718be8SEnji Cooper
258057718be8SEnji Cooper /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
258157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
258257718be8SEnji Cooper
258357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
258457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
258557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
258657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
258757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
258857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
258957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
259057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
259157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
259257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
259357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
259457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
259557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
259657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
259757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
259857718be8SEnji Cooper };
259957718be8SEnji Cooper
260057718be8SEnji Cooper bpfjit_func_t code;
260157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
260257718be8SEnji Cooper
260357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
260457718be8SEnji Cooper
260557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
260657718be8SEnji Cooper
260757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
260857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
260957718be8SEnji Cooper
261057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
261157718be8SEnji Cooper
261257718be8SEnji Cooper bpfjit_free_code(code);
261357718be8SEnji Cooper }
261457718be8SEnji Cooper
261557718be8SEnji Cooper ATF_TC(libbpfjit_ld_abs);
ATF_TC_HEAD(libbpfjit_ld_abs,tc)261657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_abs, tc)
261757718be8SEnji Cooper {
261857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
261957718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_ABS");
262057718be8SEnji Cooper }
262157718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_abs,tc)262257718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_abs, tc)
262357718be8SEnji Cooper {
262457718be8SEnji Cooper static struct bpf_insn insns[3][2] = {
262557718be8SEnji Cooper {
262657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
262757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
262857718be8SEnji Cooper },
262957718be8SEnji Cooper {
263057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
263157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
263257718be8SEnji Cooper },
263357718be8SEnji Cooper {
263457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
263557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
263657718be8SEnji Cooper }
263757718be8SEnji Cooper };
263857718be8SEnji Cooper
263957718be8SEnji Cooper static size_t lengths[3] = { 1, 2, 4 };
264057718be8SEnji Cooper static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
264157718be8SEnji Cooper
264257718be8SEnji Cooper size_t i, l;
264357718be8SEnji Cooper uint8_t *pkt = deadbeef_at_5;
264457718be8SEnji Cooper size_t pktsize = sizeof(deadbeef_at_5);
264557718be8SEnji Cooper
264657718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
264757718be8SEnji Cooper
264857718be8SEnji Cooper for (i = 0; i < 3; i++) {
264957718be8SEnji Cooper bpfjit_func_t code;
265057718be8SEnji Cooper
265157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns[i], insn_count));
265257718be8SEnji Cooper
265357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns[i], insn_count);
265457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
265557718be8SEnji Cooper
265657718be8SEnji Cooper for (l = 1; l < 5 + lengths[i]; l++) {
265757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == 0);
265857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
265957718be8SEnji Cooper }
266057718be8SEnji Cooper
266157718be8SEnji Cooper l = 5 + lengths[i];
266257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
266357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
266457718be8SEnji Cooper
266557718be8SEnji Cooper l = pktsize;
266657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
266757718be8SEnji Cooper
266857718be8SEnji Cooper bpfjit_free_code(code);
266957718be8SEnji Cooper }
267057718be8SEnji Cooper }
267157718be8SEnji Cooper
267257718be8SEnji Cooper ATF_TC(libbpfjit_ld_abs_k_overflow);
ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow,tc)267357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
267457718be8SEnji Cooper {
267557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
267657718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
267757718be8SEnji Cooper }
267857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_abs_k_overflow,tc)267957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
268057718be8SEnji Cooper {
268157718be8SEnji Cooper static struct bpf_insn insns[12][3] = {
268257718be8SEnji Cooper {
268357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
268457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
268557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
268657718be8SEnji Cooper },
268757718be8SEnji Cooper {
268857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
268957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
269057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
269157718be8SEnji Cooper },
269257718be8SEnji Cooper {
269357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
269457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
269557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
269657718be8SEnji Cooper },
269757718be8SEnji Cooper {
269857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
269957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
270057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
270157718be8SEnji Cooper },
270257718be8SEnji Cooper {
270357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
270457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
270557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
270657718be8SEnji Cooper },
270757718be8SEnji Cooper {
270857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
270957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
271157718be8SEnji Cooper },
271257718be8SEnji Cooper {
271357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
271557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
271657718be8SEnji Cooper },
271757718be8SEnji Cooper {
271857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
271957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
272057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
272157718be8SEnji Cooper },
272257718be8SEnji Cooper {
272357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
272457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
272557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
272657718be8SEnji Cooper },
272757718be8SEnji Cooper {
272857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
272957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
273057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
273157718be8SEnji Cooper },
273257718be8SEnji Cooper {
273357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
273457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
273557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
273657718be8SEnji Cooper },
273757718be8SEnji Cooper {
273857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
273957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
274057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
274157718be8SEnji Cooper }
274257718be8SEnji Cooper };
274357718be8SEnji Cooper
274457718be8SEnji Cooper int i;
274557718be8SEnji Cooper uint8_t pkt[8] = { 0 };
274657718be8SEnji Cooper
274757718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
274857718be8SEnji Cooper
274957718be8SEnji Cooper for (i = 0; i < 3; i++) {
275057718be8SEnji Cooper bpfjit_func_t code;
275157718be8SEnji Cooper
275257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns[i], insn_count));
275357718be8SEnji Cooper
275457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns[i], insn_count);
275557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
275657718be8SEnji Cooper
275757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
275857718be8SEnji Cooper
275957718be8SEnji Cooper bpfjit_free_code(code);
276057718be8SEnji Cooper }
276157718be8SEnji Cooper }
276257718be8SEnji Cooper
276357718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind);
ATF_TC_HEAD(libbpfjit_ld_ind,tc)276457718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind, tc)
276557718be8SEnji Cooper {
276657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
276757718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND");
276857718be8SEnji Cooper }
276957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_ind,tc)277057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind, tc)
277157718be8SEnji Cooper {
277257718be8SEnji Cooper static struct bpf_insn insns[6][3] = {
277357718be8SEnji Cooper {
277457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
277557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
277657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
277757718be8SEnji Cooper },
277857718be8SEnji Cooper {
277957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
278057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
278157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
278257718be8SEnji Cooper },
278357718be8SEnji Cooper {
278457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
278557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
278657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
278757718be8SEnji Cooper },
278857718be8SEnji Cooper {
278957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
279057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
279157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
279257718be8SEnji Cooper },
279357718be8SEnji Cooper {
279457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
279557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
279657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
279757718be8SEnji Cooper },
279857718be8SEnji Cooper {
279957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
280057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
280157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
280257718be8SEnji Cooper }
280357718be8SEnji Cooper };
280457718be8SEnji Cooper
280557718be8SEnji Cooper static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
280657718be8SEnji Cooper
280757718be8SEnji Cooper static unsigned int expected[6] = {
280857718be8SEnji Cooper 0xde, 0xdead, 0xdeadbeef,
280957718be8SEnji Cooper 0xde, 0xdead, 0xdeadbeef
281057718be8SEnji Cooper };
281157718be8SEnji Cooper
281257718be8SEnji Cooper size_t i, l;
281357718be8SEnji Cooper uint8_t *pkt = deadbeef_at_5;
281457718be8SEnji Cooper size_t pktsize = sizeof(deadbeef_at_5);
281557718be8SEnji Cooper
281657718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
281757718be8SEnji Cooper
281857718be8SEnji Cooper for (i = 0; i < 3; i++) {
281957718be8SEnji Cooper bpfjit_func_t code;
282057718be8SEnji Cooper
282157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns[i], insn_count));
282257718be8SEnji Cooper
282357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns[i], insn_count);
282457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
282557718be8SEnji Cooper
282657718be8SEnji Cooper for (l = 1; l < 5 + lengths[i]; l++) {
282757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == 0);
282857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
282957718be8SEnji Cooper }
283057718be8SEnji Cooper
283157718be8SEnji Cooper l = 5 + lengths[i];
283257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
283357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
283457718be8SEnji Cooper
283557718be8SEnji Cooper l = pktsize;
283657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
283757718be8SEnji Cooper
283857718be8SEnji Cooper bpfjit_free_code(code);
283957718be8SEnji Cooper }
284057718be8SEnji Cooper }
284157718be8SEnji Cooper
284257718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_k_overflow);
ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow,tc)284357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
284457718be8SEnji Cooper {
284557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
284657718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
284757718be8SEnji Cooper }
284857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_ind_k_overflow,tc)284957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
285057718be8SEnji Cooper {
285157718be8SEnji Cooper static struct bpf_insn insns[12][3] = {
285257718be8SEnji Cooper {
285357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
285457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
285557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
285657718be8SEnji Cooper },
285757718be8SEnji Cooper {
285857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
285957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
286057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
286157718be8SEnji Cooper },
286257718be8SEnji Cooper {
286357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
286457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
286557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
286657718be8SEnji Cooper },
286757718be8SEnji Cooper {
286857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
286957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
287057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
287157718be8SEnji Cooper },
287257718be8SEnji Cooper {
287357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
287457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
287557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
287657718be8SEnji Cooper },
287757718be8SEnji Cooper {
287857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
287957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
288157718be8SEnji Cooper },
288257718be8SEnji Cooper {
288357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
288557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
288657718be8SEnji Cooper },
288757718be8SEnji Cooper {
288857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
288957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
289057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
289157718be8SEnji Cooper },
289257718be8SEnji Cooper {
289357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
289457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
289557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
289657718be8SEnji Cooper },
289757718be8SEnji Cooper {
289857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
289957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
290057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
290157718be8SEnji Cooper },
290257718be8SEnji Cooper {
290357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
290457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
290557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
290657718be8SEnji Cooper },
290757718be8SEnji Cooper {
290857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
290957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
291057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
291157718be8SEnji Cooper }
291257718be8SEnji Cooper };
291357718be8SEnji Cooper
291457718be8SEnji Cooper int i;
291557718be8SEnji Cooper uint8_t pkt[8] = { 0 };
291657718be8SEnji Cooper
291757718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
291857718be8SEnji Cooper
291957718be8SEnji Cooper for (i = 0; i < 3; i++) {
292057718be8SEnji Cooper bpfjit_func_t code;
292157718be8SEnji Cooper
292257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns[i], insn_count));
292357718be8SEnji Cooper
292457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns[i], insn_count);
292557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
292657718be8SEnji Cooper
292757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
292857718be8SEnji Cooper
292957718be8SEnji Cooper bpfjit_free_code(code);
293057718be8SEnji Cooper }
293157718be8SEnji Cooper }
293257718be8SEnji Cooper
293357718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_x_overflow1);
ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1,tc)293457718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
293557718be8SEnji Cooper {
293657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
293757718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
293857718be8SEnji Cooper }
293957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1,tc)294057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
294157718be8SEnji Cooper {
294257718be8SEnji Cooper static struct bpf_insn insns[] = {
294357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0),
294457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
294557718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TAX, 0),
294657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
294757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
294857718be8SEnji Cooper };
294957718be8SEnji Cooper
295057718be8SEnji Cooper size_t i;
295157718be8SEnji Cooper bpfjit_func_t code;
295257718be8SEnji Cooper uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
295357718be8SEnji Cooper
295457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
295557718be8SEnji Cooper
295657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
295757718be8SEnji Cooper
295857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
295957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
296057718be8SEnji Cooper
296157718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++) {
296257718be8SEnji Cooper ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
296357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
296457718be8SEnji Cooper }
296557718be8SEnji Cooper
296657718be8SEnji Cooper bpfjit_free_code(code);
296757718be8SEnji Cooper }
296857718be8SEnji Cooper
296957718be8SEnji Cooper ATF_TC(libbpfjit_ld_ind_x_overflow2);
ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2,tc)297057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
297157718be8SEnji Cooper {
297257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
297357718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
297457718be8SEnji Cooper }
297557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2,tc)297657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
297757718be8SEnji Cooper {
297857718be8SEnji Cooper static struct bpf_insn insns[] = {
297957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0),
298057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
298157718be8SEnji Cooper BPF_STMT(BPF_ST, 3),
298257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
298357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
298457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
298557718be8SEnji Cooper };
298657718be8SEnji Cooper
298757718be8SEnji Cooper size_t i;
298857718be8SEnji Cooper bpfjit_func_t code;
298957718be8SEnji Cooper uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
299057718be8SEnji Cooper
299157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
299257718be8SEnji Cooper
299357718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
299457718be8SEnji Cooper
299557718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
299657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
299757718be8SEnji Cooper
299857718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++) {
299957718be8SEnji Cooper ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
300057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
300157718be8SEnji Cooper }
300257718be8SEnji Cooper
300357718be8SEnji Cooper bpfjit_free_code(code);
300457718be8SEnji Cooper }
300557718be8SEnji Cooper
300657718be8SEnji Cooper ATF_TC(libbpfjit_ld_len);
ATF_TC_HEAD(libbpfjit_ld_len,tc)300757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_len, tc)
300857718be8SEnji Cooper {
300957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
301057718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
301157718be8SEnji Cooper }
301257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_len,tc)301357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_len, tc)
301457718be8SEnji Cooper {
301557718be8SEnji Cooper static struct bpf_insn insns[] = {
301657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
301757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
301857718be8SEnji Cooper };
301957718be8SEnji Cooper
302057718be8SEnji Cooper size_t i;
302157718be8SEnji Cooper bpfjit_func_t code;
302257718be8SEnji Cooper uint8_t pkt[32]; /* the program doesn't read any data */
302357718be8SEnji Cooper
302457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
302557718be8SEnji Cooper
302657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
302757718be8SEnji Cooper
302857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
302957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
303057718be8SEnji Cooper
303157718be8SEnji Cooper for (i = 0; i < sizeof(pkt); i++)
303257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, 1) == i);
303357718be8SEnji Cooper
303457718be8SEnji Cooper bpfjit_free_code(code);
303557718be8SEnji Cooper }
303657718be8SEnji Cooper
303757718be8SEnji Cooper ATF_TC(libbpfjit_ld_imm);
ATF_TC_HEAD(libbpfjit_ld_imm,tc)303857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ld_imm, tc)
303957718be8SEnji Cooper {
304057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
304157718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IMM");
304257718be8SEnji Cooper }
304357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ld_imm,tc)304457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ld_imm, tc)
304557718be8SEnji Cooper {
304657718be8SEnji Cooper static struct bpf_insn insns[] = {
304757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
304857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
304957718be8SEnji Cooper };
305057718be8SEnji Cooper
305157718be8SEnji Cooper bpfjit_func_t code;
305257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
305357718be8SEnji Cooper
305457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
305557718be8SEnji Cooper
305657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
305757718be8SEnji Cooper
305857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
305957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
306057718be8SEnji Cooper
306157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
306257718be8SEnji Cooper
306357718be8SEnji Cooper bpfjit_free_code(code);
306457718be8SEnji Cooper }
306557718be8SEnji Cooper
306657718be8SEnji Cooper ATF_TC(libbpfjit_ldx_imm1);
ATF_TC_HEAD(libbpfjit_ldx_imm1,tc)306757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
306857718be8SEnji Cooper {
306957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
307057718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_IMM");
307157718be8SEnji Cooper }
307257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ldx_imm1,tc)307357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
307457718be8SEnji Cooper {
307557718be8SEnji Cooper static struct bpf_insn insns[] = {
307657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
307757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
307857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
307957718be8SEnji Cooper };
308057718be8SEnji Cooper
308157718be8SEnji Cooper bpfjit_func_t code;
308257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
308357718be8SEnji Cooper
308457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
308557718be8SEnji Cooper
308657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
308757718be8SEnji Cooper
308857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
308957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
309057718be8SEnji Cooper
309157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
309257718be8SEnji Cooper
309357718be8SEnji Cooper bpfjit_free_code(code);
309457718be8SEnji Cooper }
309557718be8SEnji Cooper
309657718be8SEnji Cooper ATF_TC(libbpfjit_ldx_imm2);
ATF_TC_HEAD(libbpfjit_ldx_imm2,tc)309757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
309857718be8SEnji Cooper {
309957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
310057718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_IMM");
310157718be8SEnji Cooper }
310257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ldx_imm2,tc)310357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
310457718be8SEnji Cooper {
310557718be8SEnji Cooper static struct bpf_insn insns[] = {
310657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
310757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 5),
310857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
310957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
311057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
311157718be8SEnji Cooper };
311257718be8SEnji Cooper
311357718be8SEnji Cooper bpfjit_func_t code;
311457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
311557718be8SEnji Cooper
311657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
311757718be8SEnji Cooper
311857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
311957718be8SEnji Cooper
312057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
312157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
312257718be8SEnji Cooper
312357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
312457718be8SEnji Cooper
312557718be8SEnji Cooper bpfjit_free_code(code);
312657718be8SEnji Cooper }
312757718be8SEnji Cooper
312857718be8SEnji Cooper ATF_TC(libbpfjit_ldx_len1);
ATF_TC_HEAD(libbpfjit_ldx_len1,tc)312957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
313057718be8SEnji Cooper {
313157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
313257718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_LEN");
313357718be8SEnji Cooper }
313457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ldx_len1,tc)313557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_len1, tc)
313657718be8SEnji Cooper {
313757718be8SEnji Cooper static struct bpf_insn insns[] = {
313857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
313957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
314057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
314157718be8SEnji Cooper };
314257718be8SEnji Cooper
314357718be8SEnji Cooper size_t i;
314457718be8SEnji Cooper bpfjit_func_t code;
314557718be8SEnji Cooper uint8_t pkt[5]; /* the program doesn't read any data */
314657718be8SEnji Cooper
314757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
314857718be8SEnji Cooper
314957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
315057718be8SEnji Cooper
315157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
315257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
315357718be8SEnji Cooper
315457718be8SEnji Cooper for (i = 1; i < sizeof(pkt); i++) {
315557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, 1) == i);
315657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
315757718be8SEnji Cooper }
315857718be8SEnji Cooper
315957718be8SEnji Cooper bpfjit_free_code(code);
316057718be8SEnji Cooper }
316157718be8SEnji Cooper
316257718be8SEnji Cooper ATF_TC(libbpfjit_ldx_len2);
ATF_TC_HEAD(libbpfjit_ldx_len2,tc)316357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
316457718be8SEnji Cooper {
316557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
316657718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_LEN");
316757718be8SEnji Cooper }
316857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ldx_len2,tc)316957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_len2, tc)
317057718be8SEnji Cooper {
317157718be8SEnji Cooper static struct bpf_insn insns[] = {
317257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
317357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 5),
317457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
317557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
317657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
317757718be8SEnji Cooper };
317857718be8SEnji Cooper
317957718be8SEnji Cooper bpfjit_func_t code;
318057718be8SEnji Cooper uint8_t pkt[5]; /* the program doesn't read any data */
318157718be8SEnji Cooper
318257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
318357718be8SEnji Cooper
318457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
318557718be8SEnji Cooper
318657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
318757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
318857718be8SEnji Cooper
318957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
319057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
319157718be8SEnji Cooper
319257718be8SEnji Cooper bpfjit_free_code(code);
319357718be8SEnji Cooper }
319457718be8SEnji Cooper
319557718be8SEnji Cooper ATF_TC(libbpfjit_ldx_msh);
ATF_TC_HEAD(libbpfjit_ldx_msh,tc)319657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
319757718be8SEnji Cooper {
319857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
319957718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_MSH");
320057718be8SEnji Cooper }
320157718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_ldx_msh,tc)320257718be8SEnji Cooper ATF_TC_BODY(libbpfjit_ldx_msh, tc)
320357718be8SEnji Cooper {
320457718be8SEnji Cooper static struct bpf_insn insns[] = {
320557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
320657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
320757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
320857718be8SEnji Cooper };
320957718be8SEnji Cooper
321057718be8SEnji Cooper bpfjit_func_t code;
321157718be8SEnji Cooper uint8_t pkt[2] = { 0, 0x7a };
321257718be8SEnji Cooper
321357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
321457718be8SEnji Cooper
321557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
321657718be8SEnji Cooper
321757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
321857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
321957718be8SEnji Cooper
322057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
322157718be8SEnji Cooper
322257718be8SEnji Cooper bpfjit_free_code(code);
322357718be8SEnji Cooper }
322457718be8SEnji Cooper
322557718be8SEnji Cooper ATF_TC(libbpfjit_misc_tax);
ATF_TC_HEAD(libbpfjit_misc_tax,tc)322657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_misc_tax, tc)
322757718be8SEnji Cooper {
322857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
322957718be8SEnji Cooper "Test JIT compilation of BPF_MISC+BPF_TAX");
323057718be8SEnji Cooper }
323157718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_misc_tax,tc)323257718be8SEnji Cooper ATF_TC_BODY(libbpfjit_misc_tax, tc)
323357718be8SEnji Cooper {
323457718be8SEnji Cooper static struct bpf_insn insns[] = {
323557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
323657718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TAX, 0),
323757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
323857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
323957718be8SEnji Cooper };
324057718be8SEnji Cooper
324157718be8SEnji Cooper bpfjit_func_t code;
324257718be8SEnji Cooper uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
324357718be8SEnji Cooper
324457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
324557718be8SEnji Cooper
324657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
324757718be8SEnji Cooper
324857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
324957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
325057718be8SEnji Cooper
325157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
325257718be8SEnji Cooper
325357718be8SEnji Cooper bpfjit_free_code(code);
325457718be8SEnji Cooper }
325557718be8SEnji Cooper
325657718be8SEnji Cooper ATF_TC(libbpfjit_misc_txa);
ATF_TC_HEAD(libbpfjit_misc_txa,tc)325757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_misc_txa, tc)
325857718be8SEnji Cooper {
325957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
326057718be8SEnji Cooper "Test JIT compilation of BPF_MISC+BPF_TXA");
326157718be8SEnji Cooper }
326257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_misc_txa,tc)326357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_misc_txa, tc)
326457718be8SEnji Cooper {
326557718be8SEnji Cooper static struct bpf_insn insns[] = {
326657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
326757718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TXA, 0),
326857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
326957718be8SEnji Cooper };
327057718be8SEnji Cooper
327157718be8SEnji Cooper bpfjit_func_t code;
327257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
327357718be8SEnji Cooper
327457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
327557718be8SEnji Cooper
327657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
327757718be8SEnji Cooper
327857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
327957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
328057718be8SEnji Cooper
328157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
328257718be8SEnji Cooper
328357718be8SEnji Cooper bpfjit_free_code(code);
328457718be8SEnji Cooper }
328557718be8SEnji Cooper
328657718be8SEnji Cooper ATF_TC(libbpfjit_st1);
ATF_TC_HEAD(libbpfjit_st1,tc)328757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st1, tc)
328857718be8SEnji Cooper {
328957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
329057718be8SEnji Cooper "Test JIT compilation of BPF_ST");
329157718be8SEnji Cooper }
329257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_st1,tc)329357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st1, tc)
329457718be8SEnji Cooper {
329557718be8SEnji Cooper static struct bpf_insn insns[] = {
329657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
329757718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
329857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
329957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
330057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
330157718be8SEnji Cooper };
330257718be8SEnji Cooper
330357718be8SEnji Cooper size_t i;
330457718be8SEnji Cooper bpfjit_func_t code;
330557718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
330657718be8SEnji Cooper
330757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
330857718be8SEnji Cooper
330957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
331057718be8SEnji Cooper
331157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
331257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
331357718be8SEnji Cooper
331457718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
331557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
331657718be8SEnji Cooper
331757718be8SEnji Cooper bpfjit_free_code(code);
331857718be8SEnji Cooper }
331957718be8SEnji Cooper
332057718be8SEnji Cooper ATF_TC(libbpfjit_st2);
ATF_TC_HEAD(libbpfjit_st2,tc)332157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st2, tc)
332257718be8SEnji Cooper {
332357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
332457718be8SEnji Cooper "Test JIT compilation of BPF_ST");
332557718be8SEnji Cooper }
332657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_st2,tc)332757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st2, tc)
332857718be8SEnji Cooper {
332957718be8SEnji Cooper static struct bpf_insn insns[] = {
333057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
333157718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
333257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
333357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
333457718be8SEnji Cooper };
333557718be8SEnji Cooper
333657718be8SEnji Cooper bpfjit_func_t code;
333757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
333857718be8SEnji Cooper
333957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
334057718be8SEnji Cooper
334157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
334257718be8SEnji Cooper
334357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
334457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
334557718be8SEnji Cooper
334657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
334757718be8SEnji Cooper
334857718be8SEnji Cooper bpfjit_free_code(code);
334957718be8SEnji Cooper }
335057718be8SEnji Cooper
335157718be8SEnji Cooper ATF_TC(libbpfjit_st3);
ATF_TC_HEAD(libbpfjit_st3,tc)335257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st3, tc)
335357718be8SEnji Cooper {
335457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
335557718be8SEnji Cooper "Test JIT compilation of BPF_ST");
335657718be8SEnji Cooper }
335757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_st3,tc)335857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st3, tc)
335957718be8SEnji Cooper {
336057718be8SEnji Cooper static struct bpf_insn insns[] = {
336157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
336257718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
336357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
336457718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
336557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
336657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
336757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
336857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
336957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
337057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
337157718be8SEnji Cooper };
337257718be8SEnji Cooper
337357718be8SEnji Cooper bpfjit_func_t code;
337457718be8SEnji Cooper uint8_t pkt[2]; /* the program doesn't read any data */
337557718be8SEnji Cooper
337657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
337757718be8SEnji Cooper
337857718be8SEnji Cooper ATF_REQUIRE(BPF_MEMWORDS > 1);
337957718be8SEnji Cooper
338057718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
338157718be8SEnji Cooper
338257718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
338357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
338457718be8SEnji Cooper
338557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
338657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
338757718be8SEnji Cooper
338857718be8SEnji Cooper bpfjit_free_code(code);
338957718be8SEnji Cooper }
339057718be8SEnji Cooper
339157718be8SEnji Cooper ATF_TC(libbpfjit_st4);
ATF_TC_HEAD(libbpfjit_st4,tc)339257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st4, tc)
339357718be8SEnji Cooper {
339457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
339557718be8SEnji Cooper "Test JIT compilation of BPF_ST");
339657718be8SEnji Cooper }
339757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_st4,tc)339857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st4, tc)
339957718be8SEnji Cooper {
340057718be8SEnji Cooper static struct bpf_insn insns[] = {
340157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
340257718be8SEnji Cooper BPF_STMT(BPF_ST, 5),
340357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
340457718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
340557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
340657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
340757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
340857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
340957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 5),
341057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
341157718be8SEnji Cooper };
341257718be8SEnji Cooper
341357718be8SEnji Cooper bpfjit_func_t code;
341457718be8SEnji Cooper uint8_t pkt[2]; /* the program doesn't read any data */
341557718be8SEnji Cooper
341657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
341757718be8SEnji Cooper
341857718be8SEnji Cooper ATF_REQUIRE(BPF_MEMWORDS > 6);
341957718be8SEnji Cooper
342057718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
342157718be8SEnji Cooper
342257718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
342357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
342457718be8SEnji Cooper
342557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
342657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
342757718be8SEnji Cooper
342857718be8SEnji Cooper bpfjit_free_code(code);
342957718be8SEnji Cooper }
343057718be8SEnji Cooper
343157718be8SEnji Cooper ATF_TC(libbpfjit_st5);
ATF_TC_HEAD(libbpfjit_st5,tc)343257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_st5, tc)
343357718be8SEnji Cooper {
343457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
343557718be8SEnji Cooper "Test JIT compilation of BPF_ST");
343657718be8SEnji Cooper }
343757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_st5,tc)343857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_st5, tc)
343957718be8SEnji Cooper {
344057718be8SEnji Cooper struct bpf_insn insns[5*BPF_MEMWORDS+2];
344157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
344257718be8SEnji Cooper
344357718be8SEnji Cooper size_t k;
344457718be8SEnji Cooper bpfjit_func_t code;
344557718be8SEnji Cooper uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
344657718be8SEnji Cooper
344757718be8SEnji Cooper memset(insns, 0, sizeof(insns));
344857718be8SEnji Cooper
344957718be8SEnji Cooper /* for each k do M[k] = k */
345057718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
345157718be8SEnji Cooper insns[2*k].code = BPF_LD+BPF_IMM;
345257718be8SEnji Cooper insns[2*k].k = 3*k;
345357718be8SEnji Cooper insns[2*k+1].code = BPF_ST;
345457718be8SEnji Cooper insns[2*k+1].k = k;
345557718be8SEnji Cooper }
345657718be8SEnji Cooper
345757718be8SEnji Cooper /* load wirelen into A */
345857718be8SEnji Cooper insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
345957718be8SEnji Cooper
346057718be8SEnji Cooper /* for each k, if (A == k + 1) return M[k] */
346157718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
346257718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
346357718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
346457718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
346557718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
346657718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
346757718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].k = k;
346857718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
346957718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].k = 0;
347057718be8SEnji Cooper }
347157718be8SEnji Cooper
347257718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
347357718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
347457718be8SEnji Cooper
347557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
347657718be8SEnji Cooper
347757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
347857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
347957718be8SEnji Cooper
348057718be8SEnji Cooper for (k = 1; k <= sizeof(pkt); k++)
348157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
348257718be8SEnji Cooper
348357718be8SEnji Cooper bpfjit_free_code(code);
348457718be8SEnji Cooper }
348557718be8SEnji Cooper
348657718be8SEnji Cooper ATF_TC(libbpfjit_stx1);
ATF_TC_HEAD(libbpfjit_stx1,tc)348757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx1, tc)
348857718be8SEnji Cooper {
348957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
349057718be8SEnji Cooper "Test JIT compilation of BPF_STX");
349157718be8SEnji Cooper }
349257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_stx1,tc)349357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx1, tc)
349457718be8SEnji Cooper {
349557718be8SEnji Cooper static struct bpf_insn insns[] = {
349657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
349757718be8SEnji Cooper BPF_STMT(BPF_STX, 0),
349857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
349957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
350057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
350157718be8SEnji Cooper };
350257718be8SEnji Cooper
350357718be8SEnji Cooper size_t i;
350457718be8SEnji Cooper bpfjit_func_t code;
350557718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
350657718be8SEnji Cooper
350757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
350857718be8SEnji Cooper
350957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
351057718be8SEnji Cooper
351157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
351257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
351357718be8SEnji Cooper
351457718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
351557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
351657718be8SEnji Cooper
351757718be8SEnji Cooper bpfjit_free_code(code);
351857718be8SEnji Cooper }
351957718be8SEnji Cooper
352057718be8SEnji Cooper ATF_TC(libbpfjit_stx2);
ATF_TC_HEAD(libbpfjit_stx2,tc)352157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx2, tc)
352257718be8SEnji Cooper {
352357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
352457718be8SEnji Cooper "Test JIT compilation of BPF_STX");
352557718be8SEnji Cooper }
352657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_stx2,tc)352757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx2, tc)
352857718be8SEnji Cooper {
352957718be8SEnji Cooper static struct bpf_insn insns[] = {
353057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
353157718be8SEnji Cooper BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
353257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
353357718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TXA, 0),
353457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
353557718be8SEnji Cooper };
353657718be8SEnji Cooper
353757718be8SEnji Cooper bpfjit_func_t code;
353857718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
353957718be8SEnji Cooper
354057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
354157718be8SEnji Cooper
354257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
354357718be8SEnji Cooper
354457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
354557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
354657718be8SEnji Cooper
354757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
354857718be8SEnji Cooper
354957718be8SEnji Cooper bpfjit_free_code(code);
355057718be8SEnji Cooper }
355157718be8SEnji Cooper
355257718be8SEnji Cooper ATF_TC(libbpfjit_stx3);
ATF_TC_HEAD(libbpfjit_stx3,tc)355357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx3, tc)
355457718be8SEnji Cooper {
355557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
355657718be8SEnji Cooper "Test JIT compilation of BPF_STX");
355757718be8SEnji Cooper }
355857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_stx3,tc)355957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx3, tc)
356057718be8SEnji Cooper {
356157718be8SEnji Cooper static struct bpf_insn insns[] = {
356257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
356357718be8SEnji Cooper BPF_STMT(BPF_STX, 5),
356457718be8SEnji Cooper BPF_STMT(BPF_STX, 2),
356557718be8SEnji Cooper BPF_STMT(BPF_STX, 3),
356657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
356757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
356857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
356957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
357157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
357357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
357557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
357657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
357757718be8SEnji Cooper };
357857718be8SEnji Cooper
357957718be8SEnji Cooper size_t i;
358057718be8SEnji Cooper bpfjit_func_t code;
358157718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
358257718be8SEnji Cooper
358357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
358457718be8SEnji Cooper
358557718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
358657718be8SEnji Cooper
358757718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
358857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
358957718be8SEnji Cooper
359057718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
359157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
359257718be8SEnji Cooper
359357718be8SEnji Cooper bpfjit_free_code(code);
359457718be8SEnji Cooper }
359557718be8SEnji Cooper
359657718be8SEnji Cooper ATF_TC(libbpfjit_stx4);
ATF_TC_HEAD(libbpfjit_stx4,tc)359757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_stx4, tc)
359857718be8SEnji Cooper {
359957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
360057718be8SEnji Cooper "Test JIT compilation of BPF_STX");
360157718be8SEnji Cooper }
360257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_stx4,tc)360357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_stx4, tc)
360457718be8SEnji Cooper {
360557718be8SEnji Cooper struct bpf_insn insns[5*BPF_MEMWORDS+2];
360657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
360757718be8SEnji Cooper
360857718be8SEnji Cooper size_t k;
360957718be8SEnji Cooper bpfjit_func_t code;
361057718be8SEnji Cooper uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
361157718be8SEnji Cooper
361257718be8SEnji Cooper memset(insns, 0, sizeof(insns));
361357718be8SEnji Cooper
361457718be8SEnji Cooper /* for each k do M[k] = k */
361557718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
361657718be8SEnji Cooper insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
361757718be8SEnji Cooper insns[2*k].k = 3*k;
361857718be8SEnji Cooper insns[2*k+1].code = BPF_STX;
361957718be8SEnji Cooper insns[2*k+1].k = k;
362057718be8SEnji Cooper }
362157718be8SEnji Cooper
362257718be8SEnji Cooper /* load wirelen into A */
362357718be8SEnji Cooper insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
362457718be8SEnji Cooper
362557718be8SEnji Cooper /* for each k, if (A == k + 1) return M[k] */
362657718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
362757718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
362857718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
362957718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
363057718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
363157718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
363257718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].k = k;
363357718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
363457718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].k = 0;
363557718be8SEnji Cooper }
363657718be8SEnji Cooper
363757718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
363857718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
363957718be8SEnji Cooper
364057718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
364157718be8SEnji Cooper
364257718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
364357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
364457718be8SEnji Cooper
364557718be8SEnji Cooper for (k = 1; k <= sizeof(pkt); k++)
364657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
364757718be8SEnji Cooper
364857718be8SEnji Cooper bpfjit_free_code(code);
364957718be8SEnji Cooper }
365057718be8SEnji Cooper
365157718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_1);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_1,tc)365257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
365357718be8SEnji Cooper {
365457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
365557718be8SEnji Cooper "Test JIT compilation with length optimization "
365657718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
365757718be8SEnji Cooper }
365857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_abs_1,tc)365957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
366057718be8SEnji Cooper {
366157718be8SEnji Cooper static struct bpf_insn insns[] = {
366257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
366357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
366457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
366557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
366657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
366757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
366857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
366957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
367057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
367157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
367257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
367357718be8SEnji Cooper };
367457718be8SEnji Cooper
367557718be8SEnji Cooper size_t i, j;
367657718be8SEnji Cooper bpfjit_func_t code;
367757718be8SEnji Cooper uint8_t pkt[2][34] = {
367857718be8SEnji Cooper {
367957718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
368057718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
368157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
368257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
368357718be8SEnji Cooper },
368457718be8SEnji Cooper {
368557718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
368657718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
368757718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
368857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
368957718be8SEnji Cooper }
369057718be8SEnji Cooper };
369157718be8SEnji Cooper
369257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
369357718be8SEnji Cooper
369457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
369557718be8SEnji Cooper
369657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
369757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
369857718be8SEnji Cooper
369957718be8SEnji Cooper for (i = 0; i < 2; i++) {
370057718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
370157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
370257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
370357718be8SEnji Cooper }
370457718be8SEnji Cooper
370557718be8SEnji Cooper bpfjit_free_code(code);
370657718be8SEnji Cooper }
370757718be8SEnji Cooper
370857718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_2);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_2,tc)370957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
371057718be8SEnji Cooper {
371157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
371257718be8SEnji Cooper "Test JIT compilation with length optimization "
371357718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
371457718be8SEnji Cooper }
371557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_abs_2,tc)371657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
371757718be8SEnji Cooper {
371857718be8SEnji Cooper static struct bpf_insn insns[] = {
371957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
372057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
372157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
372257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
372357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
372457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
372557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
372657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
372757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
372857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
372957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
373057718be8SEnji Cooper };
373157718be8SEnji Cooper
373257718be8SEnji Cooper size_t i, j;
373357718be8SEnji Cooper bpfjit_func_t code;
373457718be8SEnji Cooper uint8_t pkt[2][34] = {
373557718be8SEnji Cooper {
373657718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
373757718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
373857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
373957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
374057718be8SEnji Cooper },
374157718be8SEnji Cooper {
374257718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
374357718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
374457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
374557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
374657718be8SEnji Cooper }
374757718be8SEnji Cooper };
374857718be8SEnji Cooper
374957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
375057718be8SEnji Cooper
375157718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
375257718be8SEnji Cooper
375357718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
375457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
375557718be8SEnji Cooper
375657718be8SEnji Cooper for (i = 0; i < 2; i++) {
375757718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
375857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
375957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
376057718be8SEnji Cooper }
376157718be8SEnji Cooper
376257718be8SEnji Cooper bpfjit_free_code(code);
376357718be8SEnji Cooper }
376457718be8SEnji Cooper
376557718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_abs_3);
ATF_TC_HEAD(libbpfjit_opt_ld_abs_3,tc)376657718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
376757718be8SEnji Cooper {
376857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
376957718be8SEnji Cooper "Test JIT compilation with length optimization "
377057718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
377157718be8SEnji Cooper }
377257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_abs_3,tc)377357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
377457718be8SEnji Cooper {
377557718be8SEnji Cooper static struct bpf_insn insns[] = {
377657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
377757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
377857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
377957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
378057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
378157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
378257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
378357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
378457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
378557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
378657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
378757718be8SEnji Cooper };
378857718be8SEnji Cooper
378957718be8SEnji Cooper size_t i, j;
379057718be8SEnji Cooper bpfjit_func_t code;
379157718be8SEnji Cooper uint8_t pkt[2][34] = {
379257718be8SEnji Cooper {
379357718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
379457718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
379557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
379657718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
379757718be8SEnji Cooper },
379857718be8SEnji Cooper {
379957718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
380057718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
380157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
380257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
380357718be8SEnji Cooper }
380457718be8SEnji Cooper };
380557718be8SEnji Cooper
380657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
380757718be8SEnji Cooper
380857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
380957718be8SEnji Cooper
381057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
381157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
381257718be8SEnji Cooper
381357718be8SEnji Cooper for (i = 0; i < 2; i++) {
381457718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
381557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
381657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
381757718be8SEnji Cooper }
381857718be8SEnji Cooper
381957718be8SEnji Cooper bpfjit_free_code(code);
382057718be8SEnji Cooper }
382157718be8SEnji Cooper
382257718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_1);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_1,tc)382357718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
382457718be8SEnji Cooper {
382557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
382657718be8SEnji Cooper "Test JIT compilation with length optimization "
382757718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
382857718be8SEnji Cooper }
382957718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_ind_1,tc)383057718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
383157718be8SEnji Cooper {
383257718be8SEnji Cooper static struct bpf_insn insns[] = {
383357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
383457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
383557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
383657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
383757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
383857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
383957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
384057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
384157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
384257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
384357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
384457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
384557718be8SEnji Cooper };
384657718be8SEnji Cooper
384757718be8SEnji Cooper size_t i, j;
384857718be8SEnji Cooper bpfjit_func_t code;
384957718be8SEnji Cooper uint8_t pkt[2][34] = {
385057718be8SEnji Cooper {
385157718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
385257718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
385357718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
385457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
385557718be8SEnji Cooper },
385657718be8SEnji Cooper {
385757718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
385857718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
385957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
386057718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
386157718be8SEnji Cooper }
386257718be8SEnji Cooper };
386357718be8SEnji Cooper
386457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
386557718be8SEnji Cooper
386657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
386757718be8SEnji Cooper
386857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
386957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
387057718be8SEnji Cooper
387157718be8SEnji Cooper for (i = 0; i < 2; i++) {
387257718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
387357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
387457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
387557718be8SEnji Cooper }
387657718be8SEnji Cooper
387757718be8SEnji Cooper bpfjit_free_code(code);
387857718be8SEnji Cooper }
387957718be8SEnji Cooper
388057718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_2);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_2,tc)388157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
388257718be8SEnji Cooper {
388357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
388457718be8SEnji Cooper "Test JIT compilation with length optimization "
388557718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
388657718be8SEnji Cooper }
388757718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_ind_2,tc)388857718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
388957718be8SEnji Cooper {
389057718be8SEnji Cooper static struct bpf_insn insns[] = {
389157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
389257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
389357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
389457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
389557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
389657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
389757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
389857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
389957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
390057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
390157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
390257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
390357718be8SEnji Cooper };
390457718be8SEnji Cooper
390557718be8SEnji Cooper size_t i, j;
390657718be8SEnji Cooper bpfjit_func_t code;
390757718be8SEnji Cooper uint8_t pkt[2][34] = {
390857718be8SEnji Cooper {
390957718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
391057718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
391157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
391257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
391357718be8SEnji Cooper },
391457718be8SEnji Cooper {
391557718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
391657718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
391757718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
391857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
391957718be8SEnji Cooper }
392057718be8SEnji Cooper };
392157718be8SEnji Cooper
392257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
392357718be8SEnji Cooper
392457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
392557718be8SEnji Cooper
392657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
392757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
392857718be8SEnji Cooper
392957718be8SEnji Cooper for (i = 0; i < 2; i++) {
393057718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
393157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
393257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
393357718be8SEnji Cooper }
393457718be8SEnji Cooper
393557718be8SEnji Cooper bpfjit_free_code(code);
393657718be8SEnji Cooper }
393757718be8SEnji Cooper
393857718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_3);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_3,tc)393957718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
394057718be8SEnji Cooper {
394157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
394257718be8SEnji Cooper "Test JIT compilation with length optimization "
394357718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
394457718be8SEnji Cooper }
394557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_ind_3,tc)394657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
394757718be8SEnji Cooper {
394857718be8SEnji Cooper static struct bpf_insn insns[] = {
394957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
395057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
395157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
395257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
395357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
395457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
395557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
395657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
395757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
395857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
395957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
396057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
396157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
396257718be8SEnji Cooper };
396357718be8SEnji Cooper
396457718be8SEnji Cooper size_t i, j;
396557718be8SEnji Cooper bpfjit_func_t code;
396657718be8SEnji Cooper uint8_t pkt[2][34] = {
396757718be8SEnji Cooper {
396857718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
396957718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
397057718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
397157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
397257718be8SEnji Cooper },
397357718be8SEnji Cooper {
397457718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
397557718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
397657718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
397757718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
397857718be8SEnji Cooper }
397957718be8SEnji Cooper };
398057718be8SEnji Cooper
398157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
398257718be8SEnji Cooper
398357718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
398457718be8SEnji Cooper
398557718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
398657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
398757718be8SEnji Cooper
398857718be8SEnji Cooper for (i = 0; i < 2; i++) {
398957718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
399057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
399157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
399257718be8SEnji Cooper }
399357718be8SEnji Cooper
399457718be8SEnji Cooper bpfjit_free_code(code);
399557718be8SEnji Cooper }
399657718be8SEnji Cooper
399757718be8SEnji Cooper ATF_TC(libbpfjit_opt_ld_ind_4);
ATF_TC_HEAD(libbpfjit_opt_ld_ind_4,tc)399857718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
399957718be8SEnji Cooper {
400057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
400157718be8SEnji Cooper "Test JIT compilation with length optimization "
400257718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
400357718be8SEnji Cooper }
400457718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_opt_ld_ind_4,tc)400557718be8SEnji Cooper ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
400657718be8SEnji Cooper {
400757718be8SEnji Cooper static struct bpf_insn insns[] = {
400857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
400957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
401057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
401157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
401257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
401357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
401457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
401557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
401657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
401757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
401857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
401957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
402057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
402157718be8SEnji Cooper };
402257718be8SEnji Cooper
402357718be8SEnji Cooper size_t i, j;
402457718be8SEnji Cooper bpfjit_func_t code;
402557718be8SEnji Cooper uint8_t pkt[2][34] = {
402657718be8SEnji Cooper {
402757718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
402857718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
402957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
403057718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
403157718be8SEnji Cooper },
403257718be8SEnji Cooper {
403357718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
403457718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
403557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
403657718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
403757718be8SEnji Cooper }
403857718be8SEnji Cooper };
403957718be8SEnji Cooper
404057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
404157718be8SEnji Cooper
404257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
404357718be8SEnji Cooper
404457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
404557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
404657718be8SEnji Cooper
404757718be8SEnji Cooper for (i = 0; i < 2; i++) {
404857718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
404957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
405057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
405157718be8SEnji Cooper }
405257718be8SEnji Cooper
405357718be8SEnji Cooper bpfjit_free_code(code);
405457718be8SEnji Cooper }
405557718be8SEnji Cooper
405657718be8SEnji Cooper ATF_TC(libbpfjit_abc_ja);
ATF_TC_HEAD(libbpfjit_abc_ja,tc)405757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ja, tc)
405857718be8SEnji Cooper {
405957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
406057718be8SEnji Cooper "Test ABC optimization with a single BPF_JMP+BPF_JA");
406157718be8SEnji Cooper }
406257718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_abc_ja,tc)406357718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ja, tc)
406457718be8SEnji Cooper {
406557718be8SEnji Cooper static struct bpf_insn insns[] = {
406657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
406757718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 2),
406857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
406957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
407057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
407157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
407257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
407357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
407457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
407557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
407657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
407757718be8SEnji Cooper };
407857718be8SEnji Cooper
407957718be8SEnji Cooper bpfjit_func_t code;
408057718be8SEnji Cooper uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
408157718be8SEnji Cooper
408257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
408357718be8SEnji Cooper
408457718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
408557718be8SEnji Cooper
408657718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
408757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
408857718be8SEnji Cooper
408957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
409057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
409157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
409257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
409357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
409457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
409557718be8SEnji Cooper
409657718be8SEnji Cooper bpfjit_free_code(code);
409757718be8SEnji Cooper }
409857718be8SEnji Cooper
409957718be8SEnji Cooper ATF_TC(libbpfjit_abc_ja_over);
ATF_TC_HEAD(libbpfjit_abc_ja_over,tc)410057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
410157718be8SEnji Cooper {
410257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
410357718be8SEnji Cooper "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
410457718be8SEnji Cooper }
410557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_abc_ja_over,tc)410657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
410757718be8SEnji Cooper {
410857718be8SEnji Cooper static struct bpf_insn insns[] = {
410957718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 2),
411057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
411157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
411257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
411357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
411457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
411557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
411657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
411757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
411857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
411957718be8SEnji Cooper };
412057718be8SEnji Cooper
412157718be8SEnji Cooper bpfjit_func_t code;
412257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
412357718be8SEnji Cooper
412457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
412557718be8SEnji Cooper
412657718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
412757718be8SEnji Cooper
412857718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
412957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
413057718be8SEnji Cooper
413157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
413257718be8SEnji Cooper
413357718be8SEnji Cooper bpfjit_free_code(code);
413457718be8SEnji Cooper }
413557718be8SEnji Cooper
413657718be8SEnji Cooper ATF_TC(libbpfjit_abc_ld_chain);
ATF_TC_HEAD(libbpfjit_abc_ld_chain,tc)413757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
413857718be8SEnji Cooper {
413957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
414057718be8SEnji Cooper "Test ABC optimization of a chain of BPF_LD instructions "
414157718be8SEnji Cooper "with exits leading to a single BPF_RET");
414257718be8SEnji Cooper }
414357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_abc_ld_chain,tc)414457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
414557718be8SEnji Cooper {
414657718be8SEnji Cooper static struct bpf_insn insns[] = {
414757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
414857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
414957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
415057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
415157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
415257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
415357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 123456789),
415457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 987654321),
415557718be8SEnji Cooper };
415657718be8SEnji Cooper
415757718be8SEnji Cooper bpfjit_func_t code;
415857718be8SEnji Cooper uint8_t pkt[10] = {};
415957718be8SEnji Cooper
416057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
416157718be8SEnji Cooper
416257718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
416357718be8SEnji Cooper
416457718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
416557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
416657718be8SEnji Cooper
416757718be8SEnji Cooper /* Packet is too short. */
416857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
416957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
417057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
417157718be8SEnji Cooper
417257718be8SEnji Cooper /* !(pkt[3] == 8) => return 123456789 */
417357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
417457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
417557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
417657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
417757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
417857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
417957718be8SEnji Cooper
418057718be8SEnji Cooper /* !(pkt[4:2] >= 7) => too short or return 123456789 */
418157718be8SEnji Cooper pkt[3] = 8;
418257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
418357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
418457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
418557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
418657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
418757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
418857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
418957718be8SEnji Cooper
419057718be8SEnji Cooper /* !(pkt[6:4] > 6) => too short or return 987654321 */
419157718be8SEnji Cooper pkt[4] = pkt[5] = 1;
419257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
419357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
419457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
419557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
419657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
419757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
419857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
419957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
420057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
420157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
420257718be8SEnji Cooper
420357718be8SEnji Cooper /* (pkt[6:4] > 6) => too short or return 123456789 */
420457718be8SEnji Cooper pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
420557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
420657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
420757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
420857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
420957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
421057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
421157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
421257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
421357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
421457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
421557718be8SEnji Cooper
421657718be8SEnji Cooper bpfjit_free_code(code);
421757718be8SEnji Cooper }
421857718be8SEnji Cooper
421957718be8SEnji Cooper ATF_TC(libbpfjit_examples_1);
ATF_TC_HEAD(libbpfjit_examples_1,tc)422057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_1, tc)
422157718be8SEnji Cooper {
422257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
422357718be8SEnji Cooper "Test the first example from bpf(4) - "
422457718be8SEnji Cooper "accept Reverse ARP requests");
422557718be8SEnji Cooper }
422657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_examples_1,tc)422757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_1, tc)
422857718be8SEnji Cooper {
422957718be8SEnji Cooper /*
423057718be8SEnji Cooper * The following filter is taken from the Reverse ARP
423157718be8SEnji Cooper * Daemon. It accepts only Reverse ARP requests.
423257718be8SEnji Cooper */
423357718be8SEnji Cooper struct bpf_insn insns[] = {
423457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
423557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
423657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
423757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
423857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 42),
423957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
424057718be8SEnji Cooper };
424157718be8SEnji Cooper
424257718be8SEnji Cooper bpfjit_func_t code;
424357718be8SEnji Cooper uint8_t pkt[22] = {};
424457718be8SEnji Cooper
424557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
424657718be8SEnji Cooper
424757718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
424857718be8SEnji Cooper
424957718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
425057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
425157718be8SEnji Cooper
425257718be8SEnji Cooper /* Packet is too short. */
425357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
425457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
425557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
425657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
425757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
425857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
425957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
426057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
426157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
426257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
426357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
426457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
426557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
426657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
426757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
426857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
426957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
427057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
427157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
427257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
427357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
427457718be8SEnji Cooper
427557718be8SEnji Cooper /* The packet doesn't match. */
427657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
427757718be8SEnji Cooper
427857718be8SEnji Cooper /* Still no match after setting the protocol field. */
427957718be8SEnji Cooper pkt[12] = 0x80; pkt[13] = 0x35;
428057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
428157718be8SEnji Cooper
428257718be8SEnji Cooper /* Set RARP message type. */
428357718be8SEnji Cooper pkt[21] = 3;
428457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
428557718be8SEnji Cooper
428657718be8SEnji Cooper /* Packet is too short. */
428757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
428857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
428957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
429057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
429157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
429257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
429357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
429457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
429557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
429657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
429757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
429857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
429957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
430057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
430157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
430257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
430357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
430457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
430557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
430657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
430757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
430857718be8SEnji Cooper
430957718be8SEnji Cooper /* Change RARP message type. */
431057718be8SEnji Cooper pkt[20] = 3;
431157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
431257718be8SEnji Cooper
431357718be8SEnji Cooper bpfjit_free_code(code);
431457718be8SEnji Cooper }
431557718be8SEnji Cooper
431657718be8SEnji Cooper ATF_TC(libbpfjit_examples_2);
ATF_TC_HEAD(libbpfjit_examples_2,tc)431757718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_2, tc)
431857718be8SEnji Cooper {
431957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
432057718be8SEnji Cooper "Test the second example from bpf(4) - "
432157718be8SEnji Cooper "accept IP packets between two specified hosts");
432257718be8SEnji Cooper }
432357718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_examples_2,tc)432457718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_2, tc)
432557718be8SEnji Cooper {
432657718be8SEnji Cooper /*
432757718be8SEnji Cooper * This filter accepts only IP packets between host 128.3.112.15
432857718be8SEnji Cooper * and 128.3.112.35.
432957718be8SEnji Cooper */
433057718be8SEnji Cooper static struct bpf_insn insns[] = {
433157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
433257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
433357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
433457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
433557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
433657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
433757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
433857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
433957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
434057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
434157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
434257718be8SEnji Cooper };
434357718be8SEnji Cooper
434457718be8SEnji Cooper bpfjit_func_t code;
434557718be8SEnji Cooper uint8_t pkt[34] = {};
434657718be8SEnji Cooper
434757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
434857718be8SEnji Cooper
434957718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
435057718be8SEnji Cooper
435157718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
435257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
435357718be8SEnji Cooper
435457718be8SEnji Cooper /* Packet is too short. */
435557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
435657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
435757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
435857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
435957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
436057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
436157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
436257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
436357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
436457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
436557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
436657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
436757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
436857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
436957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
437057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
437157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
437257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
437357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
437457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
437557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
437657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
437757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
437857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
437957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
438057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
438157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
438257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
438357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
438457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
438557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
438657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
438757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
438857718be8SEnji Cooper
438957718be8SEnji Cooper /* The packet doesn't match. */
439057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439157718be8SEnji Cooper
439257718be8SEnji Cooper /* Still no match after setting the protocol field. */
439357718be8SEnji Cooper pkt[12] = 8;
439457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439557718be8SEnji Cooper
439657718be8SEnji Cooper pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
439757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
439857718be8SEnji Cooper
439957718be8SEnji Cooper pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
440057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
440157718be8SEnji Cooper
440257718be8SEnji Cooper /* Swap the ip addresses. */
440357718be8SEnji Cooper pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
440457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
440557718be8SEnji Cooper
440657718be8SEnji Cooper pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
440757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
440857718be8SEnji Cooper
440957718be8SEnji Cooper /* Packet is too short. */
441057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
441157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
441257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
441357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
441457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
441557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
441657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
441757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
441857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
441957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
442057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
442157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
442257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
442357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
442457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
442557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
442657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
442757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
442857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
442957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
443057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
443157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
443257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
443357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
443457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
443557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
443657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
443757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
443857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
443957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
444057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
444157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
444257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
444357718be8SEnji Cooper
444457718be8SEnji Cooper /* Change the protocol field. */
444557718be8SEnji Cooper pkt[13] = 8;
444657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
444757718be8SEnji Cooper
444857718be8SEnji Cooper bpfjit_free_code(code);
444957718be8SEnji Cooper }
445057718be8SEnji Cooper
445157718be8SEnji Cooper ATF_TC(libbpfjit_examples_3);
ATF_TC_HEAD(libbpfjit_examples_3,tc)445257718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_examples_3, tc)
445357718be8SEnji Cooper {
445457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
445557718be8SEnji Cooper "Test the third example from bpf(4) - "
445657718be8SEnji Cooper "accept TCP finger packets");
445757718be8SEnji Cooper }
445857718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_examples_3,tc)445957718be8SEnji Cooper ATF_TC_BODY(libbpfjit_examples_3, tc)
446057718be8SEnji Cooper {
446157718be8SEnji Cooper /*
446257718be8SEnji Cooper * This filter returns only TCP finger packets.
446357718be8SEnji Cooper */
446457718be8SEnji Cooper struct bpf_insn insns[] = {
446557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
446657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
446757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
446857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
446957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
447057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
447157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
447257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
447357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
447457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
447557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
447657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
447757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
447857718be8SEnji Cooper };
447957718be8SEnji Cooper
448057718be8SEnji Cooper bpfjit_func_t code;
448157718be8SEnji Cooper uint8_t pkt[30] = {};
448257718be8SEnji Cooper
448357718be8SEnji Cooper /* Set IP fragment offset to non-zero. */
448457718be8SEnji Cooper pkt[20] = 1; pkt[21] = 1;
448557718be8SEnji Cooper
448657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
448757718be8SEnji Cooper
448857718be8SEnji Cooper ATF_CHECK(bpf_validate(insns, insn_count));
448957718be8SEnji Cooper
449057718be8SEnji Cooper code = bpfjit_generate_code(NULL, insns, insn_count);
449157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
449257718be8SEnji Cooper
449357718be8SEnji Cooper /* Packet is too short. */
449457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
449557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
449657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
449757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
449857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
449957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
450057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
450157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
450257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
450357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
450457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
450557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
450657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
450757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
450857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
450957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
451057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
451157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
451257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
451357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
451457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
451557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
451657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
451757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
451857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
451957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
452057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
452157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
452257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
452357718be8SEnji Cooper
452457718be8SEnji Cooper /* The packet doesn't match. */
452557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
452657718be8SEnji Cooper
452757718be8SEnji Cooper /* Still no match after setting the protocol field. */
452857718be8SEnji Cooper pkt[12] = 8;
452957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453057718be8SEnji Cooper
453157718be8SEnji Cooper /* Get one step closer to the match. */
453257718be8SEnji Cooper pkt[23] = 6;
453357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453457718be8SEnji Cooper
453557718be8SEnji Cooper /* Set IP fragment offset to zero. */
453657718be8SEnji Cooper pkt[20] = 0x20; pkt[21] = 0;
453757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
453857718be8SEnji Cooper
453957718be8SEnji Cooper /* Set IP header length to 12. */
454057718be8SEnji Cooper pkt[14] = 0xd3;
454157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
454257718be8SEnji Cooper
454357718be8SEnji Cooper /* Match one branch of the program. */
454457718be8SEnji Cooper pkt[27] = 79;
454557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
454657718be8SEnji Cooper
454757718be8SEnji Cooper /* Match the other branch of the program. */
454857718be8SEnji Cooper pkt[29] = 79; pkt[27] = 0;
454957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
455057718be8SEnji Cooper
455157718be8SEnji Cooper /* Packet is too short. */
455257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
455357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
455457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
455557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
455657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
455757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
455857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
455957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
456057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
456157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
456257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
456357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
456457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
456557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
456657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
456757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
456857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
456957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
457057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
457157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
457257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
457357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
457457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
457557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
457657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
457757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
457857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
457957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
458057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
458157718be8SEnji Cooper
458257718be8SEnji Cooper /* Set IP header length to 16. Packet is too short. */
458357718be8SEnji Cooper pkt[14] = 4;
458457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
458557718be8SEnji Cooper
458657718be8SEnji Cooper bpfjit_free_code(code);
458757718be8SEnji Cooper }
458857718be8SEnji Cooper
458957718be8SEnji Cooper ATF_TC(libbpfjit_cop_no_ctx);
ATF_TC_HEAD(libbpfjit_cop_no_ctx,tc)459057718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
459157718be8SEnji Cooper {
459257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
459357718be8SEnji Cooper "instruction can't be accepted without a context");
459457718be8SEnji Cooper }
459557718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_cop_no_ctx,tc)459657718be8SEnji Cooper ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
459757718be8SEnji Cooper {
459857718be8SEnji Cooper static struct bpf_insn insns[] = {
459957718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COP, 0),
460057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
460157718be8SEnji Cooper };
460257718be8SEnji Cooper
460357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
460457718be8SEnji Cooper
460557718be8SEnji Cooper ATF_CHECK(!bpf_validate(insns, insn_count));
460657718be8SEnji Cooper
460757718be8SEnji Cooper ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
460857718be8SEnji Cooper }
460957718be8SEnji Cooper
461057718be8SEnji Cooper ATF_TC(libbpfjit_copx_no_ctx);
ATF_TC_HEAD(libbpfjit_copx_no_ctx,tc)461157718be8SEnji Cooper ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
461257718be8SEnji Cooper {
461357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
461457718be8SEnji Cooper "instruction can't be accepted without a context");
461557718be8SEnji Cooper }
461657718be8SEnji Cooper
ATF_TC_BODY(libbpfjit_copx_no_ctx,tc)461757718be8SEnji Cooper ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
461857718be8SEnji Cooper {
461957718be8SEnji Cooper static struct bpf_insn insns[] = {
462057718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COPX, 0),
462157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
462257718be8SEnji Cooper };
462357718be8SEnji Cooper
462457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
462557718be8SEnji Cooper
462657718be8SEnji Cooper ATF_CHECK(!bpf_validate(insns, insn_count));
462757718be8SEnji Cooper
462857718be8SEnji Cooper ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
462957718be8SEnji Cooper }
463057718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)463157718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
463257718be8SEnji Cooper {
463357718be8SEnji Cooper
463457718be8SEnji Cooper /*
463557718be8SEnji Cooper * For every new test please also add a similar test
463657718be8SEnji Cooper * to ../../net/bpfjit/t_bpfjit.c
463757718be8SEnji Cooper */
463857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_empty);
4639*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ret_k);
4640*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_bad_ret_k);
464157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
464257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
464357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
464457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
464557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
464657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
464757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
464857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
464957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
465057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
465157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
4652*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
4653*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
4654*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
4655*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
4656*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
4657*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
4658*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
4659*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
466057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
466157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
4662*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
466357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
466457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
466557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
466657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
466757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
466857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
466957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
467057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
467157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
467257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
467357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
467457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
467557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
467657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
467757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
467857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
4679*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
4680*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
4681*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
4682*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
4683*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
4684*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
4685*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
4686*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
468757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
468857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
4689*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
469057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
469157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
469257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
469357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
469457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
469557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
469657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
4697*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_invalid);
4698*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_overflow);
469957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
470057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
470157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
470257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
470357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
470457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
470557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
470657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
470757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
4708*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_ax);
4709*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_a);
4710*640235e2SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x_noinit_x);
471157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
471257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
471357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
471457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
471557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
471657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
471757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
471857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
471957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
472057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
472157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
472257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
472357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
472457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
472557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
472657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
472757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_st1);
472857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_st2);
472957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_st3);
473057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_st4);
473157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_st5);
473257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_stx1);
473357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_stx2);
473457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_stx3);
473557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_stx4);
473657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
473757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
473857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
473957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
474057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
474157718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
474257718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
474357718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
474457718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
474557718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
474657718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
474757718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
474857718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
474957718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
475057718be8SEnji Cooper ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
475157718be8SEnji Cooper
475257718be8SEnji Cooper return atf_no_error();
475357718be8SEnji Cooper }
4754