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