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