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