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