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