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