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