1*63d1fd59SEnji Cooper /* $NetBSD: t_bpfjit.c,v 1.12 2017/01/13 21:30:42 christos Exp $ */
257718be8SEnji Cooper
357718be8SEnji Cooper /*-
4640235e2SEnji 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 * 1. Redistributions of source code must retain the above copyright
1157718be8SEnji Cooper * notice, this list of conditions and the following disclaimer.
1257718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
1357718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in the
1457718be8SEnji Cooper * documentation and/or other materials provided with the distribution.
1557718be8SEnji Cooper *
1657718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
1757718be8SEnji Cooper * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1857718be8SEnji Cooper * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
1957718be8SEnji Cooper * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2057718be8SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2157718be8SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2257718be8SEnji Cooper * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2357718be8SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2457718be8SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2557718be8SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2657718be8SEnji Cooper * SUCH DAMAGE.
2757718be8SEnji Cooper */
2857718be8SEnji Cooper
2957718be8SEnji Cooper #include <sys/cdefs.h>
30*63d1fd59SEnji Cooper __RCSID("$NetBSD: t_bpfjit.c,v 1.12 2017/01/13 21:30:42 christos Exp $");
3157718be8SEnji Cooper
3257718be8SEnji Cooper #include <sys/param.h>
3357718be8SEnji Cooper #include <sys/mbuf.h>
3457718be8SEnji Cooper #include <unistd.h>
3557718be8SEnji Cooper
3657718be8SEnji Cooper #include <net/bpf.h>
3757718be8SEnji Cooper #include <net/bpfjit.h>
3857718be8SEnji Cooper
3957718be8SEnji Cooper #include <stdint.h>
4057718be8SEnji Cooper #include <string.h>
4157718be8SEnji Cooper
4257718be8SEnji Cooper #include <rump/rump.h>
4357718be8SEnji Cooper #include <rump/rump_syscalls.h>
4457718be8SEnji Cooper
4557718be8SEnji Cooper #include "../../net/bpf/h_bpf.h"
4657718be8SEnji Cooper
4757718be8SEnji Cooper /* XXX: atf-c.h has collisions with mbuf */
4857718be8SEnji Cooper #undef m_type
4957718be8SEnji Cooper #undef m_data
5057718be8SEnji Cooper #include <atf-c.h>
5157718be8SEnji Cooper
52*63d1fd59SEnji Cooper #include "h_macros.h"
5357718be8SEnji Cooper
5457718be8SEnji Cooper
5557718be8SEnji Cooper static uint8_t deadbeef_at_5[16] = {
5657718be8SEnji Cooper 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
5757718be8SEnji Cooper };
5857718be8SEnji Cooper
5957718be8SEnji Cooper static inline
jitcall(bpfjit_func_t fn,const uint8_t * pkt,unsigned int wirelen,unsigned int buflen)6057718be8SEnji Cooper unsigned int jitcall(bpfjit_func_t fn,
6157718be8SEnji Cooper const uint8_t *pkt, unsigned int wirelen, unsigned int buflen)
6257718be8SEnji Cooper {
6357718be8SEnji Cooper bpf_args_t args;
6457718be8SEnji Cooper
6557718be8SEnji Cooper args.pkt = pkt;
6657718be8SEnji Cooper args.wirelen = wirelen;
6757718be8SEnji Cooper args.buflen = buflen;
6857718be8SEnji Cooper
6957718be8SEnji Cooper return fn(NULL, &args);
7057718be8SEnji Cooper }
7157718be8SEnji Cooper
7257718be8SEnji Cooper ATF_TC(bpfjit_empty);
ATF_TC_HEAD(bpfjit_empty,tc)7357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_empty, tc)
7457718be8SEnji Cooper {
7557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
7657718be8SEnji Cooper "Test that JIT compilation of an empty bpf program fails");
7757718be8SEnji Cooper }
7857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_empty,tc)7957718be8SEnji Cooper ATF_TC_BODY(bpfjit_empty, tc)
8057718be8SEnji Cooper {
8157718be8SEnji Cooper struct bpf_insn dummy;
82640235e2SEnji Cooper bpfjit_func_t code;
8357718be8SEnji Cooper
8457718be8SEnji Cooper RZ(rump_init());
8557718be8SEnji Cooper
86640235e2SEnji Cooper ATF_CHECK(!prog_validate(&dummy, 0));
87640235e2SEnji Cooper
8857718be8SEnji Cooper rump_schedule();
89640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, &dummy, 0);
9057718be8SEnji Cooper rump_unschedule();
9157718be8SEnji Cooper
92640235e2SEnji Cooper ATF_CHECK(code == NULL);
93640235e2SEnji Cooper }
94640235e2SEnji Cooper
95640235e2SEnji Cooper ATF_TC(bpfjit_ret_k);
ATF_TC_HEAD(bpfjit_ret_k,tc)96640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_ret_k, tc)
97640235e2SEnji Cooper {
98640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
99640235e2SEnji Cooper "Test JIT compilation of a trivial bpf program");
100640235e2SEnji Cooper }
101640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_ret_k,tc)102640235e2SEnji Cooper ATF_TC_BODY(bpfjit_ret_k, tc)
103640235e2SEnji Cooper {
104640235e2SEnji Cooper static struct bpf_insn insns[] = {
105640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 17)
106640235e2SEnji Cooper };
107640235e2SEnji Cooper
108640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
109640235e2SEnji Cooper
110640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
111640235e2SEnji Cooper
112640235e2SEnji Cooper RZ(rump_init());
113640235e2SEnji Cooper
114640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
115640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 17);
116640235e2SEnji Cooper }
117640235e2SEnji Cooper
118640235e2SEnji Cooper ATF_TC(bpfjit_bad_ret_k);
ATF_TC_HEAD(bpfjit_bad_ret_k,tc)119640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_bad_ret_k, tc)
120640235e2SEnji Cooper {
121640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
122640235e2SEnji Cooper "Test that JIT compilation of a program with bad BPF_RET fails");
123640235e2SEnji Cooper }
124640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_bad_ret_k,tc)125640235e2SEnji Cooper ATF_TC_BODY(bpfjit_bad_ret_k, tc)
126640235e2SEnji Cooper {
127640235e2SEnji Cooper static struct bpf_insn insns[] = {
128640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K+0x8000, 13)
129640235e2SEnji Cooper };
130640235e2SEnji Cooper
131640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
132640235e2SEnji Cooper
133640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
134640235e2SEnji Cooper
135640235e2SEnji Cooper /*
136640235e2SEnji Cooper * The point of this test is checking a bad instruction of
137640235e2SEnji Cooper * a valid class and with a valid BPF_RVAL data.
138640235e2SEnji Cooper */
139640235e2SEnji Cooper const uint16_t rcode = insns[0].code;
140640235e2SEnji Cooper ATF_CHECK(BPF_CLASS(rcode) == BPF_RET &&
141640235e2SEnji Cooper (BPF_RVAL(rcode) == BPF_K || BPF_RVAL(rcode) == BPF_A));
142640235e2SEnji Cooper
143640235e2SEnji Cooper RZ(rump_init());
144640235e2SEnji Cooper
145640235e2SEnji Cooper ATF_CHECK(!prog_validate(insns, insn_count));
146640235e2SEnji Cooper
147640235e2SEnji Cooper /* Current implementation generates code. */
148640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 13);
14957718be8SEnji Cooper }
15057718be8SEnji Cooper
15157718be8SEnji Cooper ATF_TC(bpfjit_alu_add_k);
ATF_TC_HEAD(bpfjit_alu_add_k,tc)15257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_add_k, tc)
15357718be8SEnji Cooper {
15457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
15557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
15657718be8SEnji Cooper }
15757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_add_k,tc)15857718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_add_k, tc)
15957718be8SEnji Cooper {
16057718be8SEnji Cooper static struct bpf_insn insns[] = {
16157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
16257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
16357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
16457718be8SEnji Cooper };
16557718be8SEnji Cooper
16657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
16757718be8SEnji Cooper
16857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
16957718be8SEnji Cooper
17057718be8SEnji Cooper RZ(rump_init());
17157718be8SEnji Cooper
17257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
17357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
17457718be8SEnji Cooper }
17557718be8SEnji Cooper
17657718be8SEnji Cooper ATF_TC(bpfjit_alu_sub_k);
ATF_TC_HEAD(bpfjit_alu_sub_k,tc)17757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
17857718be8SEnji Cooper {
17957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
18057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
18157718be8SEnji Cooper }
18257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_sub_k,tc)18357718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_sub_k, tc)
18457718be8SEnji Cooper {
18557718be8SEnji Cooper static struct bpf_insn insns[] = {
18657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 1),
18757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
18857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
18957718be8SEnji Cooper };
19057718be8SEnji Cooper
19157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
19257718be8SEnji Cooper
19357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
19457718be8SEnji Cooper
19557718be8SEnji Cooper RZ(rump_init());
19657718be8SEnji Cooper
19757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
19857718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
19957718be8SEnji Cooper }
20057718be8SEnji Cooper
20157718be8SEnji Cooper ATF_TC(bpfjit_alu_mul_k);
ATF_TC_HEAD(bpfjit_alu_mul_k,tc)20257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
20357718be8SEnji Cooper {
20457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
20557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
20657718be8SEnji Cooper }
20757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mul_k,tc)20857718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_mul_k, tc)
20957718be8SEnji Cooper {
21057718be8SEnji Cooper static struct bpf_insn insns[] = {
21157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
21257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
21357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
21457718be8SEnji Cooper };
21557718be8SEnji Cooper
21657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
21757718be8SEnji Cooper
21857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
21957718be8SEnji Cooper
22057718be8SEnji Cooper RZ(rump_init());
22157718be8SEnji Cooper
22257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
22357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
22457718be8SEnji Cooper }
22557718be8SEnji Cooper
22657718be8SEnji Cooper ATF_TC(bpfjit_alu_div0_k);
ATF_TC_HEAD(bpfjit_alu_div0_k,tc)22757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
22857718be8SEnji Cooper {
22957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
23057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
23157718be8SEnji Cooper }
23257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div0_k,tc)23357718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div0_k, tc)
23457718be8SEnji Cooper {
23557718be8SEnji Cooper static struct bpf_insn insns[] = {
23657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
23757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
23857718be8SEnji Cooper };
23957718be8SEnji Cooper
24057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
24157718be8SEnji Cooper
24257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
24357718be8SEnji Cooper
24457718be8SEnji Cooper RZ(rump_init());
24557718be8SEnji Cooper
24657718be8SEnji Cooper //ATF_CHECK(prog_validate(insns, insn_count));
24757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
24857718be8SEnji Cooper }
24957718be8SEnji Cooper
25057718be8SEnji Cooper ATF_TC(bpfjit_alu_div1_k);
ATF_TC_HEAD(bpfjit_alu_div1_k,tc)25157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
25257718be8SEnji Cooper {
25357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
25457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
25557718be8SEnji Cooper }
25657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div1_k,tc)25757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div1_k, tc)
25857718be8SEnji Cooper {
25957718be8SEnji Cooper static struct bpf_insn insns[] = {
26057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
26157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
26257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
26357718be8SEnji Cooper };
26457718be8SEnji Cooper
26557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
26657718be8SEnji Cooper
26757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
26857718be8SEnji Cooper
26957718be8SEnji Cooper RZ(rump_init());
27057718be8SEnji Cooper
27157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
27257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
27357718be8SEnji Cooper }
27457718be8SEnji Cooper
27557718be8SEnji Cooper ATF_TC(bpfjit_alu_div2_k);
ATF_TC_HEAD(bpfjit_alu_div2_k,tc)27657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
27757718be8SEnji Cooper {
27857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
27957718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
28057718be8SEnji Cooper }
28157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div2_k,tc)28257718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div2_k, tc)
28357718be8SEnji Cooper {
28457718be8SEnji Cooper static struct bpf_insn insns[] = {
28557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
28657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
28757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
28857718be8SEnji Cooper };
28957718be8SEnji Cooper
29057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
29157718be8SEnji Cooper
29257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
29357718be8SEnji Cooper
29457718be8SEnji Cooper RZ(rump_init());
29557718be8SEnji Cooper
29657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
29757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
29857718be8SEnji Cooper }
29957718be8SEnji Cooper
30057718be8SEnji Cooper ATF_TC(bpfjit_alu_div4_k);
ATF_TC_HEAD(bpfjit_alu_div4_k,tc)30157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
30257718be8SEnji Cooper {
30357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
30457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
30557718be8SEnji Cooper }
30657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div4_k,tc)30757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div4_k, tc)
30857718be8SEnji Cooper {
30957718be8SEnji Cooper static struct bpf_insn insns[] = {
31057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
31157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
31257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
31357718be8SEnji Cooper };
31457718be8SEnji Cooper
31557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
31657718be8SEnji Cooper
31757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
31857718be8SEnji Cooper
31957718be8SEnji Cooper RZ(rump_init());
32057718be8SEnji Cooper
32157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
32257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
32357718be8SEnji Cooper }
32457718be8SEnji Cooper
32557718be8SEnji Cooper ATF_TC(bpfjit_alu_div10_k);
ATF_TC_HEAD(bpfjit_alu_div10_k,tc)32657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
32757718be8SEnji Cooper {
32857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
32957718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
33057718be8SEnji Cooper }
33157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div10_k,tc)33257718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div10_k, tc)
33357718be8SEnji Cooper {
33457718be8SEnji Cooper static struct bpf_insn insns[] = {
33557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
33657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
33757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
33857718be8SEnji Cooper };
33957718be8SEnji Cooper
34057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
34157718be8SEnji Cooper
34257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
34357718be8SEnji Cooper
34457718be8SEnji Cooper RZ(rump_init());
34557718be8SEnji Cooper
34657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
34757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
34857718be8SEnji Cooper }
34957718be8SEnji Cooper
35057718be8SEnji Cooper ATF_TC(bpfjit_alu_div10000_k);
ATF_TC_HEAD(bpfjit_alu_div10000_k,tc)35157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
35257718be8SEnji Cooper {
35357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
35457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
35557718be8SEnji Cooper }
35657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div10000_k,tc)35757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
35857718be8SEnji Cooper {
35957718be8SEnji Cooper static struct bpf_insn insns[] = {
36057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
36157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
36257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
36357718be8SEnji Cooper };
36457718be8SEnji Cooper
36557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
36657718be8SEnji Cooper
36757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
36857718be8SEnji Cooper
36957718be8SEnji Cooper RZ(rump_init());
37057718be8SEnji Cooper
37157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
37257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
37357718be8SEnji Cooper }
37457718be8SEnji Cooper
37557718be8SEnji Cooper ATF_TC(bpfjit_alu_div7609801_k);
ATF_TC_HEAD(bpfjit_alu_div7609801_k,tc)37657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
37757718be8SEnji Cooper {
37857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
37957718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
38057718be8SEnji Cooper }
38157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div7609801_k,tc)38257718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
38357718be8SEnji Cooper {
38457718be8SEnji Cooper static struct bpf_insn insns[] = {
38557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
38657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
38757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
38857718be8SEnji Cooper };
38957718be8SEnji Cooper
39057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
39157718be8SEnji Cooper
39257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
39357718be8SEnji Cooper
39457718be8SEnji Cooper RZ(rump_init());
39557718be8SEnji Cooper
39657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
39757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
39857718be8SEnji Cooper }
39957718be8SEnji Cooper
40057718be8SEnji Cooper ATF_TC(bpfjit_alu_div80000000_k);
ATF_TC_HEAD(bpfjit_alu_div80000000_k,tc)40157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
40257718be8SEnji Cooper {
40357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
40457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
40557718be8SEnji Cooper }
40657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div80000000_k,tc)40757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
40857718be8SEnji Cooper {
40957718be8SEnji Cooper static struct bpf_insn insns[] = {
41057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
41157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
41257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
41357718be8SEnji Cooper };
41457718be8SEnji Cooper
41557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
41657718be8SEnji Cooper
41757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
41857718be8SEnji Cooper
41957718be8SEnji Cooper RZ(rump_init());
42057718be8SEnji Cooper
42157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
42257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
42357718be8SEnji Cooper }
42457718be8SEnji Cooper
425640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod0_k);
ATF_TC_HEAD(bpfjit_alu_mod0_k,tc)426640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod0_k, tc)
427640235e2SEnji Cooper {
428640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
429640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0");
430640235e2SEnji Cooper }
431640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod0_k,tc)432640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod0_k, tc)
433640235e2SEnji Cooper {
434640235e2SEnji Cooper static struct bpf_insn insns[] = {
435640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 0),
436640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
437640235e2SEnji Cooper };
438640235e2SEnji Cooper
439640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
440640235e2SEnji Cooper
441640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
442640235e2SEnji Cooper
443640235e2SEnji Cooper RZ(rump_init());
444640235e2SEnji Cooper
445640235e2SEnji Cooper //ATF_CHECK(prog_validate(insns, insn_count));
446640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
447640235e2SEnji Cooper }
448640235e2SEnji Cooper
449640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod1_k);
ATF_TC_HEAD(bpfjit_alu_mod1_k,tc)450640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod1_k, tc)
451640235e2SEnji Cooper {
452640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
453640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=1");
454640235e2SEnji Cooper }
455640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod1_k,tc)456640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod1_k, tc)
457640235e2SEnji Cooper {
458640235e2SEnji Cooper static struct bpf_insn insns[] = {
459640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
460640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 1),
461640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
462640235e2SEnji Cooper };
463640235e2SEnji Cooper
464640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
465640235e2SEnji Cooper
466640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
467640235e2SEnji Cooper
468640235e2SEnji Cooper RZ(rump_init());
469640235e2SEnji Cooper
470640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
471640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
472640235e2SEnji Cooper }
473640235e2SEnji Cooper
474640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod2_k);
ATF_TC_HEAD(bpfjit_alu_mod2_k,tc)475640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod2_k, tc)
476640235e2SEnji Cooper {
477640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
478640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=2");
479640235e2SEnji Cooper }
480640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod2_k,tc)481640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod2_k, tc)
482640235e2SEnji Cooper {
483640235e2SEnji Cooper static struct bpf_insn insns[] = {
484640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
485640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 2),
486640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
487640235e2SEnji Cooper };
488640235e2SEnji Cooper
489640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
490640235e2SEnji Cooper
491640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
492640235e2SEnji Cooper
493640235e2SEnji Cooper RZ(rump_init());
494640235e2SEnji Cooper
495640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
496640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
497640235e2SEnji Cooper }
498640235e2SEnji Cooper
499640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod4_k);
ATF_TC_HEAD(bpfjit_alu_mod4_k,tc)500640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod4_k, tc)
501640235e2SEnji Cooper {
502640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
503640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=4");
504640235e2SEnji Cooper }
505640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod4_k,tc)506640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod4_k, tc)
507640235e2SEnji Cooper {
508640235e2SEnji Cooper static struct bpf_insn insns[] = {
509640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
510640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 4),
511640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
512640235e2SEnji Cooper };
513640235e2SEnji Cooper
514640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
515640235e2SEnji Cooper
516640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
517640235e2SEnji Cooper
518640235e2SEnji Cooper RZ(rump_init());
519640235e2SEnji Cooper
520640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
521640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
522640235e2SEnji Cooper }
523640235e2SEnji Cooper
524640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod10_k);
ATF_TC_HEAD(bpfjit_alu_mod10_k,tc)525640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod10_k, tc)
526640235e2SEnji Cooper {
527640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
528640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10");
529640235e2SEnji Cooper }
530640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod10_k,tc)531640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod10_k, tc)
532640235e2SEnji Cooper {
533640235e2SEnji Cooper static struct bpf_insn insns[] = {
534640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
535640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10),
536640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
537640235e2SEnji Cooper };
538640235e2SEnji Cooper
539640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
540640235e2SEnji Cooper
541640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
542640235e2SEnji Cooper
543640235e2SEnji Cooper RZ(rump_init());
544640235e2SEnji Cooper
545640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
546640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 9);
547640235e2SEnji Cooper }
548640235e2SEnji Cooper
549640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod10000_k);
ATF_TC_HEAD(bpfjit_alu_mod10000_k,tc)550640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod10000_k, tc)
551640235e2SEnji Cooper {
552640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
553640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=10000");
554640235e2SEnji Cooper }
555640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod10000_k,tc)556640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod10000_k, tc)
557640235e2SEnji Cooper {
558640235e2SEnji Cooper static struct bpf_insn insns[] = {
559640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
560640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, 10000),
561640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
562640235e2SEnji Cooper };
563640235e2SEnji Cooper
564640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
565640235e2SEnji Cooper
566640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
567640235e2SEnji Cooper
568640235e2SEnji Cooper RZ(rump_init());
569640235e2SEnji Cooper
570640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
571640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3849);
572640235e2SEnji Cooper }
573640235e2SEnji Cooper
574640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod7609801_k);
ATF_TC_HEAD(bpfjit_alu_mod7609801_k,tc)575640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod7609801_k, tc)
576640235e2SEnji Cooper {
577640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
578640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=7609801");
579640235e2SEnji Cooper }
580640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod7609801_k,tc)581640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod7609801_k, tc)
582640235e2SEnji Cooper {
583640235e2SEnji Cooper static struct bpf_insn insns[] = {
584640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
585640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(7609801)),
586640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
587640235e2SEnji Cooper };
588640235e2SEnji Cooper
589640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
590640235e2SEnji Cooper
591640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
592640235e2SEnji Cooper
593640235e2SEnji Cooper RZ(rump_init());
594640235e2SEnji Cooper
595640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
596640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3039531);
597640235e2SEnji Cooper }
598640235e2SEnji Cooper
599640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod80000000_k);
ATF_TC_HEAD(bpfjit_alu_mod80000000_k,tc)600640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod80000000_k, tc)
601640235e2SEnji Cooper {
602640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
603640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_K with k=0x80000000");
604640235e2SEnji Cooper }
605640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod80000000_k,tc)606640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod80000000_k, tc)
607640235e2SEnji Cooper {
608640235e2SEnji Cooper static struct bpf_insn insns[] = {
609640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
610640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_K, UINT32_C(0x80000000)),
611640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
612640235e2SEnji Cooper };
613640235e2SEnji Cooper
614640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
615640235e2SEnji Cooper
616640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
617640235e2SEnji Cooper
618640235e2SEnji Cooper RZ(rump_init());
619640235e2SEnji Cooper
620640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
621640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_C(0x7fffffde));
622640235e2SEnji Cooper }
623640235e2SEnji Cooper
62457718be8SEnji Cooper ATF_TC(bpfjit_alu_and_k);
ATF_TC_HEAD(bpfjit_alu_and_k,tc)62557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_and_k, tc)
62657718be8SEnji Cooper {
62757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
62857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
62957718be8SEnji Cooper }
63057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_and_k,tc)63157718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_and_k, tc)
63257718be8SEnji Cooper {
63357718be8SEnji Cooper static struct bpf_insn insns[] = {
63457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
63557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
63657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
63757718be8SEnji Cooper };
63857718be8SEnji Cooper
63957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
64057718be8SEnji Cooper
64157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
64257718be8SEnji Cooper
64357718be8SEnji Cooper RZ(rump_init());
64457718be8SEnji Cooper
64557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
64657718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
64757718be8SEnji Cooper }
64857718be8SEnji Cooper
64957718be8SEnji Cooper ATF_TC(bpfjit_alu_or_k);
ATF_TC_HEAD(bpfjit_alu_or_k,tc)65057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_or_k, tc)
65157718be8SEnji Cooper {
65257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
65357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
65457718be8SEnji Cooper }
65557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_or_k,tc)65657718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_or_k, tc)
65757718be8SEnji Cooper {
65857718be8SEnji Cooper static struct bpf_insn insns[] = {
65957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
66057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
66157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
66257718be8SEnji Cooper };
66357718be8SEnji Cooper
66457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
66557718be8SEnji Cooper
66657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
66757718be8SEnji Cooper
66857718be8SEnji Cooper RZ(rump_init());
66957718be8SEnji Cooper
67057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
67157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
67257718be8SEnji Cooper }
67357718be8SEnji Cooper
674640235e2SEnji Cooper ATF_TC(bpfjit_alu_xor_k);
ATF_TC_HEAD(bpfjit_alu_xor_k,tc)675640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_xor_k, tc)
676640235e2SEnji Cooper {
677640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
678640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_K");
679640235e2SEnji Cooper }
680640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_xor_k,tc)681640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_xor_k, tc)
682640235e2SEnji Cooper {
683640235e2SEnji Cooper static struct bpf_insn insns[] = {
684640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
685640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_XOR+BPF_K, 0x0000b1e0),
686640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
687640235e2SEnji Cooper };
688640235e2SEnji Cooper
689640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
690640235e2SEnji Cooper
691640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
692640235e2SEnji Cooper
693640235e2SEnji Cooper RZ(rump_init());
694640235e2SEnji Cooper
695640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
696640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
697640235e2SEnji Cooper }
698640235e2SEnji Cooper
69957718be8SEnji Cooper ATF_TC(bpfjit_alu_lsh_k);
ATF_TC_HEAD(bpfjit_alu_lsh_k,tc)70057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
70157718be8SEnji Cooper {
70257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
70357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
70457718be8SEnji Cooper }
70557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_lsh_k,tc)70657718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
70757718be8SEnji Cooper {
70857718be8SEnji Cooper static struct bpf_insn insns[] = {
70957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
71057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
71157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
71257718be8SEnji Cooper };
71357718be8SEnji Cooper
71457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
71557718be8SEnji Cooper
71657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
71757718be8SEnji Cooper
71857718be8SEnji Cooper RZ(rump_init());
71957718be8SEnji Cooper
72057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
72157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
72257718be8SEnji Cooper }
72357718be8SEnji Cooper
72457718be8SEnji Cooper ATF_TC(bpfjit_alu_lsh0_k);
ATF_TC_HEAD(bpfjit_alu_lsh0_k,tc)72557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
72657718be8SEnji Cooper {
72757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
72857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
72957718be8SEnji Cooper }
73057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_lsh0_k,tc)73157718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
73257718be8SEnji Cooper {
73357718be8SEnji Cooper static struct bpf_insn insns[] = {
73457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
73557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
73657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
73757718be8SEnji Cooper };
73857718be8SEnji Cooper
73957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
74057718be8SEnji Cooper
74157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
74257718be8SEnji Cooper
74357718be8SEnji Cooper RZ(rump_init());
74457718be8SEnji Cooper
74557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
74657718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
74757718be8SEnji Cooper }
74857718be8SEnji Cooper
74957718be8SEnji Cooper ATF_TC(bpfjit_alu_rsh_k);
ATF_TC_HEAD(bpfjit_alu_rsh_k,tc)75057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
75157718be8SEnji Cooper {
75257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
75357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
75457718be8SEnji Cooper }
75557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_rsh_k,tc)75657718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
75757718be8SEnji Cooper {
75857718be8SEnji Cooper static struct bpf_insn insns[] = {
75957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
76057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
76157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
76257718be8SEnji Cooper };
76357718be8SEnji Cooper
76457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
76557718be8SEnji Cooper
76657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
76757718be8SEnji Cooper
76857718be8SEnji Cooper RZ(rump_init());
76957718be8SEnji Cooper
77057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
77157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
77257718be8SEnji Cooper }
77357718be8SEnji Cooper
77457718be8SEnji Cooper ATF_TC(bpfjit_alu_rsh0_k);
ATF_TC_HEAD(bpfjit_alu_rsh0_k,tc)77557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
77657718be8SEnji Cooper {
77757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
77857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
77957718be8SEnji Cooper }
78057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_rsh0_k,tc)78157718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
78257718be8SEnji Cooper {
78357718be8SEnji Cooper static struct bpf_insn insns[] = {
78457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
78557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
78657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
78757718be8SEnji Cooper };
78857718be8SEnji Cooper
78957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
79057718be8SEnji Cooper
79157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
79257718be8SEnji Cooper
79357718be8SEnji Cooper RZ(rump_init());
79457718be8SEnji Cooper
79557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
79657718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
79757718be8SEnji Cooper }
79857718be8SEnji Cooper
79957718be8SEnji Cooper ATF_TC(bpfjit_alu_modulo_k);
ATF_TC_HEAD(bpfjit_alu_modulo_k,tc)80057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
80157718be8SEnji Cooper {
80257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
80357718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
80457718be8SEnji Cooper }
80557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_modulo_k,tc)80657718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
80757718be8SEnji Cooper {
80857718be8SEnji Cooper static struct bpf_insn insns[] = {
80957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
81057718be8SEnji Cooper
81157718be8SEnji Cooper /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
81257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
81357718be8SEnji Cooper
81457718be8SEnji Cooper /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
81557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
81657718be8SEnji Cooper
81757718be8SEnji Cooper /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
81857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
81957718be8SEnji Cooper
82057718be8SEnji Cooper /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
82157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
82257718be8SEnji Cooper
82357718be8SEnji Cooper /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
82457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
82557718be8SEnji Cooper
82657718be8SEnji Cooper /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
82757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
82857718be8SEnji Cooper
82957718be8SEnji Cooper /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
83057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
83157718be8SEnji Cooper
83257718be8SEnji Cooper /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
83357718be8SEnji Cooper /* 00000000,42218C74 >> 3 = 00000000,08443180 */
83457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
83557718be8SEnji Cooper
83657718be8SEnji Cooper /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
83757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
83857718be8SEnji Cooper
83957718be8SEnji Cooper /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
84057718be8SEnji Cooper /* 00000000,93818280 / DEAD = 00000000,0000A994 */
84157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
84257718be8SEnji Cooper
84357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
84457718be8SEnji Cooper };
84557718be8SEnji Cooper
84657718be8SEnji Cooper bpfjit_func_t code;
84757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
84857718be8SEnji Cooper
84957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
85057718be8SEnji Cooper
85157718be8SEnji Cooper RZ(rump_init());
85257718be8SEnji Cooper
85357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
85457718be8SEnji Cooper
85557718be8SEnji Cooper rump_schedule();
85657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
85757718be8SEnji Cooper rump_unschedule();
85857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
85957718be8SEnji Cooper
86057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
86157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
86257718be8SEnji Cooper
86357718be8SEnji Cooper rump_schedule();
86457718be8SEnji Cooper rumpns_bpfjit_free_code(code);
86557718be8SEnji Cooper rump_unschedule();
86657718be8SEnji Cooper }
86757718be8SEnji Cooper
86857718be8SEnji Cooper ATF_TC(bpfjit_alu_add_x);
ATF_TC_HEAD(bpfjit_alu_add_x,tc)86957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_add_x, tc)
87057718be8SEnji Cooper {
87157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
87257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
87357718be8SEnji Cooper }
87457718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_add_x,tc)87557718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_add_x, tc)
87657718be8SEnji Cooper {
87757718be8SEnji Cooper static struct bpf_insn insns[] = {
87857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
87957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
88057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
88157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
88257718be8SEnji Cooper };
88357718be8SEnji Cooper
88457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
88557718be8SEnji Cooper
88657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
88757718be8SEnji Cooper
88857718be8SEnji Cooper RZ(rump_init());
88957718be8SEnji Cooper
89057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
89157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 5);
89257718be8SEnji Cooper }
89357718be8SEnji Cooper
89457718be8SEnji Cooper ATF_TC(bpfjit_alu_sub_x);
ATF_TC_HEAD(bpfjit_alu_sub_x,tc)89557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
89657718be8SEnji Cooper {
89757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
89857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
89957718be8SEnji Cooper }
90057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_sub_x,tc)90157718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_sub_x, tc)
90257718be8SEnji Cooper {
90357718be8SEnji Cooper static struct bpf_insn insns[] = {
90457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 1),
90557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
90657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
90757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
90857718be8SEnji Cooper };
90957718be8SEnji Cooper
91057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
91157718be8SEnji Cooper
91257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
91357718be8SEnji Cooper
91457718be8SEnji Cooper RZ(rump_init());
91557718be8SEnji Cooper
91657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
91757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
91857718be8SEnji Cooper }
91957718be8SEnji Cooper
92057718be8SEnji Cooper ATF_TC(bpfjit_alu_mul_x);
ATF_TC_HEAD(bpfjit_alu_mul_x,tc)92157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
92257718be8SEnji Cooper {
92357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
92457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
92557718be8SEnji Cooper }
92657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mul_x,tc)92757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_mul_x, tc)
92857718be8SEnji Cooper {
92957718be8SEnji Cooper static struct bpf_insn insns[] = {
93057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
93157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
93257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
93357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
93457718be8SEnji Cooper };
93557718be8SEnji Cooper
93657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
93757718be8SEnji Cooper
93857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
93957718be8SEnji Cooper
94057718be8SEnji Cooper RZ(rump_init());
94157718be8SEnji Cooper
94257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
94357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xfffffffd);
94457718be8SEnji Cooper }
94557718be8SEnji Cooper
94657718be8SEnji Cooper ATF_TC(bpfjit_alu_div0_x);
ATF_TC_HEAD(bpfjit_alu_div0_x,tc)94757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
94857718be8SEnji Cooper {
94957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
95057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
95157718be8SEnji Cooper }
95257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div0_x,tc)95357718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div0_x, tc)
95457718be8SEnji Cooper {
95557718be8SEnji Cooper static struct bpf_insn insns[] = {
95657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
95757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
95857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
95957718be8SEnji Cooper };
96057718be8SEnji Cooper
96157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
96257718be8SEnji Cooper
96357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
96457718be8SEnji Cooper
96557718be8SEnji Cooper RZ(rump_init());
96657718be8SEnji Cooper
96757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
96857718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
96957718be8SEnji Cooper }
97057718be8SEnji Cooper
97157718be8SEnji Cooper ATF_TC(bpfjit_alu_div1_x);
ATF_TC_HEAD(bpfjit_alu_div1_x,tc)97257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
97357718be8SEnji Cooper {
97457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
97557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
97657718be8SEnji Cooper }
97757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div1_x,tc)97857718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div1_x, tc)
97957718be8SEnji Cooper {
98057718be8SEnji Cooper static struct bpf_insn insns[] = {
98157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
98257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
98357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
98457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
98557718be8SEnji Cooper };
98657718be8SEnji Cooper
98757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
98857718be8SEnji Cooper
98957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
99057718be8SEnji Cooper
99157718be8SEnji Cooper RZ(rump_init());
99257718be8SEnji Cooper
99357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
99457718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 7);
99557718be8SEnji Cooper }
99657718be8SEnji Cooper
99757718be8SEnji Cooper ATF_TC(bpfjit_alu_div2_x);
ATF_TC_HEAD(bpfjit_alu_div2_x,tc)99857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
99957718be8SEnji Cooper {
100057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
100157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
100257718be8SEnji Cooper }
100357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div2_x,tc)100457718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div2_x, tc)
100557718be8SEnji Cooper {
100657718be8SEnji Cooper static struct bpf_insn insns[] = {
100757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
100857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
100957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
101057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
101157718be8SEnji Cooper };
101257718be8SEnji Cooper
101357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
101457718be8SEnji Cooper
101557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
101657718be8SEnji Cooper
101757718be8SEnji Cooper RZ(rump_init());
101857718be8SEnji Cooper
101957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
102057718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
102157718be8SEnji Cooper }
102257718be8SEnji Cooper
102357718be8SEnji Cooper ATF_TC(bpfjit_alu_div4_x);
ATF_TC_HEAD(bpfjit_alu_div4_x,tc)102457718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
102557718be8SEnji Cooper {
102657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
102757718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
102857718be8SEnji Cooper }
102957718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div4_x,tc)103057718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div4_x, tc)
103157718be8SEnji Cooper {
103257718be8SEnji Cooper static struct bpf_insn insns[] = {
103357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
103457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
103557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
103657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
103757718be8SEnji Cooper };
103857718be8SEnji Cooper
103957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
104057718be8SEnji Cooper
104157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
104257718be8SEnji Cooper
104357718be8SEnji Cooper RZ(rump_init());
104457718be8SEnji Cooper
104557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
104657718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x3fffffff);
104757718be8SEnji Cooper }
104857718be8SEnji Cooper
104957718be8SEnji Cooper ATF_TC(bpfjit_alu_div10_x);
ATF_TC_HEAD(bpfjit_alu_div10_x,tc)105057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
105157718be8SEnji Cooper {
105257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
105357718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
105457718be8SEnji Cooper }
105557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div10_x,tc)105657718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div10_x, tc)
105757718be8SEnji Cooper {
105857718be8SEnji Cooper static struct bpf_insn insns[] = {
105957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
106057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
106157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
106257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
106357718be8SEnji Cooper };
106457718be8SEnji Cooper
106557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
106657718be8SEnji Cooper
106757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
106857718be8SEnji Cooper
106957718be8SEnji Cooper RZ(rump_init());
107057718be8SEnji Cooper
107157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
107257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484384);
107357718be8SEnji Cooper }
107457718be8SEnji Cooper
107557718be8SEnji Cooper ATF_TC(bpfjit_alu_div10000_x);
ATF_TC_HEAD(bpfjit_alu_div10000_x,tc)107657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
107757718be8SEnji Cooper {
107857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
107957718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
108057718be8SEnji Cooper }
108157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div10000_x,tc)108257718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
108357718be8SEnji Cooper {
108457718be8SEnji Cooper static struct bpf_insn insns[] = {
108557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
108657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
108757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
108857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
108957718be8SEnji Cooper };
109057718be8SEnji Cooper
109157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
109257718be8SEnji Cooper
109357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
109457718be8SEnji Cooper
109557718be8SEnji Cooper RZ(rump_init());
109657718be8SEnji Cooper
109757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
109857718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 429484);
109957718be8SEnji Cooper }
110057718be8SEnji Cooper
110157718be8SEnji Cooper ATF_TC(bpfjit_alu_div7609801_x);
ATF_TC_HEAD(bpfjit_alu_div7609801_x,tc)110257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
110357718be8SEnji Cooper {
110457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
110557718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
110657718be8SEnji Cooper }
110757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div7609801_x,tc)110857718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
110957718be8SEnji Cooper {
111057718be8SEnji Cooper static struct bpf_insn insns[] = {
111157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
111257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
111357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
111457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
111557718be8SEnji Cooper };
111657718be8SEnji Cooper
111757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
111857718be8SEnji Cooper
111957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
112057718be8SEnji Cooper
112157718be8SEnji Cooper RZ(rump_init());
112257718be8SEnji Cooper
112357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
112457718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 564);
112557718be8SEnji Cooper }
112657718be8SEnji Cooper
112757718be8SEnji Cooper ATF_TC(bpfjit_alu_div80000000_x);
ATF_TC_HEAD(bpfjit_alu_div80000000_x,tc)112857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
112957718be8SEnji Cooper {
113057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
113157718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
113257718be8SEnji Cooper }
113357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_div80000000_x,tc)113457718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
113557718be8SEnji Cooper {
113657718be8SEnji Cooper static struct bpf_insn insns[] = {
1137640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
113857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
113957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
114057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
114157718be8SEnji Cooper };
114257718be8SEnji Cooper
114357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
114457718be8SEnji Cooper
114557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
114657718be8SEnji Cooper
114757718be8SEnji Cooper RZ(rump_init());
114857718be8SEnji Cooper
114957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
115057718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
115157718be8SEnji Cooper }
115257718be8SEnji Cooper
1153640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod0_x);
ATF_TC_HEAD(bpfjit_alu_mod0_x,tc)1154640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod0_x, tc)
1155640235e2SEnji Cooper {
1156640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1157640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0");
1158640235e2SEnji Cooper }
1159640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod0_x,tc)1160640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod0_x, tc)
1161640235e2SEnji Cooper {
1162640235e2SEnji Cooper static struct bpf_insn insns[] = {
1163640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1164640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1165640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1166640235e2SEnji Cooper };
1167640235e2SEnji Cooper
1168640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1169640235e2SEnji Cooper
1170640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1171640235e2SEnji Cooper
1172640235e2SEnji Cooper RZ(rump_init());
1173640235e2SEnji Cooper
1174640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1175640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
1176640235e2SEnji Cooper }
1177640235e2SEnji Cooper
1178640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod1_x);
ATF_TC_HEAD(bpfjit_alu_mod1_x,tc)1179640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod1_x, tc)
1180640235e2SEnji Cooper {
1181640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1182640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=1");
1183640235e2SEnji Cooper }
1184640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod1_x,tc)1185640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod1_x, tc)
1186640235e2SEnji Cooper {
1187640235e2SEnji Cooper static struct bpf_insn insns[] = {
1188640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
1189640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1190640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1191640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1192640235e2SEnji Cooper };
1193640235e2SEnji Cooper
1194640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1195640235e2SEnji Cooper
1196640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1197640235e2SEnji Cooper
1198640235e2SEnji Cooper RZ(rump_init());
1199640235e2SEnji Cooper
1200640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1201640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
1202640235e2SEnji Cooper }
1203640235e2SEnji Cooper
1204640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod2_x);
ATF_TC_HEAD(bpfjit_alu_mod2_x,tc)1205640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod2_x, tc)
1206640235e2SEnji Cooper {
1207640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1208640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=2");
1209640235e2SEnji Cooper }
1210640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod2_x,tc)1211640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod2_x, tc)
1212640235e2SEnji Cooper {
1213640235e2SEnji Cooper static struct bpf_insn insns[] = {
1214640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 7),
1215640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1216640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1217640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1218640235e2SEnji Cooper };
1219640235e2SEnji Cooper
1220640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1221640235e2SEnji Cooper
1222640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1223640235e2SEnji Cooper
1224640235e2SEnji Cooper RZ(rump_init());
1225640235e2SEnji Cooper
1226640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1227640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 1);
1228640235e2SEnji Cooper }
1229640235e2SEnji Cooper
1230640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod4_x);
ATF_TC_HEAD(bpfjit_alu_mod4_x,tc)1231640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod4_x, tc)
1232640235e2SEnji Cooper {
1233640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1234640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=4");
1235640235e2SEnji Cooper }
1236640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod4_x,tc)1237640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod4_x, tc)
1238640235e2SEnji Cooper {
1239640235e2SEnji Cooper static struct bpf_insn insns[] = {
1240640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
1241640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1242640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1243640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1244640235e2SEnji Cooper };
1245640235e2SEnji Cooper
1246640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1247640235e2SEnji Cooper
1248640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1249640235e2SEnji Cooper
1250640235e2SEnji Cooper RZ(rump_init());
1251640235e2SEnji Cooper
1252640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1253640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3);
1254640235e2SEnji Cooper }
1255640235e2SEnji Cooper
1256640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod10_x);
ATF_TC_HEAD(bpfjit_alu_mod10_x,tc)1257640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod10_x, tc)
1258640235e2SEnji Cooper {
1259640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1260640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10");
1261640235e2SEnji Cooper }
1262640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod10_x,tc)1263640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod10_x, tc)
1264640235e2SEnji Cooper {
1265640235e2SEnji Cooper static struct bpf_insn insns[] = {
1266640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1267640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
1268640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1269640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1270640235e2SEnji Cooper };
1271640235e2SEnji Cooper
1272640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1273640235e2SEnji Cooper
1274640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1275640235e2SEnji Cooper
1276640235e2SEnji Cooper RZ(rump_init());
1277640235e2SEnji Cooper
1278640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1279640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 9);
1280640235e2SEnji Cooper }
1281640235e2SEnji Cooper
1282640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod10000_x);
ATF_TC_HEAD(bpfjit_alu_mod10000_x,tc)1283640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod10000_x, tc)
1284640235e2SEnji Cooper {
1285640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1286640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=10000");
1287640235e2SEnji Cooper }
1288640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod10000_x,tc)1289640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod10000_x, tc)
1290640235e2SEnji Cooper {
1291640235e2SEnji Cooper static struct bpf_insn insns[] = {
1292640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
1293640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
1294640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1295640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1296640235e2SEnji Cooper };
1297640235e2SEnji Cooper
1298640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1299640235e2SEnji Cooper
1300640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1301640235e2SEnji Cooper
1302640235e2SEnji Cooper RZ(rump_init());
1303640235e2SEnji Cooper
1304640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1305640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3849);
1306640235e2SEnji Cooper }
1307640235e2SEnji Cooper
1308640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod7609801_x);
ATF_TC_HEAD(bpfjit_alu_mod7609801_x,tc)1309640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod7609801_x, tc)
1310640235e2SEnji Cooper {
1311640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1312640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=7609801");
1313640235e2SEnji Cooper }
1314640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod7609801_x,tc)1315640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod7609801_x, tc)
1316640235e2SEnji Cooper {
1317640235e2SEnji Cooper static struct bpf_insn insns[] = {
1318640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
1319640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
1320640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1321640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1322640235e2SEnji Cooper };
1323640235e2SEnji Cooper
1324640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1325640235e2SEnji Cooper
1326640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1327640235e2SEnji Cooper
1328640235e2SEnji Cooper RZ(rump_init());
1329640235e2SEnji Cooper
1330640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1331640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 3039531);
1332640235e2SEnji Cooper }
1333640235e2SEnji Cooper
1334640235e2SEnji Cooper ATF_TC(bpfjit_alu_mod80000000_x);
ATF_TC_HEAD(bpfjit_alu_mod80000000_x,tc)1335640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_mod80000000_x, tc)
1336640235e2SEnji Cooper {
1337640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1338640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_MOD+BPF_X with X=0x80000000");
1339640235e2SEnji Cooper }
1340640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_mod80000000_x,tc)1341640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_mod80000000_x, tc)
1342640235e2SEnji Cooper {
1343640235e2SEnji Cooper static struct bpf_insn insns[] = {
1344640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
1345640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
1346640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_MOD+BPF_X, 0),
1347640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1348640235e2SEnji Cooper };
1349640235e2SEnji Cooper
1350640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1351640235e2SEnji Cooper
1352640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1353640235e2SEnji Cooper
1354640235e2SEnji Cooper RZ(rump_init());
1355640235e2SEnji Cooper
1356640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1357640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_C(0x7fffffde));
1358640235e2SEnji Cooper }
1359640235e2SEnji Cooper
136057718be8SEnji Cooper ATF_TC(bpfjit_alu_and_x);
ATF_TC_HEAD(bpfjit_alu_and_x,tc)136157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_and_x, tc)
136257718be8SEnji Cooper {
136357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
136457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
136557718be8SEnji Cooper }
136657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_and_x,tc)136757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_and_x, tc)
136857718be8SEnji Cooper {
136957718be8SEnji Cooper static struct bpf_insn insns[] = {
137057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
137157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
137257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
137357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
137457718be8SEnji Cooper };
137557718be8SEnji Cooper
137657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
137757718be8SEnji Cooper
137857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
137957718be8SEnji Cooper
138057718be8SEnji Cooper RZ(rump_init());
138157718be8SEnji Cooper
138257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
138357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == (0xdead&0xbeef));
138457718be8SEnji Cooper }
138557718be8SEnji Cooper
138657718be8SEnji Cooper ATF_TC(bpfjit_alu_or_x);
ATF_TC_HEAD(bpfjit_alu_or_x,tc)138757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_or_x, tc)
138857718be8SEnji Cooper {
138957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
139057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
139157718be8SEnji Cooper }
139257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_or_x,tc)139357718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_or_x, tc)
139457718be8SEnji Cooper {
139557718be8SEnji Cooper static struct bpf_insn insns[] = {
139657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
139757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
139857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
139957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
140057718be8SEnji Cooper };
140157718be8SEnji Cooper
140257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
140357718be8SEnji Cooper
140457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
140557718be8SEnji Cooper
140657718be8SEnji Cooper RZ(rump_init());
140757718be8SEnji Cooper
140857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
140957718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
141057718be8SEnji Cooper }
141157718be8SEnji Cooper
1412640235e2SEnji Cooper ATF_TC(bpfjit_alu_xor_x);
ATF_TC_HEAD(bpfjit_alu_xor_x,tc)1413640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_alu_xor_x, tc)
1414640235e2SEnji Cooper {
1415640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1416640235e2SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_XOR+BPF_X");
1417640235e2SEnji Cooper }
1418640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_alu_xor_x,tc)1419640235e2SEnji Cooper ATF_TC_BODY(bpfjit_alu_xor_x, tc)
1420640235e2SEnji Cooper {
1421640235e2SEnji Cooper static struct bpf_insn insns[] = {
1422640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdead0f0f),
1423640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000b1e0),
1424640235e2SEnji Cooper BPF_STMT(BPF_ALU+BPF_XOR+BPF_X, 0),
1425640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
1426640235e2SEnji Cooper };
1427640235e2SEnji Cooper
1428640235e2SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
1429640235e2SEnji Cooper
1430640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1431640235e2SEnji Cooper
1432640235e2SEnji Cooper RZ(rump_init());
1433640235e2SEnji Cooper
1434640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
1435640235e2SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
1436640235e2SEnji Cooper }
1437640235e2SEnji Cooper
143857718be8SEnji Cooper ATF_TC(bpfjit_alu_lsh_x);
ATF_TC_HEAD(bpfjit_alu_lsh_x,tc)143957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
144057718be8SEnji Cooper {
144157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
144257718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
144357718be8SEnji Cooper }
144457718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_lsh_x,tc)144557718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
144657718be8SEnji Cooper {
144757718be8SEnji Cooper static struct bpf_insn insns[] = {
144857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
144957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
145057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
145157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
145257718be8SEnji Cooper };
145357718be8SEnji Cooper
145457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
145557718be8SEnji Cooper
145657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
145757718be8SEnji Cooper
145857718be8SEnji Cooper RZ(rump_init());
145957718be8SEnji Cooper
146057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
146157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xbeef0000);
146257718be8SEnji Cooper }
146357718be8SEnji Cooper
146457718be8SEnji Cooper ATF_TC(bpfjit_alu_lsh0_x);
ATF_TC_HEAD(bpfjit_alu_lsh0_x,tc)146557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
146657718be8SEnji Cooper {
146757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
146857718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
146957718be8SEnji Cooper }
147057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_lsh0_x,tc)147157718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
147257718be8SEnji Cooper {
147357718be8SEnji Cooper static struct bpf_insn insns[] = {
147457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
147557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
147657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
147757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
147857718be8SEnji Cooper };
147957718be8SEnji Cooper
148057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
148157718be8SEnji Cooper
148257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
148357718be8SEnji Cooper
148457718be8SEnji Cooper RZ(rump_init());
148557718be8SEnji Cooper
148657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
148757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
148857718be8SEnji Cooper }
148957718be8SEnji Cooper
149057718be8SEnji Cooper ATF_TC(bpfjit_alu_rsh_x);
ATF_TC_HEAD(bpfjit_alu_rsh_x,tc)149157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
149257718be8SEnji Cooper {
149357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
149457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
149557718be8SEnji Cooper }
149657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_rsh_x,tc)149757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
149857718be8SEnji Cooper {
149957718be8SEnji Cooper static struct bpf_insn insns[] = {
150057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
150157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
150257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
150357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
150457718be8SEnji Cooper };
150557718be8SEnji Cooper
150657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
150757718be8SEnji Cooper
150857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
150957718be8SEnji Cooper
151057718be8SEnji Cooper RZ(rump_init());
151157718be8SEnji Cooper
151257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
151357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0x0000dead);
151457718be8SEnji Cooper }
151557718be8SEnji Cooper
151657718be8SEnji Cooper ATF_TC(bpfjit_alu_rsh0_x);
ATF_TC_HEAD(bpfjit_alu_rsh0_x,tc)151757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
151857718be8SEnji Cooper {
151957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
152057718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
152157718be8SEnji Cooper }
152257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_rsh0_x,tc)152357718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
152457718be8SEnji Cooper {
152557718be8SEnji Cooper static struct bpf_insn insns[] = {
152657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
152757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
152857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
152957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
153057718be8SEnji Cooper };
153157718be8SEnji Cooper
153257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
153357718be8SEnji Cooper
153457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
153557718be8SEnji Cooper
153657718be8SEnji Cooper RZ(rump_init());
153757718be8SEnji Cooper
153857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
153957718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0xdeadbeef);
154057718be8SEnji Cooper }
154157718be8SEnji Cooper
154257718be8SEnji Cooper ATF_TC(bpfjit_alu_modulo_x);
ATF_TC_HEAD(bpfjit_alu_modulo_x,tc)154357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
154457718be8SEnji Cooper {
154557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
154657718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
154757718be8SEnji Cooper }
154857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_modulo_x,tc)154957718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
155057718be8SEnji Cooper {
155157718be8SEnji Cooper static struct bpf_insn insns[] = {
155257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
155357718be8SEnji Cooper
155457718be8SEnji Cooper /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
155557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
155657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
155757718be8SEnji Cooper
155857718be8SEnji Cooper /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
155957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
156057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
156157718be8SEnji Cooper
156257718be8SEnji Cooper /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
156357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
156457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
156557718be8SEnji Cooper
156657718be8SEnji Cooper /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
156757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
156857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
156957718be8SEnji Cooper
157057718be8SEnji Cooper /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
157157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
157257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
157357718be8SEnji Cooper
157457718be8SEnji Cooper /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
157557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
157657718be8SEnji Cooper
157757718be8SEnji Cooper /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
157857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
157957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
158057718be8SEnji Cooper
158157718be8SEnji Cooper /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
158257718be8SEnji Cooper /* 00000000,42218C74 >> 3 = 00000000,08443180 */
158357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
158457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
158557718be8SEnji Cooper
158657718be8SEnji Cooper /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
158757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
158857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
158957718be8SEnji Cooper
159057718be8SEnji Cooper /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
159157718be8SEnji Cooper /* 00000000,93818280 / DEAD = 00000000,0000A994 */
159257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
159357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
159457718be8SEnji Cooper
159557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
159657718be8SEnji Cooper };
159757718be8SEnji Cooper
159857718be8SEnji Cooper bpfjit_func_t code;
159957718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
160057718be8SEnji Cooper
160157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
160257718be8SEnji Cooper
160357718be8SEnji Cooper RZ(rump_init());
160457718be8SEnji Cooper
160557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
160657718be8SEnji Cooper
160757718be8SEnji Cooper rump_schedule();
160857718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
160957718be8SEnji Cooper rump_unschedule();
161057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
161157718be8SEnji Cooper
161257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) != UINT32_C(0x71cbbbc3));
161357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_C(0x0000a994));
161457718be8SEnji Cooper
161557718be8SEnji Cooper rump_schedule();
161657718be8SEnji Cooper rumpns_bpfjit_free_code(code);
161757718be8SEnji Cooper rump_unschedule();
161857718be8SEnji Cooper }
161957718be8SEnji Cooper
162057718be8SEnji Cooper ATF_TC(bpfjit_alu_neg);
ATF_TC_HEAD(bpfjit_alu_neg,tc)162157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_alu_neg, tc)
162257718be8SEnji Cooper {
162357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
162457718be8SEnji Cooper "Test JIT compilation of BPF_ALU+BPF_NEG");
162557718be8SEnji Cooper }
162657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_alu_neg,tc)162757718be8SEnji Cooper ATF_TC_BODY(bpfjit_alu_neg, tc)
162857718be8SEnji Cooper {
162957718be8SEnji Cooper static struct bpf_insn insns[] = {
163057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 777),
163157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_NEG, 0),
163257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
163357718be8SEnji Cooper };
163457718be8SEnji Cooper
163557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
163657718be8SEnji Cooper
163757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
163857718be8SEnji Cooper
163957718be8SEnji Cooper RZ(rump_init());
164057718be8SEnji Cooper
164157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
164257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0u-777u);
164357718be8SEnji Cooper }
164457718be8SEnji Cooper
164557718be8SEnji Cooper ATF_TC(bpfjit_jmp_ja);
ATF_TC_HEAD(bpfjit_jmp_ja,tc)164657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_ja, tc)
164757718be8SEnji Cooper {
164857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
164957718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JA");
165057718be8SEnji Cooper }
165157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_ja,tc)165257718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_ja, tc)
165357718be8SEnji Cooper {
165457718be8SEnji Cooper static struct bpf_insn insns[] = {
165557718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
165657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
165757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
165857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
165957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
166057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
166157718be8SEnji Cooper };
166257718be8SEnji Cooper
166357718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
166457718be8SEnji Cooper
166557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
166657718be8SEnji Cooper
166757718be8SEnji Cooper RZ(rump_init());
166857718be8SEnji Cooper
166957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
167057718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
167157718be8SEnji Cooper }
167257718be8SEnji Cooper
1673640235e2SEnji Cooper ATF_TC(bpfjit_jmp_ja_invalid);
ATF_TC_HEAD(bpfjit_jmp_ja_invalid,tc)1674640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_ja_invalid, tc)
1675640235e2SEnji Cooper {
1676640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1677640235e2SEnji Cooper "Test BPF_JMP+BPF_JA to invalid destination");
1678640235e2SEnji Cooper }
1679640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_ja_invalid,tc)1680640235e2SEnji Cooper ATF_TC_BODY(bpfjit_jmp_ja_invalid, tc)
1681640235e2SEnji Cooper {
1682640235e2SEnji Cooper static struct bpf_insn insns[] = {
1683640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 4),
1684640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
1685640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
1686640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
1687640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
1688640235e2SEnji Cooper };
1689640235e2SEnji Cooper
1690640235e2SEnji Cooper bpfjit_func_t code;
1691640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1692640235e2SEnji Cooper
1693640235e2SEnji Cooper RZ(rump_init());
1694640235e2SEnji Cooper
1695640235e2SEnji Cooper ATF_CHECK(!prog_validate(insns, insn_count));
1696640235e2SEnji Cooper
1697640235e2SEnji Cooper rump_schedule();
1698640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1699640235e2SEnji Cooper rump_unschedule();
1700640235e2SEnji Cooper ATF_CHECK(code == NULL);
1701640235e2SEnji Cooper }
1702640235e2SEnji Cooper
1703640235e2SEnji Cooper ATF_TC(bpfjit_jmp_ja_overflow);
ATF_TC_HEAD(bpfjit_jmp_ja_overflow,tc)1704640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_ja_overflow, tc)
1705640235e2SEnji Cooper {
1706640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr",
1707640235e2SEnji Cooper "Test BPF_JMP+BPF_JA with negative offset");
1708640235e2SEnji Cooper }
1709640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_ja_overflow,tc)1710640235e2SEnji Cooper ATF_TC_BODY(bpfjit_jmp_ja_overflow, tc)
1711640235e2SEnji Cooper {
1712640235e2SEnji Cooper static struct bpf_insn insns[] = {
1713640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
1714640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 777),
1715640235e2SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, UINT32_MAX - 1), // -2
1716640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0)
1717640235e2SEnji Cooper };
1718640235e2SEnji Cooper
1719640235e2SEnji Cooper bpfjit_func_t code;
1720640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1721640235e2SEnji Cooper
1722640235e2SEnji Cooper RZ(rump_init());
1723640235e2SEnji Cooper
1724640235e2SEnji Cooper /* Jumps with negative offsets work only in userspace. */
1725640235e2SEnji Cooper ATF_CHECK(!prog_validate(insns, insn_count));
1726640235e2SEnji Cooper
1727640235e2SEnji Cooper rump_schedule();
1728640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
1729640235e2SEnji Cooper rump_unschedule();
1730640235e2SEnji Cooper ATF_CHECK(code == NULL);
1731640235e2SEnji Cooper }
1732640235e2SEnji Cooper
173357718be8SEnji Cooper ATF_TC(bpfjit_jmp_jgt_k);
ATF_TC_HEAD(bpfjit_jmp_jgt_k,tc)173457718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
173557718be8SEnji Cooper {
173657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
173757718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
173857718be8SEnji Cooper }
173957718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jgt_k,tc)174057718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
174157718be8SEnji Cooper {
174257718be8SEnji Cooper static struct bpf_insn insns[] = {
174357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
174457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
174557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
174657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
174757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
174857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
174957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
175057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
175157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
175257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
175357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
175457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
175557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
175657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
175757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
175857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
175957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
176057718be8SEnji Cooper };
176157718be8SEnji Cooper
176257718be8SEnji Cooper bpfjit_func_t code;
176357718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
176457718be8SEnji Cooper
176557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
176657718be8SEnji Cooper
176757718be8SEnji Cooper RZ(rump_init());
176857718be8SEnji Cooper
176957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
177057718be8SEnji Cooper
177157718be8SEnji Cooper rump_schedule();
177257718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
177357718be8SEnji Cooper rump_unschedule();
177457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
177557718be8SEnji Cooper
177657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
177757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
177857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
177957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
178057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
178157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
178257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
178357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
178457718be8SEnji Cooper
178557718be8SEnji Cooper rump_schedule();
178657718be8SEnji Cooper rumpns_bpfjit_free_code(code);
178757718be8SEnji Cooper rump_unschedule();
178857718be8SEnji Cooper }
178957718be8SEnji Cooper
179057718be8SEnji Cooper ATF_TC(bpfjit_jmp_jge_k);
ATF_TC_HEAD(bpfjit_jmp_jge_k,tc)179157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
179257718be8SEnji Cooper {
179357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
179457718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
179557718be8SEnji Cooper }
179657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jge_k,tc)179757718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
179857718be8SEnji Cooper {
179957718be8SEnji Cooper static struct bpf_insn insns[] = {
180057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
180157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
180257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
180357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
180457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
180557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
180657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
180757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
180857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
180957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
181057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
181157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
181257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
181357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
181457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
181557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
181657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
181757718be8SEnji Cooper };
181857718be8SEnji Cooper
181957718be8SEnji Cooper bpfjit_func_t code;
182057718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
182157718be8SEnji Cooper
182257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
182357718be8SEnji Cooper
182457718be8SEnji Cooper RZ(rump_init());
182557718be8SEnji Cooper
182657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
182757718be8SEnji Cooper
182857718be8SEnji Cooper rump_schedule();
182957718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
183057718be8SEnji Cooper rump_unschedule();
183157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
183257718be8SEnji Cooper
183357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
183457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
183557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
183657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
183757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
183857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
183957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
184057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
184157718be8SEnji Cooper
184257718be8SEnji Cooper rump_schedule();
184357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
184457718be8SEnji Cooper rump_unschedule();
184557718be8SEnji Cooper }
184657718be8SEnji Cooper
184757718be8SEnji Cooper ATF_TC(bpfjit_jmp_jeq_k);
ATF_TC_HEAD(bpfjit_jmp_jeq_k,tc)184857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
184957718be8SEnji Cooper {
185057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
185157718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
185257718be8SEnji Cooper }
185357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jeq_k,tc)185457718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
185557718be8SEnji Cooper {
185657718be8SEnji Cooper static struct bpf_insn insns[] = {
185757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
185857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
185957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
186057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
186157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
186257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
186357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
186457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
186557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
186657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
186757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
186857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
186957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
187057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
187157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
187257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
187357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
187457718be8SEnji Cooper };
187557718be8SEnji Cooper
187657718be8SEnji Cooper bpfjit_func_t code;
187757718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
187857718be8SEnji Cooper
187957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
188057718be8SEnji Cooper
188157718be8SEnji Cooper RZ(rump_init());
188257718be8SEnji Cooper
188357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
188457718be8SEnji Cooper
188557718be8SEnji Cooper rump_schedule();
188657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
188757718be8SEnji Cooper rump_unschedule();
188857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
188957718be8SEnji Cooper
189057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 7);
189157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 7);
189257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
189357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
189457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
189557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
189657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
189757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
189857718be8SEnji Cooper
189957718be8SEnji Cooper rump_schedule();
190057718be8SEnji Cooper rumpns_bpfjit_free_code(code);
190157718be8SEnji Cooper rump_unschedule();
190257718be8SEnji Cooper }
190357718be8SEnji Cooper
190457718be8SEnji Cooper ATF_TC(bpfjit_jmp_jset_k);
ATF_TC_HEAD(bpfjit_jmp_jset_k,tc)190557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
190657718be8SEnji Cooper {
190757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
190857718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
190957718be8SEnji Cooper }
191057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jset_k,tc)191157718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
191257718be8SEnji Cooper {
191357718be8SEnji Cooper static struct bpf_insn insns[] = {
191457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
191557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
191657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
191757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
191857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
191957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
192057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
192157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
192257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
192357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
192457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
192557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
192657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
192757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
192857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
192957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
193057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
193157718be8SEnji Cooper };
193257718be8SEnji Cooper
193357718be8SEnji Cooper bpfjit_func_t code;
193457718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
193557718be8SEnji Cooper
193657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
193757718be8SEnji Cooper
193857718be8SEnji Cooper RZ(rump_init());
193957718be8SEnji Cooper
194057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
194157718be8SEnji Cooper
194257718be8SEnji Cooper rump_schedule();
194357718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
194457718be8SEnji Cooper rump_unschedule();
194557718be8SEnji Cooper ATF_REQUIRE(code != NULL);
194657718be8SEnji Cooper
194757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
194857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
194957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
195057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
195157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
195257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
195357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
195457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
195557718be8SEnji Cooper
195657718be8SEnji Cooper rump_schedule();
195757718be8SEnji Cooper rumpns_bpfjit_free_code(code);
195857718be8SEnji Cooper rump_unschedule();
195957718be8SEnji Cooper }
196057718be8SEnji Cooper
196157718be8SEnji Cooper ATF_TC(bpfjit_jmp_modulo_k);
ATF_TC_HEAD(bpfjit_jmp_modulo_k,tc)196257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
196357718be8SEnji Cooper {
196457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
196557718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
196657718be8SEnji Cooper }
196757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_modulo_k,tc)196857718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
196957718be8SEnji Cooper {
197057718be8SEnji Cooper static struct bpf_insn insns[] = {
197157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
197257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
197357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
197457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
197557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
197657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
197757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
197857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
197957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
198057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
198157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
198257718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
198357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
198457718be8SEnji Cooper
198557718be8SEnji Cooper /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
198657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
198757718be8SEnji Cooper
198857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
198957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
199057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
199157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
199257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
199357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
199457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
199557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
199657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
199757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
199857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
199957718be8SEnji Cooper };
200057718be8SEnji Cooper
200157718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
200257718be8SEnji Cooper
200357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
200457718be8SEnji Cooper
200557718be8SEnji Cooper RZ(rump_init());
200657718be8SEnji Cooper
200757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
200857718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
200957718be8SEnji Cooper }
201057718be8SEnji Cooper
201157718be8SEnji Cooper ATF_TC(bpfjit_jmp_jgt_x);
ATF_TC_HEAD(bpfjit_jmp_jgt_x,tc)201257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
201357718be8SEnji Cooper {
201457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
201557718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
201657718be8SEnji Cooper }
201757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jgt_x,tc)201857718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
201957718be8SEnji Cooper {
202057718be8SEnji Cooper static struct bpf_insn insns[] = {
202157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
202257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
202357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
202457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
202557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
202657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
202757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
202857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
202957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
203057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
203157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
203257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
203357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
203457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
203557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
203657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
203757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
203857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
203957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
204057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
204157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
204257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
204357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
204457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
204557718be8SEnji Cooper };
204657718be8SEnji Cooper
204757718be8SEnji Cooper bpfjit_func_t code;
204857718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
204957718be8SEnji Cooper
205057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
205157718be8SEnji Cooper
205257718be8SEnji Cooper RZ(rump_init());
205357718be8SEnji Cooper
205457718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
205557718be8SEnji Cooper
205657718be8SEnji Cooper rump_schedule();
205757718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
205857718be8SEnji Cooper rump_unschedule();
205957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
206057718be8SEnji Cooper
206157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
206257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
206357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
206457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
206557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
206657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
206757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
206857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
206957718be8SEnji Cooper
207057718be8SEnji Cooper rump_schedule();
207157718be8SEnji Cooper rumpns_bpfjit_free_code(code);
207257718be8SEnji Cooper rump_unschedule();
207357718be8SEnji Cooper }
207457718be8SEnji Cooper
207557718be8SEnji Cooper ATF_TC(bpfjit_jmp_jge_x);
ATF_TC_HEAD(bpfjit_jmp_jge_x,tc)207657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
207757718be8SEnji Cooper {
207857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
207957718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
208057718be8SEnji Cooper }
208157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jge_x,tc)208257718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
208357718be8SEnji Cooper {
208457718be8SEnji Cooper static struct bpf_insn insns[] = {
208557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
208657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
208757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
208857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
208957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
209057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
209157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
209257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
209357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
209457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
209557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
209657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
209757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
209857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
209957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
210057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
210157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
210257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
210357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
210457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
210557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
210657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
210757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
210857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
210957718be8SEnji Cooper };
211057718be8SEnji Cooper
211157718be8SEnji Cooper bpfjit_func_t code;
211257718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
211357718be8SEnji Cooper
211457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
211557718be8SEnji Cooper
211657718be8SEnji Cooper RZ(rump_init());
211757718be8SEnji Cooper
211857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
211957718be8SEnji Cooper
212057718be8SEnji Cooper rump_schedule();
212157718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
212257718be8SEnji Cooper rump_unschedule();
212357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
212457718be8SEnji Cooper
212557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
212657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
212757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 7);
212857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
212957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 7);
213057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
213157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
213257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
213357718be8SEnji Cooper
213457718be8SEnji Cooper rump_schedule();
213557718be8SEnji Cooper rumpns_bpfjit_free_code(code);
213657718be8SEnji Cooper rump_unschedule();
213757718be8SEnji Cooper }
213857718be8SEnji Cooper
213957718be8SEnji Cooper ATF_TC(bpfjit_jmp_jeq_x);
ATF_TC_HEAD(bpfjit_jmp_jeq_x,tc)214057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
214157718be8SEnji Cooper {
214257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
214357718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
214457718be8SEnji Cooper }
214557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jeq_x,tc)214657718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
214757718be8SEnji Cooper {
214857718be8SEnji Cooper static struct bpf_insn insns[] = {
214957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
215057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
215157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2152640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
215357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
215457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
215557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
215657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
215757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
2158640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2159640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2160640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
216157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
216257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
216357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
216457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
2165640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
216657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
216757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
216857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
2169640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2170640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8),
2171640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 9)
217257718be8SEnji Cooper };
217357718be8SEnji Cooper
217457718be8SEnji Cooper bpfjit_func_t code;
217557718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
217657718be8SEnji Cooper
217757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
217857718be8SEnji Cooper
217957718be8SEnji Cooper RZ(rump_init());
218057718be8SEnji Cooper
218157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
218257718be8SEnji Cooper
218357718be8SEnji Cooper rump_schedule();
218457718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
218557718be8SEnji Cooper rump_unschedule();
218657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
218757718be8SEnji Cooper
2188640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 8);
2189640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 8);
2190640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 2);
2191640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 8);
2192640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 3);
2193640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 9);
2194640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 6);
2195640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 1);
219657718be8SEnji Cooper
219757718be8SEnji Cooper rump_schedule();
219857718be8SEnji Cooper rumpns_bpfjit_free_code(code);
219957718be8SEnji Cooper rump_unschedule();
220057718be8SEnji Cooper }
220157718be8SEnji Cooper
220257718be8SEnji Cooper ATF_TC(bpfjit_jmp_jset_x);
ATF_TC_HEAD(bpfjit_jmp_jset_x,tc)220357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
220457718be8SEnji Cooper {
220557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
220657718be8SEnji Cooper "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
220757718be8SEnji Cooper }
220857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jset_x,tc)220957718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
221057718be8SEnji Cooper {
221157718be8SEnji Cooper static struct bpf_insn insns[] = {
221257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
221357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
221457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
221557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
221657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
221757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
221857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
221957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
222057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
222157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
222257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
222357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
222457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
222557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
222657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
222757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
222857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
222957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
223057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
223157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
223257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
223357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
223457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 8)
223557718be8SEnji Cooper };
223657718be8SEnji Cooper
223757718be8SEnji Cooper bpfjit_func_t code;
223857718be8SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
223957718be8SEnji Cooper
224057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
224157718be8SEnji Cooper
224257718be8SEnji Cooper RZ(rump_init());
224357718be8SEnji Cooper
224457718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
224557718be8SEnji Cooper
224657718be8SEnji Cooper rump_schedule();
224757718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
224857718be8SEnji Cooper rump_unschedule();
224957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
225057718be8SEnji Cooper
225157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
225257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 1);
225357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 1);
225457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 7);
225557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 5);
225657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 8);
225757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 5);
225857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
225957718be8SEnji Cooper
226057718be8SEnji Cooper rump_schedule();
226157718be8SEnji Cooper rumpns_bpfjit_free_code(code);
226257718be8SEnji Cooper rump_unschedule();
226357718be8SEnji Cooper }
226457718be8SEnji Cooper
2265640235e2SEnji Cooper ATF_TC(bpfjit_jmp_jeq_x_noinit_ax);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax,tc)2266640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax, tc)
2267640235e2SEnji Cooper {
2268640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2269640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X");
2270640235e2SEnji Cooper }
2271640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax,tc)2272640235e2SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax, tc)
2273640235e2SEnji Cooper {
2274640235e2SEnji Cooper static struct bpf_insn insns[] = {
2275640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2276640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2277640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2278640235e2SEnji Cooper };
2279640235e2SEnji Cooper
2280640235e2SEnji Cooper bpfjit_func_t code;
2281640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2282640235e2SEnji Cooper
2283640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2284640235e2SEnji Cooper
2285640235e2SEnji Cooper RZ(rump_init());
2286640235e2SEnji Cooper
2287640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
2288640235e2SEnji Cooper
2289640235e2SEnji Cooper rump_schedule();
2290640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2291640235e2SEnji Cooper rump_unschedule();
2292640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2293640235e2SEnji Cooper
2294640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
2295640235e2SEnji Cooper
2296640235e2SEnji Cooper rump_schedule();
2297640235e2SEnji Cooper rumpns_bpfjit_free_code(code);
2298640235e2SEnji Cooper rump_unschedule();
2299640235e2SEnji Cooper }
2300640235e2SEnji Cooper
2301640235e2SEnji Cooper ATF_TC(bpfjit_jmp_jeq_x_noinit_a);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_a,tc)2302640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_a, tc)
2303640235e2SEnji Cooper {
2304640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2305640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A");
2306640235e2SEnji Cooper }
2307640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_a,tc)2308640235e2SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_a, tc)
2309640235e2SEnji Cooper {
2310640235e2SEnji Cooper static struct bpf_insn insns[] = {
2311640235e2SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0), /* X > 0 */
2312640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2313640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2314640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2315640235e2SEnji Cooper };
2316640235e2SEnji Cooper
2317640235e2SEnji Cooper bpfjit_func_t code;
2318640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2319640235e2SEnji Cooper
2320640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2321640235e2SEnji Cooper
2322640235e2SEnji Cooper RZ(rump_init());
2323640235e2SEnji Cooper
2324640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
2325640235e2SEnji Cooper
2326640235e2SEnji Cooper rump_schedule();
2327640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2328640235e2SEnji Cooper rump_unschedule();
2329640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2330640235e2SEnji Cooper
2331640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2332640235e2SEnji Cooper
2333640235e2SEnji Cooper rump_schedule();
2334640235e2SEnji Cooper rumpns_bpfjit_free_code(code);
2335640235e2SEnji Cooper rump_unschedule();
2336640235e2SEnji Cooper }
2337640235e2SEnji Cooper
2338640235e2SEnji Cooper ATF_TC(bpfjit_jmp_jeq_x_noinit_x);
ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_x,tc)2339640235e2SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_x, tc)
2340640235e2SEnji Cooper {
2341640235e2SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2342640235e2SEnji Cooper "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
2343640235e2SEnji Cooper }
2344640235e2SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_x,tc)2345640235e2SEnji Cooper ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_x, tc)
2346640235e2SEnji Cooper {
2347640235e2SEnji Cooper static struct bpf_insn insns[] = {
2348640235e2SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0), /* A > 0 */
2349640235e2SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2350640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 10),
2351640235e2SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 11)
2352640235e2SEnji Cooper };
2353640235e2SEnji Cooper
2354640235e2SEnji Cooper bpfjit_func_t code;
2355640235e2SEnji Cooper uint8_t pkt[8]; /* the program doesn't read any data */
2356640235e2SEnji Cooper
2357640235e2SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2358640235e2SEnji Cooper
2359640235e2SEnji Cooper RZ(rump_init());
2360640235e2SEnji Cooper
2361640235e2SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
2362640235e2SEnji Cooper
2363640235e2SEnji Cooper rump_schedule();
2364640235e2SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2365640235e2SEnji Cooper rump_unschedule();
2366640235e2SEnji Cooper ATF_REQUIRE(code != NULL);
2367640235e2SEnji Cooper
2368640235e2SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 11);
2369640235e2SEnji Cooper
2370640235e2SEnji Cooper rump_schedule();
2371640235e2SEnji Cooper rumpns_bpfjit_free_code(code);
2372640235e2SEnji Cooper rump_unschedule();
2373640235e2SEnji Cooper }
2374640235e2SEnji Cooper
237557718be8SEnji Cooper ATF_TC(bpfjit_jmp_modulo_x);
ATF_TC_HEAD(bpfjit_jmp_modulo_x,tc)237657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
237757718be8SEnji Cooper {
237857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
237957718be8SEnji Cooper "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
238057718be8SEnji Cooper }
238157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_jmp_modulo_x,tc)238257718be8SEnji Cooper ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
238357718be8SEnji Cooper {
238457718be8SEnji Cooper static struct bpf_insn insns[] = {
238557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
238657718be8SEnji Cooper /* FFFFF770 << 4 = FFFFF770 */
238757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
238857718be8SEnji Cooper
238957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
239057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
239157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
239257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
239357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
239457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
239557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
239657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
239757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
239857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
239957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
240057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
240157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
240257718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 1),
240357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
240457718be8SEnji Cooper
240557718be8SEnji Cooper /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
240657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
240757718be8SEnji Cooper
240857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
240957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
241057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 4),
241157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
241257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 5),
241357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
241457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
241557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 6),
241657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
241757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
241857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
241957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
242057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
242157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
242257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
242357718be8SEnji Cooper };
242457718be8SEnji Cooper
242557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
242657718be8SEnji Cooper
242757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
242857718be8SEnji Cooper
242957718be8SEnji Cooper RZ(rump_init());
243057718be8SEnji Cooper
243157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
243257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
243357718be8SEnji Cooper }
243457718be8SEnji Cooper
243557718be8SEnji Cooper ATF_TC(bpfjit_ld_abs);
ATF_TC_HEAD(bpfjit_ld_abs,tc)243657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_abs, tc)
243757718be8SEnji Cooper {
243857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
243957718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_ABS");
244057718be8SEnji Cooper }
244157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_abs,tc)244257718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_abs, tc)
244357718be8SEnji Cooper {
244457718be8SEnji Cooper static struct bpf_insn insns[3][2] = {
244557718be8SEnji Cooper {
244657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
244757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
244857718be8SEnji Cooper },
244957718be8SEnji Cooper {
245057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
245157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
245257718be8SEnji Cooper },
245357718be8SEnji Cooper {
245457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
245557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
245657718be8SEnji Cooper }
245757718be8SEnji Cooper };
245857718be8SEnji Cooper
245957718be8SEnji Cooper static size_t lengths[3] = { 1, 2, 4 };
246057718be8SEnji Cooper static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
246157718be8SEnji Cooper
246257718be8SEnji Cooper size_t i, l;
246357718be8SEnji Cooper uint8_t *pkt = deadbeef_at_5;
246457718be8SEnji Cooper size_t pktsize = sizeof(deadbeef_at_5);
246557718be8SEnji Cooper
246657718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
246757718be8SEnji Cooper
246857718be8SEnji Cooper RZ(rump_init());
246957718be8SEnji Cooper
247057718be8SEnji Cooper for (i = 0; i < 3; i++) {
247157718be8SEnji Cooper bpfjit_func_t code;
247257718be8SEnji Cooper
247357718be8SEnji Cooper ATF_CHECK(prog_validate(insns[i], insn_count));
247457718be8SEnji Cooper
247557718be8SEnji Cooper rump_schedule();
247657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
247757718be8SEnji Cooper rump_unschedule();
247857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
247957718be8SEnji Cooper
248057718be8SEnji Cooper for (l = 1; l < 5 + lengths[i]; l++) {
248157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == 0);
248257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
248357718be8SEnji Cooper }
248457718be8SEnji Cooper
248557718be8SEnji Cooper l = 5 + lengths[i];
248657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
248757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
248857718be8SEnji Cooper
248957718be8SEnji Cooper l = pktsize;
249057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
249157718be8SEnji Cooper
249257718be8SEnji Cooper rump_schedule();
249357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
249457718be8SEnji Cooper rump_unschedule();
249557718be8SEnji Cooper }
249657718be8SEnji Cooper }
249757718be8SEnji Cooper
249857718be8SEnji Cooper ATF_TC(bpfjit_ld_abs_k_overflow);
ATF_TC_HEAD(bpfjit_ld_abs_k_overflow,tc)249957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
250057718be8SEnji Cooper {
250157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
250257718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
250357718be8SEnji Cooper }
250457718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_abs_k_overflow,tc)250557718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
250657718be8SEnji Cooper {
250757718be8SEnji Cooper static struct bpf_insn insns[12][3] = {
250857718be8SEnji Cooper {
250957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
251057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
251157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
251257718be8SEnji Cooper },
251357718be8SEnji Cooper {
251457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
251557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
251657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
251757718be8SEnji Cooper },
251857718be8SEnji Cooper {
251957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
252057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
252157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
252257718be8SEnji Cooper },
252357718be8SEnji Cooper {
252457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
252557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
252657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
252757718be8SEnji Cooper },
252857718be8SEnji Cooper {
252957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
253057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
253157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
253257718be8SEnji Cooper },
253357718be8SEnji Cooper {
253457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
253557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
253657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
253757718be8SEnji Cooper },
253857718be8SEnji Cooper {
253957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
254057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
254157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
254257718be8SEnji Cooper },
254357718be8SEnji Cooper {
254457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
254557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
254657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
254757718be8SEnji Cooper },
254857718be8SEnji Cooper {
254957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
255057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
255157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
255257718be8SEnji Cooper },
255357718be8SEnji Cooper {
255457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
255557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
255657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
255757718be8SEnji Cooper },
255857718be8SEnji Cooper {
255957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
256057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
256157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
256257718be8SEnji Cooper },
256357718be8SEnji Cooper {
256457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
256557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
256657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
256757718be8SEnji Cooper }
256857718be8SEnji Cooper };
256957718be8SEnji Cooper
257057718be8SEnji Cooper int i;
257157718be8SEnji Cooper uint8_t pkt[8] = { 0 };
257257718be8SEnji Cooper
257357718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
257457718be8SEnji Cooper
257557718be8SEnji Cooper RZ(rump_init());
257657718be8SEnji Cooper
257757718be8SEnji Cooper for (i = 0; i < 3; i++) {
257857718be8SEnji Cooper ATF_CHECK(prog_validate(insns[i], insn_count));
257957718be8SEnji Cooper ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
258057718be8SEnji Cooper }
258157718be8SEnji Cooper }
258257718be8SEnji Cooper
258357718be8SEnji Cooper ATF_TC(bpfjit_ld_ind);
ATF_TC_HEAD(bpfjit_ld_ind,tc)258457718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_ind, tc)
258557718be8SEnji Cooper {
258657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
258757718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND");
258857718be8SEnji Cooper }
258957718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_ind,tc)259057718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_ind, tc)
259157718be8SEnji Cooper {
259257718be8SEnji Cooper static struct bpf_insn insns[6][3] = {
259357718be8SEnji Cooper {
259457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
259557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
259657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
259757718be8SEnji Cooper },
259857718be8SEnji Cooper {
259957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
260057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
260157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
260257718be8SEnji Cooper },
260357718be8SEnji Cooper {
260457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
260557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
260657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
260757718be8SEnji Cooper },
260857718be8SEnji Cooper {
260957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
261057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
261157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
261257718be8SEnji Cooper },
261357718be8SEnji Cooper {
261457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
261557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
261657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
261757718be8SEnji Cooper },
261857718be8SEnji Cooper {
261957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
262057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
262157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
262257718be8SEnji Cooper }
262357718be8SEnji Cooper };
262457718be8SEnji Cooper
262557718be8SEnji Cooper static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
262657718be8SEnji Cooper
262757718be8SEnji Cooper static unsigned int expected[6] = {
262857718be8SEnji Cooper 0xde, 0xdead, 0xdeadbeef,
262957718be8SEnji Cooper 0xde, 0xdead, 0xdeadbeef
263057718be8SEnji Cooper };
263157718be8SEnji Cooper
263257718be8SEnji Cooper size_t i, l;
263357718be8SEnji Cooper uint8_t *pkt = deadbeef_at_5;
263457718be8SEnji Cooper size_t pktsize = sizeof(deadbeef_at_5);
263557718be8SEnji Cooper
263657718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
263757718be8SEnji Cooper
263857718be8SEnji Cooper RZ(rump_init());
263957718be8SEnji Cooper
264057718be8SEnji Cooper for (i = 0; i < 3; i++) {
264157718be8SEnji Cooper bpfjit_func_t code;
264257718be8SEnji Cooper
264357718be8SEnji Cooper ATF_CHECK(prog_validate(insns[i], insn_count));
264457718be8SEnji Cooper
264557718be8SEnji Cooper rump_schedule();
264657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
264757718be8SEnji Cooper rump_unschedule();
264857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
264957718be8SEnji Cooper
265057718be8SEnji Cooper for (l = 1; l < 5 + lengths[i]; l++) {
265157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == 0);
265257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
265357718be8SEnji Cooper }
265457718be8SEnji Cooper
265557718be8SEnji Cooper l = 5 + lengths[i];
265657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
265757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
265857718be8SEnji Cooper
265957718be8SEnji Cooper l = pktsize;
266057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
266157718be8SEnji Cooper
266257718be8SEnji Cooper rump_schedule();
266357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
266457718be8SEnji Cooper rump_unschedule();
266557718be8SEnji Cooper }
266657718be8SEnji Cooper }
266757718be8SEnji Cooper
266857718be8SEnji Cooper ATF_TC(bpfjit_ld_ind_k_overflow);
ATF_TC_HEAD(bpfjit_ld_ind_k_overflow,tc)266957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
267057718be8SEnji Cooper {
267157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
267257718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
267357718be8SEnji Cooper }
267457718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_ind_k_overflow,tc)267557718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
267657718be8SEnji Cooper {
267757718be8SEnji Cooper static struct bpf_insn insns[12][3] = {
267857718be8SEnji Cooper {
267957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
268057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
268157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
268257718be8SEnji Cooper },
268357718be8SEnji Cooper {
268457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
268557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
268657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
268757718be8SEnji Cooper },
268857718be8SEnji Cooper {
268957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
269057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
269157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
269257718be8SEnji Cooper },
269357718be8SEnji Cooper {
269457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
269557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
269657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
269757718be8SEnji Cooper },
269857718be8SEnji Cooper {
269957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
270057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
270157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
270257718be8SEnji Cooper },
270357718be8SEnji Cooper {
270457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
270557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
270657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
270757718be8SEnji Cooper },
270857718be8SEnji Cooper {
270957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
271057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
271157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
271257718be8SEnji Cooper },
271357718be8SEnji Cooper {
271457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
271557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
271657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
271757718be8SEnji Cooper },
271857718be8SEnji Cooper {
271957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
272057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
272157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
272257718be8SEnji Cooper },
272357718be8SEnji Cooper {
272457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
272557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
272657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
272757718be8SEnji Cooper },
272857718be8SEnji Cooper {
272957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
273057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
273157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
273257718be8SEnji Cooper },
273357718be8SEnji Cooper {
273457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
273557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
273657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1)
273757718be8SEnji Cooper }
273857718be8SEnji Cooper };
273957718be8SEnji Cooper
274057718be8SEnji Cooper int i;
274157718be8SEnji Cooper uint8_t pkt[8] = { 0 };
274257718be8SEnji Cooper
274357718be8SEnji Cooper size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
274457718be8SEnji Cooper
274557718be8SEnji Cooper RZ(rump_init());
274657718be8SEnji Cooper
274757718be8SEnji Cooper for (i = 0; i < 3; i++) {
274857718be8SEnji Cooper
274957718be8SEnji Cooper ATF_CHECK(prog_validate(insns[i], insn_count));
275057718be8SEnji Cooper ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
275157718be8SEnji Cooper }
275257718be8SEnji Cooper }
275357718be8SEnji Cooper
275457718be8SEnji Cooper ATF_TC(bpfjit_ld_ind_x_overflow1);
ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1,tc)275557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
275657718be8SEnji Cooper {
275757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
275857718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
275957718be8SEnji Cooper }
276057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_ind_x_overflow1,tc)276157718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
276257718be8SEnji Cooper {
276357718be8SEnji Cooper static struct bpf_insn insns[] = {
276457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0),
276557718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
276657718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TAX, 0),
276757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
276857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
276957718be8SEnji Cooper };
277057718be8SEnji Cooper
277157718be8SEnji Cooper size_t i;
277257718be8SEnji Cooper bpfjit_func_t code;
277357718be8SEnji Cooper uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
277457718be8SEnji Cooper
277557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
277657718be8SEnji Cooper
277757718be8SEnji Cooper RZ(rump_init());
277857718be8SEnji Cooper
277957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
278057718be8SEnji Cooper
278157718be8SEnji Cooper rump_schedule();
278257718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
278357718be8SEnji Cooper rump_unschedule();
278457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
278557718be8SEnji Cooper
278657718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++) {
278757718be8SEnji Cooper //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
278857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
278957718be8SEnji Cooper }
279057718be8SEnji Cooper
279157718be8SEnji Cooper rump_schedule();
279257718be8SEnji Cooper rumpns_bpfjit_free_code(code);
279357718be8SEnji Cooper rump_unschedule();
279457718be8SEnji Cooper }
279557718be8SEnji Cooper
279657718be8SEnji Cooper ATF_TC(bpfjit_ld_ind_x_overflow2);
ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2,tc)279757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
279857718be8SEnji Cooper {
279957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
280057718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
280157718be8SEnji Cooper }
280257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_ind_x_overflow2,tc)280357718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
280457718be8SEnji Cooper {
280557718be8SEnji Cooper static struct bpf_insn insns[] = {
280657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_LEN, 0),
280757718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
280857718be8SEnji Cooper BPF_STMT(BPF_ST, 3),
280957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
281057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
281157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
281257718be8SEnji Cooper };
281357718be8SEnji Cooper
281457718be8SEnji Cooper size_t i;
281557718be8SEnji Cooper bpfjit_func_t code;
281657718be8SEnji Cooper uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
281757718be8SEnji Cooper
281857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
281957718be8SEnji Cooper
282057718be8SEnji Cooper RZ(rump_init());
282157718be8SEnji Cooper
282257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
282357718be8SEnji Cooper
282457718be8SEnji Cooper rump_schedule();
282557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
282657718be8SEnji Cooper rump_unschedule();
282757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
282857718be8SEnji Cooper
282957718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++) {
283057718be8SEnji Cooper //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
283157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
283257718be8SEnji Cooper }
283357718be8SEnji Cooper
283457718be8SEnji Cooper rump_schedule();
283557718be8SEnji Cooper rumpns_bpfjit_free_code(code);
283657718be8SEnji Cooper rump_unschedule();
283757718be8SEnji Cooper }
283857718be8SEnji Cooper
283957718be8SEnji Cooper ATF_TC(bpfjit_ld_len);
ATF_TC_HEAD(bpfjit_ld_len,tc)284057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_len, tc)
284157718be8SEnji Cooper {
284257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
284357718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
284457718be8SEnji Cooper }
284557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_len,tc)284657718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_len, tc)
284757718be8SEnji Cooper {
284857718be8SEnji Cooper static struct bpf_insn insns[] = {
284957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
285057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
285157718be8SEnji Cooper };
285257718be8SEnji Cooper
285357718be8SEnji Cooper size_t i;
285457718be8SEnji Cooper bpfjit_func_t code;
285557718be8SEnji Cooper uint8_t pkt[32]; /* the program doesn't read any data */
285657718be8SEnji Cooper
285757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
285857718be8SEnji Cooper
285957718be8SEnji Cooper RZ(rump_init());
286057718be8SEnji Cooper
286157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
286257718be8SEnji Cooper
286357718be8SEnji Cooper rump_schedule();
286457718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
286557718be8SEnji Cooper rump_unschedule();
286657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
286757718be8SEnji Cooper
286857718be8SEnji Cooper for (i = 0; i < sizeof(pkt); i++)
286957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, 1) == i);
287057718be8SEnji Cooper
287157718be8SEnji Cooper rump_schedule();
287257718be8SEnji Cooper rumpns_bpfjit_free_code(code);
287357718be8SEnji Cooper rump_unschedule();
287457718be8SEnji Cooper }
287557718be8SEnji Cooper
287657718be8SEnji Cooper ATF_TC(bpfjit_ld_imm);
ATF_TC_HEAD(bpfjit_ld_imm,tc)287757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ld_imm, tc)
287857718be8SEnji Cooper {
287957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
288057718be8SEnji Cooper "Test JIT compilation of BPF_LD+BPF_IMM");
288157718be8SEnji Cooper }
288257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ld_imm,tc)288357718be8SEnji Cooper ATF_TC_BODY(bpfjit_ld_imm, tc)
288457718be8SEnji Cooper {
288557718be8SEnji Cooper static struct bpf_insn insns[] = {
288657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
288757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
288857718be8SEnji Cooper };
288957718be8SEnji Cooper
289057718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
289157718be8SEnji Cooper
289257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
289357718be8SEnji Cooper
289457718be8SEnji Cooper RZ(rump_init());
289557718be8SEnji Cooper
289657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
289757718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
289857718be8SEnji Cooper }
289957718be8SEnji Cooper
290057718be8SEnji Cooper ATF_TC(bpfjit_ldx_imm1);
ATF_TC_HEAD(bpfjit_ldx_imm1,tc)290157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
290257718be8SEnji Cooper {
290357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
290457718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_IMM");
290557718be8SEnji Cooper }
290657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ldx_imm1,tc)290757718be8SEnji Cooper ATF_TC_BODY(bpfjit_ldx_imm1, tc)
290857718be8SEnji Cooper {
290957718be8SEnji Cooper static struct bpf_insn insns[] = {
291057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
291157718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
291257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
291357718be8SEnji Cooper };
291457718be8SEnji Cooper
291557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
291657718be8SEnji Cooper
291757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
291857718be8SEnji Cooper
291957718be8SEnji Cooper RZ(rump_init());
292057718be8SEnji Cooper
292157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
292257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX - 5);
292357718be8SEnji Cooper }
292457718be8SEnji Cooper
292557718be8SEnji Cooper ATF_TC(bpfjit_ldx_imm2);
ATF_TC_HEAD(bpfjit_ldx_imm2,tc)292657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
292757718be8SEnji Cooper {
292857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
292957718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_IMM");
293057718be8SEnji Cooper }
293157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ldx_imm2,tc)293257718be8SEnji Cooper ATF_TC_BODY(bpfjit_ldx_imm2, tc)
293357718be8SEnji Cooper {
293457718be8SEnji Cooper static struct bpf_insn insns[] = {
293557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
293657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 5),
293757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
293857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
293957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
294057718be8SEnji Cooper };
294157718be8SEnji Cooper
294257718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
294357718be8SEnji Cooper
294457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
294557718be8SEnji Cooper
294657718be8SEnji Cooper RZ(rump_init());
294757718be8SEnji Cooper
294857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
294957718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
295057718be8SEnji Cooper }
295157718be8SEnji Cooper
295257718be8SEnji Cooper ATF_TC(bpfjit_ldx_len1);
ATF_TC_HEAD(bpfjit_ldx_len1,tc)295357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ldx_len1, tc)
295457718be8SEnji Cooper {
295557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
295657718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_LEN");
295757718be8SEnji Cooper }
295857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ldx_len1,tc)295957718be8SEnji Cooper ATF_TC_BODY(bpfjit_ldx_len1, tc)
296057718be8SEnji Cooper {
296157718be8SEnji Cooper static struct bpf_insn insns[] = {
296257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
296357718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
296457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
296557718be8SEnji Cooper };
296657718be8SEnji Cooper
296757718be8SEnji Cooper size_t i;
296857718be8SEnji Cooper bpfjit_func_t code;
296957718be8SEnji Cooper uint8_t pkt[5]; /* the program doesn't read any data */
297057718be8SEnji Cooper
297157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
297257718be8SEnji Cooper
297357718be8SEnji Cooper RZ(rump_init());
297457718be8SEnji Cooper
297557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
297657718be8SEnji Cooper
297757718be8SEnji Cooper rump_schedule();
297857718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
297957718be8SEnji Cooper rump_unschedule();
298057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
298157718be8SEnji Cooper
298257718be8SEnji Cooper for (i = 1; i < sizeof(pkt); i++) {
298357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, 1) == i);
298457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
298557718be8SEnji Cooper }
298657718be8SEnji Cooper
298757718be8SEnji Cooper rump_schedule();
298857718be8SEnji Cooper rumpns_bpfjit_free_code(code);
298957718be8SEnji Cooper rump_unschedule();
299057718be8SEnji Cooper }
299157718be8SEnji Cooper
299257718be8SEnji Cooper ATF_TC(bpfjit_ldx_len2);
ATF_TC_HEAD(bpfjit_ldx_len2,tc)299357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ldx_len2, tc)
299457718be8SEnji Cooper {
299557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
299657718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_LEN");
299757718be8SEnji Cooper }
299857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ldx_len2,tc)299957718be8SEnji Cooper ATF_TC_BODY(bpfjit_ldx_len2, tc)
300057718be8SEnji Cooper {
300157718be8SEnji Cooper static struct bpf_insn insns[] = {
300257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
300357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 5),
300457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
300557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7),
300657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
300757718be8SEnji Cooper };
300857718be8SEnji Cooper
300957718be8SEnji Cooper bpfjit_func_t code;
301057718be8SEnji Cooper uint8_t pkt[5]; /* the program doesn't read any data */
301157718be8SEnji Cooper
301257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
301357718be8SEnji Cooper
301457718be8SEnji Cooper RZ(rump_init());
301557718be8SEnji Cooper
301657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
301757718be8SEnji Cooper
301857718be8SEnji Cooper rump_schedule();
301957718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
302057718be8SEnji Cooper rump_unschedule();
302157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
302257718be8SEnji Cooper
302357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
302457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
302557718be8SEnji Cooper
302657718be8SEnji Cooper rump_schedule();
302757718be8SEnji Cooper rumpns_bpfjit_free_code(code);
302857718be8SEnji Cooper rump_unschedule();
302957718be8SEnji Cooper }
303057718be8SEnji Cooper
303157718be8SEnji Cooper ATF_TC(bpfjit_ldx_msh);
ATF_TC_HEAD(bpfjit_ldx_msh,tc)303257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_ldx_msh, tc)
303357718be8SEnji Cooper {
303457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
303557718be8SEnji Cooper "Test JIT compilation of BPF_LDX+BPF_MSH");
303657718be8SEnji Cooper }
303757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_ldx_msh,tc)303857718be8SEnji Cooper ATF_TC_BODY(bpfjit_ldx_msh, tc)
303957718be8SEnji Cooper {
304057718be8SEnji Cooper static struct bpf_insn insns[] = {
304157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
304257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
304357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
304457718be8SEnji Cooper };
304557718be8SEnji Cooper
304657718be8SEnji Cooper uint8_t pkt[2] = { 0, 0x7a };
304757718be8SEnji Cooper
304857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
304957718be8SEnji Cooper
305057718be8SEnji Cooper RZ(rump_init());
305157718be8SEnji Cooper
305257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
305357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 2) == 40);
305457718be8SEnji Cooper }
305557718be8SEnji Cooper
305657718be8SEnji Cooper ATF_TC(bpfjit_misc_tax);
ATF_TC_HEAD(bpfjit_misc_tax,tc)305757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_misc_tax, tc)
305857718be8SEnji Cooper {
305957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
306057718be8SEnji Cooper "Test JIT compilation of BPF_MISC+BPF_TAX");
306157718be8SEnji Cooper }
306257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_misc_tax,tc)306357718be8SEnji Cooper ATF_TC_BODY(bpfjit_misc_tax, tc)
306457718be8SEnji Cooper {
306557718be8SEnji Cooper static struct bpf_insn insns[] = {
306657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 3),
306757718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TAX, 0),
306857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
306957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
307057718be8SEnji Cooper };
307157718be8SEnji Cooper
307257718be8SEnji Cooper uint8_t pkt[6] = { 0, 11, 22, 33, 44, 55 };
307357718be8SEnji Cooper
307457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
307557718be8SEnji Cooper
307657718be8SEnji Cooper RZ(rump_init());
307757718be8SEnji Cooper
307857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
307957718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 6) == 55);
308057718be8SEnji Cooper }
308157718be8SEnji Cooper
308257718be8SEnji Cooper ATF_TC(bpfjit_misc_txa);
ATF_TC_HEAD(bpfjit_misc_txa,tc)308357718be8SEnji Cooper ATF_TC_HEAD(bpfjit_misc_txa, tc)
308457718be8SEnji Cooper {
308557718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
308657718be8SEnji Cooper "Test JIT compilation of BPF_MISC+BPF_TXA");
308757718be8SEnji Cooper }
308857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_misc_txa,tc)308957718be8SEnji Cooper ATF_TC_BODY(bpfjit_misc_txa, tc)
309057718be8SEnji Cooper {
309157718be8SEnji Cooper static struct bpf_insn insns[] = {
309257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
309357718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TXA, 0),
309457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
309557718be8SEnji Cooper };
309657718be8SEnji Cooper
309757718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
309857718be8SEnji Cooper
309957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
310057718be8SEnji Cooper
310157718be8SEnji Cooper RZ(rump_init());
310257718be8SEnji Cooper
310357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
310457718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 391);
310557718be8SEnji Cooper }
310657718be8SEnji Cooper
310757718be8SEnji Cooper ATF_TC(bpfjit_st1);
ATF_TC_HEAD(bpfjit_st1,tc)310857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_st1, tc)
310957718be8SEnji Cooper {
311057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
311157718be8SEnji Cooper "Test JIT compilation of BPF_ST");
311257718be8SEnji Cooper }
311357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_st1,tc)311457718be8SEnji Cooper ATF_TC_BODY(bpfjit_st1, tc)
311557718be8SEnji Cooper {
311657718be8SEnji Cooper static struct bpf_insn insns[] = {
311757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
311857718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
311957718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
312057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
312157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
312257718be8SEnji Cooper };
312357718be8SEnji Cooper
312457718be8SEnji Cooper size_t i;
312557718be8SEnji Cooper bpfjit_func_t code;
312657718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
312757718be8SEnji Cooper
312857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
312957718be8SEnji Cooper
313057718be8SEnji Cooper RZ(rump_init());
313157718be8SEnji Cooper
313257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
313357718be8SEnji Cooper
313457718be8SEnji Cooper rump_schedule();
313557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
313657718be8SEnji Cooper rump_unschedule();
313757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
313857718be8SEnji Cooper
313957718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
314057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
314157718be8SEnji Cooper
314257718be8SEnji Cooper rump_schedule();
314357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
314457718be8SEnji Cooper rump_unschedule();
314557718be8SEnji Cooper }
314657718be8SEnji Cooper
314757718be8SEnji Cooper ATF_TC(bpfjit_st2);
ATF_TC_HEAD(bpfjit_st2,tc)314857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_st2, tc)
314957718be8SEnji Cooper {
315057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
315157718be8SEnji Cooper "Test JIT compilation of BPF_ST");
315257718be8SEnji Cooper }
315357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_st2,tc)315457718be8SEnji Cooper ATF_TC_BODY(bpfjit_st2, tc)
315557718be8SEnji Cooper {
315657718be8SEnji Cooper static struct bpf_insn insns[] = {
315757718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
315857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
315957718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
316057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
316157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
316257718be8SEnji Cooper };
316357718be8SEnji Cooper
316457718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
316557718be8SEnji Cooper
316657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
316757718be8SEnji Cooper
316857718be8SEnji Cooper RZ(rump_init());
316957718be8SEnji Cooper
317057718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
317157718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
317257718be8SEnji Cooper }
317357718be8SEnji Cooper
317457718be8SEnji Cooper ATF_TC(bpfjit_st3);
ATF_TC_HEAD(bpfjit_st3,tc)317557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_st3, tc)
317657718be8SEnji Cooper {
317757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
317857718be8SEnji Cooper "Test JIT compilation of BPF_ST");
317957718be8SEnji Cooper }
318057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_st3,tc)318157718be8SEnji Cooper ATF_TC_BODY(bpfjit_st3, tc)
318257718be8SEnji Cooper {
318357718be8SEnji Cooper static struct bpf_insn insns[] = {
318457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
318557718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
318657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
318757718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
318857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
318957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
319057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
319157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
319257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 0),
319357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
319457718be8SEnji Cooper };
319557718be8SEnji Cooper
319657718be8SEnji Cooper bpfjit_func_t code;
319757718be8SEnji Cooper uint8_t pkt[2]; /* the program doesn't read any data */
319857718be8SEnji Cooper
319957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
320057718be8SEnji Cooper
320157718be8SEnji Cooper ATF_REQUIRE(BPF_MEMWORDS > 1);
320257718be8SEnji Cooper
320357718be8SEnji Cooper RZ(rump_init());
320457718be8SEnji Cooper
320557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
320657718be8SEnji Cooper
320757718be8SEnji Cooper rump_schedule();
320857718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
320957718be8SEnji Cooper rump_unschedule();
321057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
321157718be8SEnji Cooper
321257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
321357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
321457718be8SEnji Cooper
321557718be8SEnji Cooper rump_schedule();
321657718be8SEnji Cooper rumpns_bpfjit_free_code(code);
321757718be8SEnji Cooper rump_unschedule();
321857718be8SEnji Cooper }
321957718be8SEnji Cooper
322057718be8SEnji Cooper ATF_TC(bpfjit_st4);
ATF_TC_HEAD(bpfjit_st4,tc)322157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_st4, tc)
322257718be8SEnji Cooper {
322357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
322457718be8SEnji Cooper "Test JIT compilation of BPF_ST");
322557718be8SEnji Cooper }
322657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_st4,tc)322757718be8SEnji Cooper ATF_TC_BODY(bpfjit_st4, tc)
322857718be8SEnji Cooper {
322957718be8SEnji Cooper static struct bpf_insn insns[] = {
323057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
323157718be8SEnji Cooper BPF_STMT(BPF_ST, 5),
323257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
323357718be8SEnji Cooper BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
323457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
323557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
323657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
323757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
323857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 5),
323957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
324057718be8SEnji Cooper };
324157718be8SEnji Cooper
324257718be8SEnji Cooper bpfjit_func_t code;
324357718be8SEnji Cooper uint8_t pkt[2]; /* the program doesn't read any data */
324457718be8SEnji Cooper
324557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
324657718be8SEnji Cooper
324757718be8SEnji Cooper ATF_REQUIRE(BPF_MEMWORDS > 6);
324857718be8SEnji Cooper
324957718be8SEnji Cooper RZ(rump_init());
325057718be8SEnji Cooper
325157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
325257718be8SEnji Cooper
325357718be8SEnji Cooper rump_schedule();
325457718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
325557718be8SEnji Cooper rump_unschedule();
325657718be8SEnji Cooper ATF_REQUIRE(code != NULL);
325757718be8SEnji Cooper
325857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
325957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
326057718be8SEnji Cooper
326157718be8SEnji Cooper rump_schedule();
326257718be8SEnji Cooper rumpns_bpfjit_free_code(code);
326357718be8SEnji Cooper rump_unschedule();
326457718be8SEnji Cooper }
326557718be8SEnji Cooper
326657718be8SEnji Cooper ATF_TC(bpfjit_st5);
ATF_TC_HEAD(bpfjit_st5,tc)326757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_st5, tc)
326857718be8SEnji Cooper {
326957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
327057718be8SEnji Cooper "Test JIT compilation of BPF_ST");
327157718be8SEnji Cooper }
327257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_st5,tc)327357718be8SEnji Cooper ATF_TC_BODY(bpfjit_st5, tc)
327457718be8SEnji Cooper {
327557718be8SEnji Cooper struct bpf_insn insns[5*BPF_MEMWORDS+2];
327657718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
327757718be8SEnji Cooper
327857718be8SEnji Cooper size_t k;
327957718be8SEnji Cooper bpfjit_func_t code;
328057718be8SEnji Cooper uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
328157718be8SEnji Cooper
328257718be8SEnji Cooper memset(insns, 0, sizeof(insns));
328357718be8SEnji Cooper
328457718be8SEnji Cooper /* for each k do M[k] = k */
328557718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
328657718be8SEnji Cooper insns[2*k].code = BPF_LD+BPF_IMM;
328757718be8SEnji Cooper insns[2*k].k = 3*k;
328857718be8SEnji Cooper insns[2*k+1].code = BPF_ST;
328957718be8SEnji Cooper insns[2*k+1].k = k;
329057718be8SEnji Cooper }
329157718be8SEnji Cooper
329257718be8SEnji Cooper /* load wirelen into A */
329357718be8SEnji Cooper insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
329457718be8SEnji Cooper
329557718be8SEnji Cooper /* for each k, if (A == k + 1) return M[k] */
329657718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
329757718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
329857718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
329957718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
330057718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
330157718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
330257718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].k = k;
330357718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
330457718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].k = 0;
330557718be8SEnji Cooper }
330657718be8SEnji Cooper
330757718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
330857718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
330957718be8SEnji Cooper
331057718be8SEnji Cooper RZ(rump_init());
331157718be8SEnji Cooper
331257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
331357718be8SEnji Cooper
331457718be8SEnji Cooper rump_schedule();
331557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
331657718be8SEnji Cooper rump_unschedule();
331757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
331857718be8SEnji Cooper
331957718be8SEnji Cooper for (k = 1; k <= sizeof(pkt); k++)
332057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
332157718be8SEnji Cooper
332257718be8SEnji Cooper rump_schedule();
332357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
332457718be8SEnji Cooper rump_unschedule();
332557718be8SEnji Cooper }
332657718be8SEnji Cooper
332757718be8SEnji Cooper ATF_TC(bpfjit_stx1);
ATF_TC_HEAD(bpfjit_stx1,tc)332857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_stx1, tc)
332957718be8SEnji Cooper {
333057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
333157718be8SEnji Cooper "Test JIT compilation of BPF_STX");
333257718be8SEnji Cooper }
333357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_stx1,tc)333457718be8SEnji Cooper ATF_TC_BODY(bpfjit_stx1, tc)
333557718be8SEnji Cooper {
333657718be8SEnji Cooper static struct bpf_insn insns[] = {
333757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
333857718be8SEnji Cooper BPF_STMT(BPF_STX, 0),
333957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
334057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
334157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
334257718be8SEnji Cooper };
334357718be8SEnji Cooper
334457718be8SEnji Cooper size_t i;
334557718be8SEnji Cooper bpfjit_func_t code;
334657718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
334757718be8SEnji Cooper
334857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
334957718be8SEnji Cooper
335057718be8SEnji Cooper RZ(rump_init());
335157718be8SEnji Cooper
335257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
335357718be8SEnji Cooper
335457718be8SEnji Cooper rump_schedule();
335557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
335657718be8SEnji Cooper rump_unschedule();
335757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
335857718be8SEnji Cooper
335957718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
336057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
336157718be8SEnji Cooper
336257718be8SEnji Cooper rump_schedule();
336357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
336457718be8SEnji Cooper rump_unschedule();
336557718be8SEnji Cooper }
336657718be8SEnji Cooper
336757718be8SEnji Cooper ATF_TC(bpfjit_stx2);
ATF_TC_HEAD(bpfjit_stx2,tc)336857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_stx2, tc)
336957718be8SEnji Cooper {
337057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
337157718be8SEnji Cooper "Test JIT compilation of BPF_STX");
337257718be8SEnji Cooper }
337357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_stx2,tc)337457718be8SEnji Cooper ATF_TC_BODY(bpfjit_stx2, tc)
337557718be8SEnji Cooper {
337657718be8SEnji Cooper static struct bpf_insn insns[] = {
337757718be8SEnji Cooper BPF_STMT(BPF_ST, 0),
337857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
337957718be8SEnji Cooper BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
338057718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
338157718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_TXA, 0),
338257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
338357718be8SEnji Cooper };
338457718be8SEnji Cooper
338557718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
338657718be8SEnji Cooper
338757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
338857718be8SEnji Cooper
338957718be8SEnji Cooper RZ(rump_init());
339057718be8SEnji Cooper
339157718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
339257718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
339357718be8SEnji Cooper }
339457718be8SEnji Cooper
339557718be8SEnji Cooper ATF_TC(bpfjit_stx3);
ATF_TC_HEAD(bpfjit_stx3,tc)339657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_stx3, tc)
339757718be8SEnji Cooper {
339857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
339957718be8SEnji Cooper "Test JIT compilation of BPF_STX");
340057718be8SEnji Cooper }
340157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_stx3,tc)340257718be8SEnji Cooper ATF_TC_BODY(bpfjit_stx3, tc)
340357718be8SEnji Cooper {
340457718be8SEnji Cooper static struct bpf_insn insns[] = {
340557718be8SEnji Cooper BPF_STMT(BPF_STX, 6),
340657718be8SEnji Cooper BPF_STMT(BPF_ST, 1),
340757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
340857718be8SEnji Cooper BPF_STMT(BPF_STX, 5),
340957718be8SEnji Cooper BPF_STMT(BPF_STX, 2),
341057718be8SEnji Cooper BPF_STMT(BPF_STX, 3),
341157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
341257718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
341357718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
341457718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
341557718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
341657718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
341757718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
341857718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
341957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
342057718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
342157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0)
342257718be8SEnji Cooper };
342357718be8SEnji Cooper
342457718be8SEnji Cooper size_t i;
342557718be8SEnji Cooper bpfjit_func_t code;
342657718be8SEnji Cooper uint8_t pkt[16]; /* the program doesn't read any data */
342757718be8SEnji Cooper
342857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
342957718be8SEnji Cooper
343057718be8SEnji Cooper RZ(rump_init());
343157718be8SEnji Cooper
343257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
343357718be8SEnji Cooper
343457718be8SEnji Cooper rump_schedule();
343557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
343657718be8SEnji Cooper rump_unschedule();
343757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
343857718be8SEnji Cooper
343957718be8SEnji Cooper for (i = 1; i <= sizeof(pkt); i++)
344057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
344157718be8SEnji Cooper
344257718be8SEnji Cooper rump_schedule();
344357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
344457718be8SEnji Cooper rump_unschedule();
344557718be8SEnji Cooper }
344657718be8SEnji Cooper
344757718be8SEnji Cooper ATF_TC(bpfjit_stx4);
ATF_TC_HEAD(bpfjit_stx4,tc)344857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_stx4, tc)
344957718be8SEnji Cooper {
345057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
345157718be8SEnji Cooper "Test JIT compilation of BPF_STX");
345257718be8SEnji Cooper }
345357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_stx4,tc)345457718be8SEnji Cooper ATF_TC_BODY(bpfjit_stx4, tc)
345557718be8SEnji Cooper {
345657718be8SEnji Cooper struct bpf_insn insns[5*BPF_MEMWORDS+2];
345757718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
345857718be8SEnji Cooper
345957718be8SEnji Cooper size_t k;
346057718be8SEnji Cooper bpfjit_func_t code;
346157718be8SEnji Cooper uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
346257718be8SEnji Cooper
346357718be8SEnji Cooper memset(insns, 0, sizeof(insns));
346457718be8SEnji Cooper
346557718be8SEnji Cooper /* for each k do M[k] = k */
346657718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
346757718be8SEnji Cooper insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
346857718be8SEnji Cooper insns[2*k].k = 3*k;
346957718be8SEnji Cooper insns[2*k+1].code = BPF_STX;
347057718be8SEnji Cooper insns[2*k+1].k = k;
347157718be8SEnji Cooper }
347257718be8SEnji Cooper
347357718be8SEnji Cooper /* load wirelen into A */
347457718be8SEnji Cooper insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
347557718be8SEnji Cooper
347657718be8SEnji Cooper /* for each k, if (A == k + 1) return M[k] */
347757718be8SEnji Cooper for (k = 0; k < BPF_MEMWORDS; k++) {
347857718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
347957718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
348057718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
348157718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
348257718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
348357718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+2].k = k;
348457718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
348557718be8SEnji Cooper insns[2*BPF_MEMWORDS+3*k+3].k = 0;
348657718be8SEnji Cooper }
348757718be8SEnji Cooper
348857718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
348957718be8SEnji Cooper insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
349057718be8SEnji Cooper
349157718be8SEnji Cooper RZ(rump_init());
349257718be8SEnji Cooper
349357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
349457718be8SEnji Cooper
349557718be8SEnji Cooper rump_schedule();
349657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
349757718be8SEnji Cooper rump_unschedule();
349857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
349957718be8SEnji Cooper
350057718be8SEnji Cooper for (k = 1; k <= sizeof(pkt); k++)
350157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
350257718be8SEnji Cooper
350357718be8SEnji Cooper rump_schedule();
350457718be8SEnji Cooper rumpns_bpfjit_free_code(code);
350557718be8SEnji Cooper rump_unschedule();
350657718be8SEnji Cooper }
350757718be8SEnji Cooper
350857718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_abs_1);
ATF_TC_HEAD(bpfjit_opt_ld_abs_1,tc)350957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
351057718be8SEnji Cooper {
351157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
351257718be8SEnji Cooper "Test JIT compilation with length optimization "
351357718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
351457718be8SEnji Cooper }
351557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_abs_1,tc)351657718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
351757718be8SEnji Cooper {
351857718be8SEnji Cooper static struct bpf_insn insns[] = {
351957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
352057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
352157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
352257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
352357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
352457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
352557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
352657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
352757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
352857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
352957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
353057718be8SEnji Cooper };
353157718be8SEnji Cooper
353257718be8SEnji Cooper size_t i, j;
353357718be8SEnji Cooper bpfjit_func_t code;
353457718be8SEnji Cooper uint8_t pkt[2][34] = {
353557718be8SEnji Cooper {
353657718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
353757718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
353857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
353957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
354057718be8SEnji Cooper },
354157718be8SEnji Cooper {
354257718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
354357718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
354457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
354557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
354657718be8SEnji Cooper }
354757718be8SEnji Cooper };
354857718be8SEnji Cooper
354957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
355057718be8SEnji Cooper
355157718be8SEnji Cooper RZ(rump_init());
355257718be8SEnji Cooper
355357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
355457718be8SEnji Cooper
355557718be8SEnji Cooper rump_schedule();
355657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
355757718be8SEnji Cooper rump_unschedule();
355857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
355957718be8SEnji Cooper
356057718be8SEnji Cooper for (i = 0; i < 2; i++) {
356157718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
356257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
356357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
356457718be8SEnji Cooper }
356557718be8SEnji Cooper
356657718be8SEnji Cooper rump_schedule();
356757718be8SEnji Cooper rumpns_bpfjit_free_code(code);
356857718be8SEnji Cooper rump_unschedule();
356957718be8SEnji Cooper }
357057718be8SEnji Cooper
357157718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_abs_2);
ATF_TC_HEAD(bpfjit_opt_ld_abs_2,tc)357257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
357357718be8SEnji Cooper {
357457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
357557718be8SEnji Cooper "Test JIT compilation with length optimization "
357657718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
357757718be8SEnji Cooper }
357857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_abs_2,tc)357957718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
358057718be8SEnji Cooper {
358157718be8SEnji Cooper static struct bpf_insn insns[] = {
358257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
358357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
358457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
358557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
358657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
358757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
358857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
358957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
359057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
359157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
359257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
359357718be8SEnji Cooper };
359457718be8SEnji Cooper
359557718be8SEnji Cooper size_t i, j;
359657718be8SEnji Cooper bpfjit_func_t code;
359757718be8SEnji Cooper uint8_t pkt[2][34] = {
359857718be8SEnji Cooper {
359957718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
360057718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
360157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
360257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
360357718be8SEnji Cooper },
360457718be8SEnji Cooper {
360557718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
360657718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
360757718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
360857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
360957718be8SEnji Cooper }
361057718be8SEnji Cooper };
361157718be8SEnji Cooper
361257718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
361357718be8SEnji Cooper
361457718be8SEnji Cooper RZ(rump_init());
361557718be8SEnji Cooper
361657718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
361757718be8SEnji Cooper
361857718be8SEnji Cooper rump_schedule();
361957718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
362057718be8SEnji Cooper rump_unschedule();
362157718be8SEnji Cooper ATF_REQUIRE(code != NULL);
362257718be8SEnji Cooper
362357718be8SEnji Cooper for (i = 0; i < 2; i++) {
362457718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
362557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
362657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
362757718be8SEnji Cooper }
362857718be8SEnji Cooper
362957718be8SEnji Cooper rump_schedule();
363057718be8SEnji Cooper rumpns_bpfjit_free_code(code);
363157718be8SEnji Cooper rump_unschedule();
363257718be8SEnji Cooper }
363357718be8SEnji Cooper
363457718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_abs_3);
ATF_TC_HEAD(bpfjit_opt_ld_abs_3,tc)363557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
363657718be8SEnji Cooper {
363757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
363857718be8SEnji Cooper "Test JIT compilation with length optimization "
363957718be8SEnji Cooper "applied to BPF_LD+BPF_ABS");
364057718be8SEnji Cooper }
364157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_abs_3,tc)364257718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
364357718be8SEnji Cooper {
364457718be8SEnji Cooper static struct bpf_insn insns[] = {
364557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
364657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
364757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
364857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
364957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
365057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
365157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
365257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
365357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
365457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
365557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
365657718be8SEnji Cooper };
365757718be8SEnji Cooper
365857718be8SEnji Cooper size_t i, j;
365957718be8SEnji Cooper bpfjit_func_t code;
366057718be8SEnji Cooper uint8_t pkt[2][34] = {
366157718be8SEnji Cooper {
366257718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
366357718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
366457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
366557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
366657718be8SEnji Cooper },
366757718be8SEnji Cooper {
366857718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
366957718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
367057718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
367157718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
367257718be8SEnji Cooper }
367357718be8SEnji Cooper };
367457718be8SEnji Cooper
367557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
367657718be8SEnji Cooper
367757718be8SEnji Cooper RZ(rump_init());
367857718be8SEnji Cooper
367957718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
368057718be8SEnji Cooper
368157718be8SEnji Cooper rump_schedule();
368257718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
368357718be8SEnji Cooper rump_unschedule();
368457718be8SEnji Cooper ATF_REQUIRE(code != NULL);
368557718be8SEnji Cooper
368657718be8SEnji Cooper for (i = 0; i < 2; i++) {
368757718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
368857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
368957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
369057718be8SEnji Cooper }
369157718be8SEnji Cooper
369257718be8SEnji Cooper rump_schedule();
369357718be8SEnji Cooper rumpns_bpfjit_free_code(code);
369457718be8SEnji Cooper rump_unschedule();
369557718be8SEnji Cooper }
369657718be8SEnji Cooper
369757718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_ind_1);
ATF_TC_HEAD(bpfjit_opt_ld_ind_1,tc)369857718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
369957718be8SEnji Cooper {
370057718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
370157718be8SEnji Cooper "Test JIT compilation with length optimization "
370257718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
370357718be8SEnji Cooper }
370457718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_ind_1,tc)370557718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
370657718be8SEnji Cooper {
370757718be8SEnji Cooper static struct bpf_insn insns[] = {
370857718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
370957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
371057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
371157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
371257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
371357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
371457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
371557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
371657718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
371757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
371857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
371957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
372057718be8SEnji Cooper };
372157718be8SEnji Cooper
372257718be8SEnji Cooper size_t i, j;
372357718be8SEnji Cooper bpfjit_func_t code;
372457718be8SEnji Cooper uint8_t pkt[2][34] = {
372557718be8SEnji Cooper {
372657718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
372757718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
372857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
372957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
373057718be8SEnji Cooper },
373157718be8SEnji Cooper {
373257718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
373357718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
373457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
373557718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
373657718be8SEnji Cooper }
373757718be8SEnji Cooper };
373857718be8SEnji Cooper
373957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
374057718be8SEnji Cooper
374157718be8SEnji Cooper RZ(rump_init());
374257718be8SEnji Cooper
374357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
374457718be8SEnji Cooper
374557718be8SEnji Cooper rump_schedule();
374657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
374757718be8SEnji Cooper rump_unschedule();
374857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
374957718be8SEnji Cooper
375057718be8SEnji Cooper for (i = 0; i < 2; i++) {
375157718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
375257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
375357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
375457718be8SEnji Cooper }
375557718be8SEnji Cooper
375657718be8SEnji Cooper rump_schedule();
375757718be8SEnji Cooper rumpns_bpfjit_free_code(code);
375857718be8SEnji Cooper rump_unschedule();
375957718be8SEnji Cooper }
376057718be8SEnji Cooper
376157718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_ind_2);
ATF_TC_HEAD(bpfjit_opt_ld_ind_2,tc)376257718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
376357718be8SEnji Cooper {
376457718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
376557718be8SEnji Cooper "Test JIT compilation with length optimization "
376657718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
376757718be8SEnji Cooper }
376857718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_ind_2,tc)376957718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
377057718be8SEnji Cooper {
377157718be8SEnji Cooper static struct bpf_insn insns[] = {
377257718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
377357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
377457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
377557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
377657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
377757718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
377857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
377957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
378057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
378157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
378257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
378357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
378457718be8SEnji Cooper };
378557718be8SEnji Cooper
378657718be8SEnji Cooper size_t i, j;
378757718be8SEnji Cooper bpfjit_func_t code;
378857718be8SEnji Cooper uint8_t pkt[2][34] = {
378957718be8SEnji Cooper {
379057718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
379157718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
379257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
379357718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
379457718be8SEnji Cooper },
379557718be8SEnji Cooper {
379657718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
379757718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
379857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
379957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
380057718be8SEnji Cooper }
380157718be8SEnji Cooper };
380257718be8SEnji Cooper
380357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
380457718be8SEnji Cooper
380557718be8SEnji Cooper RZ(rump_init());
380657718be8SEnji Cooper
380757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
380857718be8SEnji Cooper
380957718be8SEnji Cooper rump_schedule();
381057718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
381157718be8SEnji Cooper rump_unschedule();
381257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
381357718be8SEnji Cooper
381457718be8SEnji Cooper for (i = 0; i < 2; i++) {
381557718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
381657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
381757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
381857718be8SEnji Cooper }
381957718be8SEnji Cooper
382057718be8SEnji Cooper rump_schedule();
382157718be8SEnji Cooper rumpns_bpfjit_free_code(code);
382257718be8SEnji Cooper rump_unschedule();
382357718be8SEnji Cooper }
382457718be8SEnji Cooper
382557718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_ind_3);
ATF_TC_HEAD(bpfjit_opt_ld_ind_3,tc)382657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
382757718be8SEnji Cooper {
382857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
382957718be8SEnji Cooper "Test JIT compilation with length optimization "
383057718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
383157718be8SEnji Cooper }
383257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_ind_3,tc)383357718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
383457718be8SEnji Cooper {
383557718be8SEnji Cooper static struct bpf_insn insns[] = {
383657718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
383757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
383857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
383957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
384057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
384157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
384257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
384357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
384457718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
384557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
384657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
384757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
384857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
384957718be8SEnji Cooper };
385057718be8SEnji Cooper
385157718be8SEnji Cooper size_t i, j;
385257718be8SEnji Cooper bpfjit_func_t code;
385357718be8SEnji Cooper uint8_t pkt[2][34] = {
385457718be8SEnji Cooper {
385557718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
385657718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
385757718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
385857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
385957718be8SEnji Cooper },
386057718be8SEnji Cooper {
386157718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
386257718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
386357718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
386457718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
386557718be8SEnji Cooper }
386657718be8SEnji Cooper };
386757718be8SEnji Cooper
386857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
386957718be8SEnji Cooper
387057718be8SEnji Cooper RZ(rump_init());
387157718be8SEnji Cooper
387257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
387357718be8SEnji Cooper
387457718be8SEnji Cooper rump_schedule();
387557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
387657718be8SEnji Cooper rump_unschedule();
387757718be8SEnji Cooper ATF_REQUIRE(code != NULL);
387857718be8SEnji Cooper
387957718be8SEnji Cooper for (i = 0; i < 2; i++) {
388057718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
388157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
388257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
388357718be8SEnji Cooper }
388457718be8SEnji Cooper
388557718be8SEnji Cooper rump_schedule();
388657718be8SEnji Cooper rumpns_bpfjit_free_code(code);
388757718be8SEnji Cooper rump_unschedule();
388857718be8SEnji Cooper }
388957718be8SEnji Cooper
389057718be8SEnji Cooper ATF_TC(bpfjit_opt_ld_ind_4);
ATF_TC_HEAD(bpfjit_opt_ld_ind_4,tc)389157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
389257718be8SEnji Cooper {
389357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
389457718be8SEnji Cooper "Test JIT compilation with length optimization "
389557718be8SEnji Cooper "applied to BPF_LD+BPF_IND");
389657718be8SEnji Cooper }
389757718be8SEnji Cooper
ATF_TC_BODY(bpfjit_opt_ld_ind_4,tc)389857718be8SEnji Cooper ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
389957718be8SEnji Cooper {
390057718be8SEnji Cooper static struct bpf_insn insns[] = {
390157718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
390257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
390357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
390457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
390557718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
390657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
390757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
390857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
390957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
391057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
391157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
391257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
391357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
391457718be8SEnji Cooper };
391557718be8SEnji Cooper
391657718be8SEnji Cooper size_t i, j;
391757718be8SEnji Cooper bpfjit_func_t code;
391857718be8SEnji Cooper uint8_t pkt[2][34] = {
391957718be8SEnji Cooper {
392057718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
392157718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
392257718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f,
392357718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23
392457718be8SEnji Cooper },
392557718be8SEnji Cooper {
392657718be8SEnji Cooper 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
392757718be8SEnji Cooper 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
392857718be8SEnji Cooper 0x80, 0x03, 0x70, 0x23,
392957718be8SEnji Cooper 0x80, 0x03, 0x70, 0x0f
393057718be8SEnji Cooper }
393157718be8SEnji Cooper };
393257718be8SEnji Cooper
393357718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
393457718be8SEnji Cooper
393557718be8SEnji Cooper RZ(rump_init());
393657718be8SEnji Cooper
393757718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
393857718be8SEnji Cooper
393957718be8SEnji Cooper rump_schedule();
394057718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
394157718be8SEnji Cooper rump_unschedule();
394257718be8SEnji Cooper ATF_REQUIRE(code != NULL);
394357718be8SEnji Cooper
394457718be8SEnji Cooper for (i = 0; i < 2; i++) {
394557718be8SEnji Cooper for (j = 1; j < sizeof(pkt[i]); j++)
394657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
394757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
394857718be8SEnji Cooper }
394957718be8SEnji Cooper
395057718be8SEnji Cooper rump_schedule();
395157718be8SEnji Cooper rumpns_bpfjit_free_code(code);
395257718be8SEnji Cooper rump_unschedule();
395357718be8SEnji Cooper }
395457718be8SEnji Cooper
395557718be8SEnji Cooper ATF_TC(bpfjit_abc_ja);
ATF_TC_HEAD(bpfjit_abc_ja,tc)395657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_abc_ja, tc)
395757718be8SEnji Cooper {
395857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
395957718be8SEnji Cooper "Test ABC optimization with a single BPF_JMP+BPF_JA");
396057718be8SEnji Cooper }
396157718be8SEnji Cooper
ATF_TC_BODY(bpfjit_abc_ja,tc)396257718be8SEnji Cooper ATF_TC_BODY(bpfjit_abc_ja, tc)
396357718be8SEnji Cooper {
396457718be8SEnji Cooper static struct bpf_insn insns[] = {
396557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
396657718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 2),
396757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
396857718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
396957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
397057718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0),
397157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
397257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
397357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
397457718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
397557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
397657718be8SEnji Cooper };
397757718be8SEnji Cooper
397857718be8SEnji Cooper bpfjit_func_t code;
397957718be8SEnji Cooper uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
398057718be8SEnji Cooper
398157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
398257718be8SEnji Cooper
398357718be8SEnji Cooper RZ(rump_init());
398457718be8SEnji Cooper
398557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
398657718be8SEnji Cooper
398757718be8SEnji Cooper rump_schedule();
398857718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
398957718be8SEnji Cooper rump_unschedule();
399057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
399157718be8SEnji Cooper
399257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
399357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
399457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
399557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
399657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
399757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
399857718be8SEnji Cooper
399957718be8SEnji Cooper rump_schedule();
400057718be8SEnji Cooper rumpns_bpfjit_free_code(code);
400157718be8SEnji Cooper rump_unschedule();
400257718be8SEnji Cooper }
400357718be8SEnji Cooper
400457718be8SEnji Cooper ATF_TC(bpfjit_abc_ja_over);
ATF_TC_HEAD(bpfjit_abc_ja_over,tc)400557718be8SEnji Cooper ATF_TC_HEAD(bpfjit_abc_ja_over, tc)
400657718be8SEnji Cooper {
400757718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
400857718be8SEnji Cooper "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
400957718be8SEnji Cooper }
401057718be8SEnji Cooper
ATF_TC_BODY(bpfjit_abc_ja_over,tc)401157718be8SEnji Cooper ATF_TC_BODY(bpfjit_abc_ja_over, tc)
401257718be8SEnji Cooper {
401357718be8SEnji Cooper static struct bpf_insn insns[] = {
401457718be8SEnji Cooper BPF_STMT(BPF_JMP+BPF_JA, 2),
401557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
401657718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
401757718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
401857718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
401957718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 1),
402057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
402157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 2),
402257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
402357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 3),
402457718be8SEnji Cooper };
402557718be8SEnji Cooper
402657718be8SEnji Cooper uint8_t pkt[1]; /* the program doesn't read any data */
402757718be8SEnji Cooper
402857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
402957718be8SEnji Cooper
403057718be8SEnji Cooper RZ(rump_init());
403157718be8SEnji Cooper
403257718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
403357718be8SEnji Cooper ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
403457718be8SEnji Cooper }
403557718be8SEnji Cooper
403657718be8SEnji Cooper ATF_TC(bpfjit_abc_ld_chain);
ATF_TC_HEAD(bpfjit_abc_ld_chain,tc)403757718be8SEnji Cooper ATF_TC_HEAD(bpfjit_abc_ld_chain, tc)
403857718be8SEnji Cooper {
403957718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
404057718be8SEnji Cooper "Test ABC optimization of a chain of BPF_LD instructions "
404157718be8SEnji Cooper "with exits leading to a single BPF_RET");
404257718be8SEnji Cooper }
404357718be8SEnji Cooper
ATF_TC_BODY(bpfjit_abc_ld_chain,tc)404457718be8SEnji Cooper ATF_TC_BODY(bpfjit_abc_ld_chain, tc)
404557718be8SEnji Cooper {
404657718be8SEnji Cooper static struct bpf_insn insns[] = {
404757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
404857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
404957718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
405057718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
405157718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
405257718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
405357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 123456789),
405457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 987654321),
405557718be8SEnji Cooper };
405657718be8SEnji Cooper
405757718be8SEnji Cooper bpfjit_func_t code;
405857718be8SEnji Cooper uint8_t pkt[10] = {};
405957718be8SEnji Cooper
406057718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
406157718be8SEnji Cooper
406257718be8SEnji Cooper RZ(rump_init());
406357718be8SEnji Cooper
406457718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
406557718be8SEnji Cooper
406657718be8SEnji Cooper rump_schedule();
406757718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
406857718be8SEnji Cooper rump_unschedule();
406957718be8SEnji Cooper ATF_REQUIRE(code != NULL);
407057718be8SEnji Cooper
407157718be8SEnji Cooper /* Packet is too short. */
407257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
407357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
407457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
407557718be8SEnji Cooper
407657718be8SEnji Cooper /* !(pkt[3] == 8) => return 123456789 */
407757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
407857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
407957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
408057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
408157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
408257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
408357718be8SEnji Cooper
408457718be8SEnji Cooper /* !(pkt[4:2] >= 7) => too short or return 123456789 */
408557718be8SEnji Cooper pkt[3] = 8;
408657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
408757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
408857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
408957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
409057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
409157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
409257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
409357718be8SEnji Cooper
409457718be8SEnji Cooper /* !(pkt[6:4] > 6) => too short or return 987654321 */
409557718be8SEnji Cooper pkt[4] = pkt[5] = 1;
409657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
409757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
409857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
409957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
410057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
410157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
410257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
410357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
410457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
410557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
410657718be8SEnji Cooper
410757718be8SEnji Cooper /* (pkt[6:4] > 6) => too short or return 123456789 */
410857718be8SEnji Cooper pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
410957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
411057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
411157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
411257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
411357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
411457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
411557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
411657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
411757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
411857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
411957718be8SEnji Cooper
412057718be8SEnji Cooper rump_schedule();
412157718be8SEnji Cooper rumpns_bpfjit_free_code(code);
412257718be8SEnji Cooper rump_unschedule();
412357718be8SEnji Cooper }
412457718be8SEnji Cooper
412557718be8SEnji Cooper ATF_TC(bpfjit_examples_1);
ATF_TC_HEAD(bpfjit_examples_1,tc)412657718be8SEnji Cooper ATF_TC_HEAD(bpfjit_examples_1, tc)
412757718be8SEnji Cooper {
412857718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
412957718be8SEnji Cooper "Test the first example from bpf(4) - "
413057718be8SEnji Cooper "accept Reverse ARP requests");
413157718be8SEnji Cooper }
413257718be8SEnji Cooper
ATF_TC_BODY(bpfjit_examples_1,tc)413357718be8SEnji Cooper ATF_TC_BODY(bpfjit_examples_1, tc)
413457718be8SEnji Cooper {
413557718be8SEnji Cooper /*
413657718be8SEnji Cooper * The following filter is taken from the Reverse ARP
413757718be8SEnji Cooper * Daemon. It accepts only Reverse ARP requests.
413857718be8SEnji Cooper */
413957718be8SEnji Cooper struct bpf_insn insns[] = {
414057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
414157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
414257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
414357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
414457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 42),
414557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
414657718be8SEnji Cooper };
414757718be8SEnji Cooper
414857718be8SEnji Cooper bpfjit_func_t code;
414957718be8SEnji Cooper uint8_t pkt[22] = {};
415057718be8SEnji Cooper
415157718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
415257718be8SEnji Cooper
415357718be8SEnji Cooper RZ(rump_init());
415457718be8SEnji Cooper
415557718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
415657718be8SEnji Cooper
415757718be8SEnji Cooper rump_schedule();
415857718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
415957718be8SEnji Cooper rump_unschedule();
416057718be8SEnji Cooper ATF_REQUIRE(code != NULL);
416157718be8SEnji Cooper
416257718be8SEnji Cooper /* Packet is too short. */
416357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
416457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
416557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
416657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
416757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
416857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
416957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
417057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
417157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
417257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
417357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
417457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
417557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
417657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
417757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
417857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
417957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
418057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
418157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
418257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
418357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
418457718be8SEnji Cooper
418557718be8SEnji Cooper /* The packet doesn't match. */
418657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
418757718be8SEnji Cooper
418857718be8SEnji Cooper /* Still no match after setting the protocol field. */
418957718be8SEnji Cooper pkt[12] = 0x80; pkt[13] = 0x35;
419057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
419157718be8SEnji Cooper
419257718be8SEnji Cooper /* Set RARP message type. */
419357718be8SEnji Cooper pkt[21] = 3;
419457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
419557718be8SEnji Cooper
419657718be8SEnji Cooper /* Packet is too short. */
419757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
419857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
419957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
420057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
420157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
420257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
420357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
420457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
420557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
420657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
420757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
420857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
420957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
421057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
421157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
421257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
421357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
421457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
421557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
421657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
421757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
421857718be8SEnji Cooper
421957718be8SEnji Cooper /* Change RARP message type. */
422057718be8SEnji Cooper pkt[20] = 3;
422157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
422257718be8SEnji Cooper
422357718be8SEnji Cooper rump_schedule();
422457718be8SEnji Cooper rumpns_bpfjit_free_code(code);
422557718be8SEnji Cooper rump_unschedule();
422657718be8SEnji Cooper }
422757718be8SEnji Cooper
422857718be8SEnji Cooper ATF_TC(bpfjit_examples_2);
ATF_TC_HEAD(bpfjit_examples_2,tc)422957718be8SEnji Cooper ATF_TC_HEAD(bpfjit_examples_2, tc)
423057718be8SEnji Cooper {
423157718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
423257718be8SEnji Cooper "Test the second example from bpf(4) - "
423357718be8SEnji Cooper "accept IP packets between two specified hosts");
423457718be8SEnji Cooper }
423557718be8SEnji Cooper
ATF_TC_BODY(bpfjit_examples_2,tc)423657718be8SEnji Cooper ATF_TC_BODY(bpfjit_examples_2, tc)
423757718be8SEnji Cooper {
423857718be8SEnji Cooper /*
423957718be8SEnji Cooper * This filter accepts only IP packets between host 128.3.112.15
424057718be8SEnji Cooper * and 128.3.112.35.
424157718be8SEnji Cooper */
424257718be8SEnji Cooper static struct bpf_insn insns[] = {
424357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
424457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
424557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
424657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
424757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
424857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
424957718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
425057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
425157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
425257718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
425357718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
425457718be8SEnji Cooper };
425557718be8SEnji Cooper
425657718be8SEnji Cooper bpfjit_func_t code;
425757718be8SEnji Cooper uint8_t pkt[34] = {};
425857718be8SEnji Cooper
425957718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
426057718be8SEnji Cooper
426157718be8SEnji Cooper RZ(rump_init());
426257718be8SEnji Cooper
426357718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
426457718be8SEnji Cooper
426557718be8SEnji Cooper rump_schedule();
426657718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
426757718be8SEnji Cooper rump_unschedule();
426857718be8SEnji Cooper ATF_REQUIRE(code != NULL);
426957718be8SEnji Cooper
427057718be8SEnji Cooper /* Packet is too short. */
427157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
427257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
427357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
427457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
427557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
427657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
427757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
427857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
427957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
428057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
428157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
428257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
428357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
428457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
428557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
428657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
428757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
428857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
428957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
429057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
429157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
429257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
429357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
429457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
429557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
429657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
429757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
429857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
429957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
430057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
430157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
430257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
430357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
430457718be8SEnji Cooper
430557718be8SEnji Cooper /* The packet doesn't match. */
430657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
430757718be8SEnji Cooper
430857718be8SEnji Cooper /* Still no match after setting the protocol field. */
430957718be8SEnji Cooper pkt[12] = 8;
431057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
431157718be8SEnji Cooper
431257718be8SEnji Cooper pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
431357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
431457718be8SEnji Cooper
431557718be8SEnji Cooper pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
431657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
431757718be8SEnji Cooper
431857718be8SEnji Cooper /* Swap the ip addresses. */
431957718be8SEnji Cooper pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
432057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
432157718be8SEnji Cooper
432257718be8SEnji Cooper pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
432357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
432457718be8SEnji Cooper
432557718be8SEnji Cooper /* Packet is too short. */
432657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
432757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
432857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
432957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
433057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
433157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
433257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
433357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
433457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
433557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
433657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
433757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
433857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
433957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
434057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
434157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
434257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
434357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
434457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
434557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
434657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
434757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
434857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
434957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
435057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
435157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
435257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
435357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
435457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
435557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
435657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
435757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
435857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
435957718be8SEnji Cooper
436057718be8SEnji Cooper /* Change the protocol field. */
436157718be8SEnji Cooper pkt[13] = 8;
436257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
436357718be8SEnji Cooper
436457718be8SEnji Cooper rump_schedule();
436557718be8SEnji Cooper rumpns_bpfjit_free_code(code);
436657718be8SEnji Cooper rump_unschedule();
436757718be8SEnji Cooper }
436857718be8SEnji Cooper
436957718be8SEnji Cooper ATF_TC(bpfjit_examples_3);
ATF_TC_HEAD(bpfjit_examples_3,tc)437057718be8SEnji Cooper ATF_TC_HEAD(bpfjit_examples_3, tc)
437157718be8SEnji Cooper {
437257718be8SEnji Cooper atf_tc_set_md_var(tc, "descr",
437357718be8SEnji Cooper "Test the third example from bpf(4) - "
437457718be8SEnji Cooper "accept TCP finger packets");
437557718be8SEnji Cooper }
437657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_examples_3,tc)437757718be8SEnji Cooper ATF_TC_BODY(bpfjit_examples_3, tc)
437857718be8SEnji Cooper {
437957718be8SEnji Cooper /*
438057718be8SEnji Cooper * This filter returns only TCP finger packets.
438157718be8SEnji Cooper */
438257718be8SEnji Cooper struct bpf_insn insns[] = {
438357718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
438457718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
438557718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
438657718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
438757718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
438857718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
438957718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
439057718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
439157718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
439257718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
439357718be8SEnji Cooper BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
439457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
439557718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 0),
439657718be8SEnji Cooper };
439757718be8SEnji Cooper
439857718be8SEnji Cooper bpfjit_func_t code;
439957718be8SEnji Cooper uint8_t pkt[30] = {};
440057718be8SEnji Cooper
440157718be8SEnji Cooper /* Set IP fragment offset to non-zero. */
440257718be8SEnji Cooper pkt[20] = 1; pkt[21] = 1;
440357718be8SEnji Cooper
440457718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
440557718be8SEnji Cooper
440657718be8SEnji Cooper RZ(rump_init());
440757718be8SEnji Cooper
440857718be8SEnji Cooper ATF_CHECK(prog_validate(insns, insn_count));
440957718be8SEnji Cooper
441057718be8SEnji Cooper rump_schedule();
441157718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
441257718be8SEnji Cooper rump_unschedule();
441357718be8SEnji Cooper ATF_REQUIRE(code != NULL);
441457718be8SEnji Cooper
441557718be8SEnji Cooper /* Packet is too short. */
441657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
441757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
441857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
441957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
442057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
442157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
442257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
442357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
442457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
442557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
442657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
442757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
442857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
442957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
443057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
443157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
443257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
443357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
443457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
443557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
443657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
443757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
443857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
443957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
444057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
444157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
444257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
444357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
444457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
444557718be8SEnji Cooper
444657718be8SEnji Cooper /* The packet doesn't match. */
444757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
444857718be8SEnji Cooper
444957718be8SEnji Cooper /* Still no match after setting the protocol field. */
445057718be8SEnji Cooper pkt[12] = 8;
445157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
445257718be8SEnji Cooper
445357718be8SEnji Cooper /* Get one step closer to the match. */
445457718be8SEnji Cooper pkt[23] = 6;
445557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
445657718be8SEnji Cooper
445757718be8SEnji Cooper /* Set IP fragment offset to zero. */
445857718be8SEnji Cooper pkt[20] = 0x20; pkt[21] = 0;
445957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
446057718be8SEnji Cooper
446157718be8SEnji Cooper /* Set IP header length to 12. */
446257718be8SEnji Cooper pkt[14] = 0xd3;
446357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
446457718be8SEnji Cooper
446557718be8SEnji Cooper /* Match one branch of the program. */
446657718be8SEnji Cooper pkt[27] = 79;
446757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
446857718be8SEnji Cooper
446957718be8SEnji Cooper /* Match the other branch of the program. */
447057718be8SEnji Cooper pkt[29] = 79; pkt[27] = 0;
447157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
447257718be8SEnji Cooper
447357718be8SEnji Cooper /* Packet is too short. */
447457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
447557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
447657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
447757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
447857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
447957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
448057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
448157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
448257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
448357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
448457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
448557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
448657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
448757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
448857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
448957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
449057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
449157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
449257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
449357718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
449457718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
449557718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
449657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
449757718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
449857718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
449957718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
450057718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
450157718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
450257718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
450357718be8SEnji Cooper
450457718be8SEnji Cooper /* Set IP header length to 16. Packet is too short. */
450557718be8SEnji Cooper pkt[14] = 4;
450657718be8SEnji Cooper ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
450757718be8SEnji Cooper
450857718be8SEnji Cooper rump_schedule();
450957718be8SEnji Cooper rumpns_bpfjit_free_code(code);
451057718be8SEnji Cooper rump_unschedule();
451157718be8SEnji Cooper }
451257718be8SEnji Cooper
451357718be8SEnji Cooper ATF_TC(bpfjit_cop_no_ctx);
ATF_TC_HEAD(bpfjit_cop_no_ctx,tc)451457718be8SEnji Cooper ATF_TC_HEAD(bpfjit_cop_no_ctx, tc)
451557718be8SEnji Cooper {
451657718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
451757718be8SEnji Cooper "instruction can't be accepted without a context");
451857718be8SEnji Cooper }
451957718be8SEnji Cooper
ATF_TC_BODY(bpfjit_cop_no_ctx,tc)452057718be8SEnji Cooper ATF_TC_BODY(bpfjit_cop_no_ctx, tc)
452157718be8SEnji Cooper {
452257718be8SEnji Cooper static struct bpf_insn insns[] = {
452357718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COP, 0),
452457718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
452557718be8SEnji Cooper };
452657718be8SEnji Cooper
452757718be8SEnji Cooper bpfjit_func_t code;
452857718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
452957718be8SEnji Cooper
453057718be8SEnji Cooper RZ(rump_init());
453157718be8SEnji Cooper
453257718be8SEnji Cooper ATF_CHECK(!prog_validate(insns, insn_count));
453357718be8SEnji Cooper
453457718be8SEnji Cooper rump_schedule();
453557718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
453657718be8SEnji Cooper rump_unschedule();
453757718be8SEnji Cooper ATF_CHECK(code == NULL);
453857718be8SEnji Cooper }
453957718be8SEnji Cooper
454057718be8SEnji Cooper ATF_TC(bpfjit_copx_no_ctx);
ATF_TC_HEAD(bpfjit_copx_no_ctx,tc)454157718be8SEnji Cooper ATF_TC_HEAD(bpfjit_copx_no_ctx, tc)
454257718be8SEnji Cooper {
454357718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
454457718be8SEnji Cooper "instruction can't be accepted without a context");
454557718be8SEnji Cooper }
454657718be8SEnji Cooper
ATF_TC_BODY(bpfjit_copx_no_ctx,tc)454757718be8SEnji Cooper ATF_TC_BODY(bpfjit_copx_no_ctx, tc)
454857718be8SEnji Cooper {
454957718be8SEnji Cooper static struct bpf_insn insns[] = {
455057718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COPX, 0),
455157718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_K, 7)
455257718be8SEnji Cooper };
455357718be8SEnji Cooper
455457718be8SEnji Cooper bpfjit_func_t code;
455557718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]);
455657718be8SEnji Cooper
455757718be8SEnji Cooper RZ(rump_init());
455857718be8SEnji Cooper
455957718be8SEnji Cooper ATF_CHECK(!prog_validate(insns, insn_count));
456057718be8SEnji Cooper
456157718be8SEnji Cooper rump_schedule();
456257718be8SEnji Cooper code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
456357718be8SEnji Cooper rump_unschedule();
456457718be8SEnji Cooper ATF_CHECK(code == NULL);
456557718be8SEnji Cooper }
456657718be8SEnji Cooper
ATF_TP_ADD_TCS(tp)456757718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
456857718be8SEnji Cooper {
456957718be8SEnji Cooper
457057718be8SEnji Cooper /*
457157718be8SEnji Cooper * For every new test please also add a similar test
457257718be8SEnji Cooper * to ../../lib/libbpfjit/t_bpfjit.c
457357718be8SEnji Cooper */
457457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_empty);
4575640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ret_k);
4576640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_bad_ret_k);
457757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
457857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
457957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
458057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
458157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
458257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
458357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
458457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
458557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
458657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
458757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
4588640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_k);
4589640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_k);
4590640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_k);
4591640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_k);
4592640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_k);
4593640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_k);
4594640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_k);
4595640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_k);
459657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
459757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
4598640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_xor_k);
459957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
460057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
460157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
460257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
460357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
460457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
460557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
460657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
460757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
460857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
460957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
461057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
461157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
461257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
461357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
461457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
4615640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_x);
4616640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_x);
4617640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_x);
4618640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_x);
4619640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_x);
4620640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_x);
4621640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_x);
4622640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_x);
462357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
462457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
4625640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_xor_x);
462657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
462757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
462857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
462957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
463057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
463157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
463257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
4633640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid);
4634640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_overflow);
463557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
463657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
463757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
463857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
463957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
464057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
464157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
464257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
464357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
4644640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_ax);
4645640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_a);
4646640235e2SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_x);
464757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
464857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
464957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
465057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
465157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
465257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
465357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
465457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_len);
465557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
465657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
465757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
465857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
465957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
466057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
466157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
466257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
466357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_st1);
466457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_st2);
466557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_st3);
466657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_st4);
466757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_st5);
466857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_stx1);
466957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_stx2);
467057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_stx3);
467157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_stx4);
467257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
467357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
467457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
467557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
467657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
467757718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
467857718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
467957718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_abc_ja);
468057718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_abc_ja_over);
468157718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_abc_ld_chain);
468257718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_examples_1);
468357718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_examples_2);
468457718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_examples_3);
468557718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_cop_no_ctx);
468657718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_copx_no_ctx);
468757718be8SEnji Cooper
468857718be8SEnji Cooper return atf_no_error();
468957718be8SEnji Cooper }
4690