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