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