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