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