18c2ecf20Sopenharmony_ci{ 28c2ecf20Sopenharmony_ci "bpf_map_ptr: read with negative offset rejected", 38c2ecf20Sopenharmony_ci .insns = { 48c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 58c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 68c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, -8), 78c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 88c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 98c2ecf20Sopenharmony_ci }, 108c2ecf20Sopenharmony_ci .fixup_map_array_48b = { 1 }, 118c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 128c2ecf20Sopenharmony_ci .errstr_unpriv = "bpf_array access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN", 138c2ecf20Sopenharmony_ci .result = REJECT, 148c2ecf20Sopenharmony_ci .errstr = "R1 is bpf_array invalid negative access: off=-8", 158c2ecf20Sopenharmony_ci}, 168c2ecf20Sopenharmony_ci{ 178c2ecf20Sopenharmony_ci "bpf_map_ptr: write rejected", 188c2ecf20Sopenharmony_ci .insns = { 198c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 228c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 238c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_2, 0), 248c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 258c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 268c2ecf20Sopenharmony_ci }, 278c2ecf20Sopenharmony_ci .fixup_map_array_48b = { 3 }, 288c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 298c2ecf20Sopenharmony_ci .errstr_unpriv = "bpf_array access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN", 308c2ecf20Sopenharmony_ci .result = REJECT, 318c2ecf20Sopenharmony_ci .errstr = "only read from bpf_array is supported", 328c2ecf20Sopenharmony_ci}, 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci "bpf_map_ptr: read non-existent field rejected", 358c2ecf20Sopenharmony_ci .insns = { 368c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_6, 0), 378c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 388c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, 1), 398c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 408c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 418c2ecf20Sopenharmony_ci }, 428c2ecf20Sopenharmony_ci .fixup_map_array_48b = { 1 }, 438c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 448c2ecf20Sopenharmony_ci .errstr_unpriv = "bpf_array access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN", 458c2ecf20Sopenharmony_ci .result = REJECT, 468c2ecf20Sopenharmony_ci .errstr = "cannot access ptr member ops with moff 0 in struct bpf_map with off 1 size 4", 478c2ecf20Sopenharmony_ci}, 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci "bpf_map_ptr: read ops field accepted", 508c2ecf20Sopenharmony_ci .insns = { 518c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_6, 0), 528c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 538c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_6, BPF_REG_1, 0), 548c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 558c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 568c2ecf20Sopenharmony_ci }, 578c2ecf20Sopenharmony_ci .fixup_map_array_48b = { 1 }, 588c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 598c2ecf20Sopenharmony_ci .errstr_unpriv = "bpf_array access is allowed only to CAP_PERFMON and CAP_SYS_ADMIN", 608c2ecf20Sopenharmony_ci .result = ACCEPT, 618c2ecf20Sopenharmony_ci .retval = 1, 628c2ecf20Sopenharmony_ci}, 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci "bpf_map_ptr: r = 0, map_ptr = map_ptr + r", 658c2ecf20Sopenharmony_ci .insns = { 668c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 678c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 688c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 698c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 708c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 718c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 728c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 758c2ecf20Sopenharmony_ci }, 768c2ecf20Sopenharmony_ci .fixup_map_hash_16b = { 4 }, 778c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 788c2ecf20Sopenharmony_ci .errstr_unpriv = "R1 has pointer with unsupported alu operation", 798c2ecf20Sopenharmony_ci .result = ACCEPT, 808c2ecf20Sopenharmony_ci}, 818c2ecf20Sopenharmony_ci{ 828c2ecf20Sopenharmony_ci "bpf_map_ptr: r = 0, r = r + map_ptr", 838c2ecf20Sopenharmony_ci .insns = { 848c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 858c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 868c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 878c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 888c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_0, 0), 898c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0), 908c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 918c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 928c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 938c2ecf20Sopenharmony_ci }, 948c2ecf20Sopenharmony_ci .fixup_map_hash_16b = { 4 }, 958c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 968c2ecf20Sopenharmony_ci .errstr_unpriv = "R0 has pointer with unsupported alu operation", 978c2ecf20Sopenharmony_ci .result = ACCEPT, 988c2ecf20Sopenharmony_ci}, 99