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