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