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