t_bpfjit.c revision 1.12 1 1.12 alnsn /* $NetBSD: t_bpfjit.c,v 1.12 2015/02/14 20:29:36 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.12 alnsn __RCSID("$NetBSD: t_bpfjit.c,v 1.12 2015/02/14 20:29:36 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.12 alnsn ATF_TC(libbpfjit_jmp_x_uninitialised);
2459 1.12 alnsn ATF_TC_HEAD(libbpfjit_jmp_x_uninitialised, tc)
2460 1.12 alnsn {
2461 1.12 alnsn atf_tc_set_md_var(tc, "descr", "Test JIT compilation "
2462 1.12 alnsn "of BPF_JMP+BPF_EQ+BPF_X with uninitialised X");
2463 1.12 alnsn }
2464 1.12 alnsn
2465 1.12 alnsn ATF_TC_BODY(libbpfjit_jmp_x_uninitialised, tc)
2466 1.12 alnsn {
2467 1.12 alnsn static struct bpf_insn insns[] = {
2468 1.12 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0), /* A > 0 */
2469 1.12 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
2470 1.12 alnsn BPF_STMT(BPF_RET+BPF_K, 11),
2471 1.12 alnsn BPF_STMT(BPF_RET+BPF_K, 10)
2472 1.12 alnsn };
2473 1.12 alnsn
2474 1.12 alnsn bpfjit_func_t code;
2475 1.12 alnsn uint8_t pkt[8]; /* the program doesn't read any data */
2476 1.12 alnsn
2477 1.12 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2478 1.12 alnsn
2479 1.12 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2480 1.12 alnsn
2481 1.12 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2482 1.12 alnsn ATF_REQUIRE(code != NULL);
2483 1.12 alnsn
2484 1.12 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 10);
2485 1.12 alnsn
2486 1.12 alnsn bpfjit_free_code(code);
2487 1.12 alnsn }
2488 1.12 alnsn
2489 1.6 alnsn ATF_TC(libbpfjit_jmp_modulo_x);
2490 1.6 alnsn ATF_TC_HEAD(libbpfjit_jmp_modulo_x, tc)
2491 1.1 alnsn {
2492 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2493 1.1 alnsn "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
2494 1.1 alnsn }
2495 1.1 alnsn
2496 1.6 alnsn ATF_TC_BODY(libbpfjit_jmp_modulo_x, tc)
2497 1.1 alnsn {
2498 1.1 alnsn static struct bpf_insn insns[] = {
2499 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
2500 1.1 alnsn /* FFFFF770 << 4 = FFFFF770 */
2501 1.1 alnsn BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
2502 1.1 alnsn
2503 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2504 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2505 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
2506 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2507 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
2508 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2509 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2510 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
2511 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
2512 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2513 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2514 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
2515 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2516 1.1 alnsn BPF_STMT(BPF_JMP+BPF_JA, 1),
2517 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
2518 1.1 alnsn
2519 1.1 alnsn /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
2520 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
2521 1.1 alnsn
2522 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2523 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2524 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 4),
2525 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
2526 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 5),
2527 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2528 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
2529 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 6),
2530 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
2531 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
2532 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
2533 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
2534 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
2535 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2536 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
2537 1.1 alnsn };
2538 1.1 alnsn
2539 1.2 rmind bpfjit_func_t code;
2540 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2541 1.1 alnsn
2542 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2543 1.1 alnsn
2544 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2545 1.1 alnsn
2546 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2547 1.1 alnsn ATF_REQUIRE(code != NULL);
2548 1.1 alnsn
2549 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
2550 1.1 alnsn
2551 1.1 alnsn bpfjit_free_code(code);
2552 1.1 alnsn }
2553 1.1 alnsn
2554 1.6 alnsn ATF_TC(libbpfjit_ld_abs);
2555 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_abs, tc)
2556 1.1 alnsn {
2557 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2558 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_ABS");
2559 1.1 alnsn }
2560 1.1 alnsn
2561 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_abs, tc)
2562 1.1 alnsn {
2563 1.1 alnsn static struct bpf_insn insns[3][2] = {
2564 1.1 alnsn {
2565 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
2566 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2567 1.1 alnsn },
2568 1.1 alnsn {
2569 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
2570 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2571 1.1 alnsn },
2572 1.1 alnsn {
2573 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
2574 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2575 1.1 alnsn }
2576 1.1 alnsn };
2577 1.1 alnsn
2578 1.1 alnsn static size_t lengths[3] = { 1, 2, 4 };
2579 1.1 alnsn static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
2580 1.1 alnsn
2581 1.1 alnsn size_t i, l;
2582 1.1 alnsn uint8_t *pkt = deadbeef_at_5;
2583 1.1 alnsn size_t pktsize = sizeof(deadbeef_at_5);
2584 1.1 alnsn
2585 1.1 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2586 1.1 alnsn
2587 1.1 alnsn for (i = 0; i < 3; i++) {
2588 1.2 rmind bpfjit_func_t code;
2589 1.1 alnsn
2590 1.1 alnsn ATF_CHECK(bpf_validate(insns[i], insn_count));
2591 1.1 alnsn
2592 1.5 alnsn code = bpfjit_generate_code(NULL, insns[i], insn_count);
2593 1.1 alnsn ATF_REQUIRE(code != NULL);
2594 1.1 alnsn
2595 1.6 alnsn for (l = 1; l < 5 + lengths[i]; l++) {
2596 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2597 1.5 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2598 1.1 alnsn }
2599 1.1 alnsn
2600 1.1 alnsn l = 5 + lengths[i];
2601 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2602 1.5 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2603 1.1 alnsn
2604 1.1 alnsn l = pktsize;
2605 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2606 1.1 alnsn
2607 1.1 alnsn bpfjit_free_code(code);
2608 1.1 alnsn }
2609 1.1 alnsn }
2610 1.1 alnsn
2611 1.6 alnsn ATF_TC(libbpfjit_ld_abs_k_overflow);
2612 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_abs_k_overflow, tc)
2613 1.1 alnsn {
2614 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2615 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
2616 1.1 alnsn }
2617 1.1 alnsn
2618 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_abs_k_overflow, tc)
2619 1.1 alnsn {
2620 1.1 alnsn static struct bpf_insn insns[12][3] = {
2621 1.1 alnsn {
2622 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2623 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2624 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2625 1.1 alnsn },
2626 1.1 alnsn {
2627 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2628 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2629 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2630 1.1 alnsn },
2631 1.1 alnsn {
2632 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2633 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2634 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2635 1.1 alnsn },
2636 1.1 alnsn {
2637 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2638 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2639 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2640 1.1 alnsn },
2641 1.1 alnsn {
2642 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2643 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2644 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2645 1.1 alnsn },
2646 1.1 alnsn {
2647 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2648 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2649 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2650 1.1 alnsn },
2651 1.1 alnsn {
2652 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2653 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
2654 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2655 1.1 alnsn },
2656 1.1 alnsn {
2657 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2658 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
2659 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2660 1.1 alnsn },
2661 1.1 alnsn {
2662 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2663 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
2664 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2665 1.1 alnsn },
2666 1.1 alnsn {
2667 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2668 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
2669 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2670 1.1 alnsn },
2671 1.1 alnsn {
2672 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2673 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
2674 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2675 1.1 alnsn },
2676 1.1 alnsn {
2677 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
2678 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
2679 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2680 1.1 alnsn }
2681 1.1 alnsn };
2682 1.1 alnsn
2683 1.1 alnsn int i;
2684 1.1 alnsn uint8_t pkt[8] = { 0 };
2685 1.1 alnsn
2686 1.1 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2687 1.1 alnsn
2688 1.1 alnsn for (i = 0; i < 3; i++) {
2689 1.2 rmind bpfjit_func_t code;
2690 1.1 alnsn
2691 1.1 alnsn ATF_CHECK(bpf_validate(insns[i], insn_count));
2692 1.1 alnsn
2693 1.5 alnsn code = bpfjit_generate_code(NULL, insns[i], insn_count);
2694 1.1 alnsn ATF_REQUIRE(code != NULL);
2695 1.1 alnsn
2696 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2697 1.1 alnsn
2698 1.1 alnsn bpfjit_free_code(code);
2699 1.1 alnsn }
2700 1.1 alnsn }
2701 1.1 alnsn
2702 1.6 alnsn ATF_TC(libbpfjit_ld_ind);
2703 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_ind, tc)
2704 1.1 alnsn {
2705 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2706 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_IND");
2707 1.1 alnsn }
2708 1.1 alnsn
2709 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_ind, tc)
2710 1.1 alnsn {
2711 1.1 alnsn static struct bpf_insn insns[6][3] = {
2712 1.1 alnsn {
2713 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2714 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2715 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2716 1.1 alnsn },
2717 1.1 alnsn {
2718 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2719 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2720 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2721 1.1 alnsn },
2722 1.1 alnsn {
2723 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2724 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2725 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2726 1.1 alnsn },
2727 1.1 alnsn {
2728 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2729 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2730 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2731 1.1 alnsn },
2732 1.1 alnsn {
2733 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2734 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2735 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2736 1.1 alnsn },
2737 1.1 alnsn {
2738 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2739 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2740 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2741 1.1 alnsn }
2742 1.1 alnsn };
2743 1.1 alnsn
2744 1.1 alnsn static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2745 1.1 alnsn
2746 1.1 alnsn static unsigned int expected[6] = {
2747 1.1 alnsn 0xde, 0xdead, 0xdeadbeef,
2748 1.1 alnsn 0xde, 0xdead, 0xdeadbeef
2749 1.1 alnsn };
2750 1.1 alnsn
2751 1.1 alnsn size_t i, l;
2752 1.1 alnsn uint8_t *pkt = deadbeef_at_5;
2753 1.1 alnsn size_t pktsize = sizeof(deadbeef_at_5);
2754 1.1 alnsn
2755 1.1 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2756 1.1 alnsn
2757 1.1 alnsn for (i = 0; i < 3; i++) {
2758 1.2 rmind bpfjit_func_t code;
2759 1.1 alnsn
2760 1.1 alnsn ATF_CHECK(bpf_validate(insns[i], insn_count));
2761 1.1 alnsn
2762 1.5 alnsn code = bpfjit_generate_code(NULL, insns[i], insn_count);
2763 1.1 alnsn ATF_REQUIRE(code != NULL);
2764 1.1 alnsn
2765 1.6 alnsn for (l = 1; l < 5 + lengths[i]; l++) {
2766 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == 0);
2767 1.5 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == 0);
2768 1.1 alnsn }
2769 1.1 alnsn
2770 1.1 alnsn l = 5 + lengths[i];
2771 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2772 1.5 alnsn ATF_CHECK(jitcall(code, pkt, pktsize, l) == expected[i]);
2773 1.1 alnsn
2774 1.1 alnsn l = pktsize;
2775 1.5 alnsn ATF_CHECK(jitcall(code, pkt, l, l) == expected[i]);
2776 1.1 alnsn
2777 1.1 alnsn bpfjit_free_code(code);
2778 1.1 alnsn }
2779 1.1 alnsn }
2780 1.1 alnsn
2781 1.6 alnsn ATF_TC(libbpfjit_ld_ind_k_overflow);
2782 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_ind_k_overflow, tc)
2783 1.1 alnsn {
2784 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2785 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2786 1.1 alnsn }
2787 1.1 alnsn
2788 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_ind_k_overflow, tc)
2789 1.1 alnsn {
2790 1.1 alnsn static struct bpf_insn insns[12][3] = {
2791 1.1 alnsn {
2792 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2793 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2794 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2795 1.1 alnsn },
2796 1.1 alnsn {
2797 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2798 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2799 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2800 1.1 alnsn },
2801 1.1 alnsn {
2802 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2803 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2804 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2805 1.1 alnsn },
2806 1.1 alnsn {
2807 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2808 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2809 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2810 1.1 alnsn },
2811 1.1 alnsn {
2812 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2813 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2814 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2815 1.1 alnsn },
2816 1.1 alnsn {
2817 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2818 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2819 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2820 1.1 alnsn },
2821 1.1 alnsn {
2822 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2823 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2824 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2825 1.1 alnsn },
2826 1.1 alnsn {
2827 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2828 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2829 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2830 1.1 alnsn },
2831 1.1 alnsn {
2832 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2833 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2834 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2835 1.1 alnsn },
2836 1.1 alnsn {
2837 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2838 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2839 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2840 1.1 alnsn },
2841 1.1 alnsn {
2842 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2843 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2844 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2845 1.1 alnsn },
2846 1.1 alnsn {
2847 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2848 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2849 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 1)
2850 1.1 alnsn }
2851 1.1 alnsn };
2852 1.1 alnsn
2853 1.1 alnsn int i;
2854 1.1 alnsn uint8_t pkt[8] = { 0 };
2855 1.1 alnsn
2856 1.1 alnsn size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2857 1.1 alnsn
2858 1.1 alnsn for (i = 0; i < 3; i++) {
2859 1.2 rmind bpfjit_func_t code;
2860 1.1 alnsn
2861 1.1 alnsn ATF_CHECK(bpf_validate(insns[i], insn_count));
2862 1.1 alnsn
2863 1.5 alnsn code = bpfjit_generate_code(NULL, insns[i], insn_count);
2864 1.1 alnsn ATF_REQUIRE(code != NULL);
2865 1.1 alnsn
2866 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
2867 1.1 alnsn
2868 1.1 alnsn bpfjit_free_code(code);
2869 1.1 alnsn }
2870 1.1 alnsn }
2871 1.1 alnsn
2872 1.6 alnsn ATF_TC(libbpfjit_ld_ind_x_overflow1);
2873 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow1, tc)
2874 1.1 alnsn {
2875 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2876 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2877 1.1 alnsn }
2878 1.1 alnsn
2879 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow1, tc)
2880 1.1 alnsn {
2881 1.1 alnsn static struct bpf_insn insns[] = {
2882 1.1 alnsn BPF_STMT(BPF_LD+BPF_LEN, 0),
2883 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2884 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0),
2885 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2886 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2887 1.1 alnsn };
2888 1.1 alnsn
2889 1.1 alnsn size_t i;
2890 1.2 rmind bpfjit_func_t code;
2891 1.1 alnsn uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2892 1.1 alnsn
2893 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2894 1.1 alnsn
2895 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2896 1.1 alnsn
2897 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2898 1.1 alnsn ATF_REQUIRE(code != NULL);
2899 1.1 alnsn
2900 1.1 alnsn for (i = 1; i <= sizeof(pkt); i++) {
2901 1.1 alnsn ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2902 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2903 1.1 alnsn }
2904 1.1 alnsn
2905 1.1 alnsn bpfjit_free_code(code);
2906 1.1 alnsn }
2907 1.1 alnsn
2908 1.6 alnsn ATF_TC(libbpfjit_ld_ind_x_overflow2);
2909 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_ind_x_overflow2, tc)
2910 1.1 alnsn {
2911 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2912 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2913 1.1 alnsn }
2914 1.1 alnsn
2915 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_ind_x_overflow2, tc)
2916 1.1 alnsn {
2917 1.1 alnsn static struct bpf_insn insns[] = {
2918 1.1 alnsn BPF_STMT(BPF_LD+BPF_LEN, 0),
2919 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2920 1.1 alnsn BPF_STMT(BPF_ST, 3),
2921 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2922 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2923 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2924 1.1 alnsn };
2925 1.1 alnsn
2926 1.1 alnsn size_t i;
2927 1.2 rmind bpfjit_func_t code;
2928 1.1 alnsn uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2929 1.1 alnsn
2930 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2931 1.1 alnsn
2932 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2933 1.1 alnsn
2934 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2935 1.1 alnsn ATF_REQUIRE(code != NULL);
2936 1.1 alnsn
2937 1.1 alnsn for (i = 1; i <= sizeof(pkt); i++) {
2938 1.1 alnsn ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2939 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, i) == 10 * i);
2940 1.1 alnsn }
2941 1.1 alnsn
2942 1.1 alnsn bpfjit_free_code(code);
2943 1.1 alnsn }
2944 1.1 alnsn
2945 1.6 alnsn ATF_TC(libbpfjit_ld_len);
2946 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_len, tc)
2947 1.1 alnsn {
2948 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2949 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2950 1.1 alnsn }
2951 1.1 alnsn
2952 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_len, tc)
2953 1.1 alnsn {
2954 1.1 alnsn static struct bpf_insn insns[] = {
2955 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2956 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2957 1.1 alnsn };
2958 1.1 alnsn
2959 1.1 alnsn size_t i;
2960 1.2 rmind bpfjit_func_t code;
2961 1.1 alnsn uint8_t pkt[32]; /* the program doesn't read any data */
2962 1.1 alnsn
2963 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2964 1.1 alnsn
2965 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2966 1.1 alnsn
2967 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2968 1.1 alnsn ATF_REQUIRE(code != NULL);
2969 1.1 alnsn
2970 1.1 alnsn for (i = 0; i < sizeof(pkt); i++)
2971 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, 1) == i);
2972 1.1 alnsn
2973 1.1 alnsn bpfjit_free_code(code);
2974 1.1 alnsn }
2975 1.1 alnsn
2976 1.6 alnsn ATF_TC(libbpfjit_ld_imm);
2977 1.6 alnsn ATF_TC_HEAD(libbpfjit_ld_imm, tc)
2978 1.1 alnsn {
2979 1.1 alnsn atf_tc_set_md_var(tc, "descr",
2980 1.1 alnsn "Test JIT compilation of BPF_LD+BPF_IMM");
2981 1.1 alnsn }
2982 1.1 alnsn
2983 1.6 alnsn ATF_TC_BODY(libbpfjit_ld_imm, tc)
2984 1.1 alnsn {
2985 1.1 alnsn static struct bpf_insn insns[] = {
2986 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2987 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
2988 1.1 alnsn };
2989 1.1 alnsn
2990 1.2 rmind bpfjit_func_t code;
2991 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
2992 1.1 alnsn
2993 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2994 1.1 alnsn
2995 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
2996 1.1 alnsn
2997 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
2998 1.1 alnsn ATF_REQUIRE(code != NULL);
2999 1.1 alnsn
3000 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
3001 1.1 alnsn
3002 1.1 alnsn bpfjit_free_code(code);
3003 1.1 alnsn }
3004 1.1 alnsn
3005 1.6 alnsn ATF_TC(libbpfjit_ldx_imm1);
3006 1.6 alnsn ATF_TC_HEAD(libbpfjit_ldx_imm1, tc)
3007 1.1 alnsn {
3008 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3009 1.1 alnsn "Test JIT compilation of BPF_LDX+BPF_IMM");
3010 1.1 alnsn }
3011 1.1 alnsn
3012 1.6 alnsn ATF_TC_BODY(libbpfjit_ldx_imm1, tc)
3013 1.1 alnsn {
3014 1.1 alnsn static struct bpf_insn insns[] = {
3015 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
3016 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3017 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3018 1.1 alnsn };
3019 1.1 alnsn
3020 1.2 rmind bpfjit_func_t code;
3021 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3022 1.1 alnsn
3023 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3024 1.1 alnsn
3025 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3026 1.1 alnsn
3027 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3028 1.1 alnsn ATF_REQUIRE(code != NULL);
3029 1.1 alnsn
3030 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX - 5);
3031 1.1 alnsn
3032 1.1 alnsn bpfjit_free_code(code);
3033 1.1 alnsn }
3034 1.1 alnsn
3035 1.6 alnsn ATF_TC(libbpfjit_ldx_imm2);
3036 1.6 alnsn ATF_TC_HEAD(libbpfjit_ldx_imm2, tc)
3037 1.1 alnsn {
3038 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3039 1.1 alnsn "Test JIT compilation of BPF_LDX+BPF_IMM");
3040 1.1 alnsn }
3041 1.1 alnsn
3042 1.6 alnsn ATF_TC_BODY(libbpfjit_ldx_imm2, tc)
3043 1.1 alnsn {
3044 1.1 alnsn static struct bpf_insn insns[] = {
3045 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
3046 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 5),
3047 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
3048 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 7),
3049 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
3050 1.1 alnsn };
3051 1.1 alnsn
3052 1.2 rmind bpfjit_func_t code;
3053 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3054 1.1 alnsn
3055 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3056 1.1 alnsn
3057 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3058 1.1 alnsn
3059 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3060 1.1 alnsn ATF_REQUIRE(code != NULL);
3061 1.1 alnsn
3062 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
3063 1.1 alnsn
3064 1.1 alnsn bpfjit_free_code(code);
3065 1.1 alnsn }
3066 1.1 alnsn
3067 1.6 alnsn ATF_TC(libbpfjit_ldx_len1);
3068 1.6 alnsn ATF_TC_HEAD(libbpfjit_ldx_len1, tc)
3069 1.1 alnsn {
3070 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3071 1.1 alnsn "Test JIT compilation of BPF_LDX+BPF_LEN");
3072 1.1 alnsn }
3073 1.1 alnsn
3074 1.6 alnsn ATF_TC_BODY(libbpfjit_ldx_len1, tc)
3075 1.1 alnsn {
3076 1.1 alnsn static struct bpf_insn insns[] = {
3077 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3078 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3079 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3080 1.1 alnsn };
3081 1.1 alnsn
3082 1.1 alnsn size_t i;
3083 1.2 rmind bpfjit_func_t code;
3084 1.1 alnsn uint8_t pkt[5]; /* the program doesn't read any data */
3085 1.1 alnsn
3086 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3087 1.1 alnsn
3088 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3089 1.1 alnsn
3090 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3091 1.1 alnsn ATF_REQUIRE(code != NULL);
3092 1.1 alnsn
3093 1.1 alnsn for (i = 1; i < sizeof(pkt); i++) {
3094 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, 1) == i);
3095 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i + 1, i) == i + 1);
3096 1.1 alnsn }
3097 1.1 alnsn
3098 1.1 alnsn bpfjit_free_code(code);
3099 1.1 alnsn }
3100 1.1 alnsn
3101 1.6 alnsn ATF_TC(libbpfjit_ldx_len2);
3102 1.6 alnsn ATF_TC_HEAD(libbpfjit_ldx_len2, tc)
3103 1.1 alnsn {
3104 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3105 1.1 alnsn "Test JIT compilation of BPF_LDX+BPF_LEN");
3106 1.1 alnsn }
3107 1.1 alnsn
3108 1.6 alnsn ATF_TC_BODY(libbpfjit_ldx_len2, tc)
3109 1.1 alnsn {
3110 1.1 alnsn static struct bpf_insn insns[] = {
3111 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3112 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 5),
3113 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
3114 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 7),
3115 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
3116 1.1 alnsn };
3117 1.1 alnsn
3118 1.2 rmind bpfjit_func_t code;
3119 1.1 alnsn uint8_t pkt[5]; /* the program doesn't read any data */
3120 1.1 alnsn
3121 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3122 1.1 alnsn
3123 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3124 1.1 alnsn
3125 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3126 1.1 alnsn ATF_REQUIRE(code != NULL);
3127 1.1 alnsn
3128 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 1) == UINT32_MAX);
3129 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 5) == 7);
3130 1.1 alnsn
3131 1.1 alnsn bpfjit_free_code(code);
3132 1.1 alnsn }
3133 1.1 alnsn
3134 1.6 alnsn ATF_TC(libbpfjit_ldx_msh);
3135 1.6 alnsn ATF_TC_HEAD(libbpfjit_ldx_msh, tc)
3136 1.1 alnsn {
3137 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3138 1.1 alnsn "Test JIT compilation of BPF_LDX+BPF_MSH");
3139 1.1 alnsn }
3140 1.1 alnsn
3141 1.6 alnsn ATF_TC_BODY(libbpfjit_ldx_msh, tc)
3142 1.1 alnsn {
3143 1.1 alnsn static struct bpf_insn insns[] = {
3144 1.1 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
3145 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3146 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3147 1.1 alnsn };
3148 1.1 alnsn
3149 1.2 rmind bpfjit_func_t code;
3150 1.1 alnsn uint8_t pkt[2] = { 0, 0x7a };
3151 1.1 alnsn
3152 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3153 1.1 alnsn
3154 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3155 1.1 alnsn
3156 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3157 1.1 alnsn ATF_REQUIRE(code != NULL);
3158 1.1 alnsn
3159 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 40);
3160 1.1 alnsn
3161 1.1 alnsn bpfjit_free_code(code);
3162 1.1 alnsn }
3163 1.1 alnsn
3164 1.6 alnsn ATF_TC(libbpfjit_misc_tax);
3165 1.6 alnsn ATF_TC_HEAD(libbpfjit_misc_tax, tc)
3166 1.1 alnsn {
3167 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3168 1.1 alnsn "Test JIT compilation of BPF_MISC+BPF_TAX");
3169 1.1 alnsn }
3170 1.1 alnsn
3171 1.6 alnsn ATF_TC_BODY(libbpfjit_misc_tax, tc)
3172 1.1 alnsn {
3173 1.1 alnsn static struct bpf_insn insns[] = {
3174 1.1 alnsn BPF_STMT(BPF_LD+BPF_IMM, 3),
3175 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TAX, 0),
3176 1.1 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
3177 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3178 1.1 alnsn };
3179 1.1 alnsn
3180 1.2 rmind bpfjit_func_t code;
3181 1.1 alnsn uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
3182 1.1 alnsn
3183 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3184 1.1 alnsn
3185 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3186 1.1 alnsn
3187 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3188 1.1 alnsn ATF_REQUIRE(code != NULL);
3189 1.1 alnsn
3190 1.5 alnsn ATF_CHECK(jitcall(code, pkt, sizeof(pkt), sizeof(pkt)) == 55);
3191 1.1 alnsn
3192 1.1 alnsn bpfjit_free_code(code);
3193 1.1 alnsn }
3194 1.1 alnsn
3195 1.6 alnsn ATF_TC(libbpfjit_misc_txa);
3196 1.6 alnsn ATF_TC_HEAD(libbpfjit_misc_txa, tc)
3197 1.1 alnsn {
3198 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3199 1.1 alnsn "Test JIT compilation of BPF_MISC+BPF_TXA");
3200 1.1 alnsn }
3201 1.1 alnsn
3202 1.6 alnsn ATF_TC_BODY(libbpfjit_misc_txa, tc)
3203 1.1 alnsn {
3204 1.1 alnsn static struct bpf_insn insns[] = {
3205 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
3206 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
3207 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3208 1.1 alnsn };
3209 1.1 alnsn
3210 1.2 rmind bpfjit_func_t code;
3211 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3212 1.1 alnsn
3213 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3214 1.1 alnsn
3215 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3216 1.1 alnsn
3217 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3218 1.1 alnsn ATF_REQUIRE(code != NULL);
3219 1.1 alnsn
3220 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 391);
3221 1.1 alnsn
3222 1.1 alnsn bpfjit_free_code(code);
3223 1.1 alnsn }
3224 1.1 alnsn
3225 1.6 alnsn ATF_TC(libbpfjit_st1);
3226 1.6 alnsn ATF_TC_HEAD(libbpfjit_st1, tc)
3227 1.1 alnsn {
3228 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3229 1.1 alnsn "Test JIT compilation of BPF_ST");
3230 1.1 alnsn }
3231 1.1 alnsn
3232 1.6 alnsn ATF_TC_BODY(libbpfjit_st1, tc)
3233 1.1 alnsn {
3234 1.1 alnsn static struct bpf_insn insns[] = {
3235 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3236 1.1 alnsn BPF_STMT(BPF_ST, 0),
3237 1.6 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 1),
3238 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3239 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3240 1.1 alnsn };
3241 1.1 alnsn
3242 1.1 alnsn size_t i;
3243 1.2 rmind bpfjit_func_t code;
3244 1.1 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3245 1.1 alnsn
3246 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3247 1.1 alnsn
3248 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3249 1.1 alnsn
3250 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3251 1.1 alnsn ATF_REQUIRE(code != NULL);
3252 1.1 alnsn
3253 1.1 alnsn for (i = 1; i <= sizeof(pkt); i++)
3254 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3255 1.1 alnsn
3256 1.1 alnsn bpfjit_free_code(code);
3257 1.1 alnsn }
3258 1.1 alnsn
3259 1.6 alnsn ATF_TC(libbpfjit_st2);
3260 1.6 alnsn ATF_TC_HEAD(libbpfjit_st2, tc)
3261 1.1 alnsn {
3262 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3263 1.1 alnsn "Test JIT compilation of BPF_ST");
3264 1.1 alnsn }
3265 1.1 alnsn
3266 1.6 alnsn ATF_TC_BODY(libbpfjit_st2, tc)
3267 1.1 alnsn {
3268 1.1 alnsn static struct bpf_insn insns[] = {
3269 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3270 1.1 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3271 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3272 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3273 1.1 alnsn };
3274 1.1 alnsn
3275 1.2 rmind bpfjit_func_t code;
3276 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3277 1.1 alnsn
3278 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3279 1.1 alnsn
3280 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3281 1.1 alnsn
3282 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3283 1.1 alnsn ATF_REQUIRE(code != NULL);
3284 1.1 alnsn
3285 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3286 1.1 alnsn
3287 1.1 alnsn bpfjit_free_code(code);
3288 1.1 alnsn }
3289 1.1 alnsn
3290 1.6 alnsn ATF_TC(libbpfjit_st3);
3291 1.6 alnsn ATF_TC_HEAD(libbpfjit_st3, tc)
3292 1.1 alnsn {
3293 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3294 1.1 alnsn "Test JIT compilation of BPF_ST");
3295 1.1 alnsn }
3296 1.1 alnsn
3297 1.6 alnsn ATF_TC_BODY(libbpfjit_st3, tc)
3298 1.1 alnsn {
3299 1.1 alnsn static struct bpf_insn insns[] = {
3300 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3301 1.1 alnsn BPF_STMT(BPF_ST, 0),
3302 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3303 1.1 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3304 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3305 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3306 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3307 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
3308 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, 0),
3309 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3310 1.1 alnsn };
3311 1.1 alnsn
3312 1.2 rmind bpfjit_func_t code;
3313 1.1 alnsn uint8_t pkt[2]; /* the program doesn't read any data */
3314 1.1 alnsn
3315 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3316 1.1 alnsn
3317 1.1 alnsn ATF_REQUIRE(BPF_MEMWORDS > 1);
3318 1.1 alnsn
3319 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3320 1.1 alnsn
3321 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3322 1.1 alnsn ATF_REQUIRE(code != NULL);
3323 1.1 alnsn
3324 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3325 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3326 1.1 alnsn
3327 1.1 alnsn bpfjit_free_code(code);
3328 1.1 alnsn }
3329 1.1 alnsn
3330 1.6 alnsn ATF_TC(libbpfjit_st4);
3331 1.6 alnsn ATF_TC_HEAD(libbpfjit_st4, tc)
3332 1.1 alnsn {
3333 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3334 1.1 alnsn "Test JIT compilation of BPF_ST");
3335 1.1 alnsn }
3336 1.1 alnsn
3337 1.6 alnsn ATF_TC_BODY(libbpfjit_st4, tc)
3338 1.1 alnsn {
3339 1.1 alnsn static struct bpf_insn insns[] = {
3340 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
3341 1.1 alnsn BPF_STMT(BPF_ST, 5),
3342 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
3343 1.1 alnsn BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
3344 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
3345 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
3346 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
3347 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
3348 1.1 alnsn BPF_STMT(BPF_LD+BPF_MEM, 5),
3349 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3350 1.1 alnsn };
3351 1.1 alnsn
3352 1.2 rmind bpfjit_func_t code;
3353 1.1 alnsn uint8_t pkt[2]; /* the program doesn't read any data */
3354 1.1 alnsn
3355 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3356 1.1 alnsn
3357 1.1 alnsn ATF_REQUIRE(BPF_MEMWORDS > 6);
3358 1.1 alnsn
3359 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3360 1.1 alnsn
3361 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3362 1.1 alnsn ATF_REQUIRE(code != NULL);
3363 1.1 alnsn
3364 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 1);
3365 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 102);
3366 1.1 alnsn
3367 1.1 alnsn bpfjit_free_code(code);
3368 1.1 alnsn }
3369 1.1 alnsn
3370 1.6 alnsn ATF_TC(libbpfjit_st5);
3371 1.6 alnsn ATF_TC_HEAD(libbpfjit_st5, tc)
3372 1.1 alnsn {
3373 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3374 1.1 alnsn "Test JIT compilation of BPF_ST");
3375 1.1 alnsn }
3376 1.1 alnsn
3377 1.6 alnsn ATF_TC_BODY(libbpfjit_st5, tc)
3378 1.1 alnsn {
3379 1.1 alnsn struct bpf_insn insns[5*BPF_MEMWORDS+2];
3380 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3381 1.1 alnsn
3382 1.1 alnsn size_t k;
3383 1.2 rmind bpfjit_func_t code;
3384 1.1 alnsn uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3385 1.1 alnsn
3386 1.1 alnsn memset(insns, 0, sizeof(insns));
3387 1.1 alnsn
3388 1.1 alnsn /* for each k do M[k] = k */
3389 1.1 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3390 1.1 alnsn insns[2*k].code = BPF_LD+BPF_IMM;
3391 1.1 alnsn insns[2*k].k = 3*k;
3392 1.1 alnsn insns[2*k+1].code = BPF_ST;
3393 1.1 alnsn insns[2*k+1].k = k;
3394 1.1 alnsn }
3395 1.1 alnsn
3396 1.1 alnsn /* load wirelen into A */
3397 1.1 alnsn insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3398 1.1 alnsn
3399 1.1 alnsn /* for each k, if (A == k + 1) return M[k] */
3400 1.1 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3401 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3402 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
3403 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
3404 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
3405 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3406 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+2].k = k;
3407 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3408 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+3].k = 0;
3409 1.1 alnsn }
3410 1.1 alnsn
3411 1.1 alnsn insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3412 1.1 alnsn insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
3413 1.1 alnsn
3414 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3415 1.1 alnsn
3416 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3417 1.1 alnsn ATF_REQUIRE(code != NULL);
3418 1.1 alnsn
3419 1.1 alnsn for (k = 1; k <= sizeof(pkt); k++)
3420 1.5 alnsn ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3421 1.1 alnsn
3422 1.1 alnsn bpfjit_free_code(code);
3423 1.1 alnsn }
3424 1.1 alnsn
3425 1.6 alnsn ATF_TC(libbpfjit_stx1);
3426 1.6 alnsn ATF_TC_HEAD(libbpfjit_stx1, tc)
3427 1.1 alnsn {
3428 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3429 1.1 alnsn "Test JIT compilation of BPF_STX");
3430 1.1 alnsn }
3431 1.1 alnsn
3432 1.6 alnsn ATF_TC_BODY(libbpfjit_stx1, tc)
3433 1.1 alnsn {
3434 1.1 alnsn static struct bpf_insn insns[] = {
3435 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3436 1.1 alnsn BPF_STMT(BPF_STX, 0),
3437 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3438 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3439 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3440 1.1 alnsn };
3441 1.1 alnsn
3442 1.1 alnsn size_t i;
3443 1.2 rmind bpfjit_func_t code;
3444 1.1 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3445 1.1 alnsn
3446 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3447 1.1 alnsn
3448 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3449 1.1 alnsn
3450 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3451 1.1 alnsn ATF_REQUIRE(code != NULL);
3452 1.1 alnsn
3453 1.1 alnsn for (i = 1; i <= sizeof(pkt); i++)
3454 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == i);
3455 1.1 alnsn
3456 1.1 alnsn bpfjit_free_code(code);
3457 1.1 alnsn }
3458 1.1 alnsn
3459 1.6 alnsn ATF_TC(libbpfjit_stx2);
3460 1.6 alnsn ATF_TC_HEAD(libbpfjit_stx2, tc)
3461 1.1 alnsn {
3462 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3463 1.1 alnsn "Test JIT compilation of BPF_STX");
3464 1.1 alnsn }
3465 1.1 alnsn
3466 1.6 alnsn ATF_TC_BODY(libbpfjit_stx2, tc)
3467 1.1 alnsn {
3468 1.1 alnsn static struct bpf_insn insns[] = {
3469 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3470 1.1 alnsn BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
3471 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
3472 1.1 alnsn BPF_STMT(BPF_MISC+BPF_TXA, 0),
3473 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3474 1.1 alnsn };
3475 1.1 alnsn
3476 1.2 rmind bpfjit_func_t code;
3477 1.1 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
3478 1.1 alnsn
3479 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3480 1.1 alnsn
3481 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3482 1.1 alnsn
3483 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3484 1.1 alnsn ATF_REQUIRE(code != NULL);
3485 1.1 alnsn
3486 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
3487 1.1 alnsn
3488 1.1 alnsn bpfjit_free_code(code);
3489 1.1 alnsn }
3490 1.1 alnsn
3491 1.6 alnsn ATF_TC(libbpfjit_stx3);
3492 1.6 alnsn ATF_TC_HEAD(libbpfjit_stx3, tc)
3493 1.1 alnsn {
3494 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3495 1.1 alnsn "Test JIT compilation of BPF_STX");
3496 1.1 alnsn }
3497 1.1 alnsn
3498 1.6 alnsn ATF_TC_BODY(libbpfjit_stx3, tc)
3499 1.1 alnsn {
3500 1.1 alnsn static struct bpf_insn insns[] = {
3501 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
3502 1.1 alnsn BPF_STMT(BPF_STX, 5),
3503 1.1 alnsn BPF_STMT(BPF_STX, 2),
3504 1.1 alnsn BPF_STMT(BPF_STX, 3),
3505 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
3506 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3507 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
3508 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3509 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
3510 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3511 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
3512 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3513 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
3514 1.1 alnsn BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
3515 1.1 alnsn BPF_STMT(BPF_RET+BPF_A, 0)
3516 1.1 alnsn };
3517 1.1 alnsn
3518 1.1 alnsn size_t i;
3519 1.2 rmind bpfjit_func_t code;
3520 1.1 alnsn uint8_t pkt[16]; /* the program doesn't read any data */
3521 1.1 alnsn
3522 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3523 1.1 alnsn
3524 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3525 1.1 alnsn
3526 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3527 1.1 alnsn ATF_REQUIRE(code != NULL);
3528 1.1 alnsn
3529 1.1 alnsn for (i = 1; i <= sizeof(pkt); i++)
3530 1.5 alnsn ATF_CHECK(jitcall(code, pkt, i, sizeof(pkt)) == 3 * i);
3531 1.1 alnsn
3532 1.1 alnsn bpfjit_free_code(code);
3533 1.1 alnsn }
3534 1.1 alnsn
3535 1.6 alnsn ATF_TC(libbpfjit_stx4);
3536 1.6 alnsn ATF_TC_HEAD(libbpfjit_stx4, tc)
3537 1.1 alnsn {
3538 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3539 1.1 alnsn "Test JIT compilation of BPF_STX");
3540 1.1 alnsn }
3541 1.1 alnsn
3542 1.6 alnsn ATF_TC_BODY(libbpfjit_stx4, tc)
3543 1.1 alnsn {
3544 1.1 alnsn struct bpf_insn insns[5*BPF_MEMWORDS+2];
3545 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3546 1.1 alnsn
3547 1.1 alnsn size_t k;
3548 1.2 rmind bpfjit_func_t code;
3549 1.1 alnsn uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
3550 1.1 alnsn
3551 1.1 alnsn memset(insns, 0, sizeof(insns));
3552 1.1 alnsn
3553 1.1 alnsn /* for each k do M[k] = k */
3554 1.1 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3555 1.1 alnsn insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
3556 1.1 alnsn insns[2*k].k = 3*k;
3557 1.1 alnsn insns[2*k+1].code = BPF_STX;
3558 1.1 alnsn insns[2*k+1].k = k;
3559 1.1 alnsn }
3560 1.1 alnsn
3561 1.1 alnsn /* load wirelen into A */
3562 1.1 alnsn insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
3563 1.1 alnsn
3564 1.1 alnsn /* for each k, if (A == k + 1) return M[k] */
3565 1.1 alnsn for (k = 0; k < BPF_MEMWORDS; k++) {
3566 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
3567 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
3568 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
3569 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
3570 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
3571 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+2].k = k;
3572 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
3573 1.1 alnsn insns[2*BPF_MEMWORDS+3*k+3].k = 0;
3574 1.1 alnsn }
3575 1.1 alnsn
3576 1.1 alnsn insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
3577 1.1 alnsn insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
3578 1.1 alnsn
3579 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3580 1.1 alnsn
3581 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3582 1.1 alnsn ATF_REQUIRE(code != NULL);
3583 1.1 alnsn
3584 1.1 alnsn for (k = 1; k <= sizeof(pkt); k++)
3585 1.5 alnsn ATF_CHECK(jitcall(code, pkt, k, k) == 3*(k-1));
3586 1.1 alnsn
3587 1.1 alnsn bpfjit_free_code(code);
3588 1.1 alnsn }
3589 1.1 alnsn
3590 1.6 alnsn ATF_TC(libbpfjit_opt_ld_abs_1);
3591 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_1, tc)
3592 1.1 alnsn {
3593 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3594 1.1 alnsn "Test JIT compilation with length optimization "
3595 1.1 alnsn "applied to BPF_LD+BPF_ABS");
3596 1.1 alnsn }
3597 1.1 alnsn
3598 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_1, tc)
3599 1.1 alnsn {
3600 1.1 alnsn static struct bpf_insn insns[] = {
3601 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3602 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3603 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3604 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3605 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3606 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3607 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3608 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3609 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3610 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3611 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3612 1.1 alnsn };
3613 1.1 alnsn
3614 1.1 alnsn size_t i, j;
3615 1.2 rmind bpfjit_func_t code;
3616 1.1 alnsn uint8_t pkt[2][34] = {
3617 1.1 alnsn {
3618 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3619 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3620 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3621 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3622 1.1 alnsn },
3623 1.1 alnsn {
3624 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3625 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3626 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3627 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3628 1.1 alnsn }
3629 1.1 alnsn };
3630 1.1 alnsn
3631 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3632 1.1 alnsn
3633 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3634 1.1 alnsn
3635 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3636 1.1 alnsn ATF_REQUIRE(code != NULL);
3637 1.1 alnsn
3638 1.1 alnsn for (i = 0; i < 2; i++) {
3639 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3640 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3641 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3642 1.1 alnsn }
3643 1.1 alnsn
3644 1.1 alnsn bpfjit_free_code(code);
3645 1.1 alnsn }
3646 1.1 alnsn
3647 1.6 alnsn ATF_TC(libbpfjit_opt_ld_abs_2);
3648 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_2, tc)
3649 1.1 alnsn {
3650 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3651 1.1 alnsn "Test JIT compilation with length optimization "
3652 1.1 alnsn "applied to BPF_LD+BPF_ABS");
3653 1.1 alnsn }
3654 1.1 alnsn
3655 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_2, tc)
3656 1.1 alnsn {
3657 1.1 alnsn static struct bpf_insn insns[] = {
3658 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3659 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3660 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3661 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3662 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3663 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3664 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3665 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3666 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3667 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3668 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3669 1.1 alnsn };
3670 1.1 alnsn
3671 1.1 alnsn size_t i, j;
3672 1.2 rmind bpfjit_func_t code;
3673 1.1 alnsn uint8_t pkt[2][34] = {
3674 1.1 alnsn {
3675 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3676 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3677 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3678 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3679 1.1 alnsn },
3680 1.1 alnsn {
3681 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3682 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3683 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3684 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3685 1.1 alnsn }
3686 1.1 alnsn };
3687 1.1 alnsn
3688 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3689 1.1 alnsn
3690 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3691 1.1 alnsn
3692 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3693 1.1 alnsn ATF_REQUIRE(code != NULL);
3694 1.1 alnsn
3695 1.1 alnsn for (i = 0; i < 2; i++) {
3696 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3697 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3698 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3699 1.1 alnsn }
3700 1.1 alnsn
3701 1.1 alnsn bpfjit_free_code(code);
3702 1.1 alnsn }
3703 1.1 alnsn
3704 1.6 alnsn ATF_TC(libbpfjit_opt_ld_abs_3);
3705 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_abs_3, tc)
3706 1.1 alnsn {
3707 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3708 1.1 alnsn "Test JIT compilation with length optimization "
3709 1.1 alnsn "applied to BPF_LD+BPF_ABS");
3710 1.1 alnsn }
3711 1.1 alnsn
3712 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_abs_3, tc)
3713 1.1 alnsn {
3714 1.1 alnsn static struct bpf_insn insns[] = {
3715 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3716 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3717 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3718 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3719 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3720 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3721 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3722 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3723 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3724 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3725 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3726 1.1 alnsn };
3727 1.1 alnsn
3728 1.1 alnsn size_t i, j;
3729 1.2 rmind bpfjit_func_t code;
3730 1.1 alnsn uint8_t pkt[2][34] = {
3731 1.1 alnsn {
3732 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3733 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3734 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3735 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3736 1.1 alnsn },
3737 1.1 alnsn {
3738 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3739 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3740 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3741 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3742 1.1 alnsn }
3743 1.1 alnsn };
3744 1.1 alnsn
3745 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3746 1.1 alnsn
3747 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3748 1.1 alnsn
3749 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3750 1.1 alnsn ATF_REQUIRE(code != NULL);
3751 1.1 alnsn
3752 1.1 alnsn for (i = 0; i < 2; i++) {
3753 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3754 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3755 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3756 1.1 alnsn }
3757 1.1 alnsn
3758 1.1 alnsn bpfjit_free_code(code);
3759 1.1 alnsn }
3760 1.1 alnsn
3761 1.6 alnsn ATF_TC(libbpfjit_opt_ld_ind_1);
3762 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_1, tc)
3763 1.1 alnsn {
3764 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3765 1.1 alnsn "Test JIT compilation with length optimization "
3766 1.1 alnsn "applied to BPF_LD+BPF_IND");
3767 1.1 alnsn }
3768 1.1 alnsn
3769 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_1, tc)
3770 1.1 alnsn {
3771 1.1 alnsn static struct bpf_insn insns[] = {
3772 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3773 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3774 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3775 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3776 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3777 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3778 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3779 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3780 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3781 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3782 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3783 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3784 1.1 alnsn };
3785 1.1 alnsn
3786 1.1 alnsn size_t i, j;
3787 1.2 rmind bpfjit_func_t code;
3788 1.1 alnsn uint8_t pkt[2][34] = {
3789 1.1 alnsn {
3790 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3791 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3792 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3793 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3794 1.1 alnsn },
3795 1.1 alnsn {
3796 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3797 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3798 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3799 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3800 1.1 alnsn }
3801 1.1 alnsn };
3802 1.1 alnsn
3803 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3804 1.1 alnsn
3805 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3806 1.1 alnsn
3807 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3808 1.1 alnsn ATF_REQUIRE(code != NULL);
3809 1.1 alnsn
3810 1.1 alnsn for (i = 0; i < 2; i++) {
3811 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3812 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3813 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3814 1.1 alnsn }
3815 1.1 alnsn
3816 1.1 alnsn bpfjit_free_code(code);
3817 1.1 alnsn }
3818 1.1 alnsn
3819 1.6 alnsn ATF_TC(libbpfjit_opt_ld_ind_2);
3820 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_2, tc)
3821 1.1 alnsn {
3822 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3823 1.1 alnsn "Test JIT compilation with length optimization "
3824 1.1 alnsn "applied to BPF_LD+BPF_IND");
3825 1.1 alnsn }
3826 1.1 alnsn
3827 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_2, tc)
3828 1.1 alnsn {
3829 1.1 alnsn static struct bpf_insn insns[] = {
3830 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3831 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3832 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3833 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3834 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3835 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3836 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3837 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3838 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3839 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3840 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3841 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3842 1.1 alnsn };
3843 1.1 alnsn
3844 1.1 alnsn size_t i, j;
3845 1.2 rmind bpfjit_func_t code;
3846 1.1 alnsn uint8_t pkt[2][34] = {
3847 1.1 alnsn {
3848 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3849 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3850 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3851 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3852 1.1 alnsn },
3853 1.1 alnsn {
3854 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3855 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3856 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3857 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3858 1.1 alnsn }
3859 1.1 alnsn };
3860 1.1 alnsn
3861 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3862 1.1 alnsn
3863 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3864 1.1 alnsn
3865 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3866 1.1 alnsn ATF_REQUIRE(code != NULL);
3867 1.1 alnsn
3868 1.1 alnsn for (i = 0; i < 2; i++) {
3869 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3870 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3871 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3872 1.1 alnsn }
3873 1.1 alnsn
3874 1.1 alnsn bpfjit_free_code(code);
3875 1.1 alnsn }
3876 1.1 alnsn
3877 1.6 alnsn ATF_TC(libbpfjit_opt_ld_ind_3);
3878 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_3, tc)
3879 1.1 alnsn {
3880 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3881 1.1 alnsn "Test JIT compilation with length optimization "
3882 1.1 alnsn "applied to BPF_LD+BPF_IND");
3883 1.1 alnsn }
3884 1.1 alnsn
3885 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_3, tc)
3886 1.1 alnsn {
3887 1.1 alnsn static struct bpf_insn insns[] = {
3888 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3889 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3890 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3891 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3892 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3893 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3894 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3895 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3896 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3897 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3898 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3899 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3900 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3901 1.1 alnsn };
3902 1.1 alnsn
3903 1.1 alnsn size_t i, j;
3904 1.2 rmind bpfjit_func_t code;
3905 1.1 alnsn uint8_t pkt[2][34] = {
3906 1.1 alnsn {
3907 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3908 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3909 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3910 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3911 1.1 alnsn },
3912 1.1 alnsn {
3913 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3914 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3915 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3916 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3917 1.1 alnsn }
3918 1.1 alnsn };
3919 1.1 alnsn
3920 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3921 1.1 alnsn
3922 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3923 1.1 alnsn
3924 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3925 1.1 alnsn ATF_REQUIRE(code != NULL);
3926 1.1 alnsn
3927 1.1 alnsn for (i = 0; i < 2; i++) {
3928 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3929 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3930 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3931 1.1 alnsn }
3932 1.1 alnsn
3933 1.1 alnsn bpfjit_free_code(code);
3934 1.1 alnsn }
3935 1.1 alnsn
3936 1.6 alnsn ATF_TC(libbpfjit_opt_ld_ind_4);
3937 1.6 alnsn ATF_TC_HEAD(libbpfjit_opt_ld_ind_4, tc)
3938 1.1 alnsn {
3939 1.1 alnsn atf_tc_set_md_var(tc, "descr",
3940 1.1 alnsn "Test JIT compilation with length optimization "
3941 1.1 alnsn "applied to BPF_LD+BPF_IND");
3942 1.1 alnsn }
3943 1.1 alnsn
3944 1.6 alnsn ATF_TC_BODY(libbpfjit_opt_ld_ind_4, tc)
3945 1.1 alnsn {
3946 1.1 alnsn static struct bpf_insn insns[] = {
3947 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3948 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3949 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3950 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3951 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3952 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3953 1.1 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3954 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3955 1.1 alnsn BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3956 1.1 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3957 1.1 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3958 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3959 1.1 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
3960 1.1 alnsn };
3961 1.1 alnsn
3962 1.1 alnsn size_t i, j;
3963 1.2 rmind bpfjit_func_t code;
3964 1.1 alnsn uint8_t pkt[2][34] = {
3965 1.1 alnsn {
3966 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3967 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3968 1.1 alnsn 0x80, 0x03, 0x70, 0x0f,
3969 1.1 alnsn 0x80, 0x03, 0x70, 0x23
3970 1.1 alnsn },
3971 1.1 alnsn {
3972 1.1 alnsn 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3973 1.1 alnsn 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3974 1.1 alnsn 0x80, 0x03, 0x70, 0x23,
3975 1.1 alnsn 0x80, 0x03, 0x70, 0x0f
3976 1.1 alnsn }
3977 1.1 alnsn };
3978 1.1 alnsn
3979 1.1 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3980 1.1 alnsn
3981 1.1 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
3982 1.1 alnsn
3983 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
3984 1.1 alnsn ATF_REQUIRE(code != NULL);
3985 1.1 alnsn
3986 1.1 alnsn for (i = 0; i < 2; i++) {
3987 1.1 alnsn for (j = 1; j < sizeof(pkt[i]); j++)
3988 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == 0);
3989 1.5 alnsn ATF_CHECK(jitcall(code, pkt[i], j, j) == UINT32_MAX);
3990 1.1 alnsn }
3991 1.1 alnsn
3992 1.1 alnsn bpfjit_free_code(code);
3993 1.1 alnsn }
3994 1.1 alnsn
3995 1.6 alnsn ATF_TC(libbpfjit_abc_ja);
3996 1.6 alnsn ATF_TC_HEAD(libbpfjit_abc_ja, tc)
3997 1.3 alnsn {
3998 1.3 alnsn atf_tc_set_md_var(tc, "descr",
3999 1.3 alnsn "Test ABC optimization with a single BPF_JMP+BPF_JA");
4000 1.3 alnsn }
4001 1.3 alnsn
4002 1.6 alnsn ATF_TC_BODY(libbpfjit_abc_ja, tc)
4003 1.3 alnsn {
4004 1.3 alnsn static struct bpf_insn insns[] = {
4005 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
4006 1.3 alnsn BPF_STMT(BPF_JMP+BPF_JA, 2),
4007 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, UINT32_MAX - 1),
4008 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4009 1.3 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 2), /* min. length 6 */
4010 1.3 alnsn BPF_STMT(BPF_RET+BPF_A, 0),
4011 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
4012 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
4013 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
4014 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
4015 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
4016 1.3 alnsn };
4017 1.3 alnsn
4018 1.3 alnsn bpfjit_func_t code;
4019 1.3 alnsn uint8_t pkt[6] = {0, 0, /* UINT32_MAX: */ 255, 255, 255, 255};
4020 1.3 alnsn
4021 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4022 1.3 alnsn
4023 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4024 1.3 alnsn
4025 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4026 1.3 alnsn ATF_REQUIRE(code != NULL);
4027 1.3 alnsn
4028 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4029 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4030 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4031 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4032 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4033 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == UINT32_MAX);
4034 1.3 alnsn
4035 1.3 alnsn bpfjit_free_code(code);
4036 1.3 alnsn }
4037 1.3 alnsn
4038 1.6 alnsn ATF_TC(libbpfjit_abc_ja_over);
4039 1.6 alnsn ATF_TC_HEAD(libbpfjit_abc_ja_over, tc)
4040 1.3 alnsn {
4041 1.3 alnsn atf_tc_set_md_var(tc, "descr",
4042 1.3 alnsn "Test ABC optimization when BPF_JMP+BPF_JA jumps over all loads");
4043 1.3 alnsn }
4044 1.3 alnsn
4045 1.6 alnsn ATF_TC_BODY(libbpfjit_abc_ja_over, tc)
4046 1.3 alnsn {
4047 1.3 alnsn static struct bpf_insn insns[] = {
4048 1.3 alnsn BPF_STMT(BPF_JMP+BPF_JA, 2),
4049 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3),
4050 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4051 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4052 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 4),
4053 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 1),
4054 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
4055 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 2),
4056 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 6),
4057 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 3),
4058 1.3 alnsn };
4059 1.3 alnsn
4060 1.3 alnsn bpfjit_func_t code;
4061 1.3 alnsn uint8_t pkt[1]; /* the program doesn't read any data */
4062 1.3 alnsn
4063 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4064 1.3 alnsn
4065 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4066 1.3 alnsn
4067 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4068 1.3 alnsn ATF_REQUIRE(code != NULL);
4069 1.3 alnsn
4070 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == UINT32_MAX);
4071 1.3 alnsn
4072 1.3 alnsn bpfjit_free_code(code);
4073 1.3 alnsn }
4074 1.3 alnsn
4075 1.6 alnsn ATF_TC(libbpfjit_abc_ld_chain);
4076 1.6 alnsn ATF_TC_HEAD(libbpfjit_abc_ld_chain, tc)
4077 1.3 alnsn {
4078 1.3 alnsn atf_tc_set_md_var(tc, "descr",
4079 1.3 alnsn "Test ABC optimization of a chain of BPF_LD instructions "
4080 1.3 alnsn "with exits leading to a single BPF_RET");
4081 1.3 alnsn }
4082 1.3 alnsn
4083 1.6 alnsn ATF_TC_BODY(libbpfjit_abc_ld_chain, tc)
4084 1.3 alnsn {
4085 1.3 alnsn static struct bpf_insn insns[] = {
4086 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 3), /* min. length 4 */
4087 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 4),
4088 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 4), /* min. length 6 */
4089 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 0, 2),
4090 1.3 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 6), /* min. length 10 */
4091 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 0, 1),
4092 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 123456789),
4093 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 987654321),
4094 1.3 alnsn };
4095 1.3 alnsn
4096 1.3 alnsn bpfjit_func_t code;
4097 1.3 alnsn uint8_t pkt[10] = {};
4098 1.3 alnsn
4099 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4100 1.3 alnsn
4101 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4102 1.3 alnsn
4103 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4104 1.3 alnsn ATF_REQUIRE(code != NULL);
4105 1.3 alnsn
4106 1.3 alnsn /* Packet is too short. */
4107 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4108 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4109 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4110 1.3 alnsn
4111 1.3 alnsn /* !(pkt[3] == 8) => return 123456789 */
4112 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 123456789);
4113 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 123456789);
4114 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4115 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 123456789);
4116 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 123456789);
4117 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4118 1.3 alnsn
4119 1.3 alnsn /* !(pkt[4:2] >= 7) => too short or return 123456789 */
4120 1.3 alnsn pkt[3] = 8;
4121 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4122 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4123 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4124 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4125 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4126 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 123456789);
4127 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 123456789);
4128 1.3 alnsn
4129 1.3 alnsn /* !(pkt[6:4] > 6) => too short or return 987654321 */
4130 1.3 alnsn pkt[4] = pkt[5] = 1;
4131 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4132 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4133 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4134 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4135 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4136 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4137 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4138 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4139 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4140 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 987654321);
4141 1.3 alnsn
4142 1.3 alnsn /* (pkt[6:4] > 6) => too short or return 123456789 */
4143 1.3 alnsn pkt[6] = pkt[7] = pkt[8] = pkt[9] = 1;
4144 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4145 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4146 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4147 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4148 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4149 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4150 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4151 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4152 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4153 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 123456789);
4154 1.3 alnsn
4155 1.3 alnsn bpfjit_free_code(code);
4156 1.3 alnsn }
4157 1.3 alnsn
4158 1.6 alnsn ATF_TC(libbpfjit_examples_1);
4159 1.6 alnsn ATF_TC_HEAD(libbpfjit_examples_1, tc)
4160 1.3 alnsn {
4161 1.3 alnsn atf_tc_set_md_var(tc, "descr",
4162 1.3 alnsn "Test the first example from bpf(4) - "
4163 1.3 alnsn "accept Reverse ARP requests");
4164 1.3 alnsn }
4165 1.3 alnsn
4166 1.6 alnsn ATF_TC_BODY(libbpfjit_examples_1, tc)
4167 1.3 alnsn {
4168 1.3 alnsn /*
4169 1.3 alnsn * The following filter is taken from the Reverse ARP
4170 1.3 alnsn * Daemon. It accepts only Reverse ARP requests.
4171 1.3 alnsn */
4172 1.3 alnsn struct bpf_insn insns[] = {
4173 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4174 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8035, 0, 3),
4175 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4176 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 0, 1),
4177 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 42),
4178 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4179 1.3 alnsn };
4180 1.3 alnsn
4181 1.3 alnsn bpfjit_func_t code;
4182 1.3 alnsn uint8_t pkt[22] = {};
4183 1.3 alnsn
4184 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4185 1.3 alnsn
4186 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4187 1.3 alnsn
4188 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4189 1.3 alnsn ATF_REQUIRE(code != NULL);
4190 1.3 alnsn
4191 1.3 alnsn /* Packet is too short. */
4192 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4193 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4194 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4195 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4196 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4197 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4198 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4199 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4200 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4201 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4202 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4203 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4204 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4205 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4206 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4207 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4208 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4209 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4210 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4211 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4212 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4213 1.3 alnsn
4214 1.3 alnsn /* The packet doesn't match. */
4215 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4216 1.3 alnsn
4217 1.3 alnsn /* Still no match after setting the protocol field. */
4218 1.3 alnsn pkt[12] = 0x80; pkt[13] = 0x35;
4219 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4220 1.3 alnsn
4221 1.3 alnsn /* Set RARP message type. */
4222 1.3 alnsn pkt[21] = 3;
4223 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 42);
4224 1.3 alnsn
4225 1.3 alnsn /* Packet is too short. */
4226 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4227 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4228 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4229 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4230 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4231 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4232 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4233 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4234 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4235 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4236 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4237 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4238 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4239 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4240 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4241 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4242 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4243 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4244 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4245 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4246 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4247 1.3 alnsn
4248 1.3 alnsn /* Change RARP message type. */
4249 1.3 alnsn pkt[20] = 3;
4250 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4251 1.3 alnsn
4252 1.3 alnsn bpfjit_free_code(code);
4253 1.3 alnsn }
4254 1.3 alnsn
4255 1.6 alnsn ATF_TC(libbpfjit_examples_2);
4256 1.6 alnsn ATF_TC_HEAD(libbpfjit_examples_2, tc)
4257 1.3 alnsn {
4258 1.3 alnsn atf_tc_set_md_var(tc, "descr",
4259 1.3 alnsn "Test the second example from bpf(4) - "
4260 1.3 alnsn "accept IP packets between two specified hosts");
4261 1.3 alnsn }
4262 1.3 alnsn
4263 1.6 alnsn ATF_TC_BODY(libbpfjit_examples_2, tc)
4264 1.3 alnsn {
4265 1.3 alnsn /*
4266 1.3 alnsn * This filter accepts only IP packets between host 128.3.112.15
4267 1.3 alnsn * and 128.3.112.35.
4268 1.3 alnsn */
4269 1.3 alnsn static struct bpf_insn insns[] = {
4270 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4271 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 8),
4272 1.3 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
4273 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
4274 1.3 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4275 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
4276 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
4277 1.3 alnsn BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
4278 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
4279 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4280 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4281 1.3 alnsn };
4282 1.3 alnsn
4283 1.3 alnsn bpfjit_func_t code;
4284 1.3 alnsn uint8_t pkt[34] = {};
4285 1.3 alnsn
4286 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4287 1.3 alnsn
4288 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4289 1.3 alnsn
4290 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4291 1.3 alnsn ATF_REQUIRE(code != NULL);
4292 1.3 alnsn
4293 1.3 alnsn /* Packet is too short. */
4294 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4295 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4296 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4297 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4298 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4299 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4300 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4301 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4302 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4303 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4304 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4305 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4306 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4307 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4308 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4309 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4310 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4311 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4312 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4313 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4314 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4315 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4316 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4317 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4318 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4319 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4320 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4321 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4322 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4323 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4324 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4325 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4326 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4327 1.3 alnsn
4328 1.3 alnsn /* The packet doesn't match. */
4329 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4330 1.3 alnsn
4331 1.3 alnsn /* Still no match after setting the protocol field. */
4332 1.3 alnsn pkt[12] = 8;
4333 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4334 1.3 alnsn
4335 1.3 alnsn pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 15;
4336 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4337 1.3 alnsn
4338 1.3 alnsn pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 35;
4339 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4340 1.3 alnsn
4341 1.3 alnsn /* Swap the ip addresses. */
4342 1.3 alnsn pkt[26] = 128; pkt[27] = 3; pkt[28] = 112; pkt[29] = 35;
4343 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4344 1.3 alnsn
4345 1.3 alnsn pkt[30] = 128; pkt[31] = 3; pkt[32] = 112; pkt[33] = 15;
4346 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == UINT32_MAX);
4347 1.3 alnsn
4348 1.3 alnsn /* Packet is too short. */
4349 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4350 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4351 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4352 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4353 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4354 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4355 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4356 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4357 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4358 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4359 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4360 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4361 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4362 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4363 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4364 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4365 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4366 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4367 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4368 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4369 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4370 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4371 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4372 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4373 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4374 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4375 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4376 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4377 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4378 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4379 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 31, 31) == 0);
4380 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 32, 32) == 0);
4381 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 33, 33) == 0);
4382 1.3 alnsn
4383 1.3 alnsn /* Change the protocol field. */
4384 1.3 alnsn pkt[13] = 8;
4385 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 34, 34) == 0);
4386 1.3 alnsn
4387 1.3 alnsn bpfjit_free_code(code);
4388 1.3 alnsn }
4389 1.3 alnsn
4390 1.6 alnsn ATF_TC(libbpfjit_examples_3);
4391 1.6 alnsn ATF_TC_HEAD(libbpfjit_examples_3, tc)
4392 1.3 alnsn {
4393 1.3 alnsn atf_tc_set_md_var(tc, "descr",
4394 1.3 alnsn "Test the third example from bpf(4) - "
4395 1.3 alnsn "accept TCP finger packets");
4396 1.3 alnsn }
4397 1.3 alnsn
4398 1.6 alnsn ATF_TC_BODY(libbpfjit_examples_3, tc)
4399 1.3 alnsn {
4400 1.3 alnsn /*
4401 1.3 alnsn * This filter returns only TCP finger packets.
4402 1.3 alnsn */
4403 1.3 alnsn struct bpf_insn insns[] = {
4404 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
4405 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x0800, 0, 10),
4406 1.3 alnsn BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
4407 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 0, 8),
4408 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
4409 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
4410 1.3 alnsn BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
4411 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
4412 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 2, 0),
4413 1.3 alnsn BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
4414 1.3 alnsn BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 79, 0, 1),
4415 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
4416 1.3 alnsn BPF_STMT(BPF_RET+BPF_K, 0),
4417 1.3 alnsn };
4418 1.3 alnsn
4419 1.3 alnsn bpfjit_func_t code;
4420 1.3 alnsn uint8_t pkt[30] = {};
4421 1.3 alnsn
4422 1.3 alnsn /* Set IP fragment offset to non-zero. */
4423 1.3 alnsn pkt[20] = 1; pkt[21] = 1;
4424 1.3 alnsn
4425 1.3 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4426 1.3 alnsn
4427 1.3 alnsn ATF_CHECK(bpf_validate(insns, insn_count));
4428 1.3 alnsn
4429 1.5 alnsn code = bpfjit_generate_code(NULL, insns, insn_count);
4430 1.3 alnsn ATF_REQUIRE(code != NULL);
4431 1.3 alnsn
4432 1.3 alnsn /* Packet is too short. */
4433 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4434 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4435 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4436 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4437 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4438 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4439 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4440 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4441 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4442 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4443 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4444 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4445 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4446 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4447 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4448 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4449 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4450 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4451 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4452 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4453 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4454 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4455 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4456 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4457 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4458 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4459 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4460 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4461 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4462 1.3 alnsn
4463 1.3 alnsn /* The packet doesn't match. */
4464 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4465 1.3 alnsn
4466 1.3 alnsn /* Still no match after setting the protocol field. */
4467 1.3 alnsn pkt[12] = 8;
4468 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4469 1.3 alnsn
4470 1.3 alnsn /* Get one step closer to the match. */
4471 1.3 alnsn pkt[23] = 6;
4472 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4473 1.3 alnsn
4474 1.3 alnsn /* Set IP fragment offset to zero. */
4475 1.3 alnsn pkt[20] = 0x20; pkt[21] = 0;
4476 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4477 1.3 alnsn
4478 1.3 alnsn /* Set IP header length to 12. */
4479 1.3 alnsn pkt[14] = 0xd3;
4480 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4481 1.3 alnsn
4482 1.3 alnsn /* Match one branch of the program. */
4483 1.3 alnsn pkt[27] = 79;
4484 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4485 1.3 alnsn
4486 1.3 alnsn /* Match the other branch of the program. */
4487 1.3 alnsn pkt[29] = 79; pkt[27] = 0;
4488 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == UINT32_MAX);
4489 1.3 alnsn
4490 1.3 alnsn /* Packet is too short. */
4491 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 1, 1) == 0);
4492 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 2, 2) == 0);
4493 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 3, 3) == 0);
4494 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 4, 4) == 0);
4495 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 5, 5) == 0);
4496 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 6, 6) == 0);
4497 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 7, 7) == 0);
4498 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 8, 8) == 0);
4499 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 9, 9) == 0);
4500 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 10, 10) == 0);
4501 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 11, 11) == 0);
4502 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 12, 12) == 0);
4503 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 13, 13) == 0);
4504 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 14, 14) == 0);
4505 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 15, 15) == 0);
4506 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 16, 16) == 0);
4507 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 17, 17) == 0);
4508 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 18, 18) == 0);
4509 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 19, 19) == 0);
4510 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 20, 20) == 0);
4511 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 21, 21) == 0);
4512 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 22, 22) == 0);
4513 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 23, 23) == 0);
4514 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 24, 24) == 0);
4515 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 25, 25) == 0);
4516 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 26, 26) == 0);
4517 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 27, 27) == 0);
4518 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 28, 28) == 0);
4519 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 29, 29) == 0);
4520 1.3 alnsn
4521 1.3 alnsn /* Set IP header length to 16. Packet is too short. */
4522 1.3 alnsn pkt[14] = 4;
4523 1.5 alnsn ATF_CHECK(jitcall(code, pkt, 30, 30) == 0);
4524 1.3 alnsn
4525 1.3 alnsn bpfjit_free_code(code);
4526 1.3 alnsn }
4527 1.3 alnsn
4528 1.6 alnsn ATF_TC(libbpfjit_cop_no_ctx);
4529 1.6 alnsn ATF_TC_HEAD(libbpfjit_cop_no_ctx, tc)
4530 1.5 alnsn {
4531 1.5 alnsn atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COP "
4532 1.5 alnsn "instruction can't be accepted without a context");
4533 1.5 alnsn }
4534 1.5 alnsn
4535 1.6 alnsn ATF_TC_BODY(libbpfjit_cop_no_ctx, tc)
4536 1.5 alnsn {
4537 1.5 alnsn static struct bpf_insn insns[] = {
4538 1.5 alnsn BPF_STMT(BPF_MISC+BPF_COP, 0),
4539 1.5 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
4540 1.5 alnsn };
4541 1.5 alnsn
4542 1.5 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4543 1.5 alnsn
4544 1.5 alnsn ATF_CHECK(!bpf_validate(insns, insn_count));
4545 1.5 alnsn
4546 1.5 alnsn ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
4547 1.5 alnsn }
4548 1.5 alnsn
4549 1.6 alnsn ATF_TC(libbpfjit_copx_no_ctx);
4550 1.6 alnsn ATF_TC_HEAD(libbpfjit_copx_no_ctx, tc)
4551 1.5 alnsn {
4552 1.5 alnsn atf_tc_set_md_var(tc, "descr", "Test that BPF_MISC|BPF_COPX "
4553 1.5 alnsn "instruction can't be accepted without a context");
4554 1.5 alnsn }
4555 1.5 alnsn
4556 1.6 alnsn ATF_TC_BODY(libbpfjit_copx_no_ctx, tc)
4557 1.5 alnsn {
4558 1.5 alnsn static struct bpf_insn insns[] = {
4559 1.5 alnsn BPF_STMT(BPF_MISC+BPF_COPX, 0),
4560 1.5 alnsn BPF_STMT(BPF_RET+BPF_K, 7)
4561 1.5 alnsn };
4562 1.5 alnsn
4563 1.5 alnsn size_t insn_count = sizeof(insns) / sizeof(insns[0]);
4564 1.5 alnsn
4565 1.5 alnsn ATF_CHECK(!bpf_validate(insns, insn_count));
4566 1.5 alnsn
4567 1.5 alnsn ATF_CHECK(bpfjit_generate_code(NULL, insns, insn_count) == NULL);
4568 1.5 alnsn }
4569 1.5 alnsn
4570 1.1 alnsn ATF_TP_ADD_TCS(tp)
4571 1.1 alnsn {
4572 1.1 alnsn
4573 1.6 alnsn /*
4574 1.6 alnsn * For every new test please also add a similar test
4575 1.6 alnsn * to ../../net/bpfjit/t_bpfjit.c
4576 1.6 alnsn */
4577 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_empty);
4578 1.9 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ret_k);
4579 1.9 alnsn ATF_TP_ADD_TC(tp, libbpfjit_bad_ret_k);
4580 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_add_k);
4581 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_k);
4582 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_k);
4583 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_k);
4584 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_k);
4585 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_k);
4586 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_k);
4587 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_k);
4588 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_k);
4589 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_k);
4590 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_k);
4591 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_k);
4592 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_k);
4593 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_k);
4594 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_k);
4595 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_k);
4596 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_k);
4597 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_k);
4598 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_k);
4599 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_and_k);
4600 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_or_k);
4601 1.7 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_k);
4602 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_k);
4603 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_k);
4604 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_k);
4605 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_k);
4606 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_k);
4607 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_add_x);
4608 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_sub_x);
4609 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mul_x);
4610 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div0_x);
4611 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div1_x);
4612 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div2_x);
4613 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div4_x);
4614 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div10_x);
4615 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div10000_x);
4616 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div7609801_x);
4617 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_div80000000_x);
4618 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod0_x);
4619 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod1_x);
4620 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod2_x);
4621 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod4_x);
4622 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10_x);
4623 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod10000_x);
4624 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod7609801_x);
4625 1.8 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_mod80000000_x);
4626 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_and_x);
4627 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_or_x);
4628 1.7 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_xor_x);
4629 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh_x);
4630 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_lsh0_x);
4631 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh_x);
4632 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_rsh0_x);
4633 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_modulo_x);
4634 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_alu_neg);
4635 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja);
4636 1.10 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_invalid);
4637 1.11 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_ja_overflow);
4638 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_k);
4639 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_k);
4640 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_k);
4641 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_k);
4642 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_k);
4643 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jgt_x);
4644 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jge_x);
4645 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jeq_x);
4646 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_jset_x);
4647 1.12 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_x_uninitialised);
4648 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_jmp_modulo_x);
4649 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_abs);
4650 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_abs_k_overflow);
4651 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_ind);
4652 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_k_overflow);
4653 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow1);
4654 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_ind_x_overflow2);
4655 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_len);
4656 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ld_imm);
4657 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm1);
4658 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ldx_imm2);
4659 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ldx_len1);
4660 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ldx_len2);
4661 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_ldx_msh);
4662 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_misc_tax);
4663 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_misc_txa);
4664 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_st1);
4665 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_st2);
4666 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_st3);
4667 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_st4);
4668 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_st5);
4669 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_stx1);
4670 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_stx2);
4671 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_stx3);
4672 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_stx4);
4673 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_1);
4674 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_2);
4675 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_abs_3);
4676 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_1);
4677 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_2);
4678 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_3);
4679 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_opt_ld_ind_4);
4680 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_abc_ja);
4681 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_abc_ja_over);
4682 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_abc_ld_chain);
4683 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_examples_1);
4684 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_examples_2);
4685 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_examples_3);
4686 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_cop_no_ctx);
4687 1.6 alnsn ATF_TP_ADD_TC(tp, libbpfjit_copx_no_ctx);
4688 1.1 alnsn
4689 1.1 alnsn return atf_no_error();
4690 1.1 alnsn }
4691