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