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