t_bpfjit.c revision 1.10 1 1.10 alnsn /* $NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 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.10 alnsn __RCSID("$NetBSD: t_bpfjit.c,v 1.10 2015/02/14 20:25:08 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.10 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
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.10 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
2158 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2159 1.10 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2160 1.10 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
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, 4),
2164 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 5),
2165 1.10 alnsn BPF_STMT(BPF_RET+BPF_K, 6),
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, 7),
2169 1.10 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2170 1.10 alnsn BPF_STMT(BPF_RET+BPF_K, 8),
2171 1.10 alnsn BPF_STMT(BPF_RET+BPF_K, 9)
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.10 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 8);
2189 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 8);
2190 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 2);
2191 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 8);
2192 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 3);
2193 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 9);
2194 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 6);
2195 1.10 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 1);
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.9 alnsn ATF_TC(bpfjit_jmp_jeq_x_noinit_ax);
2266 1.9 alnsn ATF_TC_HEAD(bpfjit_jmp_jeq_x_noinit_ax, tc)
2267 1.7 alnsn {
2268 1.7 alnsn atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2269 1.9 alnsn "of BPF_JMP+BPF_EQ+BPF_X with uninitialised A and X");
2270 1.7 alnsn }
2271 1.7 alnsn
2272 1.9 alnsn ATF_TC_BODY(bpfjit_jmp_jeq_x_noinit_ax, tc)
2273 1.7 alnsn {
2274 1.7 alnsn static struct bpf_insn insns[] = {
2275 1.9 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2276 1.9 alnsn BPF_STMT(BPF_RET+BPF_K, 10),
2277 1.9 alnsn BPF_STMT(BPF_RET+BPF_K, 11)
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.8 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2288 1.7 alnsn
2289 1.7 alnsn rump_schedule();
2290 1.7 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2291 1.7 alnsn rump_unschedule();
2292 1.7 alnsn ATF_REQUIRE(code != NULL);
2293 1.7 alnsn
2294 1.8 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
2295 1.7 alnsn
2296 1.7 alnsn rump_schedule();
2297 1.7 alnsn rumpns_bpfjit_free_code(code);
2298 1.7 alnsn rump_unschedule();
2299 1.7 alnsn }
2300 1.7 alnsn
2301 1.2 alnsn ATF_TC(bpfjit_jmp_modulo_x);
2302 1.2 alnsn ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
2303 1.2 alnsn {
2304 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2305 1.2 alnsn "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
2306 1.2 alnsn }
2307 1.2 alnsn
2308 1.2 alnsn ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
2309 1.2 alnsn {
2310 1.2 alnsn static struct bpf_insn insns[] = {
2311 1.2 alnsn BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
2312 1.2 alnsn /* FFFFF770 << 4 = FFFFF770 */
2313 1.2 alnsn BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
2314 1.2 alnsn
2315 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2316 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2317 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
2318 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2319 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
2320 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2321 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2322 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
2323 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2324 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2325 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2326 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2327 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2328 1.2 alnsn BPF_STMT(BPF_JMP+BPF_JA, 1),
2329 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
2330 1.2 alnsn
2331 1.2 alnsn /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
2332 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
2333 1.2 alnsn
2334 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2335 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2336 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 4),
2337 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2338 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 5),
2339 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2340 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2341 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 6),
2342 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2343 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2344 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2345 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2346 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2347 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2348 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
2349 1.2 alnsn };
2350 1.2 alnsn
2351 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2352 1.2 alnsn
2353 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2354 1.2 alnsn
2355 1.2 alnsn RZ(rump_init());
2356 1.2 alnsn
2357 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2358 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2359 1.2 alnsn }
2360 1.2 alnsn
2361 1.2 alnsn ATF_TC(bpfjit_ld_abs);
2362 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_abs, tc)
2363 1.2 alnsn {
2364 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2365 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_ABS");
2366 1.2 alnsn }
2367 1.2 alnsn
2368 1.2 alnsn ATF_TC_BODY(bpfjit_ld_abs, tc)
2369 1.2 alnsn {
2370 1.2 alnsn static struct bpf_insn insns[3][2] = {
2371 1.2 alnsn {
2372 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
2373 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2374 1.2 alnsn },
2375 1.2 alnsn {
2376 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
2377 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2378 1.2 alnsn },
2379 1.2 alnsn {
2380 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
2381 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2382 1.2 alnsn }
2383 1.2 alnsn };
2384 1.2 alnsn
2385 1.2 alnsn static size_t lengths[3] = { 1, 2, 4 };
2386 1.2 alnsn static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
2387 1.2 alnsn
2388 1.2 alnsn size_t i, l;
2389 1.2 alnsn uint8_t *pkt = deadbeef_at_5;
2390 1.2 alnsn size_t pktsize = sizeof(deadbeef_at_5);
2391 1.2 alnsn
2392 1.2 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2393 1.2 alnsn
2394 1.2 alnsn RZ(rump_init());
2395 1.2 alnsn
2396 1.2 alnsn for (i = 0; i < 3; i++) {
2397 1.2 alnsn bpfjit_func_t code;
2398 1.2 alnsn
2399 1.2 alnsn ATF_CHECK(prog_validate(insns[i], insn_count));
2400 1.2 alnsn
2401 1.2 alnsn rump_schedule();
2402 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
2403 1.2 alnsn rump_unschedule();
2404 1.2 alnsn ATF_REQUIRE(code != NULL);
2405 1.2 alnsn
2406 1.2 alnsn for (l = 1; l < 5 + lengths[i]; l++) {
2407 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2408 1.2 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2409 1.2 alnsn }
2410 1.2 alnsn
2411 1.2 alnsn l = 5 + lengths[i];
2412 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2413 1.2 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2414 1.2 alnsn
2415 1.2 alnsn l = pktsize;
2416 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2417 1.2 alnsn
2418 1.2 alnsn rump_schedule();
2419 1.2 alnsn rumpns_bpfjit_free_code(code);
2420 1.2 alnsn rump_unschedule();
2421 1.2 alnsn }
2422 1.2 alnsn }
2423 1.2 alnsn
2424 1.2 alnsn ATF_TC(bpfjit_ld_abs_k_overflow);
2425 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
2426 1.2 alnsn {
2427 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2428 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
2429 1.2 alnsn }
2430 1.2 alnsn
2431 1.2 alnsn ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
2432 1.2 alnsn {
2433 1.2 alnsn static struct bpf_insn insns[12][3] = {
2434 1.2 alnsn {
2435 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2436 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2437 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2438 1.2 alnsn },
2439 1.2 alnsn {
2440 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2441 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2442 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2443 1.2 alnsn },
2444 1.2 alnsn {
2445 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2446 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2447 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2448 1.2 alnsn },
2449 1.2 alnsn {
2450 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2451 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2452 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2453 1.2 alnsn },
2454 1.2 alnsn {
2455 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2456 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2457 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2458 1.2 alnsn },
2459 1.2 alnsn {
2460 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2461 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2462 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2463 1.2 alnsn },
2464 1.2 alnsn {
2465 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2466 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2467 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2468 1.2 alnsn },
2469 1.2 alnsn {
2470 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2471 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2472 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2473 1.2 alnsn },
2474 1.2 alnsn {
2475 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2476 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2477 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2478 1.2 alnsn },
2479 1.2 alnsn {
2480 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2481 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2482 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2483 1.2 alnsn },
2484 1.2 alnsn {
2485 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2486 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2487 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2488 1.2 alnsn },
2489 1.2 alnsn {
2490 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2491 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2492 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2493 1.2 alnsn }
2494 1.2 alnsn };
2495 1.2 alnsn
2496 1.2 alnsn int i;
2497 1.2 alnsn uint8_t pkt[8] = { 0 };
2498 1.2 alnsn
2499 1.2 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2500 1.2 alnsn
2501 1.2 alnsn RZ(rump_init());
2502 1.2 alnsn
2503 1.2 alnsn for (i = 0; i < 3; i++) {
2504 1.2 alnsn ATF_CHECK(prog_validate(insns[i], insn_count));
2505 1.2 alnsn ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
2506 1.2 alnsn }
2507 1.2 alnsn }
2508 1.2 alnsn
2509 1.2 alnsn ATF_TC(bpfjit_ld_ind);
2510 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_ind, tc)
2511 1.2 alnsn {
2512 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2513 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_IND");
2514 1.2 alnsn }
2515 1.2 alnsn
2516 1.2 alnsn ATF_TC_BODY(bpfjit_ld_ind, tc)
2517 1.2 alnsn {
2518 1.2 alnsn static struct bpf_insn insns[6][3] = {
2519 1.2 alnsn {
2520 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2521 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2522 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2523 1.2 alnsn },
2524 1.2 alnsn {
2525 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2526 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2527 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2528 1.2 alnsn },
2529 1.2 alnsn {
2530 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2531 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2532 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2533 1.2 alnsn },
2534 1.2 alnsn {
2535 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2536 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2537 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2538 1.2 alnsn },
2539 1.2 alnsn {
2540 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2541 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2542 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2543 1.2 alnsn },
2544 1.2 alnsn {
2545 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2546 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2547 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2548 1.2 alnsn }
2549 1.2 alnsn };
2550 1.2 alnsn
2551 1.2 alnsn static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2552 1.2 alnsn
2553 1.2 alnsn static unsigned int expected[6] = {
2554 1.2 alnsn 0xde, 0xdead, 0xdeadbeef,
2555 1.2 alnsn 0xde, 0xdead, 0xdeadbeef
2556 1.2 alnsn };
2557 1.2 alnsn
2558 1.2 alnsn size_t i, l;
2559 1.2 alnsn uint8_t *pkt = deadbeef_at_5;
2560 1.2 alnsn size_t pktsize = sizeof(deadbeef_at_5);
2561 1.2 alnsn
2562 1.2 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2563 1.2 alnsn
2564 1.2 alnsn RZ(rump_init());
2565 1.2 alnsn
2566 1.2 alnsn for (i = 0; i < 3; i++) {
2567 1.2 alnsn bpfjit_func_t code;
2568 1.2 alnsn
2569 1.2 alnsn ATF_CHECK(prog_validate(insns[i], insn_count));
2570 1.2 alnsn
2571 1.2 alnsn rump_schedule();
2572 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns[i], insn_count);
2573 1.2 alnsn rump_unschedule();
2574 1.2 alnsn ATF_REQUIRE(code != NULL);
2575 1.2 alnsn
2576 1.2 alnsn for (l = 1; l < 5 + lengths[i]; l++) {
2577 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2578 1.2 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2579 1.2 alnsn }
2580 1.2 alnsn
2581 1.2 alnsn l = 5 + lengths[i];
2582 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2583 1.2 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2584 1.2 alnsn
2585 1.2 alnsn l = pktsize;
2586 1.2 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2587 1.2 alnsn
2588 1.2 alnsn rump_schedule();
2589 1.2 alnsn rumpns_bpfjit_free_code(code);
2590 1.2 alnsn rump_unschedule();
2591 1.2 alnsn }
2592 1.2 alnsn }
2593 1.2 alnsn
2594 1.2 alnsn ATF_TC(bpfjit_ld_ind_k_overflow);
2595 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
2596 1.2 alnsn {
2597 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2598 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2599 1.2 alnsn }
2600 1.2 alnsn
2601 1.2 alnsn ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
2602 1.2 alnsn {
2603 1.2 alnsn static struct bpf_insn insns[12][3] = {
2604 1.2 alnsn {
2605 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2606 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2607 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2608 1.2 alnsn },
2609 1.2 alnsn {
2610 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2611 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2612 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2613 1.2 alnsn },
2614 1.2 alnsn {
2615 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2616 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2617 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2618 1.2 alnsn },
2619 1.2 alnsn {
2620 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2621 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2622 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2623 1.2 alnsn },
2624 1.2 alnsn {
2625 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2626 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2627 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2628 1.2 alnsn },
2629 1.2 alnsn {
2630 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2631 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2632 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2633 1.2 alnsn },
2634 1.2 alnsn {
2635 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2636 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2637 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2638 1.2 alnsn },
2639 1.2 alnsn {
2640 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2641 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2642 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2643 1.2 alnsn },
2644 1.2 alnsn {
2645 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2646 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2647 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2648 1.2 alnsn },
2649 1.2 alnsn {
2650 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2651 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2652 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2653 1.2 alnsn },
2654 1.2 alnsn {
2655 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2656 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2657 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2658 1.2 alnsn },
2659 1.2 alnsn {
2660 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2661 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2662 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2663 1.2 alnsn }
2664 1.2 alnsn };
2665 1.2 alnsn
2666 1.2 alnsn int i;
2667 1.2 alnsn uint8_t pkt[8] = { 0 };
2668 1.2 alnsn
2669 1.2 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2670 1.2 alnsn
2671 1.2 alnsn RZ(rump_init());
2672 1.2 alnsn
2673 1.2 alnsn for (i = 0; i < 3; i++) {
2674 1.2 alnsn
2675 1.2 alnsn ATF_CHECK(prog_validate(insns[i], insn_count));
2676 1.2 alnsn ATF_CHECK(exec_prog(insns[i], insn_count, pkt, 8) == 0);
2677 1.2 alnsn }
2678 1.2 alnsn }
2679 1.2 alnsn
2680 1.2 alnsn ATF_TC(bpfjit_ld_ind_x_overflow1);
2681 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2682 1.2 alnsn {
2683 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2684 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2685 1.2 alnsn }
2686 1.2 alnsn
2687 1.2 alnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2688 1.2 alnsn {
2689 1.2 alnsn static struct bpf_insn insns[] = {
2690 1.2 alnsn BPF_STMT(BPF_LD+BPF_LEN, 0),
2691 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2692 1.2 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0),
2693 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2694 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2695 1.2 alnsn };
2696 1.2 alnsn
2697 1.2 alnsn size_t i;
2698 1.2 alnsn bpfjit_func_t code;
2699 1.2 alnsn uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2700 1.2 alnsn
2701 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2702 1.2 alnsn
2703 1.2 alnsn RZ(rump_init());
2704 1.2 alnsn
2705 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2706 1.2 alnsn
2707 1.2 alnsn rump_schedule();
2708 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2709 1.2 alnsn rump_unschedule();
2710 1.2 alnsn ATF_REQUIRE(code != NULL);
2711 1.2 alnsn
2712 1.2 alnsn for (i = 1; i <= sizeof(pkt); i++) {
2713 1.2 alnsn //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2714 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2715 1.2 alnsn }
2716 1.2 alnsn
2717 1.2 alnsn rump_schedule();
2718 1.2 alnsn rumpns_bpfjit_free_code(code);
2719 1.2 alnsn rump_unschedule();
2720 1.2 alnsn }
2721 1.2 alnsn
2722 1.2 alnsn ATF_TC(bpfjit_ld_ind_x_overflow2);
2723 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2724 1.2 alnsn {
2725 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2726 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2727 1.2 alnsn }
2728 1.2 alnsn
2729 1.2 alnsn ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2730 1.2 alnsn {
2731 1.2 alnsn static struct bpf_insn insns[] = {
2732 1.2 alnsn BPF_STMT(BPF_LD+BPF_LEN, 0),
2733 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2734 1.2 alnsn BPF_STMT(BPF_ST, 3),
2735 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2736 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2737 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2738 1.2 alnsn };
2739 1.2 alnsn
2740 1.2 alnsn size_t i;
2741 1.2 alnsn bpfjit_func_t code;
2742 1.2 alnsn uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2743 1.2 alnsn
2744 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2745 1.2 alnsn
2746 1.2 alnsn RZ(rump_init());
2747 1.2 alnsn
2748 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2749 1.2 alnsn
2750 1.2 alnsn rump_schedule();
2751 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2752 1.2 alnsn rump_unschedule();
2753 1.2 alnsn ATF_REQUIRE(code != NULL);
2754 1.2 alnsn
2755 1.2 alnsn for (i = 1; i <= sizeof(pkt); i++) {
2756 1.2 alnsn //ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2757 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2758 1.2 alnsn }
2759 1.2 alnsn
2760 1.2 alnsn rump_schedule();
2761 1.2 alnsn rumpns_bpfjit_free_code(code);
2762 1.2 alnsn rump_unschedule();
2763 1.2 alnsn }
2764 1.2 alnsn
2765 1.2 alnsn ATF_TC(bpfjit_ld_len);
2766 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_len, tc)
2767 1.2 alnsn {
2768 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2769 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2770 1.2 alnsn }
2771 1.2 alnsn
2772 1.2 alnsn ATF_TC_BODY(bpfjit_ld_len, tc)
2773 1.2 alnsn {
2774 1.2 alnsn static struct bpf_insn insns[] = {
2775 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2776 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2777 1.2 alnsn };
2778 1.2 alnsn
2779 1.2 alnsn size_t i;
2780 1.2 alnsn bpfjit_func_t code;
2781 1.2 alnsn uint8_t pkt[32]; /* the program doesn't read any data */
2782 1.2 alnsn
2783 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2784 1.2 alnsn
2785 1.2 alnsn RZ(rump_init());
2786 1.2 alnsn
2787 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2788 1.2 alnsn
2789 1.2 alnsn rump_schedule();
2790 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2791 1.2 alnsn rump_unschedule();
2792 1.2 alnsn ATF_REQUIRE(code != NULL);
2793 1.2 alnsn
2794 1.2 alnsn for (i = 0; i < sizeof(pkt); i++)
2795 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2796 1.2 alnsn
2797 1.2 alnsn rump_schedule();
2798 1.2 alnsn rumpns_bpfjit_free_code(code);
2799 1.2 alnsn rump_unschedule();
2800 1.2 alnsn }
2801 1.2 alnsn
2802 1.2 alnsn ATF_TC(bpfjit_ld_imm);
2803 1.2 alnsn ATF_TC_HEAD(bpfjit_ld_imm, tc)
2804 1.2 alnsn {
2805 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2806 1.2 alnsn "Test JIT compilation of BPF_LD+BPF_IMM");
2807 1.2 alnsn }
2808 1.2 alnsn
2809 1.2 alnsn ATF_TC_BODY(bpfjit_ld_imm, tc)
2810 1.2 alnsn {
2811 1.2 alnsn static struct bpf_insn insns[] = {
2812 1.2 alnsn BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2813 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2814 1.2 alnsn };
2815 1.2 alnsn
2816 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2817 1.2 alnsn
2818 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2819 1.2 alnsn
2820 1.2 alnsn RZ(rump_init());
2821 1.2 alnsn
2822 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2823 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2824 1.2 alnsn }
2825 1.2 alnsn
2826 1.2 alnsn ATF_TC(bpfjit_ldx_imm1);
2827 1.2 alnsn ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2828 1.2 alnsn {
2829 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2830 1.2 alnsn "Test JIT compilation of BPF_LDX+BPF_IMM");
2831 1.2 alnsn }
2832 1.2 alnsn
2833 1.2 alnsn ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2834 1.2 alnsn {
2835 1.2 alnsn static struct bpf_insn insns[] = {
2836 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2837 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2838 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2839 1.2 alnsn };
2840 1.2 alnsn
2841 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2842 1.2 alnsn
2843 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2844 1.2 alnsn
2845 1.2 alnsn RZ(rump_init());
2846 1.2 alnsn
2847 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2848 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX - 5);
2849 1.2 alnsn }
2850 1.2 alnsn
2851 1.2 alnsn ATF_TC(bpfjit_ldx_imm2);
2852 1.2 alnsn ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2853 1.2 alnsn {
2854 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2855 1.2 alnsn "Test JIT compilation of BPF_LDX+BPF_IMM");
2856 1.2 alnsn }
2857 1.2 alnsn
2858 1.2 alnsn ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2859 1.2 alnsn {
2860 1.2 alnsn static struct bpf_insn insns[] = {
2861 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2862 1.2 alnsn BPF_STMT(BPF_LD+BPF_IMM, 5),
2863 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2864 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 7),
2865 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2866 1.2 alnsn };
2867 1.2 alnsn
2868 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2869 1.2 alnsn
2870 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2871 1.2 alnsn
2872 1.2 alnsn RZ(rump_init());
2873 1.2 alnsn
2874 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2875 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
2876 1.2 alnsn }
2877 1.2 alnsn
2878 1.2 alnsn ATF_TC(bpfjit_ldx_len1);
2879 1.2 alnsn ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2880 1.2 alnsn {
2881 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2882 1.2 alnsn "Test JIT compilation of BPF_LDX+BPF_LEN");
2883 1.2 alnsn }
2884 1.2 alnsn
2885 1.2 alnsn ATF_TC_BODY(bpfjit_ldx_len1, tc)
2886 1.2 alnsn {
2887 1.2 alnsn static struct bpf_insn insns[] = {
2888 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2889 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2890 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2891 1.2 alnsn };
2892 1.2 alnsn
2893 1.2 alnsn size_t i;
2894 1.2 alnsn bpfjit_func_t code;
2895 1.2 alnsn uint8_t pkt[5]; /* the program doesn't read any data */
2896 1.2 alnsn
2897 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2898 1.2 alnsn
2899 1.2 alnsn RZ(rump_init());
2900 1.2 alnsn
2901 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2902 1.2 alnsn
2903 1.2 alnsn rump_schedule();
2904 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2905 1.2 alnsn rump_unschedule();
2906 1.2 alnsn ATF_REQUIRE(code != NULL);
2907 1.2 alnsn
2908 1.2 alnsn for (i = 1; i < sizeof(pkt); i++) {
2909 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2910 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
2911 1.2 alnsn }
2912 1.2 alnsn
2913 1.2 alnsn rump_schedule();
2914 1.2 alnsn rumpns_bpfjit_free_code(code);
2915 1.2 alnsn rump_unschedule();
2916 1.2 alnsn }
2917 1.2 alnsn
2918 1.2 alnsn ATF_TC(bpfjit_ldx_len2);
2919 1.2 alnsn ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2920 1.2 alnsn {
2921 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2922 1.2 alnsn "Test JIT compilation of BPF_LDX+BPF_LEN");
2923 1.2 alnsn }
2924 1.2 alnsn
2925 1.2 alnsn ATF_TC_BODY(bpfjit_ldx_len2, tc)
2926 1.2 alnsn {
2927 1.2 alnsn static struct bpf_insn insns[] = {
2928 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2929 1.2 alnsn BPF_STMT(BPF_LD+BPF_IMM, 5),
2930 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2931 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 7),
2932 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2933 1.2 alnsn };
2934 1.2 alnsn
2935 1.2 alnsn bpfjit_func_t code;
2936 1.2 alnsn uint8_t pkt[5]; /* the program doesn't read any data */
2937 1.2 alnsn
2938 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2939 1.2 alnsn
2940 1.2 alnsn RZ(rump_init());
2941 1.2 alnsn
2942 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2943 1.2 alnsn
2944 1.2 alnsn rump_schedule();
2945 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
2946 1.2 alnsn rump_unschedule();
2947 1.2 alnsn ATF_REQUIRE(code != NULL);
2948 1.2 alnsn
2949 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
2950 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
2951 1.2 alnsn
2952 1.2 alnsn rump_schedule();
2953 1.2 alnsn rumpns_bpfjit_free_code(code);
2954 1.2 alnsn rump_unschedule();
2955 1.2 alnsn }
2956 1.2 alnsn
2957 1.2 alnsn ATF_TC(bpfjit_ldx_msh);
2958 1.2 alnsn ATF_TC_HEAD(bpfjit_ldx_msh, tc)
2959 1.2 alnsn {
2960 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2961 1.2 alnsn "Test JIT compilation of BPF_LDX+BPF_MSH");
2962 1.2 alnsn }
2963 1.2 alnsn
2964 1.2 alnsn ATF_TC_BODY(bpfjit_ldx_msh, tc)
2965 1.2 alnsn {
2966 1.2 alnsn static struct bpf_insn insns[] = {
2967 1.2 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2968 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2969 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2970 1.2 alnsn };
2971 1.2 alnsn
2972 1.2 alnsn uint8_t pkt[2] = { 0, 0x7a };
2973 1.2 alnsn
2974 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2975 1.2 alnsn
2976 1.2 alnsn RZ(rump_init());
2977 1.2 alnsn
2978 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
2979 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 2) == 40);
2980 1.2 alnsn }
2981 1.2 alnsn
2982 1.2 alnsn ATF_TC(bpfjit_misc_tax);
2983 1.2 alnsn ATF_TC_HEAD(bpfjit_misc_tax, tc)
2984 1.2 alnsn {
2985 1.2 alnsn atf_tc_set_md_var(tc, "descr",
2986 1.2 alnsn "Test JIT compilation of BPF_MISC+BPF_TAX");
2987 1.2 alnsn }
2988 1.2 alnsn
2989 1.2 alnsn ATF_TC_BODY(bpfjit_misc_tax, tc)
2990 1.2 alnsn {
2991 1.2 alnsn static struct bpf_insn insns[] = {
2992 1.2 alnsn BPF_STMT(BPF_LD+BPF_IMM, 3),
2993 1.2 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0),
2994 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2995 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2996 1.2 alnsn };
2997 1.2 alnsn
2998 1.2 alnsn uint8_t pkt[6] = { 0, 11, 22, 33, 44, 55 };
2999 1.2 alnsn
3000 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3001 1.2 alnsn
3002 1.2 alnsn RZ(rump_init());
3003 1.2 alnsn
3004 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3005 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 6) == 55);
3006 1.2 alnsn }
3007 1.2 alnsn
3008 1.2 alnsn ATF_TC(bpfjit_misc_txa);
3009 1.2 alnsn ATF_TC_HEAD(bpfjit_misc_txa, tc)
3010 1.2 alnsn {
3011 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3012 1.2 alnsn "Test JIT compilation of BPF_MISC+BPF_TXA");
3013 1.2 alnsn }
3014 1.2 alnsn
3015 1.2 alnsn ATF_TC_BODY(bpfjit_misc_txa, tc)
3016 1.2 alnsn {
3017 1.2 alnsn static struct bpf_insn insns[] = {
3018 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
3019 1.2 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
3020 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3021 1.2 alnsn };
3022 1.2 alnsn
3023 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3024 1.2 alnsn
3025 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3026 1.2 alnsn
3027 1.2 alnsn RZ(rump_init());
3028 1.2 alnsn
3029 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3030 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 391);
3031 1.2 alnsn }
3032 1.2 alnsn
3033 1.2 alnsn ATF_TC(bpfjit_st1);
3034 1.2 alnsn ATF_TC_HEAD(bpfjit_st1, tc)
3035 1.2 alnsn {
3036 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3037 1.2 alnsn "Test JIT compilation of BPF_ST");
3038 1.2 alnsn }
3039 1.2 alnsn
3040 1.2 alnsn ATF_TC_BODY(bpfjit_st1, tc)
3041 1.2 alnsn {
3042 1.2 alnsn static struct bpf_insn insns[] = {
3043 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3044 1.2 alnsn BPF_STMT(BPF_ST, 0),
3045 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
3046 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3047 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3048 1.2 alnsn };
3049 1.2 alnsn
3050 1.2 alnsn size_t i;
3051 1.2 alnsn bpfjit_func_t code;
3052 1.2 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3053 1.2 alnsn
3054 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3055 1.2 alnsn
3056 1.2 alnsn RZ(rump_init());
3057 1.2 alnsn
3058 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3059 1.2 alnsn
3060 1.2 alnsn rump_schedule();
3061 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3062 1.2 alnsn rump_unschedule();
3063 1.2 alnsn ATF_REQUIRE(code != NULL);
3064 1.2 alnsn
3065 1.2 alnsn for (i = 1; i <= sizeof(pkt); i++)
3066 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3067 1.2 alnsn
3068 1.2 alnsn rump_schedule();
3069 1.2 alnsn rumpns_bpfjit_free_code(code);
3070 1.2 alnsn rump_unschedule();
3071 1.2 alnsn }
3072 1.2 alnsn
3073 1.2 alnsn ATF_TC(bpfjit_st2);
3074 1.2 alnsn ATF_TC_HEAD(bpfjit_st2, tc)
3075 1.2 alnsn {
3076 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3077 1.2 alnsn "Test JIT compilation of BPF_ST");
3078 1.2 alnsn }
3079 1.2 alnsn
3080 1.2 alnsn ATF_TC_BODY(bpfjit_st2, tc)
3081 1.2 alnsn {
3082 1.2 alnsn static struct bpf_insn insns[] = {
3083 1.2 alnsn BPF_STMT(BPF_ST, 0),
3084 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3085 1.2 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3086 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3087 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3088 1.2 alnsn };
3089 1.2 alnsn
3090 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3091 1.2 alnsn
3092 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3093 1.2 alnsn
3094 1.2 alnsn RZ(rump_init());
3095 1.2 alnsn
3096 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3097 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
3098 1.2 alnsn }
3099 1.2 alnsn
3100 1.2 alnsn ATF_TC(bpfjit_st3);
3101 1.2 alnsn ATF_TC_HEAD(bpfjit_st3, tc)
3102 1.2 alnsn {
3103 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3104 1.2 alnsn "Test JIT compilation of BPF_ST");
3105 1.2 alnsn }
3106 1.2 alnsn
3107 1.2 alnsn ATF_TC_BODY(bpfjit_st3, tc)
3108 1.2 alnsn {
3109 1.2 alnsn static struct bpf_insn insns[] = {
3110 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3111 1.2 alnsn BPF_STMT(BPF_ST, 0),
3112 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3113 1.2 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3114 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3115 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3116 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3117 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
3118 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3119 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3120 1.2 alnsn };
3121 1.2 alnsn
3122 1.2 alnsn bpfjit_func_t code;
3123 1.2 alnsn uint8_t pkt[2]; /* the program doesn't read any data */
3124 1.2 alnsn
3125 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3126 1.2 alnsn
3127 1.2 alnsn ATF_REQUIRE(BPF_MEMWORDS > 1);
3128 1.2 alnsn
3129 1.2 alnsn RZ(rump_init());
3130 1.2 alnsn
3131 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3132 1.2 alnsn
3133 1.2 alnsn rump_schedule();
3134 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3135 1.2 alnsn rump_unschedule();
3136 1.2 alnsn ATF_REQUIRE(code != NULL);
3137 1.2 alnsn
3138 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3139 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3140 1.2 alnsn
3141 1.2 alnsn rump_schedule();
3142 1.2 alnsn rumpns_bpfjit_free_code(code);
3143 1.2 alnsn rump_unschedule();
3144 1.2 alnsn }
3145 1.2 alnsn
3146 1.2 alnsn ATF_TC(bpfjit_st4);
3147 1.2 alnsn ATF_TC_HEAD(bpfjit_st4, tc)
3148 1.2 alnsn {
3149 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3150 1.2 alnsn "Test JIT compilation of BPF_ST");
3151 1.2 alnsn }
3152 1.2 alnsn
3153 1.2 alnsn ATF_TC_BODY(bpfjit_st4, tc)
3154 1.2 alnsn {
3155 1.2 alnsn static struct bpf_insn insns[] = {
3156 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3157 1.2 alnsn BPF_STMT(BPF_ST, 5),
3158 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3159 1.2 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3160 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3161 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3162 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3163 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
3164 1.2 alnsn BPF_STMT(BPF_LD+BPF_MEM, 5),
3165 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3166 1.2 alnsn };
3167 1.2 alnsn
3168 1.2 alnsn bpfjit_func_t code;
3169 1.2 alnsn uint8_t pkt[2]; /* the program doesn't read any data */
3170 1.2 alnsn
3171 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3172 1.2 alnsn
3173 1.2 alnsn ATF_REQUIRE(BPF_MEMWORDS > 6);
3174 1.2 alnsn
3175 1.2 alnsn RZ(rump_init());
3176 1.2 alnsn
3177 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3178 1.2 alnsn
3179 1.2 alnsn rump_schedule();
3180 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3181 1.2 alnsn rump_unschedule();
3182 1.2 alnsn ATF_REQUIRE(code != NULL);
3183 1.2 alnsn
3184 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3185 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3186 1.2 alnsn
3187 1.2 alnsn rump_schedule();
3188 1.2 alnsn rumpns_bpfjit_free_code(code);
3189 1.2 alnsn rump_unschedule();
3190 1.2 alnsn }
3191 1.2 alnsn
3192 1.2 alnsn ATF_TC(bpfjit_st5);
3193 1.2 alnsn ATF_TC_HEAD(bpfjit_st5, tc)
3194 1.2 alnsn {
3195 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3196 1.2 alnsn "Test JIT compilation of BPF_ST");
3197 1.2 alnsn }
3198 1.2 alnsn
3199 1.2 alnsn ATF_TC_BODY(bpfjit_st5, tc)
3200 1.2 alnsn {
3201 1.2 alnsn struct bpf_insn insns[5*BPF_MEMWORDS+2];
3202 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3203 1.2 alnsn
3204 1.2 alnsn size_t k;
3205 1.2 alnsn bpfjit_func_t code;
3206 1.2 alnsn uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3207 1.2 alnsn
3208 1.2 alnsn memset(insns, 0, sizeof(insns));
3209 1.2 alnsn
3210 1.2 alnsn /* for each k do M[k] = k */
3211 1.2 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3212 1.2 alnsn insns[2*k].code = BPF_LD+BPF_IMM;
3213 1.2 alnsn insns[2*k].k = 3*k;
3214 1.2 alnsn insns[2*k+1].code = BPF_ST;
3215 1.2 alnsn insns[2*k+1].k = k;
3216 1.2 alnsn }
3217 1.2 alnsn
3218 1.2 alnsn /* load wirelen into A */
3219 1.2 alnsn insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3220 1.2 alnsn
3221 1.2 alnsn /* for each k, if (A == k + 1) return M[k] */
3222 1.2 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3223 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3224 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
3225 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
3226 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
3227 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3228 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+2].k = k;
3229 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3230 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+3].k = 0;
3231 1.2 alnsn }
3232 1.2 alnsn
3233 1.2 alnsn insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3234 1.2 alnsn insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
3235 1.2 alnsn
3236 1.2 alnsn RZ(rump_init());
3237 1.2 alnsn
3238 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3239 1.2 alnsn
3240 1.2 alnsn rump_schedule();
3241 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3242 1.2 alnsn rump_unschedule();
3243 1.2 alnsn ATF_REQUIRE(code != NULL);
3244 1.2 alnsn
3245 1.2 alnsn for (k = 1; k <= sizeof(pkt); k++)
3246 1.2 alnsn ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3247 1.2 alnsn
3248 1.2 alnsn rump_schedule();
3249 1.2 alnsn rumpns_bpfjit_free_code(code);
3250 1.2 alnsn rump_unschedule();
3251 1.2 alnsn }
3252 1.2 alnsn
3253 1.2 alnsn ATF_TC(bpfjit_stx1);
3254 1.2 alnsn ATF_TC_HEAD(bpfjit_stx1, tc)
3255 1.2 alnsn {
3256 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3257 1.2 alnsn "Test JIT compilation of BPF_STX");
3258 1.2 alnsn }
3259 1.2 alnsn
3260 1.2 alnsn ATF_TC_BODY(bpfjit_stx1, tc)
3261 1.2 alnsn {
3262 1.2 alnsn static struct bpf_insn insns[] = {
3263 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3264 1.2 alnsn BPF_STMT(BPF_STX, 0),
3265 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3266 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3267 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3268 1.2 alnsn };
3269 1.2 alnsn
3270 1.2 alnsn size_t i;
3271 1.2 alnsn bpfjit_func_t code;
3272 1.2 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3273 1.2 alnsn
3274 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3275 1.2 alnsn
3276 1.2 alnsn RZ(rump_init());
3277 1.2 alnsn
3278 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3279 1.2 alnsn
3280 1.2 alnsn rump_schedule();
3281 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3282 1.2 alnsn rump_unschedule();
3283 1.2 alnsn ATF_REQUIRE(code != NULL);
3284 1.2 alnsn
3285 1.2 alnsn for (i = 1; i <= sizeof(pkt); i++)
3286 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3287 1.2 alnsn
3288 1.2 alnsn rump_schedule();
3289 1.2 alnsn rumpns_bpfjit_free_code(code);
3290 1.2 alnsn rump_unschedule();
3291 1.2 alnsn }
3292 1.2 alnsn
3293 1.2 alnsn ATF_TC(bpfjit_stx2);
3294 1.2 alnsn ATF_TC_HEAD(bpfjit_stx2, tc)
3295 1.2 alnsn {
3296 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3297 1.2 alnsn "Test JIT compilation of BPF_STX");
3298 1.2 alnsn }
3299 1.2 alnsn
3300 1.2 alnsn ATF_TC_BODY(bpfjit_stx2, tc)
3301 1.2 alnsn {
3302 1.2 alnsn static struct bpf_insn insns[] = {
3303 1.2 alnsn BPF_STMT(BPF_ST, 0),
3304 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3305 1.2 alnsn BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
3306 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3307 1.2 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
3308 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3309 1.2 alnsn };
3310 1.2 alnsn
3311 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3312 1.2 alnsn
3313 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3314 1.2 alnsn
3315 1.2 alnsn RZ(rump_init());
3316 1.2 alnsn
3317 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3318 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == 0);
3319 1.2 alnsn }
3320 1.2 alnsn
3321 1.2 alnsn ATF_TC(bpfjit_stx3);
3322 1.2 alnsn ATF_TC_HEAD(bpfjit_stx3, tc)
3323 1.2 alnsn {
3324 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3325 1.2 alnsn "Test JIT compilation of BPF_STX");
3326 1.2 alnsn }
3327 1.2 alnsn
3328 1.2 alnsn ATF_TC_BODY(bpfjit_stx3, tc)
3329 1.2 alnsn {
3330 1.2 alnsn static struct bpf_insn insns[] = {
3331 1.2 alnsn BPF_STMT(BPF_STX, 6),
3332 1.2 alnsn BPF_STMT(BPF_ST, 1),
3333 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3334 1.2 alnsn BPF_STMT(BPF_STX, 5),
3335 1.2 alnsn BPF_STMT(BPF_STX, 2),
3336 1.2 alnsn BPF_STMT(BPF_STX, 3),
3337 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
3338 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3339 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
3340 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3341 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
3342 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3343 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
3344 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3345 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
3346 1.2 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3347 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3348 1.2 alnsn };
3349 1.2 alnsn
3350 1.2 alnsn size_t i;
3351 1.2 alnsn bpfjit_func_t code;
3352 1.2 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3353 1.2 alnsn
3354 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3355 1.2 alnsn
3356 1.2 alnsn RZ(rump_init());
3357 1.2 alnsn
3358 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3359 1.2 alnsn
3360 1.2 alnsn rump_schedule();
3361 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3362 1.2 alnsn rump_unschedule();
3363 1.2 alnsn ATF_REQUIRE(code != NULL);
3364 1.2 alnsn
3365 1.2 alnsn for (i = 1; i <= sizeof(pkt); i++)
3366 1.2 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
3367 1.2 alnsn
3368 1.2 alnsn rump_schedule();
3369 1.2 alnsn rumpns_bpfjit_free_code(code);
3370 1.2 alnsn rump_unschedule();
3371 1.2 alnsn }
3372 1.2 alnsn
3373 1.2 alnsn ATF_TC(bpfjit_stx4);
3374 1.2 alnsn ATF_TC_HEAD(bpfjit_stx4, tc)
3375 1.2 alnsn {
3376 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3377 1.2 alnsn "Test JIT compilation of BPF_STX");
3378 1.2 alnsn }
3379 1.2 alnsn
3380 1.2 alnsn ATF_TC_BODY(bpfjit_stx4, tc)
3381 1.2 alnsn {
3382 1.2 alnsn struct bpf_insn insns[5*BPF_MEMWORDS+2];
3383 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3384 1.2 alnsn
3385 1.2 alnsn size_t k;
3386 1.2 alnsn bpfjit_func_t code;
3387 1.2 alnsn uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3388 1.2 alnsn
3389 1.2 alnsn memset(insns, 0, sizeof(insns));
3390 1.2 alnsn
3391 1.2 alnsn /* for each k do M[k] = k */
3392 1.2 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3393 1.2 alnsn insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
3394 1.2 alnsn insns[2*k].k = 3*k;
3395 1.2 alnsn insns[2*k+1].code = BPF_STX;
3396 1.2 alnsn insns[2*k+1].k = k;
3397 1.2 alnsn }
3398 1.2 alnsn
3399 1.2 alnsn /* load wirelen into A */
3400 1.2 alnsn insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3401 1.2 alnsn
3402 1.2 alnsn /* for each k, if (A == k + 1) return M[k] */
3403 1.2 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3404 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3405 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
3406 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
3407 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
3408 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3409 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+2].k = k;
3410 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3411 1.2 alnsn insns[2*BPF_MEMWORDS+3*k+3].k = 0;
3412 1.2 alnsn }
3413 1.2 alnsn
3414 1.2 alnsn insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3415 1.2 alnsn insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
3416 1.2 alnsn
3417 1.2 alnsn RZ(rump_init());
3418 1.2 alnsn
3419 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3420 1.2 alnsn
3421 1.2 alnsn rump_schedule();
3422 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3423 1.2 alnsn rump_unschedule();
3424 1.2 alnsn ATF_REQUIRE(code != NULL);
3425 1.2 alnsn
3426 1.2 alnsn for (k = 1; k <= sizeof(pkt); k++)
3427 1.2 alnsn ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3428 1.2 alnsn
3429 1.2 alnsn rump_schedule();
3430 1.2 alnsn rumpns_bpfjit_free_code(code);
3431 1.2 alnsn rump_unschedule();
3432 1.2 alnsn }
3433 1.2 alnsn
3434 1.2 alnsn ATF_TC(bpfjit_opt_ld_abs_1);
3435 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
3436 1.2 alnsn {
3437 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3438 1.2 alnsn "Test JIT compilation with length optimization "
3439 1.2 alnsn "applied to BPF_LD+BPF_ABS");
3440 1.2 alnsn }
3441 1.2 alnsn
3442 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
3443 1.2 alnsn {
3444 1.2 alnsn static struct bpf_insn insns[] = {
3445 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3446 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3447 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3448 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3449 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3450 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3451 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3452 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3453 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3454 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3455 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3456 1.2 alnsn };
3457 1.2 alnsn
3458 1.2 alnsn size_t i, j;
3459 1.2 alnsn bpfjit_func_t code;
3460 1.2 alnsn uint8_t pkt[2][34] = {
3461 1.2 alnsn {
3462 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3463 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3464 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3465 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3466 1.2 alnsn },
3467 1.2 alnsn {
3468 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3469 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3470 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3471 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3472 1.2 alnsn }
3473 1.2 alnsn };
3474 1.2 alnsn
3475 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3476 1.2 alnsn
3477 1.2 alnsn RZ(rump_init());
3478 1.2 alnsn
3479 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3480 1.2 alnsn
3481 1.2 alnsn rump_schedule();
3482 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3483 1.2 alnsn rump_unschedule();
3484 1.2 alnsn ATF_REQUIRE(code != NULL);
3485 1.2 alnsn
3486 1.2 alnsn for (i = 0; i < 2; i++) {
3487 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3488 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3489 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3490 1.2 alnsn }
3491 1.2 alnsn
3492 1.2 alnsn rump_schedule();
3493 1.2 alnsn rumpns_bpfjit_free_code(code);
3494 1.2 alnsn rump_unschedule();
3495 1.2 alnsn }
3496 1.2 alnsn
3497 1.2 alnsn ATF_TC(bpfjit_opt_ld_abs_2);
3498 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
3499 1.2 alnsn {
3500 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3501 1.2 alnsn "Test JIT compilation with length optimization "
3502 1.2 alnsn "applied to BPF_LD+BPF_ABS");
3503 1.2 alnsn }
3504 1.2 alnsn
3505 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
3506 1.2 alnsn {
3507 1.2 alnsn static struct bpf_insn insns[] = {
3508 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3509 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3510 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3511 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3512 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3513 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3514 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3515 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3516 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3517 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3518 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3519 1.2 alnsn };
3520 1.2 alnsn
3521 1.2 alnsn size_t i, j;
3522 1.2 alnsn bpfjit_func_t code;
3523 1.2 alnsn uint8_t pkt[2][34] = {
3524 1.2 alnsn {
3525 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3526 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3527 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3528 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3529 1.2 alnsn },
3530 1.2 alnsn {
3531 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3532 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3533 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3534 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3535 1.2 alnsn }
3536 1.2 alnsn };
3537 1.2 alnsn
3538 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3539 1.2 alnsn
3540 1.2 alnsn RZ(rump_init());
3541 1.2 alnsn
3542 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3543 1.2 alnsn
3544 1.2 alnsn rump_schedule();
3545 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3546 1.2 alnsn rump_unschedule();
3547 1.2 alnsn ATF_REQUIRE(code != NULL);
3548 1.2 alnsn
3549 1.2 alnsn for (i = 0; i < 2; i++) {
3550 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3551 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3552 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3553 1.2 alnsn }
3554 1.2 alnsn
3555 1.2 alnsn rump_schedule();
3556 1.2 alnsn rumpns_bpfjit_free_code(code);
3557 1.2 alnsn rump_unschedule();
3558 1.2 alnsn }
3559 1.2 alnsn
3560 1.2 alnsn ATF_TC(bpfjit_opt_ld_abs_3);
3561 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
3562 1.2 alnsn {
3563 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3564 1.2 alnsn "Test JIT compilation with length optimization "
3565 1.2 alnsn "applied to BPF_LD+BPF_ABS");
3566 1.2 alnsn }
3567 1.2 alnsn
3568 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
3569 1.2 alnsn {
3570 1.2 alnsn static struct bpf_insn insns[] = {
3571 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3572 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3573 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3574 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3575 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3576 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3577 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3578 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3579 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3580 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3581 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3582 1.2 alnsn };
3583 1.2 alnsn
3584 1.2 alnsn size_t i, j;
3585 1.2 alnsn bpfjit_func_t code;
3586 1.2 alnsn uint8_t pkt[2][34] = {
3587 1.2 alnsn {
3588 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3589 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3590 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3591 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3592 1.2 alnsn },
3593 1.2 alnsn {
3594 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3595 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3596 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3597 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3598 1.2 alnsn }
3599 1.2 alnsn };
3600 1.2 alnsn
3601 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3602 1.2 alnsn
3603 1.2 alnsn RZ(rump_init());
3604 1.2 alnsn
3605 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3606 1.2 alnsn
3607 1.2 alnsn rump_schedule();
3608 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3609 1.2 alnsn rump_unschedule();
3610 1.2 alnsn ATF_REQUIRE(code != NULL);
3611 1.2 alnsn
3612 1.2 alnsn for (i = 0; i < 2; i++) {
3613 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3614 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3615 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3616 1.2 alnsn }
3617 1.2 alnsn
3618 1.2 alnsn rump_schedule();
3619 1.2 alnsn rumpns_bpfjit_free_code(code);
3620 1.2 alnsn rump_unschedule();
3621 1.2 alnsn }
3622 1.2 alnsn
3623 1.2 alnsn ATF_TC(bpfjit_opt_ld_ind_1);
3624 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3625 1.2 alnsn {
3626 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3627 1.2 alnsn "Test JIT compilation with length optimization "
3628 1.2 alnsn "applied to BPF_LD+BPF_IND");
3629 1.2 alnsn }
3630 1.2 alnsn
3631 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3632 1.2 alnsn {
3633 1.2 alnsn static struct bpf_insn insns[] = {
3634 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3635 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3636 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3637 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3638 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3639 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3640 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3641 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3642 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3643 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3644 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3645 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3646 1.2 alnsn };
3647 1.2 alnsn
3648 1.2 alnsn size_t i, j;
3649 1.2 alnsn bpfjit_func_t code;
3650 1.2 alnsn uint8_t pkt[2][34] = {
3651 1.2 alnsn {
3652 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3653 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3654 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3655 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3656 1.2 alnsn },
3657 1.2 alnsn {
3658 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3659 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3660 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3661 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3662 1.2 alnsn }
3663 1.2 alnsn };
3664 1.2 alnsn
3665 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3666 1.2 alnsn
3667 1.2 alnsn RZ(rump_init());
3668 1.2 alnsn
3669 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3670 1.2 alnsn
3671 1.2 alnsn rump_schedule();
3672 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3673 1.2 alnsn rump_unschedule();
3674 1.2 alnsn ATF_REQUIRE(code != NULL);
3675 1.2 alnsn
3676 1.2 alnsn for (i = 0; i < 2; i++) {
3677 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3678 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3679 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3680 1.2 alnsn }
3681 1.2 alnsn
3682 1.2 alnsn rump_schedule();
3683 1.2 alnsn rumpns_bpfjit_free_code(code);
3684 1.2 alnsn rump_unschedule();
3685 1.2 alnsn }
3686 1.2 alnsn
3687 1.2 alnsn ATF_TC(bpfjit_opt_ld_ind_2);
3688 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3689 1.2 alnsn {
3690 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3691 1.2 alnsn "Test JIT compilation with length optimization "
3692 1.2 alnsn "applied to BPF_LD+BPF_IND");
3693 1.2 alnsn }
3694 1.2 alnsn
3695 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3696 1.2 alnsn {
3697 1.2 alnsn static struct bpf_insn insns[] = {
3698 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3699 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3700 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3701 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3702 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3703 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3704 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3705 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3706 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3707 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3708 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3709 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3710 1.2 alnsn };
3711 1.2 alnsn
3712 1.2 alnsn size_t i, j;
3713 1.2 alnsn bpfjit_func_t code;
3714 1.2 alnsn uint8_t pkt[2][34] = {
3715 1.2 alnsn {
3716 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3717 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3718 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3719 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3720 1.2 alnsn },
3721 1.2 alnsn {
3722 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3723 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3724 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3725 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3726 1.2 alnsn }
3727 1.2 alnsn };
3728 1.2 alnsn
3729 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3730 1.2 alnsn
3731 1.2 alnsn RZ(rump_init());
3732 1.2 alnsn
3733 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3734 1.2 alnsn
3735 1.2 alnsn rump_schedule();
3736 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3737 1.2 alnsn rump_unschedule();
3738 1.2 alnsn ATF_REQUIRE(code != NULL);
3739 1.2 alnsn
3740 1.2 alnsn for (i = 0; i < 2; i++) {
3741 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3742 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3743 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3744 1.2 alnsn }
3745 1.2 alnsn
3746 1.2 alnsn rump_schedule();
3747 1.2 alnsn rumpns_bpfjit_free_code(code);
3748 1.2 alnsn rump_unschedule();
3749 1.2 alnsn }
3750 1.2 alnsn
3751 1.2 alnsn ATF_TC(bpfjit_opt_ld_ind_3);
3752 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3753 1.2 alnsn {
3754 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3755 1.2 alnsn "Test JIT compilation with length optimization "
3756 1.2 alnsn "applied to BPF_LD+BPF_IND");
3757 1.2 alnsn }
3758 1.2 alnsn
3759 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3760 1.2 alnsn {
3761 1.2 alnsn static struct bpf_insn insns[] = {
3762 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3763 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3764 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3765 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3766 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3767 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3768 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3769 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3770 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3771 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3772 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3773 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3774 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3775 1.2 alnsn };
3776 1.2 alnsn
3777 1.2 alnsn size_t i, j;
3778 1.2 alnsn bpfjit_func_t code;
3779 1.2 alnsn uint8_t pkt[2][34] = {
3780 1.2 alnsn {
3781 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3782 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3783 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3784 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3785 1.2 alnsn },
3786 1.2 alnsn {
3787 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3788 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3789 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3790 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3791 1.2 alnsn }
3792 1.2 alnsn };
3793 1.2 alnsn
3794 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3795 1.2 alnsn
3796 1.2 alnsn RZ(rump_init());
3797 1.2 alnsn
3798 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3799 1.2 alnsn
3800 1.2 alnsn rump_schedule();
3801 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3802 1.2 alnsn rump_unschedule();
3803 1.2 alnsn ATF_REQUIRE(code != NULL);
3804 1.2 alnsn
3805 1.2 alnsn for (i = 0; i < 2; i++) {
3806 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3807 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3808 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3809 1.2 alnsn }
3810 1.2 alnsn
3811 1.2 alnsn rump_schedule();
3812 1.2 alnsn rumpns_bpfjit_free_code(code);
3813 1.2 alnsn rump_unschedule();
3814 1.2 alnsn }
3815 1.2 alnsn
3816 1.2 alnsn ATF_TC(bpfjit_opt_ld_ind_4);
3817 1.2 alnsn ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3818 1.2 alnsn {
3819 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3820 1.2 alnsn "Test JIT compilation with length optimization "
3821 1.2 alnsn "applied to BPF_LD+BPF_IND");
3822 1.2 alnsn }
3823 1.2 alnsn
3824 1.2 alnsn ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3825 1.2 alnsn {
3826 1.2 alnsn static struct bpf_insn insns[] = {
3827 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3828 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3829 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3830 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3831 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3832 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3833 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3834 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3835 1.2 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3836 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3837 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3838 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3839 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3840 1.2 alnsn };
3841 1.2 alnsn
3842 1.2 alnsn size_t i, j;
3843 1.2 alnsn bpfjit_func_t code;
3844 1.2 alnsn uint8_t pkt[2][34] = {
3845 1.2 alnsn {
3846 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3847 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3848 1.2 alnsn 0x80, 0x03, 0x70, 0x0f,
3849 1.2 alnsn 0x80, 0x03, 0x70, 0x23
3850 1.2 alnsn },
3851 1.2 alnsn {
3852 1.2 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3853 1.2 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3854 1.2 alnsn 0x80, 0x03, 0x70, 0x23,
3855 1.2 alnsn 0x80, 0x03, 0x70, 0x0f
3856 1.2 alnsn }
3857 1.2 alnsn };
3858 1.2 alnsn
3859 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3860 1.2 alnsn
3861 1.2 alnsn RZ(rump_init());
3862 1.2 alnsn
3863 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3864 1.2 alnsn
3865 1.2 alnsn rump_schedule();
3866 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3867 1.2 alnsn rump_unschedule();
3868 1.2 alnsn ATF_REQUIRE(code != NULL);
3869 1.2 alnsn
3870 1.2 alnsn for (i = 0; i < 2; i++) {
3871 1.2 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3872 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3873 1.2 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3874 1.2 alnsn }
3875 1.2 alnsn
3876 1.2 alnsn rump_schedule();
3877 1.2 alnsn rumpns_bpfjit_free_code(code);
3878 1.2 alnsn rump_unschedule();
3879 1.2 alnsn }
3880 1.2 alnsn
3881 1.2 alnsn ATF_TC(bpfjit_abc_ja);
3882 1.2 alnsn ATF_TC_HEAD(bpfjit_abc_ja, tc)
3883 1.2 alnsn {
3884 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3885 1.2 alnsn "Test ABC optimization with a single BPF_JMP+BPF_JA");
3886 1.2 alnsn }
3887 1.2 alnsn
3888 1.2 alnsn ATF_TC_BODY(bpfjit_abc_ja, tc)
3889 1.2 alnsn {
3890 1.2 alnsn static struct bpf_insn insns[] = {
3891 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3892 1.2 alnsn BPF_STMT(BPF_JMP+BPF_JA, 2),
3893 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
3894 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3895 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
3896 1.2 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
3897 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
3898 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3899 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
3900 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
3901 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
3902 1.2 alnsn };
3903 1.2 alnsn
3904 1.2 alnsn bpfjit_func_t code;
3905 1.2 alnsn uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
3906 1.2 alnsn
3907 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3908 1.2 alnsn
3909 1.2 alnsn RZ(rump_init());
3910 1.2 alnsn
3911 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3912 1.2 alnsn
3913 1.2 alnsn rump_schedule();
3914 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3915 1.2 alnsn rump_unschedule();
3916 1.2 alnsn ATF_REQUIRE(code != NULL);
3917 1.2 alnsn
3918 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3919 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
3920 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
3921 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
3922 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
3923 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
3924 1.2 alnsn
3925 1.2 alnsn rump_schedule();
3926 1.2 alnsn rumpns_bpfjit_free_code(code);
3927 1.2 alnsn rump_unschedule();
3928 1.2 alnsn }
3929 1.2 alnsn
3930 1.2 alnsn ATF_TC(bpfjit_abc_ja_over);
3931 1.2 alnsn ATF_TC_HEAD(bpfjit_abc_ja_over, tc)
3932 1.2 alnsn {
3933 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3934 1.2 alnsn "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
3935 1.2 alnsn }
3936 1.2 alnsn
3937 1.2 alnsn ATF_TC_BODY(bpfjit_abc_ja_over, tc)
3938 1.2 alnsn {
3939 1.2 alnsn static struct bpf_insn insns[] = {
3940 1.2 alnsn BPF_STMT(BPF_JMP+BPF_JA, 2),
3941 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
3942 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3943 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3944 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
3945 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
3946 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
3947 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
3948 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
3949 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
3950 1.2 alnsn };
3951 1.2 alnsn
3952 1.2 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3953 1.2 alnsn
3954 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3955 1.2 alnsn
3956 1.2 alnsn RZ(rump_init());
3957 1.2 alnsn
3958 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3959 1.2 alnsn ATF_CHECK(exec_prog(insns, insn_count, pkt, 1) == UINT32_MAX);
3960 1.2 alnsn }
3961 1.2 alnsn
3962 1.2 alnsn ATF_TC(bpfjit_abc_ld_chain);
3963 1.2 alnsn ATF_TC_HEAD(bpfjit_abc_ld_chain, tc)
3964 1.2 alnsn {
3965 1.2 alnsn atf_tc_set_md_var(tc, "descr",
3966 1.2 alnsn "Test ABC optimization of a chain of BPF_LD instructions "
3967 1.2 alnsn "with exits leading to a single BPF_RET");
3968 1.2 alnsn }
3969 1.2 alnsn
3970 1.2 alnsn ATF_TC_BODY(bpfjit_abc_ld_chain, tc)
3971 1.2 alnsn {
3972 1.2 alnsn static struct bpf_insn insns[] = {
3973 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
3974 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
3975 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
3976 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
3977 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
3978 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
3979 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 123456789),
3980 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 987654321),
3981 1.2 alnsn };
3982 1.2 alnsn
3983 1.2 alnsn bpfjit_func_t code;
3984 1.2 alnsn uint8_t pkt[10] = {};
3985 1.2 alnsn
3986 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3987 1.2 alnsn
3988 1.2 alnsn RZ(rump_init());
3989 1.2 alnsn
3990 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
3991 1.2 alnsn
3992 1.2 alnsn rump_schedule();
3993 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
3994 1.2 alnsn rump_unschedule();
3995 1.2 alnsn ATF_REQUIRE(code != NULL);
3996 1.2 alnsn
3997 1.2 alnsn /* Packet is too short. */
3998 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3999 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4000 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4001 1.2 alnsn
4002 1.2 alnsn /* !(pkt[3] == 8) => return 123456789 */
4003 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
4004 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
4005 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4006 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
4007 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
4008 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4009 1.2 alnsn
4010 1.2 alnsn /* !(pkt[4:2] >= 7) => too short or return 123456789 */
4011 1.2 alnsn pkt[3] = 8;
4012 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4013 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4014 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4015 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4016 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4017 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4018 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4019 1.2 alnsn
4020 1.2 alnsn /* !(pkt[6:4] > 6) => too short or return 987654321 */
4021 1.2 alnsn pkt[4] = pkt[5] = 1;
4022 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4023 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4024 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4025 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4026 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4027 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4028 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4029 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4030 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4031 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
4032 1.2 alnsn
4033 1.2 alnsn /* (pkt[6:4] > 6) => too short or return 123456789 */
4034 1.2 alnsn pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
4035 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4036 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4037 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4038 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4039 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4040 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4041 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4042 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4043 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4044 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
4045 1.2 alnsn
4046 1.2 alnsn rump_schedule();
4047 1.2 alnsn rumpns_bpfjit_free_code(code);
4048 1.2 alnsn rump_unschedule();
4049 1.2 alnsn }
4050 1.2 alnsn
4051 1.2 alnsn ATF_TC(bpfjit_examples_1);
4052 1.2 alnsn ATF_TC_HEAD(bpfjit_examples_1, tc)
4053 1.2 alnsn {
4054 1.2 alnsn atf_tc_set_md_var(tc, "descr",
4055 1.2 alnsn "Test the first example from bpf(4) - "
4056 1.2 alnsn "accept Reverse ARP requests");
4057 1.2 alnsn }
4058 1.2 alnsn
4059 1.2 alnsn ATF_TC_BODY(bpfjit_examples_1, tc)
4060 1.2 alnsn {
4061 1.2 alnsn /*
4062 1.2 alnsn * The following filter is taken from the Reverse ARP
4063 1.2 alnsn * Daemon. It accepts only Reverse ARP requests.
4064 1.2 alnsn */
4065 1.2 alnsn struct bpf_insn insns[] = {
4066 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4067 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
4068 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4069 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
4070 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 42),
4071 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4072 1.2 alnsn };
4073 1.2 alnsn
4074 1.2 alnsn bpfjit_func_t code;
4075 1.2 alnsn uint8_t pkt[22] = {};
4076 1.2 alnsn
4077 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4078 1.2 alnsn
4079 1.2 alnsn RZ(rump_init());
4080 1.2 alnsn
4081 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
4082 1.2 alnsn
4083 1.2 alnsn rump_schedule();
4084 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4085 1.2 alnsn rump_unschedule();
4086 1.2 alnsn ATF_REQUIRE(code != NULL);
4087 1.2 alnsn
4088 1.2 alnsn /* Packet is too short. */
4089 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4090 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4091 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4092 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4093 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4094 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4095 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4096 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4097 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4098 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4099 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4100 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4101 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4102 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4103 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4104 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4105 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4106 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4107 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4108 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4109 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4110 1.2 alnsn
4111 1.2 alnsn /* The packet doesn't match. */
4112 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4113 1.2 alnsn
4114 1.2 alnsn /* Still no match after setting the protocol field. */
4115 1.2 alnsn pkt[12] = 0x80; pkt[13] = 0x35;
4116 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4117 1.2 alnsn
4118 1.2 alnsn /* Set RARP message type. */
4119 1.2 alnsn pkt[21] = 3;
4120 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
4121 1.2 alnsn
4122 1.2 alnsn /* Packet is too short. */
4123 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4124 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4125 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4126 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4127 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4128 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4129 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4130 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4131 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4132 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4133 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4134 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4135 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4136 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4137 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4138 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4139 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4140 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4141 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4142 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4143 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4144 1.2 alnsn
4145 1.2 alnsn /* Change RARP message type. */
4146 1.2 alnsn pkt[20] = 3;
4147 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4148 1.2 alnsn
4149 1.2 alnsn rump_schedule();
4150 1.2 alnsn rumpns_bpfjit_free_code(code);
4151 1.2 alnsn rump_unschedule();
4152 1.2 alnsn }
4153 1.2 alnsn
4154 1.2 alnsn ATF_TC(bpfjit_examples_2);
4155 1.2 alnsn ATF_TC_HEAD(bpfjit_examples_2, tc)
4156 1.2 alnsn {
4157 1.2 alnsn atf_tc_set_md_var(tc, "descr",
4158 1.2 alnsn "Test the second example from bpf(4) - "
4159 1.2 alnsn "accept IP packets between two specified hosts");
4160 1.2 alnsn }
4161 1.2 alnsn
4162 1.2 alnsn ATF_TC_BODY(bpfjit_examples_2, tc)
4163 1.2 alnsn {
4164 1.2 alnsn /*
4165 1.2 alnsn * This filter accepts only IP packets between host 128.3.112.15
4166 1.2 alnsn * and 128.3.112.35.
4167 1.2 alnsn */
4168 1.2 alnsn static struct bpf_insn insns[] = {
4169 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4170 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
4171 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
4172 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
4173 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4174 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
4175 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
4176 1.2 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4177 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
4178 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4179 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4180 1.2 alnsn };
4181 1.2 alnsn
4182 1.2 alnsn bpfjit_func_t code;
4183 1.2 alnsn uint8_t pkt[34] = {};
4184 1.2 alnsn
4185 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4186 1.2 alnsn
4187 1.2 alnsn RZ(rump_init());
4188 1.2 alnsn
4189 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
4190 1.2 alnsn
4191 1.2 alnsn rump_schedule();
4192 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4193 1.2 alnsn rump_unschedule();
4194 1.2 alnsn ATF_REQUIRE(code != NULL);
4195 1.2 alnsn
4196 1.2 alnsn /* Packet is too short. */
4197 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4198 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4199 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4200 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4201 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4202 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4203 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4204 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4205 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4206 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4207 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4208 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4209 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4210 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4211 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4212 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4213 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4214 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4215 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4216 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4217 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4218 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4219 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4220 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4221 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4222 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4223 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4224 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4225 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4226 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4227 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4228 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4229 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4230 1.2 alnsn
4231 1.2 alnsn /* The packet doesn't match. */
4232 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4233 1.2 alnsn
4234 1.2 alnsn /* Still no match after setting the protocol field. */
4235 1.2 alnsn pkt[12] = 8;
4236 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4237 1.2 alnsn
4238 1.2 alnsn pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
4239 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4240 1.2 alnsn
4241 1.2 alnsn pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
4242 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4243 1.2 alnsn
4244 1.2 alnsn /* Swap the ip addresses. */
4245 1.2 alnsn pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
4246 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4247 1.2 alnsn
4248 1.2 alnsn pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
4249 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4250 1.2 alnsn
4251 1.2 alnsn /* Packet is too short. */
4252 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4253 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4254 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4255 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4256 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4257 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4258 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4259 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4260 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4261 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4262 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4263 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4264 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4265 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4266 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4267 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4268 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4269 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4270 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4271 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4272 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4273 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4274 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4275 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4276 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4277 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4278 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4279 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4280 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4281 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4282 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4283 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4284 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4285 1.2 alnsn
4286 1.2 alnsn /* Change the protocol field. */
4287 1.2 alnsn pkt[13] = 8;
4288 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4289 1.2 alnsn
4290 1.2 alnsn rump_schedule();
4291 1.2 alnsn rumpns_bpfjit_free_code(code);
4292 1.2 alnsn rump_unschedule();
4293 1.2 alnsn }
4294 1.2 alnsn
4295 1.2 alnsn ATF_TC(bpfjit_examples_3);
4296 1.2 alnsn ATF_TC_HEAD(bpfjit_examples_3, tc)
4297 1.2 alnsn {
4298 1.2 alnsn atf_tc_set_md_var(tc, "descr",
4299 1.2 alnsn "Test the third example from bpf(4) - "
4300 1.2 alnsn "accept TCP finger packets");
4301 1.2 alnsn }
4302 1.2 alnsn
4303 1.2 alnsn ATF_TC_BODY(bpfjit_examples_3, tc)
4304 1.2 alnsn {
4305 1.2 alnsn /*
4306 1.2 alnsn * This filter returns only TCP finger packets.
4307 1.2 alnsn */
4308 1.2 alnsn struct bpf_insn insns[] = {
4309 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4310 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
4311 1.2 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
4312 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
4313 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4314 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
4315 1.2 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
4316 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
4317 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
4318 1.2 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
4319 1.2 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
4320 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4321 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4322 1.2 alnsn };
4323 1.2 alnsn
4324 1.2 alnsn bpfjit_func_t code;
4325 1.2 alnsn uint8_t pkt[30] = {};
4326 1.2 alnsn
4327 1.2 alnsn /* Set IP fragment offset to non-zero. */
4328 1.2 alnsn pkt[20] = 1; pkt[21] = 1;
4329 1.2 alnsn
4330 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4331 1.2 alnsn
4332 1.2 alnsn RZ(rump_init());
4333 1.2 alnsn
4334 1.2 alnsn ATF_CHECK(prog_validate(insns, insn_count));
4335 1.2 alnsn
4336 1.2 alnsn rump_schedule();
4337 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4338 1.2 alnsn rump_unschedule();
4339 1.2 alnsn ATF_REQUIRE(code != NULL);
4340 1.2 alnsn
4341 1.2 alnsn /* Packet is too short. */
4342 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4343 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4344 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4345 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4346 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4347 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4348 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4349 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4350 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4351 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4352 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4353 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4354 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4355 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4356 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4357 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4358 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4359 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4360 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4361 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4362 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4363 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4364 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4365 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4366 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4367 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4368 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4369 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4370 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4371 1.2 alnsn
4372 1.2 alnsn /* The packet doesn't match. */
4373 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4374 1.2 alnsn
4375 1.2 alnsn /* Still no match after setting the protocol field. */
4376 1.2 alnsn pkt[12] = 8;
4377 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4378 1.2 alnsn
4379 1.2 alnsn /* Get one step closer to the match. */
4380 1.2 alnsn pkt[23] = 6;
4381 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4382 1.2 alnsn
4383 1.2 alnsn /* Set IP fragment offset to zero. */
4384 1.2 alnsn pkt[20] = 0x20; pkt[21] = 0;
4385 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4386 1.2 alnsn
4387 1.2 alnsn /* Set IP header length to 12. */
4388 1.2 alnsn pkt[14] = 0xd3;
4389 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4390 1.2 alnsn
4391 1.2 alnsn /* Match one branch of the program. */
4392 1.2 alnsn pkt[27] = 79;
4393 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4394 1.2 alnsn
4395 1.2 alnsn /* Match the other branch of the program. */
4396 1.2 alnsn pkt[29] = 79; pkt[27] = 0;
4397 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4398 1.2 alnsn
4399 1.2 alnsn /* Packet is too short. */
4400 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4401 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4402 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4403 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4404 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4405 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4406 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4407 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4408 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4409 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4410 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4411 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4412 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4413 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4414 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4415 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4416 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4417 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4418 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4419 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4420 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4421 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4422 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4423 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4424 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4425 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4426 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4427 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4428 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4429 1.2 alnsn
4430 1.2 alnsn /* Set IP header length to 16. Packet is too short. */
4431 1.2 alnsn pkt[14] = 4;
4432 1.2 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4433 1.2 alnsn
4434 1.2 alnsn rump_schedule();
4435 1.2 alnsn rumpns_bpfjit_free_code(code);
4436 1.2 alnsn rump_unschedule();
4437 1.2 alnsn }
4438 1.2 alnsn
4439 1.2 alnsn ATF_TC(bpfjit_cop_no_ctx);
4440 1.2 alnsn ATF_TC_HEAD(bpfjit_cop_no_ctx, tc)
4441 1.2 alnsn {
4442 1.2 alnsn atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
4443 1.2 alnsn "instruction can't be accepted without a context");
4444 1.2 alnsn }
4445 1.2 alnsn
4446 1.2 alnsn ATF_TC_BODY(bpfjit_cop_no_ctx, tc)
4447 1.2 alnsn {
4448 1.2 alnsn static struct bpf_insn insns[] = {
4449 1.2 alnsn BPF_STMT(BPF_MISC+BPF_COP, 0),
4450 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
4451 1.2 alnsn };
4452 1.2 alnsn
4453 1.2 alnsn bpfjit_func_t code;
4454 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4455 1.2 alnsn
4456 1.2 alnsn RZ(rump_init());
4457 1.2 alnsn
4458 1.2 alnsn ATF_CHECK(!prog_validate(insns, insn_count));
4459 1.2 alnsn
4460 1.2 alnsn rump_schedule();
4461 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4462 1.2 alnsn rump_unschedule();
4463 1.2 alnsn ATF_CHECK(code == NULL);
4464 1.2 alnsn }
4465 1.2 alnsn
4466 1.2 alnsn ATF_TC(bpfjit_copx_no_ctx);
4467 1.2 alnsn ATF_TC_HEAD(bpfjit_copx_no_ctx, tc)
4468 1.2 alnsn {
4469 1.2 alnsn atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
4470 1.2 alnsn "instruction can't be accepted without a context");
4471 1.2 alnsn }
4472 1.2 alnsn
4473 1.2 alnsn ATF_TC_BODY(bpfjit_copx_no_ctx, tc)
4474 1.2 alnsn {
4475 1.2 alnsn static struct bpf_insn insns[] = {
4476 1.2 alnsn BPF_STMT(BPF_MISC+BPF_COPX, 0),
4477 1.2 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
4478 1.2 alnsn };
4479 1.2 alnsn
4480 1.2 alnsn bpfjit_func_t code;
4481 1.2 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4482 1.2 alnsn
4483 1.2 alnsn RZ(rump_init());
4484 1.2 alnsn
4485 1.2 alnsn ATF_CHECK(!prog_validate(insns, insn_count));
4486 1.2 alnsn
4487 1.2 alnsn rump_schedule();
4488 1.2 alnsn code = rumpns_bpfjit_generate_code(NULL, insns, insn_count);
4489 1.2 alnsn rump_unschedule();
4490 1.2 alnsn ATF_CHECK(code == NULL);
4491 1.1 alnsn }
4492 1.1 alnsn
4493 1.1 alnsn ATF_TP_ADD_TCS(tp)
4494 1.1 alnsn {
4495 1.1 alnsn
4496 1.2 alnsn /*
4497 1.2 alnsn * For every new test please also add a similar test
4498 1.2 alnsn * to ../../lib/libbpfjit/t_bpfjit.c
4499 1.2 alnsn */
4500 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_empty);
4501 1.5 alnsn ATF_TP_ADD_TC(tp, bpfjit_ret_k);
4502 1.5 alnsn ATF_TP_ADD_TC(tp, bpfjit_bad_ret_k);
4503 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
4504 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
4505 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
4506 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
4507 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
4508 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
4509 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
4510 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
4511 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
4512 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
4513 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
4514 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_k);
4515 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_k);
4516 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_k);
4517 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_k);
4518 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_k);
4519 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_k);
4520 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_k);
4521 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_k);
4522 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
4523 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
4524 1.3 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_xor_k);
4525 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
4526 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
4527 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
4528 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
4529 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
4530 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
4531 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
4532 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
4533 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
4534 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
4535 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
4536 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
4537 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
4538 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
4539 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
4540 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
4541 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod0_x);
4542 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod1_x);
4543 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod2_x);
4544 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod4_x);
4545 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod10_x);
4546 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod10000_x);
4547 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod7609801_x);
4548 1.4 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_mod80000000_x);
4549 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
4550 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
4551 1.3 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_xor_x);
4552 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
4553 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
4554 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
4555 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
4556 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
4557 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
4558 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
4559 1.5 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_invalid);
4560 1.6 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_ja_overflow);
4561 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
4562 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
4563 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
4564 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
4565 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
4566 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
4567 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
4568 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
4569 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
4570 1.9 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x_noinit_ax);
4571 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
4572 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
4573 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
4574 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
4575 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
4576 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
4577 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
4578 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_len);
4579 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
4580 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
4581 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
4582 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
4583 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
4584 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
4585 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
4586 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
4587 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_st1);
4588 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_st2);
4589 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_st3);
4590 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_st4);
4591 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_st5);
4592 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_stx1);
4593 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_stx2);
4594 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_stx3);
4595 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_stx4);
4596 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
4597 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
4598 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
4599 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
4600 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
4601 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
4602 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
4603 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_abc_ja);
4604 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_abc_ja_over);
4605 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_abc_ld_chain);
4606 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_examples_1);
4607 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_examples_2);
4608 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_examples_3);
4609 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_cop_no_ctx);
4610 1.2 alnsn ATF_TP_ADD_TC(tp, bpfjit_copx_no_ctx);
4611 1.1 alnsn
4612 1.1 alnsn return atf_no_error();
4613 1.1 alnsn }
4614