t_bpfjit.c revision 1.1.4.3 1 1.1.4.3 yamt /* $NetBSD: t_bpfjit.c,v 1.1.4.3 2014/05/22 11:42:20 yamt Exp $ */
2 1.1.4.2 yamt
3 1.1.4.2 yamt /*-
4 1.1.4.2 yamt * Copyright (c) 2011-2012 Alexander Nasonov.
5 1.1.4.2 yamt * All rights reserved.
6 1.1.4.2 yamt *
7 1.1.4.2 yamt * Redistribution and use in source and binary forms, with or without
8 1.1.4.2 yamt * modification, are permitted provided that the following conditions
9 1.1.4.2 yamt * are met:
10 1.1.4.2 yamt *
11 1.1.4.2 yamt * 1. Redistributions of source code must retain the above copyright
12 1.1.4.2 yamt * notice, this list of conditions and the following disclaimer.
13 1.1.4.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
14 1.1.4.2 yamt * notice, this list of conditions and the following disclaimer in
15 1.1.4.2 yamt * the documentation and/or other materials provided with the
16 1.1.4.2 yamt * distribution.
17 1.1.4.2 yamt *
18 1.1.4.2 yamt * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 1.1.4.2 yamt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 1.1.4.2 yamt * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21 1.1.4.2 yamt * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22 1.1.4.2 yamt * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23 1.1.4.2 yamt * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 1.1.4.2 yamt * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 1.1.4.2 yamt * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 1.1.4.2 yamt * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 1.1.4.2 yamt * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28 1.1.4.2 yamt * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 1.1.4.2 yamt * SUCH DAMAGE.
30 1.1.4.2 yamt */
31 1.1.4.2 yamt
32 1.1.4.2 yamt #include <sys/cdefs.h>
33 1.1.4.3 yamt __RCSID("$NetBSD: t_bpfjit.c,v 1.1.4.3 2014/05/22 11:42:20 yamt Exp $");
34 1.1.4.2 yamt
35 1.1.4.2 yamt #include <atf-c.h>
36 1.1.4.2 yamt #include <stdint.h>
37 1.1.4.2 yamt #include <string.h>
38 1.1.4.2 yamt
39 1.1.4.3 yamt #define __BPF_PRIVATE
40 1.1.4.3 yamt #include <net/bpf.h>
41 1.1.4.3 yamt #include <net/bpfjit.h>
42 1.1.4.3 yamt
43 1.1.4.2 yamt static uint8_t deadbeef_at_5[16] = {
44 1.1.4.2 yamt 0, 0xf1, 2, 0xf3, 4, 0xde, 0xad, 0xbe, 0xef, 0xff
45 1.1.4.2 yamt };
46 1.1.4.2 yamt
47 1.1.4.3 yamt static bpf_ctx_t bc_zeroed;
48 1.1.4.3 yamt static bpf_ctx_t *bc = &bc_zeroed;
49 1.1.4.3 yamt
50 1.1.4.2 yamt ATF_TC(bpfjit_empty);
51 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_empty, tc)
52 1.1.4.2 yamt {
53 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
54 1.1.4.2 yamt "Test that JIT compilation for an empty bpf program fails");
55 1.1.4.2 yamt }
56 1.1.4.2 yamt
57 1.1.4.2 yamt ATF_TC_BODY(bpfjit_empty, tc)
58 1.1.4.2 yamt {
59 1.1.4.2 yamt struct bpf_insn dummy;
60 1.1.4.2 yamt
61 1.1.4.3 yamt ATF_CHECK(bpfjit_generate_code(bc, &dummy, 0) == NULL);
62 1.1.4.2 yamt }
63 1.1.4.2 yamt
64 1.1.4.2 yamt ATF_TC(bpfjit_alu_add_k);
65 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_add_k, tc)
66 1.1.4.2 yamt {
67 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
68 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_K");
69 1.1.4.2 yamt }
70 1.1.4.2 yamt
71 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_add_k, tc)
72 1.1.4.2 yamt {
73 1.1.4.2 yamt static struct bpf_insn insns[] = {
74 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 3),
75 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 2),
76 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
77 1.1.4.2 yamt };
78 1.1.4.2 yamt
79 1.1.4.3 yamt bpfjit_func_t code;
80 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
81 1.1.4.2 yamt
82 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
83 1.1.4.2 yamt
84 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
85 1.1.4.2 yamt
86 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
87 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
88 1.1.4.2 yamt
89 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 5);
90 1.1.4.2 yamt
91 1.1.4.2 yamt bpfjit_free_code(code);
92 1.1.4.2 yamt }
93 1.1.4.2 yamt
94 1.1.4.2 yamt ATF_TC(bpfjit_alu_sub_k);
95 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_sub_k, tc)
96 1.1.4.2 yamt {
97 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
98 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_K");
99 1.1.4.2 yamt }
100 1.1.4.2 yamt
101 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_sub_k, tc)
102 1.1.4.2 yamt {
103 1.1.4.2 yamt static struct bpf_insn insns[] = {
104 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 1),
105 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, 2),
106 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
107 1.1.4.2 yamt };
108 1.1.4.2 yamt
109 1.1.4.3 yamt bpfjit_func_t code;
110 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
111 1.1.4.2 yamt
112 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
113 1.1.4.2 yamt
114 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
115 1.1.4.2 yamt
116 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
117 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
118 1.1.4.2 yamt
119 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
120 1.1.4.2 yamt
121 1.1.4.2 yamt bpfjit_free_code(code);
122 1.1.4.2 yamt }
123 1.1.4.2 yamt
124 1.1.4.2 yamt ATF_TC(bpfjit_alu_mul_k);
125 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_mul_k, tc)
126 1.1.4.2 yamt {
127 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
128 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_K");
129 1.1.4.2 yamt }
130 1.1.4.2 yamt
131 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_mul_k, tc)
132 1.1.4.2 yamt {
133 1.1.4.2 yamt static struct bpf_insn insns[] = {
134 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
135 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, 3),
136 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
137 1.1.4.2 yamt };
138 1.1.4.2 yamt
139 1.1.4.3 yamt bpfjit_func_t code;
140 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
141 1.1.4.2 yamt
142 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
143 1.1.4.2 yamt
144 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
145 1.1.4.2 yamt
146 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
147 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
148 1.1.4.2 yamt
149 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
150 1.1.4.2 yamt
151 1.1.4.2 yamt bpfjit_free_code(code);
152 1.1.4.2 yamt }
153 1.1.4.2 yamt
154 1.1.4.2 yamt ATF_TC(bpfjit_alu_div0_k);
155 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div0_k, tc)
156 1.1.4.2 yamt {
157 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
158 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0");
159 1.1.4.2 yamt }
160 1.1.4.2 yamt
161 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div0_k, tc)
162 1.1.4.2 yamt {
163 1.1.4.2 yamt static struct bpf_insn insns[] = {
164 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 0),
165 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
166 1.1.4.2 yamt };
167 1.1.4.2 yamt
168 1.1.4.3 yamt bpfjit_func_t code;
169 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
170 1.1.4.2 yamt
171 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
172 1.1.4.2 yamt
173 1.1.4.2 yamt //ATF_CHECK(bpf_validate(insns, insn_count));
174 1.1.4.2 yamt
175 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
176 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
177 1.1.4.2 yamt
178 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0);
179 1.1.4.2 yamt
180 1.1.4.2 yamt bpfjit_free_code(code);
181 1.1.4.2 yamt }
182 1.1.4.2 yamt
183 1.1.4.2 yamt ATF_TC(bpfjit_alu_div1_k);
184 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div1_k, tc)
185 1.1.4.2 yamt {
186 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
187 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=1");
188 1.1.4.2 yamt }
189 1.1.4.2 yamt
190 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div1_k, tc)
191 1.1.4.2 yamt {
192 1.1.4.2 yamt static struct bpf_insn insns[] = {
193 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 7),
194 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 1),
195 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
196 1.1.4.2 yamt };
197 1.1.4.2 yamt
198 1.1.4.3 yamt bpfjit_func_t code;
199 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
200 1.1.4.2 yamt
201 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
202 1.1.4.2 yamt
203 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
204 1.1.4.2 yamt
205 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
206 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
207 1.1.4.2 yamt
208 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 7);
209 1.1.4.2 yamt
210 1.1.4.2 yamt bpfjit_free_code(code);
211 1.1.4.2 yamt }
212 1.1.4.2 yamt
213 1.1.4.2 yamt ATF_TC(bpfjit_alu_div2_k);
214 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div2_k, tc)
215 1.1.4.2 yamt {
216 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
217 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=2");
218 1.1.4.2 yamt }
219 1.1.4.2 yamt
220 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div2_k, tc)
221 1.1.4.2 yamt {
222 1.1.4.2 yamt static struct bpf_insn insns[] = {
223 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 7),
224 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 2),
225 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
226 1.1.4.2 yamt };
227 1.1.4.2 yamt
228 1.1.4.3 yamt bpfjit_func_t code;
229 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
230 1.1.4.2 yamt
231 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
232 1.1.4.2 yamt
233 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
234 1.1.4.2 yamt
235 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
236 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
237 1.1.4.2 yamt
238 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 3);
239 1.1.4.2 yamt
240 1.1.4.2 yamt bpfjit_free_code(code);
241 1.1.4.2 yamt }
242 1.1.4.2 yamt
243 1.1.4.2 yamt ATF_TC(bpfjit_alu_div4_k);
244 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div4_k, tc)
245 1.1.4.2 yamt {
246 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
247 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=4");
248 1.1.4.2 yamt }
249 1.1.4.2 yamt
250 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div4_k, tc)
251 1.1.4.2 yamt {
252 1.1.4.2 yamt static struct bpf_insn insns[] = {
253 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
254 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 4),
255 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
256 1.1.4.2 yamt };
257 1.1.4.2 yamt
258 1.1.4.3 yamt bpfjit_func_t code;
259 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
260 1.1.4.2 yamt
261 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
262 1.1.4.2 yamt
263 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
264 1.1.4.2 yamt
265 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
266 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
267 1.1.4.2 yamt
268 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
269 1.1.4.2 yamt
270 1.1.4.2 yamt bpfjit_free_code(code);
271 1.1.4.2 yamt }
272 1.1.4.2 yamt
273 1.1.4.2 yamt ATF_TC(bpfjit_alu_div10_k);
274 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div10_k, tc)
275 1.1.4.2 yamt {
276 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
277 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10");
278 1.1.4.2 yamt }
279 1.1.4.2 yamt
280 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div10_k, tc)
281 1.1.4.2 yamt {
282 1.1.4.2 yamt static struct bpf_insn insns[] = {
283 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
284 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10),
285 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
286 1.1.4.2 yamt };
287 1.1.4.2 yamt
288 1.1.4.3 yamt bpfjit_func_t code;
289 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
290 1.1.4.2 yamt
291 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
292 1.1.4.2 yamt
293 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
294 1.1.4.2 yamt
295 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
296 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
297 1.1.4.2 yamt
298 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
299 1.1.4.2 yamt
300 1.1.4.2 yamt bpfjit_free_code(code);
301 1.1.4.2 yamt }
302 1.1.4.2 yamt
303 1.1.4.2 yamt ATF_TC(bpfjit_alu_div10000_k);
304 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div10000_k, tc)
305 1.1.4.2 yamt {
306 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
307 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=10000");
308 1.1.4.2 yamt }
309 1.1.4.2 yamt
310 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div10000_k, tc)
311 1.1.4.2 yamt {
312 1.1.4.2 yamt static struct bpf_insn insns[] = {
313 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
314 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, 10000),
315 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
316 1.1.4.2 yamt };
317 1.1.4.2 yamt
318 1.1.4.3 yamt bpfjit_func_t code;
319 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
320 1.1.4.2 yamt
321 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
322 1.1.4.2 yamt
323 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
324 1.1.4.2 yamt
325 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
326 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
327 1.1.4.2 yamt
328 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
329 1.1.4.2 yamt
330 1.1.4.2 yamt bpfjit_free_code(code);
331 1.1.4.2 yamt }
332 1.1.4.2 yamt
333 1.1.4.2 yamt ATF_TC(bpfjit_alu_div7609801_k);
334 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div7609801_k, tc)
335 1.1.4.2 yamt {
336 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
337 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=7609801");
338 1.1.4.2 yamt }
339 1.1.4.2 yamt
340 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div7609801_k, tc)
341 1.1.4.2 yamt {
342 1.1.4.2 yamt static struct bpf_insn insns[] = {
343 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
344 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(7609801)),
345 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
346 1.1.4.2 yamt };
347 1.1.4.2 yamt
348 1.1.4.3 yamt bpfjit_func_t code;
349 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
350 1.1.4.2 yamt
351 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
352 1.1.4.2 yamt
353 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
354 1.1.4.2 yamt
355 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
356 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
357 1.1.4.2 yamt
358 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 564);
359 1.1.4.2 yamt
360 1.1.4.2 yamt bpfjit_free_code(code);
361 1.1.4.2 yamt }
362 1.1.4.2 yamt
363 1.1.4.2 yamt ATF_TC(bpfjit_alu_div80000000_k);
364 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div80000000_k, tc)
365 1.1.4.2 yamt {
366 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
367 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_K with k=0x80000000");
368 1.1.4.2 yamt }
369 1.1.4.2 yamt
370 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div80000000_k, tc)
371 1.1.4.2 yamt {
372 1.1.4.2 yamt static struct bpf_insn insns[] = {
373 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffde)),
374 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0x80000000)),
375 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
376 1.1.4.2 yamt };
377 1.1.4.2 yamt
378 1.1.4.3 yamt bpfjit_func_t code;
379 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
380 1.1.4.2 yamt
381 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
382 1.1.4.2 yamt
383 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
384 1.1.4.2 yamt
385 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
386 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
387 1.1.4.2 yamt
388 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
389 1.1.4.2 yamt
390 1.1.4.2 yamt bpfjit_free_code(code);
391 1.1.4.2 yamt }
392 1.1.4.2 yamt
393 1.1.4.2 yamt ATF_TC(bpfjit_alu_and_k);
394 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_and_k, tc)
395 1.1.4.2 yamt {
396 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
397 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_AND+BPF_K");
398 1.1.4.2 yamt }
399 1.1.4.2 yamt
400 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_and_k, tc)
401 1.1.4.2 yamt {
402 1.1.4.2 yamt static struct bpf_insn insns[] = {
403 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
404 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_AND+BPF_K, 0xbeef),
405 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
406 1.1.4.2 yamt };
407 1.1.4.2 yamt
408 1.1.4.3 yamt bpfjit_func_t code;
409 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
410 1.1.4.2 yamt
411 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
412 1.1.4.2 yamt
413 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
414 1.1.4.2 yamt
415 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
416 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
417 1.1.4.2 yamt
418 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
419 1.1.4.2 yamt
420 1.1.4.2 yamt bpfjit_free_code(code);
421 1.1.4.2 yamt }
422 1.1.4.2 yamt
423 1.1.4.2 yamt ATF_TC(bpfjit_alu_or_k);
424 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_or_k, tc)
425 1.1.4.2 yamt {
426 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
427 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_OR+BPF_K");
428 1.1.4.2 yamt }
429 1.1.4.2 yamt
430 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_or_k, tc)
431 1.1.4.2 yamt {
432 1.1.4.2 yamt static struct bpf_insn insns[] = {
433 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
434 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_OR+BPF_K, 0x0000beef),
435 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
436 1.1.4.2 yamt };
437 1.1.4.2 yamt
438 1.1.4.3 yamt bpfjit_func_t code;
439 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
440 1.1.4.2 yamt
441 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
442 1.1.4.2 yamt
443 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
444 1.1.4.2 yamt
445 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
446 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
447 1.1.4.2 yamt
448 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
449 1.1.4.2 yamt
450 1.1.4.2 yamt bpfjit_free_code(code);
451 1.1.4.2 yamt }
452 1.1.4.2 yamt
453 1.1.4.2 yamt ATF_TC(bpfjit_alu_lsh_k);
454 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_lsh_k, tc)
455 1.1.4.2 yamt {
456 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
457 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K");
458 1.1.4.2 yamt }
459 1.1.4.2 yamt
460 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_lsh_k, tc)
461 1.1.4.2 yamt {
462 1.1.4.2 yamt static struct bpf_insn insns[] = {
463 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
464 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 16),
465 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
466 1.1.4.2 yamt };
467 1.1.4.2 yamt
468 1.1.4.3 yamt bpfjit_func_t code;
469 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
470 1.1.4.2 yamt
471 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
472 1.1.4.2 yamt
473 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
474 1.1.4.2 yamt
475 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
476 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
477 1.1.4.2 yamt
478 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
479 1.1.4.2 yamt
480 1.1.4.2 yamt bpfjit_free_code(code);
481 1.1.4.2 yamt }
482 1.1.4.2 yamt
483 1.1.4.2 yamt ATF_TC(bpfjit_alu_lsh0_k);
484 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_lsh0_k, tc)
485 1.1.4.2 yamt {
486 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
487 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_K with k=0");
488 1.1.4.2 yamt }
489 1.1.4.2 yamt
490 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_lsh0_k, tc)
491 1.1.4.2 yamt {
492 1.1.4.2 yamt static struct bpf_insn insns[] = {
493 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
494 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 0),
495 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
496 1.1.4.2 yamt };
497 1.1.4.2 yamt
498 1.1.4.3 yamt bpfjit_func_t code;
499 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
500 1.1.4.2 yamt
501 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
502 1.1.4.2 yamt
503 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
504 1.1.4.2 yamt
505 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
506 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
507 1.1.4.2 yamt
508 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
509 1.1.4.2 yamt
510 1.1.4.2 yamt bpfjit_free_code(code);
511 1.1.4.2 yamt }
512 1.1.4.2 yamt
513 1.1.4.2 yamt ATF_TC(bpfjit_alu_rsh_k);
514 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_rsh_k, tc)
515 1.1.4.2 yamt {
516 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
517 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K");
518 1.1.4.2 yamt }
519 1.1.4.2 yamt
520 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_rsh_k, tc)
521 1.1.4.2 yamt {
522 1.1.4.2 yamt static struct bpf_insn insns[] = {
523 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
524 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 16),
525 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
526 1.1.4.2 yamt };
527 1.1.4.2 yamt
528 1.1.4.3 yamt bpfjit_func_t code;
529 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
530 1.1.4.2 yamt
531 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
532 1.1.4.2 yamt
533 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
534 1.1.4.2 yamt
535 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
536 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
537 1.1.4.2 yamt
538 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
539 1.1.4.2 yamt
540 1.1.4.2 yamt bpfjit_free_code(code);
541 1.1.4.2 yamt }
542 1.1.4.2 yamt
543 1.1.4.2 yamt ATF_TC(bpfjit_alu_rsh0_k);
544 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_rsh0_k, tc)
545 1.1.4.2 yamt {
546 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
547 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_K with k=0");
548 1.1.4.2 yamt }
549 1.1.4.2 yamt
550 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_rsh0_k, tc)
551 1.1.4.2 yamt {
552 1.1.4.2 yamt static struct bpf_insn insns[] = {
553 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
554 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 0),
555 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
556 1.1.4.2 yamt };
557 1.1.4.2 yamt
558 1.1.4.3 yamt bpfjit_func_t code;
559 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
560 1.1.4.2 yamt
561 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
562 1.1.4.2 yamt
563 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
564 1.1.4.2 yamt
565 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
566 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
567 1.1.4.2 yamt
568 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
569 1.1.4.2 yamt
570 1.1.4.2 yamt bpfjit_free_code(code);
571 1.1.4.2 yamt }
572 1.1.4.2 yamt
573 1.1.4.2 yamt ATF_TC(bpfjit_alu_modulo_k);
574 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_modulo_k, tc)
575 1.1.4.2 yamt {
576 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
577 1.1.4.2 yamt "Test JIT compilation of modulo logic of BPF_ALU+BPF_K operations");
578 1.1.4.2 yamt }
579 1.1.4.2 yamt
580 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_modulo_k, tc)
581 1.1.4.2 yamt {
582 1.1.4.2 yamt static struct bpf_insn insns[] = {
583 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
584 1.1.4.2 yamt
585 1.1.4.2 yamt /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
586 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x0fffff77)),
587 1.1.4.2 yamt
588 1.1.4.2 yamt /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
589 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 1),
590 1.1.4.2 yamt
591 1.1.4.2 yamt /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
592 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xdddddddd)),
593 1.1.4.2 yamt
594 1.1.4.2 yamt /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
595 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_SUB+BPF_K, UINT32_C(0xffffffff)),
596 1.1.4.2 yamt
597 1.1.4.2 yamt /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
598 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_OR+BPF_K, UINT32_C(0x0000030c)),
599 1.1.4.2 yamt
600 1.1.4.2 yamt /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
601 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_NEG, 0),
602 1.1.4.2 yamt
603 1.1.4.2 yamt /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
604 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_AND+BPF_K, UINT32_C(0xffffff0f)),
605 1.1.4.2 yamt
606 1.1.4.2 yamt /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
607 1.1.4.2 yamt /* 00000000,42218C74 >> 3 = 00000000,08443180 */
608 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_K, 3),
609 1.1.4.2 yamt
610 1.1.4.2 yamt /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
611 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_K, UINT32_C(0x7fffff77)),
612 1.1.4.2 yamt
613 1.1.4.2 yamt /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
614 1.1.4.2 yamt /* 00000000,93818280 / DEAD = 00000000,0000A994 */
615 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_K, UINT32_C(0xdead)),
616 1.1.4.2 yamt
617 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
618 1.1.4.2 yamt };
619 1.1.4.2 yamt
620 1.1.4.3 yamt bpfjit_func_t code;
621 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
622 1.1.4.2 yamt
623 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
624 1.1.4.2 yamt
625 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
626 1.1.4.2 yamt
627 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
628 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
629 1.1.4.2 yamt
630 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
631 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
632 1.1.4.2 yamt
633 1.1.4.2 yamt
634 1.1.4.2 yamt bpfjit_free_code(code);
635 1.1.4.2 yamt }
636 1.1.4.2 yamt
637 1.1.4.2 yamt ATF_TC(bpfjit_alu_add_x);
638 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_add_x, tc)
639 1.1.4.2 yamt {
640 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
641 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_ADD+BPF_X");
642 1.1.4.2 yamt }
643 1.1.4.2 yamt
644 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_add_x, tc)
645 1.1.4.2 yamt {
646 1.1.4.2 yamt static struct bpf_insn insns[] = {
647 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 3),
648 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
649 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
650 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
651 1.1.4.2 yamt };
652 1.1.4.2 yamt
653 1.1.4.3 yamt bpfjit_func_t code;
654 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
655 1.1.4.2 yamt
656 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
657 1.1.4.2 yamt
658 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
659 1.1.4.2 yamt
660 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
661 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
662 1.1.4.2 yamt
663 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 5);
664 1.1.4.2 yamt
665 1.1.4.2 yamt bpfjit_free_code(code);
666 1.1.4.2 yamt }
667 1.1.4.2 yamt
668 1.1.4.2 yamt ATF_TC(bpfjit_alu_sub_x);
669 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_sub_x, tc)
670 1.1.4.2 yamt {
671 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
672 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_SUB+BPF_X");
673 1.1.4.2 yamt }
674 1.1.4.2 yamt
675 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_sub_x, tc)
676 1.1.4.2 yamt {
677 1.1.4.2 yamt static struct bpf_insn insns[] = {
678 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 1),
679 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
680 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
681 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
682 1.1.4.2 yamt };
683 1.1.4.2 yamt
684 1.1.4.3 yamt bpfjit_func_t code;
685 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
686 1.1.4.2 yamt
687 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
688 1.1.4.2 yamt
689 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
690 1.1.4.2 yamt
691 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
692 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
693 1.1.4.2 yamt
694 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
695 1.1.4.2 yamt
696 1.1.4.2 yamt bpfjit_free_code(code);
697 1.1.4.2 yamt }
698 1.1.4.2 yamt
699 1.1.4.2 yamt ATF_TC(bpfjit_alu_mul_x);
700 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_mul_x, tc)
701 1.1.4.2 yamt {
702 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
703 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_MUL+BPF_X");
704 1.1.4.2 yamt }
705 1.1.4.2 yamt
706 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_mul_x, tc)
707 1.1.4.2 yamt {
708 1.1.4.2 yamt static struct bpf_insn insns[] = {
709 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
710 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
711 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
712 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
713 1.1.4.2 yamt };
714 1.1.4.2 yamt
715 1.1.4.3 yamt bpfjit_func_t code;
716 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
717 1.1.4.2 yamt
718 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
719 1.1.4.2 yamt
720 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
721 1.1.4.2 yamt
722 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
723 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
724 1.1.4.2 yamt
725 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0xfffffffd));
726 1.1.4.2 yamt
727 1.1.4.2 yamt bpfjit_free_code(code);
728 1.1.4.2 yamt }
729 1.1.4.2 yamt
730 1.1.4.2 yamt ATF_TC(bpfjit_alu_div0_x);
731 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div0_x, tc)
732 1.1.4.2 yamt {
733 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
734 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0");
735 1.1.4.2 yamt }
736 1.1.4.2 yamt
737 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div0_x, tc)
738 1.1.4.2 yamt {
739 1.1.4.2 yamt static struct bpf_insn insns[] = {
740 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
741 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
742 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
743 1.1.4.2 yamt };
744 1.1.4.2 yamt
745 1.1.4.3 yamt bpfjit_func_t code;
746 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
747 1.1.4.2 yamt
748 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
749 1.1.4.2 yamt
750 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
751 1.1.4.2 yamt
752 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
753 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
754 1.1.4.2 yamt
755 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0);
756 1.1.4.2 yamt
757 1.1.4.2 yamt bpfjit_free_code(code);
758 1.1.4.2 yamt }
759 1.1.4.2 yamt
760 1.1.4.2 yamt ATF_TC(bpfjit_alu_div1_x);
761 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div1_x, tc)
762 1.1.4.2 yamt {
763 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
764 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=1");
765 1.1.4.2 yamt }
766 1.1.4.2 yamt
767 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div1_x, tc)
768 1.1.4.2 yamt {
769 1.1.4.2 yamt static struct bpf_insn insns[] = {
770 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 7),
771 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
772 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
773 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
774 1.1.4.2 yamt };
775 1.1.4.2 yamt
776 1.1.4.3 yamt bpfjit_func_t code;
777 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
778 1.1.4.2 yamt
779 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
780 1.1.4.2 yamt
781 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
782 1.1.4.2 yamt
783 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
784 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
785 1.1.4.2 yamt
786 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 7);
787 1.1.4.2 yamt
788 1.1.4.2 yamt bpfjit_free_code(code);
789 1.1.4.2 yamt }
790 1.1.4.2 yamt
791 1.1.4.2 yamt ATF_TC(bpfjit_alu_div2_x);
792 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div2_x, tc)
793 1.1.4.2 yamt {
794 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
795 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=2");
796 1.1.4.2 yamt }
797 1.1.4.2 yamt
798 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div2_x, tc)
799 1.1.4.2 yamt {
800 1.1.4.2 yamt static struct bpf_insn insns[] = {
801 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 7),
802 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
803 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
804 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
805 1.1.4.2 yamt };
806 1.1.4.2 yamt
807 1.1.4.3 yamt bpfjit_func_t code;
808 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
809 1.1.4.2 yamt
810 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
811 1.1.4.2 yamt
812 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
813 1.1.4.2 yamt
814 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
815 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
816 1.1.4.2 yamt
817 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 3);
818 1.1.4.2 yamt
819 1.1.4.2 yamt bpfjit_free_code(code);
820 1.1.4.2 yamt }
821 1.1.4.2 yamt
822 1.1.4.2 yamt ATF_TC(bpfjit_alu_div4_x);
823 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div4_x, tc)
824 1.1.4.2 yamt {
825 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
826 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=4");
827 1.1.4.2 yamt }
828 1.1.4.2 yamt
829 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div4_x, tc)
830 1.1.4.2 yamt {
831 1.1.4.2 yamt static struct bpf_insn insns[] = {
832 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0xffffffff)),
833 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
834 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
835 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
836 1.1.4.2 yamt };
837 1.1.4.2 yamt
838 1.1.4.3 yamt bpfjit_func_t code;
839 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
840 1.1.4.2 yamt
841 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
842 1.1.4.2 yamt
843 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
844 1.1.4.2 yamt
845 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
846 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
847 1.1.4.2 yamt
848 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x3fffffff));
849 1.1.4.2 yamt
850 1.1.4.2 yamt bpfjit_free_code(code);
851 1.1.4.2 yamt }
852 1.1.4.2 yamt
853 1.1.4.2 yamt ATF_TC(bpfjit_alu_div10_x);
854 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div10_x, tc)
855 1.1.4.2 yamt {
856 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
857 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10");
858 1.1.4.2 yamt }
859 1.1.4.2 yamt
860 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div10_x, tc)
861 1.1.4.2 yamt {
862 1.1.4.2 yamt static struct bpf_insn insns[] = {
863 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
864 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10),
865 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
866 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
867 1.1.4.2 yamt };
868 1.1.4.2 yamt
869 1.1.4.3 yamt bpfjit_func_t code;
870 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
871 1.1.4.2 yamt
872 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
873 1.1.4.2 yamt
874 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
875 1.1.4.2 yamt
876 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
877 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
878 1.1.4.2 yamt
879 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484384));
880 1.1.4.2 yamt
881 1.1.4.2 yamt bpfjit_free_code(code);
882 1.1.4.2 yamt }
883 1.1.4.2 yamt
884 1.1.4.2 yamt ATF_TC(bpfjit_alu_div10000_x);
885 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div10000_x, tc)
886 1.1.4.2 yamt {
887 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
888 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=10000");
889 1.1.4.2 yamt }
890 1.1.4.2 yamt
891 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div10000_x, tc)
892 1.1.4.2 yamt {
893 1.1.4.2 yamt static struct bpf_insn insns[] = {
894 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294843849)),
895 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 10000),
896 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
897 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
898 1.1.4.2 yamt };
899 1.1.4.2 yamt
900 1.1.4.3 yamt bpfjit_func_t code;
901 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
902 1.1.4.2 yamt
903 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
904 1.1.4.2 yamt
905 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
906 1.1.4.2 yamt
907 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
908 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
909 1.1.4.2 yamt
910 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(429484));
911 1.1.4.2 yamt
912 1.1.4.2 yamt bpfjit_free_code(code);
913 1.1.4.2 yamt }
914 1.1.4.2 yamt
915 1.1.4.2 yamt ATF_TC(bpfjit_alu_div7609801_x);
916 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div7609801_x, tc)
917 1.1.4.2 yamt {
918 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
919 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=7609801");
920 1.1.4.2 yamt }
921 1.1.4.2 yamt
922 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div7609801_x, tc)
923 1.1.4.2 yamt {
924 1.1.4.2 yamt static struct bpf_insn insns[] = {
925 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(4294967295)),
926 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(7609801)),
927 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
928 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
929 1.1.4.2 yamt };
930 1.1.4.2 yamt
931 1.1.4.3 yamt bpfjit_func_t code;
932 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
933 1.1.4.2 yamt
934 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
935 1.1.4.2 yamt
936 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
937 1.1.4.2 yamt
938 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
939 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
940 1.1.4.2 yamt
941 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 564);
942 1.1.4.2 yamt
943 1.1.4.2 yamt bpfjit_free_code(code);
944 1.1.4.2 yamt }
945 1.1.4.2 yamt
946 1.1.4.2 yamt ATF_TC(bpfjit_alu_div80000000_x);
947 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_div80000000_x, tc)
948 1.1.4.2 yamt {
949 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
950 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_DIV+BPF_X with X=0x80000000");
951 1.1.4.2 yamt }
952 1.1.4.2 yamt
953 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_div80000000_x, tc)
954 1.1.4.2 yamt {
955 1.1.4.2 yamt static struct bpf_insn insns[] = {
956 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX - 33),
957 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0x80000000)),
958 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
959 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
960 1.1.4.2 yamt };
961 1.1.4.2 yamt
962 1.1.4.3 yamt bpfjit_func_t code;
963 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
964 1.1.4.2 yamt
965 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
966 1.1.4.2 yamt
967 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
968 1.1.4.2 yamt
969 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
970 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
971 1.1.4.2 yamt
972 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
973 1.1.4.2 yamt
974 1.1.4.2 yamt bpfjit_free_code(code);
975 1.1.4.2 yamt }
976 1.1.4.2 yamt
977 1.1.4.2 yamt ATF_TC(bpfjit_alu_and_x);
978 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_and_x, tc)
979 1.1.4.2 yamt {
980 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
981 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_AND+BPF_X");
982 1.1.4.2 yamt }
983 1.1.4.2 yamt
984 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_and_x, tc)
985 1.1.4.2 yamt {
986 1.1.4.2 yamt static struct bpf_insn insns[] = {
987 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdead),
988 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0xbeef),
989 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
990 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
991 1.1.4.2 yamt };
992 1.1.4.2 yamt
993 1.1.4.3 yamt bpfjit_func_t code;
994 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
995 1.1.4.2 yamt
996 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
997 1.1.4.2 yamt
998 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
999 1.1.4.2 yamt
1000 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1001 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1002 1.1.4.2 yamt
1003 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == (0xdead&0xbeef));
1004 1.1.4.2 yamt
1005 1.1.4.2 yamt bpfjit_free_code(code);
1006 1.1.4.2 yamt }
1007 1.1.4.2 yamt
1008 1.1.4.2 yamt ATF_TC(bpfjit_alu_or_x);
1009 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_or_x, tc)
1010 1.1.4.2 yamt {
1011 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1012 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_OR+BPF_X");
1013 1.1.4.2 yamt }
1014 1.1.4.2 yamt
1015 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_or_x, tc)
1016 1.1.4.2 yamt {
1017 1.1.4.2 yamt static struct bpf_insn insns[] = {
1018 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdead0000),
1019 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0x0000beef),
1020 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1021 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1022 1.1.4.2 yamt };
1023 1.1.4.2 yamt
1024 1.1.4.3 yamt bpfjit_func_t code;
1025 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1026 1.1.4.2 yamt
1027 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1028 1.1.4.2 yamt
1029 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1030 1.1.4.2 yamt
1031 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1032 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1033 1.1.4.2 yamt
1034 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1035 1.1.4.2 yamt
1036 1.1.4.2 yamt bpfjit_free_code(code);
1037 1.1.4.2 yamt }
1038 1.1.4.2 yamt
1039 1.1.4.2 yamt ATF_TC(bpfjit_alu_lsh_x);
1040 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_lsh_x, tc)
1041 1.1.4.2 yamt {
1042 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1043 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X");
1044 1.1.4.2 yamt }
1045 1.1.4.2 yamt
1046 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_lsh_x, tc)
1047 1.1.4.2 yamt {
1048 1.1.4.2 yamt static struct bpf_insn insns[] = {
1049 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1050 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1051 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1052 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1053 1.1.4.2 yamt };
1054 1.1.4.2 yamt
1055 1.1.4.3 yamt bpfjit_func_t code;
1056 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1057 1.1.4.2 yamt
1058 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1059 1.1.4.2 yamt
1060 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1061 1.1.4.2 yamt
1062 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1063 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1064 1.1.4.2 yamt
1065 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xbeef0000);
1066 1.1.4.2 yamt
1067 1.1.4.2 yamt bpfjit_free_code(code);
1068 1.1.4.2 yamt }
1069 1.1.4.2 yamt
1070 1.1.4.2 yamt ATF_TC(bpfjit_alu_lsh0_x);
1071 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_lsh0_x, tc)
1072 1.1.4.2 yamt {
1073 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1074 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_LSH+BPF_X with k=0");
1075 1.1.4.2 yamt }
1076 1.1.4.2 yamt
1077 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_lsh0_x, tc)
1078 1.1.4.2 yamt {
1079 1.1.4.2 yamt static struct bpf_insn insns[] = {
1080 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1081 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1082 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1083 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1084 1.1.4.2 yamt };
1085 1.1.4.2 yamt
1086 1.1.4.3 yamt bpfjit_func_t code;
1087 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1088 1.1.4.2 yamt
1089 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1090 1.1.4.2 yamt
1091 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1092 1.1.4.2 yamt
1093 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1094 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1095 1.1.4.2 yamt
1096 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1097 1.1.4.2 yamt
1098 1.1.4.2 yamt bpfjit_free_code(code);
1099 1.1.4.2 yamt }
1100 1.1.4.2 yamt
1101 1.1.4.2 yamt ATF_TC(bpfjit_alu_rsh_x);
1102 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_rsh_x, tc)
1103 1.1.4.2 yamt {
1104 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1105 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X");
1106 1.1.4.2 yamt }
1107 1.1.4.2 yamt
1108 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_rsh_x, tc)
1109 1.1.4.2 yamt {
1110 1.1.4.2 yamt static struct bpf_insn insns[] = {
1111 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1112 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 16),
1113 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1114 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1115 1.1.4.2 yamt };
1116 1.1.4.2 yamt
1117 1.1.4.3 yamt bpfjit_func_t code;
1118 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1119 1.1.4.2 yamt
1120 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1121 1.1.4.2 yamt
1122 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1123 1.1.4.2 yamt
1124 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1125 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1126 1.1.4.2 yamt
1127 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0x0000dead);
1128 1.1.4.2 yamt
1129 1.1.4.2 yamt bpfjit_free_code(code);
1130 1.1.4.2 yamt }
1131 1.1.4.2 yamt
1132 1.1.4.2 yamt ATF_TC(bpfjit_alu_rsh0_x);
1133 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_rsh0_x, tc)
1134 1.1.4.2 yamt {
1135 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1136 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_RSH+BPF_X with k=0");
1137 1.1.4.2 yamt }
1138 1.1.4.2 yamt
1139 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_rsh0_x, tc)
1140 1.1.4.2 yamt {
1141 1.1.4.2 yamt static struct bpf_insn insns[] = {
1142 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 0xdeadbeef),
1143 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1144 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1145 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1146 1.1.4.2 yamt };
1147 1.1.4.2 yamt
1148 1.1.4.3 yamt bpfjit_func_t code;
1149 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1150 1.1.4.2 yamt
1151 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1152 1.1.4.2 yamt
1153 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1154 1.1.4.2 yamt
1155 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1156 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1157 1.1.4.2 yamt
1158 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0xdeadbeef);
1159 1.1.4.2 yamt
1160 1.1.4.2 yamt bpfjit_free_code(code);
1161 1.1.4.2 yamt }
1162 1.1.4.2 yamt
1163 1.1.4.2 yamt ATF_TC(bpfjit_alu_modulo_x);
1164 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_modulo_x, tc)
1165 1.1.4.2 yamt {
1166 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1167 1.1.4.2 yamt "Test JIT compilation of modulo logic of BPF_ALU+BPF_X operations");
1168 1.1.4.2 yamt }
1169 1.1.4.2 yamt
1170 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_modulo_x, tc)
1171 1.1.4.2 yamt {
1172 1.1.4.2 yamt static struct bpf_insn insns[] = {
1173 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1174 1.1.4.2 yamt
1175 1.1.4.2 yamt /* (7FFFFF77 * 0FFFFF77) = 07FFFFB2,F0004951 */
1176 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0fffff77)),
1177 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1178 1.1.4.2 yamt
1179 1.1.4.2 yamt /* 07FFFFB2,F0004951 << 1 = 0FFFFF65,E00092A2 */
1180 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, 1),
1181 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_X, 0),
1182 1.1.4.2 yamt
1183 1.1.4.2 yamt /* 0FFFFF65,E00092A2 + DDDDDDDD = 0FFFFF66,BDDE707F */
1184 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdddddddd)),
1185 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
1186 1.1.4.2 yamt
1187 1.1.4.2 yamt /* 0FFFFF66,BDDE707F - FFFFFFFF = 0FFFFF65,BDDE7080 */
1188 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffffff)),
1189 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_SUB+BPF_X, 0),
1190 1.1.4.2 yamt
1191 1.1.4.2 yamt /* 0FFFFF65,BDDE7080 | 0000030C = 0FFFFF65,BDDE738C */
1192 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x0000030c)),
1193 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_OR+BPF_X, 0),
1194 1.1.4.2 yamt
1195 1.1.4.2 yamt /* -0FFFFF65,BDDE738C mod(2^64) = F000009A,42218C74 */
1196 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_NEG, 0),
1197 1.1.4.2 yamt
1198 1.1.4.2 yamt /* F000009A,42218C74 & FFFFFF0F = F000009A,42218C04 */
1199 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xffffff0f)),
1200 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_AND+BPF_X, 0),
1201 1.1.4.2 yamt
1202 1.1.4.2 yamt /* F000009A,42218C74 >> 3 = 1E000013,48443180 */
1203 1.1.4.2 yamt /* 00000000,42218C74 >> 3 = 00000000,08443180 */
1204 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, 3),
1205 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_RSH+BPF_X, 0),
1206 1.1.4.2 yamt
1207 1.1.4.2 yamt /* 00000000,08443180 * 7FFFFF77 = 042218BB,93818280 */
1208 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0x7fffff77)),
1209 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_MUL+BPF_X, 0),
1210 1.1.4.2 yamt
1211 1.1.4.2 yamt /* 042218BB,93818280 / DEAD = 000004C0,71CBBBC3 */
1212 1.1.4.2 yamt /* 00000000,93818280 / DEAD = 00000000,0000A994 */
1213 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_K, UINT32_C(0xdead)),
1214 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_DIV+BPF_X, 0),
1215 1.1.4.2 yamt
1216 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1217 1.1.4.2 yamt };
1218 1.1.4.2 yamt
1219 1.1.4.3 yamt bpfjit_func_t code;
1220 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1221 1.1.4.2 yamt
1222 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1223 1.1.4.2 yamt
1224 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1225 1.1.4.2 yamt
1226 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1227 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1228 1.1.4.2 yamt
1229 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) != UINT32_C(0x71cbbbc3));
1230 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_C(0x0000a994));
1231 1.1.4.2 yamt
1232 1.1.4.2 yamt
1233 1.1.4.2 yamt bpfjit_free_code(code);
1234 1.1.4.2 yamt }
1235 1.1.4.2 yamt
1236 1.1.4.2 yamt ATF_TC(bpfjit_alu_neg);
1237 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_alu_neg, tc)
1238 1.1.4.2 yamt {
1239 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1240 1.1.4.2 yamt "Test JIT compilation of BPF_ALU+BPF_NEG");
1241 1.1.4.2 yamt }
1242 1.1.4.2 yamt
1243 1.1.4.2 yamt ATF_TC_BODY(bpfjit_alu_neg, tc)
1244 1.1.4.2 yamt {
1245 1.1.4.2 yamt static struct bpf_insn insns[] = {
1246 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 777),
1247 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_NEG, 0),
1248 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1249 1.1.4.2 yamt };
1250 1.1.4.2 yamt
1251 1.1.4.3 yamt bpfjit_func_t code;
1252 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1253 1.1.4.2 yamt
1254 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1255 1.1.4.2 yamt
1256 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1257 1.1.4.2 yamt
1258 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1259 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1260 1.1.4.2 yamt
1261 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0u-777u);
1262 1.1.4.2 yamt
1263 1.1.4.2 yamt bpfjit_free_code(code);
1264 1.1.4.2 yamt }
1265 1.1.4.2 yamt
1266 1.1.4.2 yamt ATF_TC(bpfjit_jmp_ja);
1267 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_ja, tc)
1268 1.1.4.2 yamt {
1269 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1270 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JA");
1271 1.1.4.2 yamt }
1272 1.1.4.2 yamt
1273 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_ja, tc)
1274 1.1.4.2 yamt {
1275 1.1.4.2 yamt static struct bpf_insn insns[] = {
1276 1.1.4.2 yamt BPF_STMT(BPF_JMP+BPF_JA, 1),
1277 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1278 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1279 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1280 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1281 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1282 1.1.4.2 yamt };
1283 1.1.4.2 yamt
1284 1.1.4.3 yamt bpfjit_func_t code;
1285 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1286 1.1.4.2 yamt
1287 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1288 1.1.4.2 yamt
1289 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1290 1.1.4.2 yamt
1291 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1292 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1293 1.1.4.2 yamt
1294 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1295 1.1.4.2 yamt
1296 1.1.4.2 yamt bpfjit_free_code(code);
1297 1.1.4.2 yamt }
1298 1.1.4.2 yamt
1299 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jgt_k);
1300 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jgt_k, tc)
1301 1.1.4.2 yamt {
1302 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1303 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_K");
1304 1.1.4.2 yamt }
1305 1.1.4.2 yamt
1306 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jgt_k, tc)
1307 1.1.4.2 yamt {
1308 1.1.4.2 yamt static struct bpf_insn insns[] = {
1309 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1310 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 7, 0, 1),
1311 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1312 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 2, 2, 0),
1313 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 9, 0, 0),
1314 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1315 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 4, 1, 1),
1316 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1317 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 6, 2, 3),
1318 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1319 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1320 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1321 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 5, 3, 1),
1322 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1323 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, 0, 0, 0),
1324 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1325 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1326 1.1.4.2 yamt };
1327 1.1.4.2 yamt
1328 1.1.4.3 yamt bpfjit_func_t code;
1329 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1330 1.1.4.2 yamt
1331 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1332 1.1.4.2 yamt
1333 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1334 1.1.4.2 yamt
1335 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1336 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1337 1.1.4.2 yamt
1338 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1339 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1340 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 7);
1341 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1342 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1343 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1344 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1345 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1346 1.1.4.2 yamt
1347 1.1.4.2 yamt bpfjit_free_code(code);
1348 1.1.4.2 yamt }
1349 1.1.4.2 yamt
1350 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jge_k);
1351 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jge_k, tc)
1352 1.1.4.2 yamt {
1353 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1354 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_K");
1355 1.1.4.2 yamt }
1356 1.1.4.2 yamt
1357 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jge_k, tc)
1358 1.1.4.2 yamt {
1359 1.1.4.2 yamt static struct bpf_insn insns[] = {
1360 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1361 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 8, 0, 1),
1362 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1363 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 3, 2, 0),
1364 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 9, 0, 0),
1365 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1366 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 5, 1, 1),
1367 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1368 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 7, 2, 3),
1369 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1370 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1371 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1372 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 6, 3, 1),
1373 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1374 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, 1, 0, 0),
1375 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1376 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1377 1.1.4.2 yamt };
1378 1.1.4.2 yamt
1379 1.1.4.3 yamt bpfjit_func_t code;
1380 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1381 1.1.4.2 yamt
1382 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1383 1.1.4.2 yamt
1384 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1385 1.1.4.2 yamt
1386 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1387 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1388 1.1.4.2 yamt
1389 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1390 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1391 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 7);
1392 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1393 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1394 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1395 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1396 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1397 1.1.4.2 yamt
1398 1.1.4.2 yamt bpfjit_free_code(code);
1399 1.1.4.2 yamt }
1400 1.1.4.2 yamt
1401 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jeq_k);
1402 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jeq_k, tc)
1403 1.1.4.2 yamt {
1404 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1405 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_K");
1406 1.1.4.2 yamt }
1407 1.1.4.2 yamt
1408 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jeq_k, tc)
1409 1.1.4.2 yamt {
1410 1.1.4.2 yamt static struct bpf_insn insns[] = {
1411 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1412 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 8, 0, 1),
1413 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1414 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 3, 1, 0),
1415 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 9, 1, 1),
1416 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1417 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 5, 1, 1),
1418 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1419 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 7, 2, 3),
1420 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1421 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1422 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1423 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 6, 3, 1),
1424 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1425 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 1, 0, 0),
1426 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1427 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1428 1.1.4.2 yamt };
1429 1.1.4.2 yamt
1430 1.1.4.3 yamt bpfjit_func_t code;
1431 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1432 1.1.4.2 yamt
1433 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1434 1.1.4.2 yamt
1435 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1436 1.1.4.2 yamt
1437 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1438 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1439 1.1.4.2 yamt
1440 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 7);
1441 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 7);
1442 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 1);
1443 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1444 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1445 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1446 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1447 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1448 1.1.4.2 yamt
1449 1.1.4.2 yamt bpfjit_free_code(code);
1450 1.1.4.2 yamt }
1451 1.1.4.2 yamt
1452 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jset_k);
1453 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jset_k, tc)
1454 1.1.4.2 yamt {
1455 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1456 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_K");
1457 1.1.4.2 yamt }
1458 1.1.4.2 yamt
1459 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jset_k, tc)
1460 1.1.4.2 yamt {
1461 1.1.4.2 yamt static struct bpf_insn insns[] = {
1462 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1463 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 8, 0, 1),
1464 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1465 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 4, 2, 0),
1466 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 3, 0, 0),
1467 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1468 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 1, 1),
1469 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1470 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 1, 2, 3),
1471 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1472 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1473 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1474 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 2, 3, 1),
1475 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1476 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 7, 0, 0),
1477 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1478 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1479 1.1.4.2 yamt };
1480 1.1.4.2 yamt
1481 1.1.4.3 yamt bpfjit_func_t code;
1482 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1483 1.1.4.2 yamt
1484 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1485 1.1.4.2 yamt
1486 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1487 1.1.4.2 yamt
1488 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1489 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1490 1.1.4.2 yamt
1491 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1492 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1493 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 1);
1494 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1495 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 5);
1496 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1497 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1498 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1499 1.1.4.2 yamt
1500 1.1.4.2 yamt bpfjit_free_code(code);
1501 1.1.4.2 yamt }
1502 1.1.4.2 yamt
1503 1.1.4.2 yamt ATF_TC(bpfjit_jmp_modulo_k);
1504 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_modulo_k, tc)
1505 1.1.4.2 yamt {
1506 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1507 1.1.4.2 yamt "Test JIT compilation of modulo logic of BPF_JMP+BPF_K operations");
1508 1.1.4.2 yamt }
1509 1.1.4.2 yamt
1510 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_modulo_k, tc)
1511 1.1.4.2 yamt {
1512 1.1.4.2 yamt static struct bpf_insn insns[] = {
1513 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1514 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1515 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 1, 0),
1516 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1517 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 0, 1),
1518 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1519 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 0, 1),
1520 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1521 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xfffff770), 0, 3),
1522 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xfffff770), 2, 0),
1523 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xfffff771), 1, 0),
1524 1.1.4.2 yamt BPF_STMT(BPF_JMP+BPF_JA, 1),
1525 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1526 1.1.4.2 yamt
1527 1.1.4.2 yamt /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1528 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1529 1.1.4.2 yamt
1530 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 1, 0),
1531 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1532 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 0, 1),
1533 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1534 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 0, 1),
1535 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1536 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, UINT32_C(0xffffeee0), 0, 3),
1537 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, UINT32_C(0xffffeee0), 2, 0),
1538 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, UINT32_C(0xffffeee1), 1, 0),
1539 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1540 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7)
1541 1.1.4.2 yamt };
1542 1.1.4.2 yamt
1543 1.1.4.3 yamt bpfjit_func_t code;
1544 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1545 1.1.4.2 yamt
1546 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1547 1.1.4.2 yamt
1548 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1549 1.1.4.2 yamt
1550 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1551 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1552 1.1.4.2 yamt
1553 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1554 1.1.4.2 yamt
1555 1.1.4.2 yamt bpfjit_free_code(code);
1556 1.1.4.2 yamt }
1557 1.1.4.2 yamt
1558 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jgt_x);
1559 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jgt_x, tc)
1560 1.1.4.2 yamt {
1561 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1562 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JGT+BPF_X");
1563 1.1.4.2 yamt }
1564 1.1.4.2 yamt
1565 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jgt_x, tc)
1566 1.1.4.2 yamt {
1567 1.1.4.2 yamt static struct bpf_insn insns[] = {
1568 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1569 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1570 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1571 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1572 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1573 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1574 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1575 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1576 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1577 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1578 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 1, 1),
1579 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1580 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1581 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 2, 3),
1582 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1583 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1584 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1585 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1586 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 4, 1),
1587 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1588 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
1589 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 0),
1590 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1591 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1592 1.1.4.2 yamt };
1593 1.1.4.2 yamt
1594 1.1.4.3 yamt bpfjit_func_t code;
1595 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1596 1.1.4.2 yamt
1597 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1598 1.1.4.2 yamt
1599 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1600 1.1.4.2 yamt
1601 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1602 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1603 1.1.4.2 yamt
1604 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1605 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1606 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 7);
1607 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1608 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1609 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1610 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1611 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1612 1.1.4.2 yamt
1613 1.1.4.2 yamt bpfjit_free_code(code);
1614 1.1.4.2 yamt }
1615 1.1.4.2 yamt
1616 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jge_x);
1617 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jge_x, tc)
1618 1.1.4.2 yamt {
1619 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1620 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JGE+BPF_X");
1621 1.1.4.2 yamt }
1622 1.1.4.2 yamt
1623 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jge_x, tc)
1624 1.1.4.2 yamt {
1625 1.1.4.2 yamt static struct bpf_insn insns[] = {
1626 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1627 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1628 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1629 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1630 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1631 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 3, 0),
1632 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1633 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1634 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1635 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1636 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 1),
1637 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1638 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1639 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 2, 3),
1640 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1641 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1642 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1643 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1644 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 4, 1),
1645 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1646 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1647 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 0),
1648 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1649 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1650 1.1.4.2 yamt };
1651 1.1.4.2 yamt
1652 1.1.4.3 yamt bpfjit_func_t code;
1653 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1654 1.1.4.2 yamt
1655 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1656 1.1.4.2 yamt
1657 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1658 1.1.4.2 yamt
1659 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1660 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1661 1.1.4.2 yamt
1662 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1663 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1664 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 7);
1665 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1666 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1667 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1668 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1669 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1670 1.1.4.2 yamt
1671 1.1.4.2 yamt bpfjit_free_code(code);
1672 1.1.4.2 yamt }
1673 1.1.4.2 yamt
1674 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jeq_x);
1675 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jeq_x, tc)
1676 1.1.4.2 yamt {
1677 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1678 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JEQ+BPF_X");
1679 1.1.4.2 yamt }
1680 1.1.4.2 yamt
1681 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jeq_x, tc)
1682 1.1.4.2 yamt {
1683 1.1.4.2 yamt static struct bpf_insn insns[] = {
1684 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1685 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1686 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 1),
1687 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1688 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
1689 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 0),
1690 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 9),
1691 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1692 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1693 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
1694 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 1),
1695 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1696 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1697 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 2, 3),
1698 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1699 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1700 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1701 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 6),
1702 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 3, 1),
1703 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1704 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 1, 0, 0),
1705 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1706 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1707 1.1.4.2 yamt };
1708 1.1.4.2 yamt
1709 1.1.4.3 yamt bpfjit_func_t code;
1710 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1711 1.1.4.2 yamt
1712 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1713 1.1.4.2 yamt
1714 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1715 1.1.4.2 yamt
1716 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1717 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1718 1.1.4.2 yamt
1719 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 7);
1720 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 7);
1721 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 1);
1722 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1723 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 7);
1724 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1725 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1726 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1727 1.1.4.2 yamt
1728 1.1.4.2 yamt bpfjit_free_code(code);
1729 1.1.4.2 yamt }
1730 1.1.4.2 yamt
1731 1.1.4.2 yamt ATF_TC(bpfjit_jmp_jset_x);
1732 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_jset_x, tc)
1733 1.1.4.2 yamt {
1734 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1735 1.1.4.2 yamt "Test JIT compilation of BPF_JMP+BPF_JSET+BPF_X");
1736 1.1.4.2 yamt }
1737 1.1.4.2 yamt
1738 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_jset_x, tc)
1739 1.1.4.2 yamt {
1740 1.1.4.2 yamt static struct bpf_insn insns[] = {
1741 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
1742 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 8),
1743 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 1),
1744 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1745 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 4),
1746 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 0),
1747 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 3, 0, 0),
1748 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1749 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1750 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 1, 1),
1751 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1752 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 1),
1753 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 2, 3),
1754 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1755 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1756 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1757 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2),
1758 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 4, 1),
1759 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1760 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 7),
1761 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JSET+BPF_X, 0, 0, 0),
1762 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
1763 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 8)
1764 1.1.4.2 yamt };
1765 1.1.4.2 yamt
1766 1.1.4.3 yamt bpfjit_func_t code;
1767 1.1.4.2 yamt uint8_t pkt[8]; /* the program doesn't read any data */
1768 1.1.4.2 yamt
1769 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1770 1.1.4.2 yamt
1771 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1772 1.1.4.2 yamt
1773 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1774 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1775 1.1.4.2 yamt
1776 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
1777 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 1);
1778 1.1.4.2 yamt ATF_CHECK(code(pkt, 3, 3) == 1);
1779 1.1.4.2 yamt ATF_CHECK(code(pkt, 4, 4) == 7);
1780 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 5) == 5);
1781 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 6) == 8);
1782 1.1.4.2 yamt ATF_CHECK(code(pkt, 7, 7) == 5);
1783 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1784 1.1.4.2 yamt
1785 1.1.4.2 yamt bpfjit_free_code(code);
1786 1.1.4.2 yamt }
1787 1.1.4.2 yamt
1788 1.1.4.2 yamt ATF_TC(bpfjit_jmp_modulo_x);
1789 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_jmp_modulo_x, tc)
1790 1.1.4.2 yamt {
1791 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1792 1.1.4.2 yamt "Test JIT compilation of modulo logic of BPF_JMP+BPF_X operations");
1793 1.1.4.2 yamt }
1794 1.1.4.2 yamt
1795 1.1.4.2 yamt ATF_TC_BODY(bpfjit_jmp_modulo_x, tc)
1796 1.1.4.2 yamt {
1797 1.1.4.2 yamt static struct bpf_insn insns[] = {
1798 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_C(0x7fffff77)),
1799 1.1.4.2 yamt /* FFFFF770 << 4 = FFFFF770 */
1800 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_LSH+BPF_K, 4),
1801 1.1.4.2 yamt
1802 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1803 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1804 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
1805 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1806 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1),
1807 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1808 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1809 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 2),
1810 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff770)),
1811 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1812 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1813 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xfffff771)),
1814 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1815 1.1.4.2 yamt BPF_STMT(BPF_JMP+BPF_JA, 1),
1816 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 3),
1817 1.1.4.2 yamt
1818 1.1.4.2 yamt /* FFFFF770+FFFFF770 = 00000001,FFFFEEE0 */
1819 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xfffff770)),
1820 1.1.4.2 yamt
1821 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1822 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
1823 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 4),
1824 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 0, 1),
1825 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 5),
1826 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1827 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 0, 1),
1828 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 6),
1829 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee0)),
1830 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 0, 4),
1831 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGT+BPF_X, 0, 3, 0),
1832 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_C(0xffffeee1)),
1833 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JGE+BPF_X, 0, 1, 0),
1834 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
1835 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7)
1836 1.1.4.2 yamt };
1837 1.1.4.2 yamt
1838 1.1.4.3 yamt bpfjit_func_t code;
1839 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
1840 1.1.4.2 yamt
1841 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
1842 1.1.4.2 yamt
1843 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
1844 1.1.4.2 yamt
1845 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
1846 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1847 1.1.4.2 yamt
1848 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
1849 1.1.4.2 yamt
1850 1.1.4.2 yamt bpfjit_free_code(code);
1851 1.1.4.2 yamt }
1852 1.1.4.2 yamt
1853 1.1.4.2 yamt ATF_TC(bpfjit_ld_abs);
1854 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_abs, tc)
1855 1.1.4.2 yamt {
1856 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1857 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_ABS");
1858 1.1.4.2 yamt }
1859 1.1.4.2 yamt
1860 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_abs, tc)
1861 1.1.4.2 yamt {
1862 1.1.4.2 yamt static struct bpf_insn insns[3][2] = {
1863 1.1.4.2 yamt {
1864 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 5),
1865 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1866 1.1.4.2 yamt },
1867 1.1.4.2 yamt {
1868 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 5),
1869 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1870 1.1.4.2 yamt },
1871 1.1.4.2 yamt {
1872 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 5),
1873 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
1874 1.1.4.2 yamt }
1875 1.1.4.2 yamt };
1876 1.1.4.2 yamt
1877 1.1.4.2 yamt static size_t lengths[3] = { 1, 2, 4 };
1878 1.1.4.2 yamt static unsigned int expected[3] = { 0xde, 0xdead, 0xdeadbeef };
1879 1.1.4.2 yamt
1880 1.1.4.2 yamt size_t i, l;
1881 1.1.4.2 yamt uint8_t *pkt = deadbeef_at_5;
1882 1.1.4.2 yamt size_t pktsize = sizeof(deadbeef_at_5);
1883 1.1.4.2 yamt
1884 1.1.4.2 yamt size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1885 1.1.4.2 yamt
1886 1.1.4.2 yamt for (i = 0; i < 3; i++) {
1887 1.1.4.3 yamt bpfjit_func_t code;
1888 1.1.4.2 yamt
1889 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns[i], insn_count));
1890 1.1.4.2 yamt
1891 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns[i], insn_count);
1892 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1893 1.1.4.2 yamt
1894 1.1.4.2 yamt for (l = 0; l < 5 + lengths[i]; l++) {
1895 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == 0);
1896 1.1.4.2 yamt ATF_CHECK(code(pkt, pktsize, l) == 0);
1897 1.1.4.2 yamt }
1898 1.1.4.2 yamt
1899 1.1.4.2 yamt l = 5 + lengths[i];
1900 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == expected[i]);
1901 1.1.4.2 yamt ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
1902 1.1.4.2 yamt
1903 1.1.4.2 yamt l = pktsize;
1904 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == expected[i]);
1905 1.1.4.2 yamt
1906 1.1.4.2 yamt bpfjit_free_code(code);
1907 1.1.4.2 yamt }
1908 1.1.4.2 yamt }
1909 1.1.4.2 yamt
1910 1.1.4.2 yamt ATF_TC(bpfjit_ld_abs_k_overflow);
1911 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_abs_k_overflow, tc)
1912 1.1.4.2 yamt {
1913 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
1914 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_ABS with overflow in k+4");
1915 1.1.4.2 yamt }
1916 1.1.4.2 yamt
1917 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_abs_k_overflow, tc)
1918 1.1.4.2 yamt {
1919 1.1.4.2 yamt static struct bpf_insn insns[12][3] = {
1920 1.1.4.2 yamt {
1921 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1922 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1923 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1924 1.1.4.2 yamt },
1925 1.1.4.2 yamt {
1926 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1927 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1928 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1929 1.1.4.2 yamt },
1930 1.1.4.2 yamt {
1931 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1932 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1933 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1934 1.1.4.2 yamt },
1935 1.1.4.2 yamt {
1936 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1937 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1938 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1939 1.1.4.2 yamt },
1940 1.1.4.2 yamt {
1941 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1942 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1943 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1944 1.1.4.2 yamt },
1945 1.1.4.2 yamt {
1946 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1947 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1948 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1949 1.1.4.2 yamt },
1950 1.1.4.2 yamt {
1951 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1952 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX),
1953 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1954 1.1.4.2 yamt },
1955 1.1.4.2 yamt {
1956 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1957 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, UINT32_MAX - 1),
1958 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1959 1.1.4.2 yamt },
1960 1.1.4.2 yamt {
1961 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1962 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX),
1963 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1964 1.1.4.2 yamt },
1965 1.1.4.2 yamt {
1966 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1967 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 1),
1968 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1969 1.1.4.2 yamt },
1970 1.1.4.2 yamt {
1971 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1972 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 2),
1973 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1974 1.1.4.2 yamt },
1975 1.1.4.2 yamt {
1976 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 7),
1977 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, UINT32_MAX - 3),
1978 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
1979 1.1.4.2 yamt }
1980 1.1.4.2 yamt };
1981 1.1.4.2 yamt
1982 1.1.4.2 yamt int i;
1983 1.1.4.2 yamt uint8_t pkt[8] = { 0 };
1984 1.1.4.2 yamt
1985 1.1.4.2 yamt size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
1986 1.1.4.2 yamt
1987 1.1.4.2 yamt for (i = 0; i < 3; i++) {
1988 1.1.4.3 yamt bpfjit_func_t code;
1989 1.1.4.2 yamt
1990 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns[i], insn_count));
1991 1.1.4.2 yamt
1992 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns[i], insn_count);
1993 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
1994 1.1.4.2 yamt
1995 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
1996 1.1.4.2 yamt
1997 1.1.4.2 yamt bpfjit_free_code(code);
1998 1.1.4.2 yamt }
1999 1.1.4.2 yamt }
2000 1.1.4.2 yamt
2001 1.1.4.2 yamt ATF_TC(bpfjit_ld_ind);
2002 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_ind, tc)
2003 1.1.4.2 yamt {
2004 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2005 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_IND");
2006 1.1.4.2 yamt }
2007 1.1.4.2 yamt
2008 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_ind, tc)
2009 1.1.4.2 yamt {
2010 1.1.4.2 yamt static struct bpf_insn insns[6][3] = {
2011 1.1.4.2 yamt {
2012 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2013 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2014 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2015 1.1.4.2 yamt },
2016 1.1.4.2 yamt {
2017 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2018 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 2),
2019 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2020 1.1.4.2 yamt },
2021 1.1.4.2 yamt {
2022 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 3),
2023 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 2),
2024 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2025 1.1.4.2 yamt },
2026 1.1.4.2 yamt {
2027 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2028 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2029 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2030 1.1.4.2 yamt },
2031 1.1.4.2 yamt {
2032 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2033 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
2034 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2035 1.1.4.2 yamt },
2036 1.1.4.2 yamt {
2037 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2038 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 0),
2039 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2040 1.1.4.2 yamt }
2041 1.1.4.2 yamt };
2042 1.1.4.2 yamt
2043 1.1.4.2 yamt static size_t lengths[6] = { 1, 2, 4, 1, 2, 4 };
2044 1.1.4.2 yamt
2045 1.1.4.2 yamt static unsigned int expected[6] = {
2046 1.1.4.2 yamt 0xde, 0xdead, 0xdeadbeef,
2047 1.1.4.2 yamt 0xde, 0xdead, 0xdeadbeef
2048 1.1.4.2 yamt };
2049 1.1.4.2 yamt
2050 1.1.4.2 yamt size_t i, l;
2051 1.1.4.2 yamt uint8_t *pkt = deadbeef_at_5;
2052 1.1.4.2 yamt size_t pktsize = sizeof(deadbeef_at_5);
2053 1.1.4.2 yamt
2054 1.1.4.2 yamt size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2055 1.1.4.2 yamt
2056 1.1.4.2 yamt for (i = 0; i < 3; i++) {
2057 1.1.4.3 yamt bpfjit_func_t code;
2058 1.1.4.2 yamt
2059 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns[i], insn_count));
2060 1.1.4.2 yamt
2061 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns[i], insn_count);
2062 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2063 1.1.4.2 yamt
2064 1.1.4.2 yamt for (l = 0; l < 5 + lengths[i]; l++) {
2065 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == 0);
2066 1.1.4.2 yamt ATF_CHECK(code(pkt, pktsize, l) == 0);
2067 1.1.4.2 yamt }
2068 1.1.4.2 yamt
2069 1.1.4.2 yamt l = 5 + lengths[i];
2070 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == expected[i]);
2071 1.1.4.2 yamt ATF_CHECK(code(pkt, pktsize, l) == expected[i]);
2072 1.1.4.2 yamt
2073 1.1.4.2 yamt l = pktsize;
2074 1.1.4.2 yamt ATF_CHECK(code(pkt, l, l) == expected[i]);
2075 1.1.4.2 yamt
2076 1.1.4.2 yamt bpfjit_free_code(code);
2077 1.1.4.2 yamt }
2078 1.1.4.2 yamt }
2079 1.1.4.2 yamt
2080 1.1.4.2 yamt ATF_TC(bpfjit_ld_ind_k_overflow);
2081 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_ind_k_overflow, tc)
2082 1.1.4.2 yamt {
2083 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2084 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_IND with overflow in k+4");
2085 1.1.4.2 yamt }
2086 1.1.4.2 yamt
2087 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_ind_k_overflow, tc)
2088 1.1.4.2 yamt {
2089 1.1.4.2 yamt static struct bpf_insn insns[12][3] = {
2090 1.1.4.2 yamt {
2091 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2092 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2093 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2094 1.1.4.2 yamt },
2095 1.1.4.2 yamt {
2096 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2097 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2098 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2099 1.1.4.2 yamt },
2100 1.1.4.2 yamt {
2101 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2102 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2103 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2104 1.1.4.2 yamt },
2105 1.1.4.2 yamt {
2106 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2107 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2108 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2109 1.1.4.2 yamt },
2110 1.1.4.2 yamt {
2111 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2112 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2113 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2114 1.1.4.2 yamt },
2115 1.1.4.2 yamt {
2116 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2117 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2118 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2119 1.1.4.2 yamt },
2120 1.1.4.2 yamt {
2121 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2122 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX),
2123 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2124 1.1.4.2 yamt },
2125 1.1.4.2 yamt {
2126 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2127 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, UINT32_MAX - 1),
2128 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2129 1.1.4.2 yamt },
2130 1.1.4.2 yamt {
2131 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2132 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX),
2133 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2134 1.1.4.2 yamt },
2135 1.1.4.2 yamt {
2136 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2137 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 1),
2138 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2139 1.1.4.2 yamt },
2140 1.1.4.2 yamt {
2141 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2142 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 2),
2143 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2144 1.1.4.2 yamt },
2145 1.1.4.2 yamt {
2146 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 7),
2147 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, UINT32_MAX - 3),
2148 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 1)
2149 1.1.4.2 yamt }
2150 1.1.4.2 yamt };
2151 1.1.4.2 yamt
2152 1.1.4.2 yamt int i;
2153 1.1.4.2 yamt uint8_t pkt[8] = { 0 };
2154 1.1.4.2 yamt
2155 1.1.4.2 yamt size_t insn_count = sizeof(insns[0]) / sizeof(insns[0][0]);
2156 1.1.4.2 yamt
2157 1.1.4.2 yamt for (i = 0; i < 3; i++) {
2158 1.1.4.3 yamt bpfjit_func_t code;
2159 1.1.4.2 yamt
2160 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns[i], insn_count));
2161 1.1.4.2 yamt
2162 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns[i], insn_count);
2163 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2164 1.1.4.2 yamt
2165 1.1.4.2 yamt ATF_CHECK(code(pkt, 8, 8) == 0);
2166 1.1.4.2 yamt
2167 1.1.4.2 yamt bpfjit_free_code(code);
2168 1.1.4.2 yamt }
2169 1.1.4.2 yamt }
2170 1.1.4.2 yamt
2171 1.1.4.2 yamt ATF_TC(bpfjit_ld_ind_x_overflow1);
2172 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_ind_x_overflow1, tc)
2173 1.1.4.2 yamt {
2174 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2175 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2176 1.1.4.2 yamt }
2177 1.1.4.2 yamt
2178 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_ind_x_overflow1, tc)
2179 1.1.4.2 yamt {
2180 1.1.4.2 yamt static struct bpf_insn insns[] = {
2181 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_LEN, 0),
2182 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2183 1.1.4.2 yamt BPF_STMT(BPF_MISC+BPF_TAX, 0),
2184 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2185 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2186 1.1.4.2 yamt };
2187 1.1.4.2 yamt
2188 1.1.4.2 yamt size_t i;
2189 1.1.4.3 yamt bpfjit_func_t code;
2190 1.1.4.2 yamt uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2191 1.1.4.2 yamt
2192 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2193 1.1.4.2 yamt
2194 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2195 1.1.4.2 yamt
2196 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2197 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2198 1.1.4.2 yamt
2199 1.1.4.2 yamt for (i = 1; i <= sizeof(pkt); i++) {
2200 1.1.4.2 yamt ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2201 1.1.4.2 yamt ATF_CHECK(code(pkt, i, i) == 10 * i);
2202 1.1.4.2 yamt }
2203 1.1.4.2 yamt
2204 1.1.4.2 yamt bpfjit_free_code(code);
2205 1.1.4.2 yamt }
2206 1.1.4.2 yamt
2207 1.1.4.2 yamt ATF_TC(bpfjit_ld_ind_x_overflow2);
2208 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_ind_x_overflow2, tc)
2209 1.1.4.2 yamt {
2210 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2211 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_IND with overflow in X+4");
2212 1.1.4.2 yamt }
2213 1.1.4.2 yamt
2214 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_ind_x_overflow2, tc)
2215 1.1.4.2 yamt {
2216 1.1.4.2 yamt static struct bpf_insn insns[] = {
2217 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_LEN, 0),
2218 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, UINT32_C(0xffffffff)),
2219 1.1.4.2 yamt BPF_STMT(BPF_ST, 3),
2220 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2221 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_IND, 0),
2222 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2223 1.1.4.2 yamt };
2224 1.1.4.2 yamt
2225 1.1.4.2 yamt size_t i;
2226 1.1.4.3 yamt bpfjit_func_t code;
2227 1.1.4.2 yamt uint8_t pkt[8] = { 10, 20, 30, 40, 50, 60, 70, 80 };
2228 1.1.4.2 yamt
2229 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2230 1.1.4.2 yamt
2231 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2232 1.1.4.2 yamt
2233 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2234 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2235 1.1.4.2 yamt
2236 1.1.4.2 yamt for (i = 1; i <= sizeof(pkt); i++) {
2237 1.1.4.2 yamt ATF_CHECK(bpf_filter(insns, pkt, i, i) == 10 * i);
2238 1.1.4.2 yamt ATF_CHECK(code(pkt, i, i) == 10 * i);
2239 1.1.4.2 yamt }
2240 1.1.4.2 yamt
2241 1.1.4.2 yamt bpfjit_free_code(code);
2242 1.1.4.2 yamt }
2243 1.1.4.2 yamt
2244 1.1.4.2 yamt ATF_TC(bpfjit_ld_len);
2245 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_len, tc)
2246 1.1.4.2 yamt {
2247 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2248 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_W+BPF_LEN");
2249 1.1.4.2 yamt }
2250 1.1.4.2 yamt
2251 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_len, tc)
2252 1.1.4.2 yamt {
2253 1.1.4.2 yamt static struct bpf_insn insns[] = {
2254 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2255 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2256 1.1.4.2 yamt };
2257 1.1.4.2 yamt
2258 1.1.4.2 yamt size_t i;
2259 1.1.4.3 yamt bpfjit_func_t code;
2260 1.1.4.2 yamt uint8_t pkt[32]; /* the program doesn't read any data */
2261 1.1.4.2 yamt
2262 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2263 1.1.4.2 yamt
2264 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2265 1.1.4.2 yamt
2266 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2267 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2268 1.1.4.2 yamt
2269 1.1.4.2 yamt for (i = 0; i < sizeof(pkt); i++)
2270 1.1.4.2 yamt ATF_CHECK(code(pkt, i, 1) == i);
2271 1.1.4.2 yamt
2272 1.1.4.2 yamt bpfjit_free_code(code);
2273 1.1.4.2 yamt }
2274 1.1.4.2 yamt
2275 1.1.4.2 yamt ATF_TC(bpfjit_ld_imm);
2276 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ld_imm, tc)
2277 1.1.4.2 yamt {
2278 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2279 1.1.4.2 yamt "Test JIT compilation of BPF_LD+BPF_IMM");
2280 1.1.4.2 yamt }
2281 1.1.4.2 yamt
2282 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ld_imm, tc)
2283 1.1.4.2 yamt {
2284 1.1.4.2 yamt static struct bpf_insn insns[] = {
2285 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, UINT32_MAX),
2286 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2287 1.1.4.2 yamt };
2288 1.1.4.2 yamt
2289 1.1.4.3 yamt bpfjit_func_t code;
2290 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2291 1.1.4.2 yamt
2292 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2293 1.1.4.2 yamt
2294 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2295 1.1.4.2 yamt
2296 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2297 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2298 1.1.4.2 yamt
2299 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2300 1.1.4.2 yamt
2301 1.1.4.2 yamt bpfjit_free_code(code);
2302 1.1.4.2 yamt }
2303 1.1.4.2 yamt
2304 1.1.4.2 yamt ATF_TC(bpfjit_ldx_imm1);
2305 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ldx_imm1, tc)
2306 1.1.4.2 yamt {
2307 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2308 1.1.4.2 yamt "Test JIT compilation of BPF_LDX+BPF_IMM");
2309 1.1.4.2 yamt }
2310 1.1.4.2 yamt
2311 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ldx_imm1, tc)
2312 1.1.4.2 yamt {
2313 1.1.4.2 yamt static struct bpf_insn insns[] = {
2314 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, UINT32_MAX - 5),
2315 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2316 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2317 1.1.4.2 yamt };
2318 1.1.4.2 yamt
2319 1.1.4.3 yamt bpfjit_func_t code;
2320 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2321 1.1.4.2 yamt
2322 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2323 1.1.4.2 yamt
2324 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2325 1.1.4.2 yamt
2326 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2327 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2328 1.1.4.2 yamt
2329 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX - 5);
2330 1.1.4.2 yamt
2331 1.1.4.2 yamt bpfjit_free_code(code);
2332 1.1.4.2 yamt }
2333 1.1.4.2 yamt
2334 1.1.4.2 yamt ATF_TC(bpfjit_ldx_imm2);
2335 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ldx_imm2, tc)
2336 1.1.4.2 yamt {
2337 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2338 1.1.4.2 yamt "Test JIT compilation of BPF_LDX+BPF_IMM");
2339 1.1.4.2 yamt }
2340 1.1.4.2 yamt
2341 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ldx_imm2, tc)
2342 1.1.4.2 yamt {
2343 1.1.4.2 yamt static struct bpf_insn insns[] = {
2344 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 5),
2345 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 5),
2346 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2347 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
2348 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2349 1.1.4.2 yamt };
2350 1.1.4.2 yamt
2351 1.1.4.3 yamt bpfjit_func_t code;
2352 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2353 1.1.4.2 yamt
2354 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2355 1.1.4.2 yamt
2356 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2357 1.1.4.2 yamt
2358 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2359 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2360 1.1.4.2 yamt
2361 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == UINT32_MAX);
2362 1.1.4.2 yamt
2363 1.1.4.2 yamt bpfjit_free_code(code);
2364 1.1.4.2 yamt }
2365 1.1.4.2 yamt
2366 1.1.4.2 yamt ATF_TC(bpfjit_ldx_len1);
2367 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ldx_len1, tc)
2368 1.1.4.2 yamt {
2369 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2370 1.1.4.2 yamt "Test JIT compilation of BPF_LDX+BPF_LEN");
2371 1.1.4.2 yamt }
2372 1.1.4.2 yamt
2373 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ldx_len1, tc)
2374 1.1.4.2 yamt {
2375 1.1.4.2 yamt static struct bpf_insn insns[] = {
2376 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2377 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2378 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2379 1.1.4.2 yamt };
2380 1.1.4.2 yamt
2381 1.1.4.2 yamt size_t i;
2382 1.1.4.3 yamt bpfjit_func_t code;
2383 1.1.4.2 yamt uint8_t pkt[5]; /* the program doesn't read any data */
2384 1.1.4.2 yamt
2385 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2386 1.1.4.2 yamt
2387 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2388 1.1.4.2 yamt
2389 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2390 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2391 1.1.4.2 yamt
2392 1.1.4.2 yamt for (i = 1; i < sizeof(pkt); i++) {
2393 1.1.4.2 yamt ATF_CHECK(code(pkt, i, 1) == i);
2394 1.1.4.2 yamt ATF_CHECK(code(pkt, i + 1, i) == i + 1);
2395 1.1.4.2 yamt }
2396 1.1.4.2 yamt
2397 1.1.4.2 yamt bpfjit_free_code(code);
2398 1.1.4.2 yamt }
2399 1.1.4.2 yamt
2400 1.1.4.2 yamt ATF_TC(bpfjit_ldx_len2);
2401 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ldx_len2, tc)
2402 1.1.4.2 yamt {
2403 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2404 1.1.4.2 yamt "Test JIT compilation of BPF_LDX+BPF_LEN");
2405 1.1.4.2 yamt }
2406 1.1.4.2 yamt
2407 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ldx_len2, tc)
2408 1.1.4.2 yamt {
2409 1.1.4.2 yamt static struct bpf_insn insns[] = {
2410 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2411 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 5),
2412 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_X, 0, 1, 0),
2413 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 7),
2414 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX)
2415 1.1.4.2 yamt };
2416 1.1.4.2 yamt
2417 1.1.4.3 yamt bpfjit_func_t code;
2418 1.1.4.2 yamt uint8_t pkt[5]; /* the program doesn't read any data */
2419 1.1.4.2 yamt
2420 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2421 1.1.4.2 yamt
2422 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2423 1.1.4.2 yamt
2424 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2425 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2426 1.1.4.2 yamt
2427 1.1.4.2 yamt ATF_CHECK(code(pkt, 5, 1) == UINT32_MAX);
2428 1.1.4.2 yamt ATF_CHECK(code(pkt, 6, 5) == 7);
2429 1.1.4.2 yamt
2430 1.1.4.2 yamt bpfjit_free_code(code);
2431 1.1.4.2 yamt }
2432 1.1.4.2 yamt
2433 1.1.4.2 yamt ATF_TC(bpfjit_ldx_msh);
2434 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_ldx_msh, tc)
2435 1.1.4.2 yamt {
2436 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2437 1.1.4.2 yamt "Test JIT compilation of BPF_LDX+BPF_MSH");
2438 1.1.4.2 yamt }
2439 1.1.4.2 yamt
2440 1.1.4.2 yamt ATF_TC_BODY(bpfjit_ldx_msh, tc)
2441 1.1.4.2 yamt {
2442 1.1.4.2 yamt static struct bpf_insn insns[] = {
2443 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 1),
2444 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2445 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2446 1.1.4.2 yamt };
2447 1.1.4.2 yamt
2448 1.1.4.3 yamt bpfjit_func_t code;
2449 1.1.4.2 yamt uint8_t pkt[2] = { 0, 0x7a };
2450 1.1.4.2 yamt
2451 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2452 1.1.4.2 yamt
2453 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2454 1.1.4.2 yamt
2455 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2456 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2457 1.1.4.2 yamt
2458 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 40);
2459 1.1.4.2 yamt
2460 1.1.4.2 yamt bpfjit_free_code(code);
2461 1.1.4.2 yamt }
2462 1.1.4.2 yamt
2463 1.1.4.2 yamt ATF_TC(bpfjit_misc_tax);
2464 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_misc_tax, tc)
2465 1.1.4.2 yamt {
2466 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2467 1.1.4.2 yamt "Test JIT compilation of BPF_MISC+BPF_TAX");
2468 1.1.4.2 yamt }
2469 1.1.4.2 yamt
2470 1.1.4.2 yamt ATF_TC_BODY(bpfjit_misc_tax, tc)
2471 1.1.4.2 yamt {
2472 1.1.4.2 yamt static struct bpf_insn insns[] = {
2473 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_IMM, 3),
2474 1.1.4.2 yamt BPF_STMT(BPF_MISC+BPF_TAX, 0),
2475 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_B+BPF_IND, 2),
2476 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2477 1.1.4.2 yamt };
2478 1.1.4.2 yamt
2479 1.1.4.3 yamt bpfjit_func_t code;
2480 1.1.4.2 yamt uint8_t pkt[] = { 0, 11, 22, 33, 44, 55 };
2481 1.1.4.2 yamt
2482 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2483 1.1.4.2 yamt
2484 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2485 1.1.4.2 yamt
2486 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2487 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2488 1.1.4.2 yamt
2489 1.1.4.2 yamt ATF_CHECK(code(pkt, sizeof(pkt), sizeof(pkt)) == 55);
2490 1.1.4.2 yamt
2491 1.1.4.2 yamt bpfjit_free_code(code);
2492 1.1.4.2 yamt }
2493 1.1.4.2 yamt
2494 1.1.4.2 yamt ATF_TC(bpfjit_misc_txa);
2495 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_misc_txa, tc)
2496 1.1.4.2 yamt {
2497 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2498 1.1.4.2 yamt "Test JIT compilation of BPF_MISC+BPF_TXA");
2499 1.1.4.2 yamt }
2500 1.1.4.2 yamt
2501 1.1.4.2 yamt ATF_TC_BODY(bpfjit_misc_txa, tc)
2502 1.1.4.2 yamt {
2503 1.1.4.2 yamt static struct bpf_insn insns[] = {
2504 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 391),
2505 1.1.4.2 yamt BPF_STMT(BPF_MISC+BPF_TXA, 0),
2506 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2507 1.1.4.2 yamt };
2508 1.1.4.2 yamt
2509 1.1.4.3 yamt bpfjit_func_t code;
2510 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2511 1.1.4.2 yamt
2512 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2513 1.1.4.2 yamt
2514 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2515 1.1.4.2 yamt
2516 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2517 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2518 1.1.4.2 yamt
2519 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 391);
2520 1.1.4.2 yamt
2521 1.1.4.2 yamt bpfjit_free_code(code);
2522 1.1.4.2 yamt }
2523 1.1.4.2 yamt
2524 1.1.4.2 yamt ATF_TC(bpfjit_st1);
2525 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_st1, tc)
2526 1.1.4.2 yamt {
2527 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2528 1.1.4.2 yamt "Test JIT compilation of BPF_ST");
2529 1.1.4.2 yamt }
2530 1.1.4.2 yamt
2531 1.1.4.2 yamt ATF_TC_BODY(bpfjit_st1, tc)
2532 1.1.4.2 yamt {
2533 1.1.4.2 yamt static struct bpf_insn insns[] = {
2534 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2535 1.1.4.2 yamt BPF_STMT(BPF_ST, 0),
2536 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, 0),
2537 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2538 1.1.4.2 yamt };
2539 1.1.4.2 yamt
2540 1.1.4.2 yamt size_t i;
2541 1.1.4.3 yamt bpfjit_func_t code;
2542 1.1.4.2 yamt uint8_t pkt[16]; /* the program doesn't read any data */
2543 1.1.4.2 yamt
2544 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2545 1.1.4.2 yamt
2546 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2547 1.1.4.2 yamt
2548 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2549 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2550 1.1.4.2 yamt
2551 1.1.4.2 yamt for (i = 1; i <= sizeof(pkt); i++)
2552 1.1.4.2 yamt ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2553 1.1.4.2 yamt
2554 1.1.4.2 yamt bpfjit_free_code(code);
2555 1.1.4.2 yamt }
2556 1.1.4.2 yamt
2557 1.1.4.2 yamt ATF_TC(bpfjit_st2);
2558 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_st2, tc)
2559 1.1.4.2 yamt {
2560 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2561 1.1.4.2 yamt "Test JIT compilation of BPF_ST");
2562 1.1.4.2 yamt }
2563 1.1.4.2 yamt
2564 1.1.4.2 yamt ATF_TC_BODY(bpfjit_st2, tc)
2565 1.1.4.2 yamt {
2566 1.1.4.2 yamt static struct bpf_insn insns[] = {
2567 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2568 1.1.4.2 yamt BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2569 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, 0),
2570 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2571 1.1.4.2 yamt };
2572 1.1.4.2 yamt
2573 1.1.4.3 yamt bpfjit_func_t code;
2574 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2575 1.1.4.2 yamt
2576 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2577 1.1.4.2 yamt
2578 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2579 1.1.4.2 yamt
2580 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2581 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2582 1.1.4.2 yamt
2583 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0);
2584 1.1.4.2 yamt
2585 1.1.4.2 yamt bpfjit_free_code(code);
2586 1.1.4.2 yamt }
2587 1.1.4.2 yamt
2588 1.1.4.2 yamt ATF_TC(bpfjit_st3);
2589 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_st3, tc)
2590 1.1.4.2 yamt {
2591 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2592 1.1.4.2 yamt "Test JIT compilation of BPF_ST");
2593 1.1.4.2 yamt }
2594 1.1.4.2 yamt
2595 1.1.4.2 yamt ATF_TC_BODY(bpfjit_st3, tc)
2596 1.1.4.2 yamt {
2597 1.1.4.2 yamt static struct bpf_insn insns[] = {
2598 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2599 1.1.4.2 yamt BPF_STMT(BPF_ST, 0),
2600 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2601 1.1.4.2 yamt BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2602 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2603 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2604 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2605 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0),
2606 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, 0),
2607 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2608 1.1.4.2 yamt };
2609 1.1.4.2 yamt
2610 1.1.4.3 yamt bpfjit_func_t code;
2611 1.1.4.2 yamt uint8_t pkt[2]; /* the program doesn't read any data */
2612 1.1.4.2 yamt
2613 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2614 1.1.4.2 yamt
2615 1.1.4.2 yamt ATF_REQUIRE(BPF_MEMWORDS > 1);
2616 1.1.4.2 yamt
2617 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2618 1.1.4.2 yamt
2619 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2620 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2621 1.1.4.2 yamt
2622 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
2623 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 102);
2624 1.1.4.2 yamt
2625 1.1.4.2 yamt bpfjit_free_code(code);
2626 1.1.4.2 yamt }
2627 1.1.4.2 yamt
2628 1.1.4.2 yamt ATF_TC(bpfjit_st4);
2629 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_st4, tc)
2630 1.1.4.2 yamt {
2631 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2632 1.1.4.2 yamt "Test JIT compilation of BPF_ST");
2633 1.1.4.2 yamt }
2634 1.1.4.2 yamt
2635 1.1.4.2 yamt ATF_TC_BODY(bpfjit_st4, tc)
2636 1.1.4.2 yamt {
2637 1.1.4.2 yamt static struct bpf_insn insns[] = {
2638 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_LEN, 0),
2639 1.1.4.2 yamt BPF_STMT(BPF_ST, 5),
2640 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 100),
2641 1.1.4.2 yamt BPF_STMT(BPF_ST, BPF_MEMWORDS-1),
2642 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_K, 200),
2643 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 301, 2, 0),
2644 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, BPF_MEMWORDS-1),
2645 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0),
2646 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_MEM, 5),
2647 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2648 1.1.4.2 yamt };
2649 1.1.4.2 yamt
2650 1.1.4.3 yamt bpfjit_func_t code;
2651 1.1.4.2 yamt uint8_t pkt[2]; /* the program doesn't read any data */
2652 1.1.4.2 yamt
2653 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2654 1.1.4.2 yamt
2655 1.1.4.2 yamt ATF_REQUIRE(BPF_MEMWORDS > 6);
2656 1.1.4.2 yamt
2657 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2658 1.1.4.2 yamt
2659 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2660 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2661 1.1.4.2 yamt
2662 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 1);
2663 1.1.4.2 yamt ATF_CHECK(code(pkt, 2, 2) == 102);
2664 1.1.4.2 yamt
2665 1.1.4.2 yamt bpfjit_free_code(code);
2666 1.1.4.2 yamt }
2667 1.1.4.2 yamt
2668 1.1.4.2 yamt ATF_TC(bpfjit_st5);
2669 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_st5, tc)
2670 1.1.4.2 yamt {
2671 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2672 1.1.4.2 yamt "Test JIT compilation of BPF_ST");
2673 1.1.4.2 yamt }
2674 1.1.4.2 yamt
2675 1.1.4.2 yamt ATF_TC_BODY(bpfjit_st5, tc)
2676 1.1.4.2 yamt {
2677 1.1.4.2 yamt struct bpf_insn insns[5*BPF_MEMWORDS+2];
2678 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2679 1.1.4.2 yamt
2680 1.1.4.2 yamt size_t k;
2681 1.1.4.3 yamt bpfjit_func_t code;
2682 1.1.4.2 yamt uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2683 1.1.4.2 yamt
2684 1.1.4.2 yamt memset(insns, 0, sizeof(insns));
2685 1.1.4.2 yamt
2686 1.1.4.2 yamt /* for each k do M[k] = k */
2687 1.1.4.2 yamt for (k = 0; k < BPF_MEMWORDS; k++) {
2688 1.1.4.2 yamt insns[2*k].code = BPF_LD+BPF_IMM;
2689 1.1.4.2 yamt insns[2*k].k = 3*k;
2690 1.1.4.2 yamt insns[2*k+1].code = BPF_ST;
2691 1.1.4.2 yamt insns[2*k+1].k = k;
2692 1.1.4.2 yamt }
2693 1.1.4.2 yamt
2694 1.1.4.2 yamt /* load wirelen into A */
2695 1.1.4.2 yamt insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2696 1.1.4.2 yamt
2697 1.1.4.2 yamt /* for each k, if (A == k + 1) return M[k] */
2698 1.1.4.2 yamt for (k = 0; k < BPF_MEMWORDS; k++) {
2699 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2700 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2701 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2702 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2703 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2704 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+2].k = k;
2705 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2706 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2707 1.1.4.2 yamt }
2708 1.1.4.2 yamt
2709 1.1.4.2 yamt insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2710 1.1.4.2 yamt insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2711 1.1.4.2 yamt
2712 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2713 1.1.4.2 yamt
2714 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2715 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2716 1.1.4.2 yamt
2717 1.1.4.2 yamt for (k = 1; k <= sizeof(pkt); k++)
2718 1.1.4.2 yamt ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2719 1.1.4.2 yamt
2720 1.1.4.2 yamt bpfjit_free_code(code);
2721 1.1.4.2 yamt }
2722 1.1.4.2 yamt
2723 1.1.4.2 yamt ATF_TC(bpfjit_stx1);
2724 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_stx1, tc)
2725 1.1.4.2 yamt {
2726 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2727 1.1.4.2 yamt "Test JIT compilation of BPF_STX");
2728 1.1.4.2 yamt }
2729 1.1.4.2 yamt
2730 1.1.4.2 yamt ATF_TC_BODY(bpfjit_stx1, tc)
2731 1.1.4.2 yamt {
2732 1.1.4.2 yamt static struct bpf_insn insns[] = {
2733 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2734 1.1.4.2 yamt BPF_STMT(BPF_STX, 0),
2735 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2736 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2737 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2738 1.1.4.2 yamt };
2739 1.1.4.2 yamt
2740 1.1.4.2 yamt size_t i;
2741 1.1.4.3 yamt bpfjit_func_t code;
2742 1.1.4.2 yamt uint8_t pkt[16]; /* the program doesn't read any data */
2743 1.1.4.2 yamt
2744 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2745 1.1.4.2 yamt
2746 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2747 1.1.4.2 yamt
2748 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2749 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2750 1.1.4.2 yamt
2751 1.1.4.2 yamt for (i = 1; i <= sizeof(pkt); i++)
2752 1.1.4.2 yamt ATF_CHECK(code(pkt, i, sizeof(pkt)) == i);
2753 1.1.4.2 yamt
2754 1.1.4.2 yamt bpfjit_free_code(code);
2755 1.1.4.2 yamt }
2756 1.1.4.2 yamt
2757 1.1.4.2 yamt ATF_TC(bpfjit_stx2);
2758 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_stx2, tc)
2759 1.1.4.2 yamt {
2760 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2761 1.1.4.2 yamt "Test JIT compilation of BPF_STX");
2762 1.1.4.2 yamt }
2763 1.1.4.2 yamt
2764 1.1.4.2 yamt ATF_TC_BODY(bpfjit_stx2, tc)
2765 1.1.4.2 yamt {
2766 1.1.4.2 yamt static struct bpf_insn insns[] = {
2767 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2768 1.1.4.2 yamt BPF_STMT(BPF_STX, BPF_MEMWORDS-1),
2769 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 0),
2770 1.1.4.2 yamt BPF_STMT(BPF_MISC+BPF_TXA, 0),
2771 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2772 1.1.4.2 yamt };
2773 1.1.4.2 yamt
2774 1.1.4.3 yamt bpfjit_func_t code;
2775 1.1.4.2 yamt uint8_t pkt[1]; /* the program doesn't read any data */
2776 1.1.4.2 yamt
2777 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2778 1.1.4.2 yamt
2779 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2780 1.1.4.2 yamt
2781 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2782 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2783 1.1.4.2 yamt
2784 1.1.4.2 yamt ATF_CHECK(code(pkt, 1, 1) == 0);
2785 1.1.4.2 yamt
2786 1.1.4.2 yamt bpfjit_free_code(code);
2787 1.1.4.2 yamt }
2788 1.1.4.2 yamt
2789 1.1.4.2 yamt ATF_TC(bpfjit_stx3);
2790 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_stx3, tc)
2791 1.1.4.2 yamt {
2792 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2793 1.1.4.2 yamt "Test JIT compilation of BPF_STX");
2794 1.1.4.2 yamt }
2795 1.1.4.2 yamt
2796 1.1.4.2 yamt ATF_TC_BODY(bpfjit_stx3, tc)
2797 1.1.4.2 yamt {
2798 1.1.4.2 yamt static struct bpf_insn insns[] = {
2799 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_LEN, 0),
2800 1.1.4.2 yamt BPF_STMT(BPF_STX, 5),
2801 1.1.4.2 yamt BPF_STMT(BPF_STX, 2),
2802 1.1.4.2 yamt BPF_STMT(BPF_STX, 3),
2803 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 1),
2804 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2805 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 2),
2806 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2807 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 3),
2808 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2809 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 5),
2810 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2811 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_MEM, 6),
2812 1.1.4.2 yamt BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0),
2813 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_A, 0)
2814 1.1.4.2 yamt };
2815 1.1.4.2 yamt
2816 1.1.4.2 yamt size_t i;
2817 1.1.4.3 yamt bpfjit_func_t code;
2818 1.1.4.2 yamt uint8_t pkt[16]; /* the program doesn't read any data */
2819 1.1.4.2 yamt
2820 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2821 1.1.4.2 yamt
2822 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2823 1.1.4.2 yamt
2824 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2825 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2826 1.1.4.2 yamt
2827 1.1.4.2 yamt for (i = 1; i <= sizeof(pkt); i++)
2828 1.1.4.2 yamt ATF_CHECK(code(pkt, i, sizeof(pkt)) == 3 * i);
2829 1.1.4.2 yamt
2830 1.1.4.2 yamt bpfjit_free_code(code);
2831 1.1.4.2 yamt }
2832 1.1.4.2 yamt
2833 1.1.4.2 yamt ATF_TC(bpfjit_stx4);
2834 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_stx4, tc)
2835 1.1.4.2 yamt {
2836 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2837 1.1.4.2 yamt "Test JIT compilation of BPF_STX");
2838 1.1.4.2 yamt }
2839 1.1.4.2 yamt
2840 1.1.4.2 yamt ATF_TC_BODY(bpfjit_stx4, tc)
2841 1.1.4.2 yamt {
2842 1.1.4.2 yamt struct bpf_insn insns[5*BPF_MEMWORDS+2];
2843 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2844 1.1.4.2 yamt
2845 1.1.4.2 yamt size_t k;
2846 1.1.4.3 yamt bpfjit_func_t code;
2847 1.1.4.2 yamt uint8_t pkt[BPF_MEMWORDS]; /* the program doesn't read any data */
2848 1.1.4.2 yamt
2849 1.1.4.2 yamt memset(insns, 0, sizeof(insns));
2850 1.1.4.2 yamt
2851 1.1.4.2 yamt /* for each k do M[k] = k */
2852 1.1.4.2 yamt for (k = 0; k < BPF_MEMWORDS; k++) {
2853 1.1.4.2 yamt insns[2*k].code = BPF_LDX+BPF_W+BPF_IMM;
2854 1.1.4.2 yamt insns[2*k].k = 3*k;
2855 1.1.4.2 yamt insns[2*k+1].code = BPF_STX;
2856 1.1.4.2 yamt insns[2*k+1].k = k;
2857 1.1.4.2 yamt }
2858 1.1.4.2 yamt
2859 1.1.4.2 yamt /* load wirelen into A */
2860 1.1.4.2 yamt insns[2*BPF_MEMWORDS].code = BPF_LD+BPF_W+BPF_LEN;
2861 1.1.4.2 yamt
2862 1.1.4.2 yamt /* for each k, if (A == k + 1) return M[k] */
2863 1.1.4.2 yamt for (k = 0; k < BPF_MEMWORDS; k++) {
2864 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].code = BPF_JMP+BPF_JEQ+BPF_K;
2865 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].k = k+1;
2866 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].jt = 0;
2867 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+1].jf = 2;
2868 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+2].code = BPF_LD+BPF_MEM;
2869 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+2].k = k;
2870 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+3].code = BPF_RET+BPF_A;
2871 1.1.4.2 yamt insns[2*BPF_MEMWORDS+3*k+3].k = 0;
2872 1.1.4.2 yamt }
2873 1.1.4.2 yamt
2874 1.1.4.2 yamt insns[5*BPF_MEMWORDS+1].code = BPF_RET+BPF_K;
2875 1.1.4.2 yamt insns[5*BPF_MEMWORDS+1].k = UINT32_MAX;
2876 1.1.4.2 yamt
2877 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2878 1.1.4.2 yamt
2879 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2880 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2881 1.1.4.2 yamt
2882 1.1.4.2 yamt for (k = 1; k <= sizeof(pkt); k++)
2883 1.1.4.2 yamt ATF_CHECK(code(pkt, k, k) == 3*(k-1));
2884 1.1.4.2 yamt
2885 1.1.4.2 yamt bpfjit_free_code(code);
2886 1.1.4.2 yamt }
2887 1.1.4.2 yamt
2888 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_abs_1);
2889 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_abs_1, tc)
2890 1.1.4.2 yamt {
2891 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2892 1.1.4.2 yamt "Test JIT compilation with length optimization "
2893 1.1.4.2 yamt "applied to BPF_LD+BPF_ABS");
2894 1.1.4.2 yamt }
2895 1.1.4.2 yamt
2896 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_abs_1, tc)
2897 1.1.4.2 yamt {
2898 1.1.4.2 yamt static struct bpf_insn insns[] = {
2899 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2900 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
2901 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2902 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2903 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2904 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
2905 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
2906 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2907 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
2908 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2909 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
2910 1.1.4.2 yamt };
2911 1.1.4.2 yamt
2912 1.1.4.2 yamt size_t i, j;
2913 1.1.4.3 yamt bpfjit_func_t code;
2914 1.1.4.2 yamt uint8_t pkt[2][34] = {
2915 1.1.4.2 yamt {
2916 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2917 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2918 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
2919 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
2920 1.1.4.2 yamt },
2921 1.1.4.2 yamt {
2922 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2923 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2924 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
2925 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
2926 1.1.4.2 yamt }
2927 1.1.4.2 yamt };
2928 1.1.4.2 yamt
2929 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2930 1.1.4.2 yamt
2931 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2932 1.1.4.2 yamt
2933 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2934 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2935 1.1.4.2 yamt
2936 1.1.4.2 yamt for (i = 0; i < 2; i++) {
2937 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
2938 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
2939 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2940 1.1.4.2 yamt }
2941 1.1.4.2 yamt
2942 1.1.4.2 yamt bpfjit_free_code(code);
2943 1.1.4.2 yamt }
2944 1.1.4.2 yamt
2945 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_abs_2);
2946 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_abs_2, tc)
2947 1.1.4.2 yamt {
2948 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
2949 1.1.4.2 yamt "Test JIT compilation with length optimization "
2950 1.1.4.2 yamt "applied to BPF_LD+BPF_ABS");
2951 1.1.4.2 yamt }
2952 1.1.4.2 yamt
2953 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_abs_2, tc)
2954 1.1.4.2 yamt {
2955 1.1.4.2 yamt static struct bpf_insn insns[] = {
2956 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
2957 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
2958 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2959 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
2960 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
2961 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
2962 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
2963 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
2964 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
2965 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
2966 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
2967 1.1.4.2 yamt };
2968 1.1.4.2 yamt
2969 1.1.4.2 yamt size_t i, j;
2970 1.1.4.3 yamt bpfjit_func_t code;
2971 1.1.4.2 yamt uint8_t pkt[2][34] = {
2972 1.1.4.2 yamt {
2973 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2974 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2975 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
2976 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
2977 1.1.4.2 yamt },
2978 1.1.4.2 yamt {
2979 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
2980 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
2981 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
2982 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
2983 1.1.4.2 yamt }
2984 1.1.4.2 yamt };
2985 1.1.4.2 yamt
2986 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
2987 1.1.4.2 yamt
2988 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
2989 1.1.4.2 yamt
2990 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
2991 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
2992 1.1.4.2 yamt
2993 1.1.4.2 yamt for (i = 0; i < 2; i++) {
2994 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
2995 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
2996 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
2997 1.1.4.2 yamt }
2998 1.1.4.2 yamt
2999 1.1.4.2 yamt bpfjit_free_code(code);
3000 1.1.4.2 yamt }
3001 1.1.4.2 yamt
3002 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_abs_3);
3003 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_abs_3, tc)
3004 1.1.4.2 yamt {
3005 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
3006 1.1.4.2 yamt "Test JIT compilation with length optimization "
3007 1.1.4.2 yamt "applied to BPF_LD+BPF_ABS");
3008 1.1.4.2 yamt }
3009 1.1.4.2 yamt
3010 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_abs_3, tc)
3011 1.1.4.2 yamt {
3012 1.1.4.2 yamt static struct bpf_insn insns[] = {
3013 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 30),
3014 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3015 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3016 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 6),
3017 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 5),
3018 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),
3019 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3020 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
3021 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3022 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3023 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
3024 1.1.4.2 yamt };
3025 1.1.4.2 yamt
3026 1.1.4.2 yamt size_t i, j;
3027 1.1.4.3 yamt bpfjit_func_t code;
3028 1.1.4.2 yamt uint8_t pkt[2][34] = {
3029 1.1.4.2 yamt {
3030 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3031 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3032 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
3033 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
3034 1.1.4.2 yamt },
3035 1.1.4.2 yamt {
3036 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3037 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3038 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
3039 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
3040 1.1.4.2 yamt }
3041 1.1.4.2 yamt };
3042 1.1.4.2 yamt
3043 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3044 1.1.4.2 yamt
3045 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
3046 1.1.4.2 yamt
3047 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
3048 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
3049 1.1.4.2 yamt
3050 1.1.4.2 yamt for (i = 0; i < 2; i++) {
3051 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
3052 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
3053 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3054 1.1.4.2 yamt }
3055 1.1.4.2 yamt
3056 1.1.4.2 yamt bpfjit_free_code(code);
3057 1.1.4.2 yamt }
3058 1.1.4.2 yamt
3059 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_ind_1);
3060 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_ind_1, tc)
3061 1.1.4.2 yamt {
3062 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
3063 1.1.4.2 yamt "Test JIT compilation with length optimization "
3064 1.1.4.2 yamt "applied to BPF_LD+BPF_IND");
3065 1.1.4.2 yamt }
3066 1.1.4.2 yamt
3067 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_ind_1, tc)
3068 1.1.4.2 yamt {
3069 1.1.4.2 yamt static struct bpf_insn insns[] = {
3070 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 12),
3071 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 0),
3072 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 8),
3073 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 14),
3074 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3075 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3076 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 4),
3077 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 3),
3078 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 18),
3079 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 1),
3080 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3081 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
3082 1.1.4.2 yamt };
3083 1.1.4.2 yamt
3084 1.1.4.2 yamt size_t i, j;
3085 1.1.4.3 yamt bpfjit_func_t code;
3086 1.1.4.2 yamt uint8_t pkt[2][34] = {
3087 1.1.4.2 yamt {
3088 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3089 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3090 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
3091 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
3092 1.1.4.2 yamt },
3093 1.1.4.2 yamt {
3094 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3095 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3096 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
3097 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
3098 1.1.4.2 yamt }
3099 1.1.4.2 yamt };
3100 1.1.4.2 yamt
3101 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3102 1.1.4.2 yamt
3103 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
3104 1.1.4.2 yamt
3105 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
3106 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
3107 1.1.4.2 yamt
3108 1.1.4.2 yamt for (i = 0; i < 2; i++) {
3109 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
3110 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
3111 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3112 1.1.4.2 yamt }
3113 1.1.4.2 yamt
3114 1.1.4.2 yamt bpfjit_free_code(code);
3115 1.1.4.2 yamt }
3116 1.1.4.2 yamt
3117 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_ind_2);
3118 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_ind_2, tc)
3119 1.1.4.2 yamt {
3120 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
3121 1.1.4.2 yamt "Test JIT compilation with length optimization "
3122 1.1.4.2 yamt "applied to BPF_LD+BPF_IND");
3123 1.1.4.2 yamt }
3124 1.1.4.2 yamt
3125 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_ind_2, tc)
3126 1.1.4.2 yamt {
3127 1.1.4.2 yamt static struct bpf_insn insns[] = {
3128 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3129 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 26),
3130 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 2),
3131 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3132 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 3, 6),
3133 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 5),
3134 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 30),
3135 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 3),
3136 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3137 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3138 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3139 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
3140 1.1.4.2 yamt };
3141 1.1.4.2 yamt
3142 1.1.4.2 yamt size_t i, j;
3143 1.1.4.3 yamt bpfjit_func_t code;
3144 1.1.4.2 yamt uint8_t pkt[2][34] = {
3145 1.1.4.2 yamt {
3146 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3147 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3148 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
3149 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
3150 1.1.4.2 yamt },
3151 1.1.4.2 yamt {
3152 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3153 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3154 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
3155 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
3156 1.1.4.2 yamt }
3157 1.1.4.2 yamt };
3158 1.1.4.2 yamt
3159 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3160 1.1.4.2 yamt
3161 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
3162 1.1.4.2 yamt
3163 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
3164 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
3165 1.1.4.2 yamt
3166 1.1.4.2 yamt for (i = 0; i < 2; i++) {
3167 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
3168 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
3169 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3170 1.1.4.2 yamt }
3171 1.1.4.2 yamt
3172 1.1.4.2 yamt bpfjit_free_code(code);
3173 1.1.4.2 yamt }
3174 1.1.4.2 yamt
3175 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_ind_3);
3176 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_ind_3, tc)
3177 1.1.4.2 yamt {
3178 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
3179 1.1.4.2 yamt "Test JIT compilation with length optimization "
3180 1.1.4.2 yamt "applied to BPF_LD+BPF_IND");
3181 1.1.4.2 yamt }
3182 1.1.4.2 yamt
3183 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_ind_3, tc)
3184 1.1.4.2 yamt {
3185 1.1.4.2 yamt static struct bpf_insn insns[] = {
3186 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 15),
3187 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3188 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3189 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3190 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3191 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3192 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 11),
3193 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3194 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3195 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3196 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3197 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3198 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
3199 1.1.4.2 yamt };
3200 1.1.4.2 yamt
3201 1.1.4.2 yamt size_t i, j;
3202 1.1.4.3 yamt bpfjit_func_t code;
3203 1.1.4.2 yamt uint8_t pkt[2][34] = {
3204 1.1.4.2 yamt {
3205 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3206 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3207 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
3208 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
3209 1.1.4.2 yamt },
3210 1.1.4.2 yamt {
3211 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3212 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3213 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
3214 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
3215 1.1.4.2 yamt }
3216 1.1.4.2 yamt };
3217 1.1.4.2 yamt
3218 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3219 1.1.4.2 yamt
3220 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
3221 1.1.4.2 yamt
3222 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
3223 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
3224 1.1.4.2 yamt
3225 1.1.4.2 yamt for (i = 0; i < 2; i++) {
3226 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
3227 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
3228 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3229 1.1.4.2 yamt }
3230 1.1.4.2 yamt
3231 1.1.4.2 yamt bpfjit_free_code(code);
3232 1.1.4.2 yamt }
3233 1.1.4.2 yamt
3234 1.1.4.2 yamt ATF_TC(bpfjit_opt_ld_ind_4);
3235 1.1.4.2 yamt ATF_TC_HEAD(bpfjit_opt_ld_ind_4, tc)
3236 1.1.4.2 yamt {
3237 1.1.4.2 yamt atf_tc_set_md_var(tc, "descr",
3238 1.1.4.2 yamt "Test JIT compilation with length optimization "
3239 1.1.4.2 yamt "applied to BPF_LD+BPF_IND");
3240 1.1.4.2 yamt }
3241 1.1.4.2 yamt
3242 1.1.4.2 yamt ATF_TC_BODY(bpfjit_opt_ld_ind_4, tc)
3243 1.1.4.2 yamt {
3244 1.1.4.2 yamt static struct bpf_insn insns[] = {
3245 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 11),
3246 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 19),
3247 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 2),
3248 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3249 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 3, 7),
3250 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x8003700f, 0, 6),
3251 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_W+BPF_IND, 15),
3252 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x80037023, 0, 4),
3253 1.1.4.2 yamt BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 0),
3254 1.1.4.2 yamt BPF_STMT(BPF_LD+BPF_H+BPF_IND, 12),
3255 1.1.4.2 yamt BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x800, 0, 1),
3256 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, UINT32_MAX),
3257 1.1.4.2 yamt BPF_STMT(BPF_RET+BPF_K, 0),
3258 1.1.4.2 yamt };
3259 1.1.4.2 yamt
3260 1.1.4.2 yamt size_t i, j;
3261 1.1.4.3 yamt bpfjit_func_t code;
3262 1.1.4.2 yamt uint8_t pkt[2][34] = {
3263 1.1.4.2 yamt {
3264 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3265 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3266 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f,
3267 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23
3268 1.1.4.2 yamt },
3269 1.1.4.2 yamt {
3270 1.1.4.2 yamt 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0x08, 0x00,
3271 1.1.4.2 yamt 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
3272 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x23,
3273 1.1.4.2 yamt 0x80, 0x03, 0x70, 0x0f
3274 1.1.4.2 yamt }
3275 1.1.4.2 yamt };
3276 1.1.4.2 yamt
3277 1.1.4.2 yamt size_t insn_count = sizeof(insns) / sizeof(insns[0]);
3278 1.1.4.2 yamt
3279 1.1.4.2 yamt ATF_CHECK(bpf_validate(insns, insn_count));
3280 1.1.4.2 yamt
3281 1.1.4.3 yamt code = bpfjit_generate_code(bc, insns, insn_count);
3282 1.1.4.2 yamt ATF_REQUIRE(code != NULL);
3283 1.1.4.2 yamt
3284 1.1.4.2 yamt for (i = 0; i < 2; i++) {
3285 1.1.4.2 yamt for (j = 1; j < sizeof(pkt[i]); j++)
3286 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == 0);
3287 1.1.4.2 yamt ATF_CHECK(code(pkt[i], j, j) == UINT32_MAX);
3288 1.1.4.2 yamt }
3289 1.1.4.2 yamt
3290 1.1.4.2 yamt bpfjit_free_code(code);
3291 1.1.4.2 yamt }
3292 1.1.4.2 yamt
3293 1.1.4.2 yamt ATF_TP_ADD_TCS(tp)
3294 1.1.4.2 yamt {
3295 1.1.4.2 yamt
3296 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_empty);
3297 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_add_k);
3298 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_sub_k);
3299 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_mul_k);
3300 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div0_k);
3301 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div1_k);
3302 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div2_k);
3303 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div4_k);
3304 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div10_k);
3305 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_k);
3306 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_k);
3307 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_k);
3308 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_and_k);
3309 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_or_k);
3310 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_k);
3311 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_k);
3312 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_k);
3313 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_k);
3314 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_k);
3315 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_add_x);
3316 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_sub_x);
3317 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_mul_x);
3318 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div0_x);
3319 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div1_x);
3320 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div2_x);
3321 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div4_x);
3322 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div10_x);
3323 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div10000_x);
3324 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div7609801_x);
3325 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_div80000000_x);
3326 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_and_x);
3327 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_or_x);
3328 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_lsh_x);
3329 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_lsh0_x);
3330 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_rsh_x);
3331 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_rsh0_x);
3332 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_modulo_x);
3333 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_alu_neg);
3334 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_ja);
3335 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_k);
3336 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_k);
3337 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_k);
3338 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_k);
3339 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_k);
3340 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jgt_x);
3341 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jge_x);
3342 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jeq_x);
3343 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_jset_x);
3344 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_jmp_modulo_x);
3345 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_abs);
3346 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_abs_k_overflow);
3347 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_ind);
3348 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_ind_k_overflow);
3349 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow1);
3350 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_ind_x_overflow2);
3351 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_len);
3352 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ld_imm);
3353 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ldx_imm1);
3354 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ldx_imm2);
3355 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ldx_len1);
3356 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ldx_len2);
3357 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_ldx_msh);
3358 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_misc_tax);
3359 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_misc_txa);
3360 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_st1);
3361 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_st2);
3362 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_st3);
3363 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_st4);
3364 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_st5);
3365 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_stx1);
3366 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_stx2);
3367 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_stx3);
3368 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_stx4);
3369 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_1);
3370 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_2);
3371 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_abs_3);
3372 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_1);
3373 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_2);
3374 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_3);
3375 1.1.4.2 yamt ATF_TP_ADD_TC(tp, bpfjit_opt_ld_ind_4);
3376 1.1.4.2 yamt /* XXX: bpfjit_opt_ldx_msh */
3377 1.1.4.2 yamt
3378 1.1.4.2 yamt return atf_no_error();
3379 1.1.4.2 yamt }
3380