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