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