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