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