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