1*57718be8SEnji Cooper /* $NetBSD: t_extmem.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $ */ 2*57718be8SEnji Cooper 3*57718be8SEnji Cooper /*- 4*57718be8SEnji Cooper * Copyright (c) 2014 Alexander Nasonov. 5*57718be8SEnji Cooper * All rights reserved. 6*57718be8SEnji Cooper * 7*57718be8SEnji Cooper * Redistribution and use in source and binary forms, with or without 8*57718be8SEnji Cooper * modification, are permitted provided that the following conditions 9*57718be8SEnji Cooper * are met: 10*57718be8SEnji Cooper * 11*57718be8SEnji Cooper * 1. Redistributions of source code must retain the above copyright 12*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer. 13*57718be8SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 14*57718be8SEnji Cooper * notice, this list of conditions and the following disclaimer in 15*57718be8SEnji Cooper * the documentation and/or other materials provided with the 16*57718be8SEnji Cooper * distribution. 17*57718be8SEnji Cooper * 18*57718be8SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*57718be8SEnji Cooper * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*57718be8SEnji Cooper * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 21*57718be8SEnji Cooper * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 22*57718be8SEnji Cooper * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23*57718be8SEnji Cooper * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 24*57718be8SEnji Cooper * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*57718be8SEnji Cooper * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26*57718be8SEnji Cooper * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27*57718be8SEnji Cooper * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 28*57718be8SEnji Cooper * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29*57718be8SEnji Cooper * SUCH DAMAGE. 30*57718be8SEnji Cooper */ 31*57718be8SEnji Cooper 32*57718be8SEnji Cooper #include <sys/cdefs.h> 33*57718be8SEnji Cooper __RCSID("$NetBSD: t_extmem.c,v 1.1 2014/07/09 13:49:49 alnsn Exp $"); 34*57718be8SEnji Cooper 35*57718be8SEnji Cooper #include <stdint.h> 36*57718be8SEnji Cooper #include <string.h> 37*57718be8SEnji Cooper 38*57718be8SEnji Cooper #define __BPF_PRIVATE 39*57718be8SEnji Cooper #include <net/bpf.h> 40*57718be8SEnji Cooper #include <net/bpfjit.h> 41*57718be8SEnji Cooper 42*57718be8SEnji Cooper #include "../../net/bpf/h_bpf.h" 43*57718be8SEnji Cooper 44*57718be8SEnji Cooper /* XXX: atf-c.h has collisions with mbuf */ 45*57718be8SEnji Cooper #undef m_type 46*57718be8SEnji Cooper #undef m_data 47*57718be8SEnji Cooper #include <atf-c.h> 48*57718be8SEnji Cooper 49*57718be8SEnji Cooper #include "../../h_macros.h" 50*57718be8SEnji Cooper 51*57718be8SEnji Cooper static uint32_t retM(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A); 52*57718be8SEnji Cooper 53*57718be8SEnji Cooper static const bpf_copfunc_t copfuncs[] = { 54*57718be8SEnji Cooper &retM 55*57718be8SEnji Cooper }; 56*57718be8SEnji Cooper 57*57718be8SEnji Cooper static const bpf_ctx_t ctx = { 58*57718be8SEnji Cooper .copfuncs = copfuncs, 59*57718be8SEnji Cooper .nfuncs = sizeof(copfuncs) / sizeof(copfuncs[0]), 60*57718be8SEnji Cooper .extwords = 4, 61*57718be8SEnji Cooper .preinited = BPF_MEMWORD_INIT(0) | BPF_MEMWORD_INIT(3), 62*57718be8SEnji Cooper }; 63*57718be8SEnji Cooper 64*57718be8SEnji Cooper static uint32_t 65*57718be8SEnji Cooper retM(const bpf_ctx_t *bc, bpf_args_t *args, uint32_t A) 66*57718be8SEnji Cooper { 67*57718be8SEnji Cooper 68*57718be8SEnji Cooper return args->mem[(uintptr_t)args->arg]; 69*57718be8SEnji Cooper } 70*57718be8SEnji Cooper 71*57718be8SEnji Cooper 72*57718be8SEnji Cooper ATF_TC(bpfjit_extmem_load_preinited); 73*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_extmem_load_preinited, tc) 74*57718be8SEnji Cooper { 75*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test a load of external " 76*57718be8SEnji Cooper "pre-initialized memory"); 77*57718be8SEnji Cooper } 78*57718be8SEnji Cooper 79*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_extmem_load_preinited, tc) 80*57718be8SEnji Cooper { 81*57718be8SEnji Cooper static struct bpf_insn insns[] = { 82*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 3), 83*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 84*57718be8SEnji Cooper }; 85*57718be8SEnji Cooper 86*57718be8SEnji Cooper bpfjit_func_t code; 87*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 88*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 89*57718be8SEnji Cooper 90*57718be8SEnji Cooper /* Pre-inited words. */ 91*57718be8SEnji Cooper mem[0] = 0; 92*57718be8SEnji Cooper mem[3] = 3; 93*57718be8SEnji Cooper 94*57718be8SEnji Cooper bpf_args_t args = { 95*57718be8SEnji Cooper .pkt = pkt, 96*57718be8SEnji Cooper .buflen = sizeof(pkt), 97*57718be8SEnji Cooper .wirelen = sizeof(pkt), 98*57718be8SEnji Cooper .mem = mem, 99*57718be8SEnji Cooper }; 100*57718be8SEnji Cooper 101*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 102*57718be8SEnji Cooper 103*57718be8SEnji Cooper RZ(rump_init()); 104*57718be8SEnji Cooper 105*57718be8SEnji Cooper rump_schedule(); 106*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 107*57718be8SEnji Cooper rump_unschedule(); 108*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 109*57718be8SEnji Cooper 110*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 3); 111*57718be8SEnji Cooper 112*57718be8SEnji Cooper rump_schedule(); 113*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 114*57718be8SEnji Cooper rump_unschedule(); 115*57718be8SEnji Cooper } 116*57718be8SEnji Cooper 117*57718be8SEnji Cooper ATF_TC(bpfjit_extmem_invalid_load); 118*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_extmem_invalid_load, tc) 119*57718be8SEnji Cooper { 120*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that out-of-range load " 121*57718be8SEnji Cooper "fails validation"); 122*57718be8SEnji Cooper } 123*57718be8SEnji Cooper 124*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_extmem_invalid_load, tc) 125*57718be8SEnji Cooper { 126*57718be8SEnji Cooper static struct bpf_insn insns[] = { 127*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_MEM, 4), 128*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 129*57718be8SEnji Cooper }; 130*57718be8SEnji Cooper 131*57718be8SEnji Cooper bpfjit_func_t code; 132*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 133*57718be8SEnji Cooper 134*57718be8SEnji Cooper RZ(rump_init()); 135*57718be8SEnji Cooper 136*57718be8SEnji Cooper rump_schedule(); 137*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 138*57718be8SEnji Cooper rump_unschedule(); 139*57718be8SEnji Cooper ATF_CHECK(code == NULL); 140*57718be8SEnji Cooper } 141*57718be8SEnji Cooper 142*57718be8SEnji Cooper ATF_TC(bpfjit_extmem_store); 143*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_extmem_store, tc) 144*57718be8SEnji Cooper { 145*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test stores to external memory"); 146*57718be8SEnji Cooper } 147*57718be8SEnji Cooper 148*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_extmem_store, tc) 149*57718be8SEnji Cooper { 150*57718be8SEnji Cooper static struct bpf_insn insns[] = { 151*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 1), /* A <- 1 */ 152*57718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2), /* X <- 2 */ 153*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), /* M[1] <- A */ 154*57718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ 155*57718be8SEnji Cooper BPF_STMT(BPF_STX, 2), /* M[2] <- X */ 156*57718be8SEnji Cooper BPF_STMT(BPF_ST, 3), /* M[3] <- A */ 157*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) /* ret A */ 158*57718be8SEnji Cooper }; 159*57718be8SEnji Cooper 160*57718be8SEnji Cooper bpfjit_func_t code; 161*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 162*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 163*57718be8SEnji Cooper 164*57718be8SEnji Cooper /* Pre-inited words. */ 165*57718be8SEnji Cooper mem[0] = 0; 166*57718be8SEnji Cooper mem[3] = 7; 167*57718be8SEnji Cooper 168*57718be8SEnji Cooper mem[1] = mem[2] = 0xdeadbeef; 169*57718be8SEnji Cooper 170*57718be8SEnji Cooper bpf_args_t args = { 171*57718be8SEnji Cooper .pkt = pkt, 172*57718be8SEnji Cooper .buflen = sizeof(pkt), 173*57718be8SEnji Cooper .wirelen = sizeof(pkt), 174*57718be8SEnji Cooper .mem = mem, 175*57718be8SEnji Cooper }; 176*57718be8SEnji Cooper 177*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 178*57718be8SEnji Cooper 179*57718be8SEnji Cooper RZ(rump_init()); 180*57718be8SEnji Cooper 181*57718be8SEnji Cooper rump_schedule(); 182*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 183*57718be8SEnji Cooper rump_unschedule(); 184*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 185*57718be8SEnji Cooper 186*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 3); 187*57718be8SEnji Cooper 188*57718be8SEnji Cooper rump_schedule(); 189*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 190*57718be8SEnji Cooper rump_unschedule(); 191*57718be8SEnji Cooper 192*57718be8SEnji Cooper ATF_CHECK(mem[0] == 0); 193*57718be8SEnji Cooper ATF_CHECK(mem[1] == 1); 194*57718be8SEnji Cooper ATF_CHECK(mem[2] == 2); 195*57718be8SEnji Cooper ATF_CHECK(mem[3] == 3); 196*57718be8SEnji Cooper } 197*57718be8SEnji Cooper 198*57718be8SEnji Cooper ATF_TC(bpfjit_extmem_side_effect); 199*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_extmem_side_effect, tc) 200*57718be8SEnji Cooper { 201*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that ABC optimization doesn\'t " 202*57718be8SEnji Cooper "skip stores to external memory"); 203*57718be8SEnji Cooper } 204*57718be8SEnji Cooper 205*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_extmem_side_effect, tc) 206*57718be8SEnji Cooper { 207*57718be8SEnji Cooper static struct bpf_insn insns[] = { 208*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 0), /* A <- P[0] */ 209*57718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_W+BPF_IMM, 2), /* X <- 2 */ 210*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), /* M[1] <- A */ 211*57718be8SEnji Cooper BPF_STMT(BPF_ALU+BPF_ADD+BPF_X, 0), /* A <- A + X */ 212*57718be8SEnji Cooper BPF_STMT(BPF_STX, 2), /* M[2] <- X */ 213*57718be8SEnji Cooper BPF_STMT(BPF_ST, 3), /* M[3] <- A */ 214*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 99), /* A <- P[99] */ 215*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) /* ret A */ 216*57718be8SEnji Cooper }; 217*57718be8SEnji Cooper 218*57718be8SEnji Cooper bpfjit_func_t code; 219*57718be8SEnji Cooper uint8_t pkt[1] = { 1 }; 220*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 221*57718be8SEnji Cooper 222*57718be8SEnji Cooper /* Pre-inited words. */ 223*57718be8SEnji Cooper mem[0] = 0; 224*57718be8SEnji Cooper mem[3] = 7; 225*57718be8SEnji Cooper 226*57718be8SEnji Cooper mem[1] = mem[2] = 0xdeadbeef; 227*57718be8SEnji Cooper 228*57718be8SEnji Cooper bpf_args_t args = { 229*57718be8SEnji Cooper .pkt = pkt, 230*57718be8SEnji Cooper .buflen = sizeof(pkt), 231*57718be8SEnji Cooper .wirelen = sizeof(pkt), 232*57718be8SEnji Cooper .mem = mem, 233*57718be8SEnji Cooper }; 234*57718be8SEnji Cooper 235*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 236*57718be8SEnji Cooper 237*57718be8SEnji Cooper RZ(rump_init()); 238*57718be8SEnji Cooper 239*57718be8SEnji Cooper rump_schedule(); 240*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 241*57718be8SEnji Cooper rump_unschedule(); 242*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 243*57718be8SEnji Cooper 244*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 0); 245*57718be8SEnji Cooper 246*57718be8SEnji Cooper rump_schedule(); 247*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 248*57718be8SEnji Cooper rump_unschedule(); 249*57718be8SEnji Cooper 250*57718be8SEnji Cooper ATF_CHECK(mem[0] == 0); 251*57718be8SEnji Cooper ATF_CHECK(mem[1] == 1); 252*57718be8SEnji Cooper ATF_CHECK(mem[2] == 2); 253*57718be8SEnji Cooper ATF_CHECK(mem[3] == 3); 254*57718be8SEnji Cooper } 255*57718be8SEnji Cooper 256*57718be8SEnji Cooper ATF_TC(bpfjit_extmem_invalid_store); 257*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_extmem_invalid_store, tc) 258*57718be8SEnji Cooper { 259*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test that out-of-range store " 260*57718be8SEnji Cooper "fails validation"); 261*57718be8SEnji Cooper } 262*57718be8SEnji Cooper 263*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_extmem_invalid_store, tc) 264*57718be8SEnji Cooper { 265*57718be8SEnji Cooper static struct bpf_insn insns[] = { 266*57718be8SEnji Cooper BPF_STMT(BPF_ST, 4), 267*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 268*57718be8SEnji Cooper }; 269*57718be8SEnji Cooper 270*57718be8SEnji Cooper bpfjit_func_t code; 271*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 272*57718be8SEnji Cooper 273*57718be8SEnji Cooper RZ(rump_init()); 274*57718be8SEnji Cooper 275*57718be8SEnji Cooper rump_schedule(); 276*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 277*57718be8SEnji Cooper rump_unschedule(); 278*57718be8SEnji Cooper ATF_CHECK(code == NULL); 279*57718be8SEnji Cooper } 280*57718be8SEnji Cooper 281*57718be8SEnji Cooper ATF_TC(bpfjit_cop_ret_mem); 282*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_cop_ret_mem, tc) 283*57718be8SEnji Cooper { 284*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test coprocessor function " 285*57718be8SEnji Cooper "that returns a content of external memory word"); 286*57718be8SEnji Cooper } 287*57718be8SEnji Cooper 288*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_cop_ret_mem, tc) 289*57718be8SEnji Cooper { 290*57718be8SEnji Cooper static struct bpf_insn insns[] = { 291*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 13), 292*57718be8SEnji Cooper BPF_STMT(BPF_ST, 2), 293*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 137), 294*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), 295*57718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COP, 0), // retM 296*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 297*57718be8SEnji Cooper }; 298*57718be8SEnji Cooper 299*57718be8SEnji Cooper bpfjit_func_t code; 300*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 301*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 302*57718be8SEnji Cooper void *arg = (void*)(uintptr_t)2; 303*57718be8SEnji Cooper 304*57718be8SEnji Cooper /* Pre-inited words. */ 305*57718be8SEnji Cooper mem[0] = 0; 306*57718be8SEnji Cooper mem[3] = 3; 307*57718be8SEnji Cooper 308*57718be8SEnji Cooper bpf_args_t args = { 309*57718be8SEnji Cooper .pkt = pkt, 310*57718be8SEnji Cooper .buflen = sizeof(pkt), 311*57718be8SEnji Cooper .wirelen = sizeof(pkt), 312*57718be8SEnji Cooper .arg = arg, 313*57718be8SEnji Cooper .mem = mem, 314*57718be8SEnji Cooper }; 315*57718be8SEnji Cooper 316*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 317*57718be8SEnji Cooper 318*57718be8SEnji Cooper RZ(rump_init()); 319*57718be8SEnji Cooper 320*57718be8SEnji Cooper rump_schedule(); 321*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 322*57718be8SEnji Cooper rump_unschedule(); 323*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 324*57718be8SEnji Cooper 325*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 13); 326*57718be8SEnji Cooper 327*57718be8SEnji Cooper rump_schedule(); 328*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 329*57718be8SEnji Cooper rump_unschedule(); 330*57718be8SEnji Cooper } 331*57718be8SEnji Cooper 332*57718be8SEnji Cooper ATF_TC(bpfjit_cop_ret_preinited_mem); 333*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_cop_ret_preinited_mem, tc) 334*57718be8SEnji Cooper { 335*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test coprocessor function that " 336*57718be8SEnji Cooper "returns a content of external pre-initialized memory word"); 337*57718be8SEnji Cooper } 338*57718be8SEnji Cooper 339*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_cop_ret_preinited_mem, tc) 340*57718be8SEnji Cooper { 341*57718be8SEnji Cooper static struct bpf_insn insns[] = { 342*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 13), 343*57718be8SEnji Cooper BPF_STMT(BPF_ST, 2), 344*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 137), 345*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), 346*57718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COP, 0), // retM 347*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 348*57718be8SEnji Cooper }; 349*57718be8SEnji Cooper 350*57718be8SEnji Cooper bpfjit_func_t code; 351*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 352*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 353*57718be8SEnji Cooper void *arg = (void*)(uintptr_t)3; 354*57718be8SEnji Cooper 355*57718be8SEnji Cooper /* Pre-inited words. */ 356*57718be8SEnji Cooper mem[0] = 0; 357*57718be8SEnji Cooper mem[3] = 3; 358*57718be8SEnji Cooper 359*57718be8SEnji Cooper bpf_args_t args = { 360*57718be8SEnji Cooper .pkt = pkt, 361*57718be8SEnji Cooper .buflen = sizeof(pkt), 362*57718be8SEnji Cooper .wirelen = sizeof(pkt), 363*57718be8SEnji Cooper .arg = arg, 364*57718be8SEnji Cooper .mem = mem, 365*57718be8SEnji Cooper }; 366*57718be8SEnji Cooper 367*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 368*57718be8SEnji Cooper 369*57718be8SEnji Cooper RZ(rump_init()); 370*57718be8SEnji Cooper 371*57718be8SEnji Cooper rump_schedule(); 372*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 373*57718be8SEnji Cooper rump_unschedule(); 374*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 375*57718be8SEnji Cooper 376*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 3); 377*57718be8SEnji Cooper 378*57718be8SEnji Cooper rump_schedule(); 379*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 380*57718be8SEnji Cooper rump_unschedule(); 381*57718be8SEnji Cooper } 382*57718be8SEnji Cooper 383*57718be8SEnji Cooper ATF_TC(bpfjit_copx_ret_mem); 384*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_copx_ret_mem, tc) 385*57718be8SEnji Cooper { 386*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test coprocessor function " 387*57718be8SEnji Cooper "that returns a content of external memory word"); 388*57718be8SEnji Cooper } 389*57718be8SEnji Cooper 390*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_copx_ret_mem, tc) 391*57718be8SEnji Cooper { 392*57718be8SEnji Cooper static struct bpf_insn insns[] = { 393*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 13), 394*57718be8SEnji Cooper BPF_STMT(BPF_ST, 2), 395*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 137), 396*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), 397*57718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_IMM, 0), // retM 398*57718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COPX, 0), 399*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 400*57718be8SEnji Cooper }; 401*57718be8SEnji Cooper 402*57718be8SEnji Cooper bpfjit_func_t code; 403*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 404*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 405*57718be8SEnji Cooper void *arg = (void*)(uintptr_t)2; 406*57718be8SEnji Cooper 407*57718be8SEnji Cooper /* Pre-inited words. */ 408*57718be8SEnji Cooper mem[0] = 0; 409*57718be8SEnji Cooper mem[3] = 3; 410*57718be8SEnji Cooper 411*57718be8SEnji Cooper bpf_args_t args = { 412*57718be8SEnji Cooper .pkt = pkt, 413*57718be8SEnji Cooper .buflen = sizeof(pkt), 414*57718be8SEnji Cooper .wirelen = sizeof(pkt), 415*57718be8SEnji Cooper .arg = arg, 416*57718be8SEnji Cooper .mem = mem, 417*57718be8SEnji Cooper }; 418*57718be8SEnji Cooper 419*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 420*57718be8SEnji Cooper 421*57718be8SEnji Cooper RZ(rump_init()); 422*57718be8SEnji Cooper 423*57718be8SEnji Cooper rump_schedule(); 424*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 425*57718be8SEnji Cooper rump_unschedule(); 426*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 427*57718be8SEnji Cooper 428*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 13); 429*57718be8SEnji Cooper 430*57718be8SEnji Cooper rump_schedule(); 431*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 432*57718be8SEnji Cooper rump_unschedule(); 433*57718be8SEnji Cooper } 434*57718be8SEnji Cooper 435*57718be8SEnji Cooper ATF_TC(bpfjit_copx_ret_preinited_mem); 436*57718be8SEnji Cooper ATF_TC_HEAD(bpfjit_copx_ret_preinited_mem, tc) 437*57718be8SEnji Cooper { 438*57718be8SEnji Cooper atf_tc_set_md_var(tc, "descr", "Test coprocessor function that " 439*57718be8SEnji Cooper "returns a content of external pre-initialized memory word"); 440*57718be8SEnji Cooper } 441*57718be8SEnji Cooper 442*57718be8SEnji Cooper ATF_TC_BODY(bpfjit_copx_ret_preinited_mem, tc) 443*57718be8SEnji Cooper { 444*57718be8SEnji Cooper static struct bpf_insn insns[] = { 445*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 13), 446*57718be8SEnji Cooper BPF_STMT(BPF_ST, 2), 447*57718be8SEnji Cooper BPF_STMT(BPF_LD+BPF_IMM, 137), 448*57718be8SEnji Cooper BPF_STMT(BPF_ST, 1), 449*57718be8SEnji Cooper BPF_STMT(BPF_LDX+BPF_IMM, 0), // retM 450*57718be8SEnji Cooper BPF_STMT(BPF_MISC+BPF_COPX, 0), 451*57718be8SEnji Cooper BPF_STMT(BPF_RET+BPF_A, 0) 452*57718be8SEnji Cooper }; 453*57718be8SEnji Cooper 454*57718be8SEnji Cooper bpfjit_func_t code; 455*57718be8SEnji Cooper uint8_t pkt[1] = { 0 }; 456*57718be8SEnji Cooper uint32_t mem[ctx.extwords]; 457*57718be8SEnji Cooper void *arg = (void*)(uintptr_t)3; 458*57718be8SEnji Cooper 459*57718be8SEnji Cooper /* Pre-inited words. */ 460*57718be8SEnji Cooper mem[0] = 0; 461*57718be8SEnji Cooper mem[3] = 3; 462*57718be8SEnji Cooper 463*57718be8SEnji Cooper bpf_args_t args = { 464*57718be8SEnji Cooper .pkt = pkt, 465*57718be8SEnji Cooper .buflen = sizeof(pkt), 466*57718be8SEnji Cooper .wirelen = sizeof(pkt), 467*57718be8SEnji Cooper .arg = arg, 468*57718be8SEnji Cooper .mem = mem, 469*57718be8SEnji Cooper }; 470*57718be8SEnji Cooper 471*57718be8SEnji Cooper size_t insn_count = sizeof(insns) / sizeof(insns[0]); 472*57718be8SEnji Cooper 473*57718be8SEnji Cooper RZ(rump_init()); 474*57718be8SEnji Cooper 475*57718be8SEnji Cooper rump_schedule(); 476*57718be8SEnji Cooper code = rumpns_bpfjit_generate_code(&ctx, insns, insn_count); 477*57718be8SEnji Cooper rump_unschedule(); 478*57718be8SEnji Cooper ATF_REQUIRE(code != NULL); 479*57718be8SEnji Cooper 480*57718be8SEnji Cooper ATF_CHECK(code(&ctx, &args) == 3); 481*57718be8SEnji Cooper 482*57718be8SEnji Cooper rump_schedule(); 483*57718be8SEnji Cooper rumpns_bpfjit_free_code(code); 484*57718be8SEnji Cooper rump_unschedule(); 485*57718be8SEnji Cooper } 486*57718be8SEnji Cooper 487*57718be8SEnji Cooper ATF_TP_ADD_TCS(tp) 488*57718be8SEnji Cooper { 489*57718be8SEnji Cooper 490*57718be8SEnji Cooper /* 491*57718be8SEnji Cooper * For every new test please also add a similar test 492*57718be8SEnji Cooper * to ../../lib/libbpfjit/t_extmem.c 493*57718be8SEnji Cooper */ 494*57718be8SEnji Cooper //ATF_TP_ADD_TC(tp, bpfjit_extmem_load_default); 495*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_extmem_load_preinited); 496*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_extmem_invalid_load); 497*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_extmem_store); 498*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_extmem_side_effect); 499*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_extmem_invalid_store); 500*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_cop_ret_mem); 501*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_cop_ret_preinited_mem); 502*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_copx_ret_mem); 503*57718be8SEnji Cooper ATF_TP_ADD_TC(tp, bpfjit_copx_ret_preinited_mem); 504*57718be8SEnji Cooper 505*57718be8SEnji Cooper return atf_no_error(); 506*57718be8SEnji Cooper } 507