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