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