18c2ecf20Sopenharmony_ci{ 28c2ecf20Sopenharmony_ci "calls: basic sanity", 38c2ecf20Sopenharmony_ci .insns = { 48c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 58c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 68c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 78c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 88c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 98c2ecf20Sopenharmony_ci }, 108c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 118c2ecf20Sopenharmony_ci .result = ACCEPT, 128c2ecf20Sopenharmony_ci}, 138c2ecf20Sopenharmony_ci{ 148c2ecf20Sopenharmony_ci "calls: not on unpriviledged", 158c2ecf20Sopenharmony_ci .insns = { 168c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 178c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 198c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 208c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 218c2ecf20Sopenharmony_ci }, 228c2ecf20Sopenharmony_ci .errstr_unpriv = "function calls to other bpf functions are allowed for", 238c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 248c2ecf20Sopenharmony_ci .result = ACCEPT, 258c2ecf20Sopenharmony_ci .retval = 1, 268c2ecf20Sopenharmony_ci}, 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci "calls: div by 0 in subprog", 298c2ecf20Sopenharmony_ci .insns = { 308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 318c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 328c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 338c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 348c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 358c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 368c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 378c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 388c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 398c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 408c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 418c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_2, 0), 428c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_3, 1), 438c2ecf20Sopenharmony_ci BPF_ALU32_REG(BPF_DIV, BPF_REG_3, BPF_REG_2), 448c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 458c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 468c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 478c2ecf20Sopenharmony_ci }, 488c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 498c2ecf20Sopenharmony_ci .result = ACCEPT, 508c2ecf20Sopenharmony_ci .retval = 1, 518c2ecf20Sopenharmony_ci}, 528c2ecf20Sopenharmony_ci{ 538c2ecf20Sopenharmony_ci "calls: multiple ret types in subprog 1", 548c2ecf20Sopenharmony_ci .insns = { 558c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 568c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 578c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 588c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 598c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 608c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 618c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 628c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 638c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 658c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 668c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 678c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 688c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 698c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 42), 708c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 718c2ecf20Sopenharmony_ci }, 728c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 738c2ecf20Sopenharmony_ci .result = REJECT, 748c2ecf20Sopenharmony_ci .errstr = "R0 invalid mem access 'inv'", 758c2ecf20Sopenharmony_ci}, 768c2ecf20Sopenharmony_ci{ 778c2ecf20Sopenharmony_ci "calls: multiple ret types in subprog 2", 788c2ecf20Sopenharmony_ci .insns = { 798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 808c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 818c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 828c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_1, 838c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 848c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_0), 858c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, 8), 868c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_2, BPF_REG_1, 1), 878c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_0, 0), 888c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 898c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 908c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 918c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 928c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 938c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 9), 948c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 958c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 968c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 978c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 988c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 998c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 1008c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_6, 1018c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 1028c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 64), 1038c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1048c2ecf20Sopenharmony_ci }, 1058c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 1068c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 16 }, 1078c2ecf20Sopenharmony_ci .result = REJECT, 1088c2ecf20Sopenharmony_ci .errstr = "R0 min value is outside of the allowed memory range", 1098c2ecf20Sopenharmony_ci}, 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci "calls: overlapping caller/callee", 1128c2ecf20Sopenharmony_ci .insns = { 1138c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0), 1148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1168c2ecf20Sopenharmony_ci }, 1178c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1188c2ecf20Sopenharmony_ci .errstr = "last insn is not an exit or jmp", 1198c2ecf20Sopenharmony_ci .result = REJECT, 1208c2ecf20Sopenharmony_ci}, 1218c2ecf20Sopenharmony_ci{ 1228c2ecf20Sopenharmony_ci "calls: wrong recursive calls", 1238c2ecf20Sopenharmony_ci .insns = { 1248c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 4), 1258c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 4), 1268c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 1278c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 1288c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -2), 1298c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1308c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1318c2ecf20Sopenharmony_ci }, 1328c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1338c2ecf20Sopenharmony_ci .errstr = "jump out of range", 1348c2ecf20Sopenharmony_ci .result = REJECT, 1358c2ecf20Sopenharmony_ci}, 1368c2ecf20Sopenharmony_ci{ 1378c2ecf20Sopenharmony_ci "calls: wrong src reg", 1388c2ecf20Sopenharmony_ci .insns = { 1398c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 2, 0, 0), 1408c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1418c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1428c2ecf20Sopenharmony_ci }, 1438c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1448c2ecf20Sopenharmony_ci .errstr = "BPF_CALL uses reserved fields", 1458c2ecf20Sopenharmony_ci .result = REJECT, 1468c2ecf20Sopenharmony_ci}, 1478c2ecf20Sopenharmony_ci{ 1488c2ecf20Sopenharmony_ci "calls: wrong off value", 1498c2ecf20Sopenharmony_ci .insns = { 1508c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, -1, 2), 1518c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1528c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1538c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1548c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1558c2ecf20Sopenharmony_ci }, 1568c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1578c2ecf20Sopenharmony_ci .errstr = "BPF_CALL uses reserved fields", 1588c2ecf20Sopenharmony_ci .result = REJECT, 1598c2ecf20Sopenharmony_ci}, 1608c2ecf20Sopenharmony_ci{ 1618c2ecf20Sopenharmony_ci "calls: jump back loop", 1628c2ecf20Sopenharmony_ci .insns = { 1638c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 1648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1658c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1668c2ecf20Sopenharmony_ci }, 1678c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1688c2ecf20Sopenharmony_ci .errstr = "back-edge from insn 0 to 0", 1698c2ecf20Sopenharmony_ci .result = REJECT, 1708c2ecf20Sopenharmony_ci}, 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci "calls: conditional call", 1738c2ecf20Sopenharmony_ci .insns = { 1748c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1758c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 1768c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 1778c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 1788c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1798c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1808c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1818c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1828c2ecf20Sopenharmony_ci }, 1838c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1848c2ecf20Sopenharmony_ci .errstr = "jump out of range", 1858c2ecf20Sopenharmony_ci .result = REJECT, 1868c2ecf20Sopenharmony_ci}, 1878c2ecf20Sopenharmony_ci{ 1888c2ecf20Sopenharmony_ci "calls: conditional call 2", 1898c2ecf20Sopenharmony_ci .insns = { 1908c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 1918c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 1928c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 1938c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 1948c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 1958c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1968c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 1978c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1988c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 1998c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2008c2ecf20Sopenharmony_ci }, 2018c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 2028c2ecf20Sopenharmony_ci .result = ACCEPT, 2038c2ecf20Sopenharmony_ci}, 2048c2ecf20Sopenharmony_ci{ 2058c2ecf20Sopenharmony_ci "calls: conditional call 3", 2068c2ecf20Sopenharmony_ci .insns = { 2078c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2088c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2098c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 2108c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 4), 2118c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2128c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2138c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2148c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -6), 2158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 2168c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -6), 2178c2ecf20Sopenharmony_ci }, 2188c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 2198c2ecf20Sopenharmony_ci .errstr_unpriv = "back-edge from insn", 2208c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 2218c2ecf20Sopenharmony_ci .result = ACCEPT, 2228c2ecf20Sopenharmony_ci .retval = 1, 2238c2ecf20Sopenharmony_ci}, 2248c2ecf20Sopenharmony_ci{ 2258c2ecf20Sopenharmony_ci "calls: conditional call 4", 2268c2ecf20Sopenharmony_ci .insns = { 2278c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2288c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2298c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 2308c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 2318c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2338c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2348c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -5), 2358c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 2368c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2378c2ecf20Sopenharmony_ci }, 2388c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 2398c2ecf20Sopenharmony_ci .result = ACCEPT, 2408c2ecf20Sopenharmony_ci}, 2418c2ecf20Sopenharmony_ci{ 2428c2ecf20Sopenharmony_ci "calls: conditional call 5", 2438c2ecf20Sopenharmony_ci .insns = { 2448c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2458c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2468c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 3), 2478c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 2488c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2498c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2508c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 2518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -6), 2528c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 3), 2538c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2548c2ecf20Sopenharmony_ci }, 2558c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2568c2ecf20Sopenharmony_ci .result = ACCEPT, 2578c2ecf20Sopenharmony_ci .retval = 1, 2588c2ecf20Sopenharmony_ci}, 2598c2ecf20Sopenharmony_ci{ 2608c2ecf20Sopenharmony_ci "calls: conditional call 6", 2618c2ecf20Sopenharmony_ci .insns = { 2628c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 2638c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 2648c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 2658c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 2668c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2678c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 2688c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, mark)), 2698c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2708c2ecf20Sopenharmony_ci }, 2718c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 2728c2ecf20Sopenharmony_ci .errstr = "infinite loop detected", 2738c2ecf20Sopenharmony_ci .result = REJECT, 2748c2ecf20Sopenharmony_ci}, 2758c2ecf20Sopenharmony_ci{ 2768c2ecf20Sopenharmony_ci "calls: using r0 returned by callee", 2778c2ecf20Sopenharmony_ci .insns = { 2788c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 2798c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2808c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), 2818c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2828c2ecf20Sopenharmony_ci }, 2838c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 2848c2ecf20Sopenharmony_ci .result = ACCEPT, 2858c2ecf20Sopenharmony_ci}, 2868c2ecf20Sopenharmony_ci{ 2878c2ecf20Sopenharmony_ci "calls: using uninit r0 from callee", 2888c2ecf20Sopenharmony_ci .insns = { 2898c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 2908c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2918c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2928c2ecf20Sopenharmony_ci }, 2938c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 2948c2ecf20Sopenharmony_ci .errstr = "!read_ok", 2958c2ecf20Sopenharmony_ci .result = REJECT, 2968c2ecf20Sopenharmony_ci}, 2978c2ecf20Sopenharmony_ci{ 2988c2ecf20Sopenharmony_ci "calls: callee is using r1", 2998c2ecf20Sopenharmony_ci .insns = { 3008c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 3018c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3028c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 3038c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 3048c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3058c2ecf20Sopenharmony_ci }, 3068c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_ACT, 3078c2ecf20Sopenharmony_ci .result = ACCEPT, 3088c2ecf20Sopenharmony_ci .retval = TEST_DATA_LEN, 3098c2ecf20Sopenharmony_ci}, 3108c2ecf20Sopenharmony_ci{ 3118c2ecf20Sopenharmony_ci "calls: callee using args1", 3128c2ecf20Sopenharmony_ci .insns = { 3138c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 3148c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3158c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 3168c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3178c2ecf20Sopenharmony_ci }, 3188c2ecf20Sopenharmony_ci .errstr_unpriv = "allowed for", 3198c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 3208c2ecf20Sopenharmony_ci .result = ACCEPT, 3218c2ecf20Sopenharmony_ci .retval = POINTER_VALUE, 3228c2ecf20Sopenharmony_ci}, 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci "calls: callee using wrong args2", 3258c2ecf20Sopenharmony_ci .insns = { 3268c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 3278c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3288c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 3298c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3308c2ecf20Sopenharmony_ci }, 3318c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 3328c2ecf20Sopenharmony_ci .errstr = "R2 !read_ok", 3338c2ecf20Sopenharmony_ci .result = REJECT, 3348c2ecf20Sopenharmony_ci}, 3358c2ecf20Sopenharmony_ci{ 3368c2ecf20Sopenharmony_ci "calls: callee using two args", 3378c2ecf20Sopenharmony_ci .insns = { 3388c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 3398c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_6, 3408c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 3418c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_6, 3428c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 3438c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 3448c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3458c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 3468c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_0, BPF_REG_2), 3478c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3488c2ecf20Sopenharmony_ci }, 3498c2ecf20Sopenharmony_ci .errstr_unpriv = "allowed for", 3508c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 3518c2ecf20Sopenharmony_ci .result = ACCEPT, 3528c2ecf20Sopenharmony_ci .retval = TEST_DATA_LEN + TEST_DATA_LEN - ETH_HLEN - ETH_HLEN, 3538c2ecf20Sopenharmony_ci}, 3548c2ecf20Sopenharmony_ci{ 3558c2ecf20Sopenharmony_ci "calls: callee changing pkt pointers", 3568c2ecf20Sopenharmony_ci .insns = { 3578c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_6, BPF_REG_1, offsetof(struct xdp_md, data)), 3588c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_7, BPF_REG_1, 3598c2ecf20Sopenharmony_ci offsetof(struct xdp_md, data_end)), 3608c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_6), 3618c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_8, 8), 3628c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_8, BPF_REG_7, 2), 3638c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 3648c2ecf20Sopenharmony_ci /* clear_all_pkt_pointers() has to walk all frames 3658c2ecf20Sopenharmony_ci * to make sure that pkt pointers in the caller 3668c2ecf20Sopenharmony_ci * are cleared when callee is calling a helper that 3678c2ecf20Sopenharmony_ci * adjusts packet size 3688c2ecf20Sopenharmony_ci */ 3698c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 3708c2ecf20Sopenharmony_ci BPF_MOV32_IMM(BPF_REG_0, 0), 3718c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3728c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 3738c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_xdp_adjust_head), 3748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3758c2ecf20Sopenharmony_ci }, 3768c2ecf20Sopenharmony_ci .result = REJECT, 3778c2ecf20Sopenharmony_ci .errstr = "R6 invalid mem access 'inv'", 3788c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 3798c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 3808c2ecf20Sopenharmony_ci}, 3818c2ecf20Sopenharmony_ci{ 3828c2ecf20Sopenharmony_ci "calls: ptr null check in subprog", 3838c2ecf20Sopenharmony_ci .insns = { 3848c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 3858c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3868c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3878c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 3888c2ecf20Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 3898c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 3908c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_0), 3918c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 3928c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 3938c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_0, BPF_REG_6, 0), 3948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3958c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 3968c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 3978c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 3988c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 3998c2ecf20Sopenharmony_ci }, 4008c2ecf20Sopenharmony_ci .errstr_unpriv = "function calls to other bpf functions are allowed for", 4018c2ecf20Sopenharmony_ci .fixup_map_hash_48b = { 3 }, 4028c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 4038c2ecf20Sopenharmony_ci .result = ACCEPT, 4048c2ecf20Sopenharmony_ci .retval = 0, 4058c2ecf20Sopenharmony_ci}, 4068c2ecf20Sopenharmony_ci{ 4078c2ecf20Sopenharmony_ci "calls: two calls with args", 4088c2ecf20Sopenharmony_ci .insns = { 4098c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4118c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 4128c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 4138c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 4148c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 4158c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 4168c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 4178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 4188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4198c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 4208c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 4218c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4228c2ecf20Sopenharmony_ci }, 4238c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4248c2ecf20Sopenharmony_ci .result = ACCEPT, 4258c2ecf20Sopenharmony_ci .retval = TEST_DATA_LEN + TEST_DATA_LEN, 4268c2ecf20Sopenharmony_ci}, 4278c2ecf20Sopenharmony_ci{ 4288c2ecf20Sopenharmony_ci "calls: calls with stack arith", 4298c2ecf20Sopenharmony_ci .insns = { 4308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4318c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 4328c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4338c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 4358c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4368c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4378c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -64), 4388c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 42), 4398c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 4408c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4418c2ecf20Sopenharmony_ci }, 4428c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4438c2ecf20Sopenharmony_ci .result = ACCEPT, 4448c2ecf20Sopenharmony_ci .retval = 42, 4458c2ecf20Sopenharmony_ci}, 4468c2ecf20Sopenharmony_ci{ 4478c2ecf20Sopenharmony_ci "calls: calls with misaligned stack access", 4488c2ecf20Sopenharmony_ci .insns = { 4498c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 4508c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 4518c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4528c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4538c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -61), 4548c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4558c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4568c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -63), 4578c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 42), 4588c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_0, 0), 4598c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4608c2ecf20Sopenharmony_ci }, 4618c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4628c2ecf20Sopenharmony_ci .flags = F_LOAD_WITH_STRICT_ALIGNMENT, 4638c2ecf20Sopenharmony_ci .errstr = "misaligned stack access", 4648c2ecf20Sopenharmony_ci .result = REJECT, 4658c2ecf20Sopenharmony_ci}, 4668c2ecf20Sopenharmony_ci{ 4678c2ecf20Sopenharmony_ci "calls: calls control flow, jump test", 4688c2ecf20Sopenharmony_ci .insns = { 4698c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 42), 4708c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 4718c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 43), 4728c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 4738c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -3), 4748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4758c2ecf20Sopenharmony_ci }, 4768c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4778c2ecf20Sopenharmony_ci .result = ACCEPT, 4788c2ecf20Sopenharmony_ci .retval = 43, 4798c2ecf20Sopenharmony_ci}, 4808c2ecf20Sopenharmony_ci{ 4818c2ecf20Sopenharmony_ci "calls: calls control flow, jump test 2", 4828c2ecf20Sopenharmony_ci .insns = { 4838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 42), 4848c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 4858c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 43), 4868c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 4878c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 4888c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4898c2ecf20Sopenharmony_ci }, 4908c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 4918c2ecf20Sopenharmony_ci .errstr = "jump out of range from insn 1 to 4", 4928c2ecf20Sopenharmony_ci .result = REJECT, 4938c2ecf20Sopenharmony_ci}, 4948c2ecf20Sopenharmony_ci{ 4958c2ecf20Sopenharmony_ci "calls: two calls with bad jump", 4968c2ecf20Sopenharmony_ci .insns = { 4978c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 4988c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 4998c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 5008c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 5018c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 5028c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 5038c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 5048c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 5058c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 5068c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5078c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 5088c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 5098c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, -3), 5108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5118c2ecf20Sopenharmony_ci }, 5128c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5138c2ecf20Sopenharmony_ci .errstr = "jump out of range from insn 11 to 9", 5148c2ecf20Sopenharmony_ci .result = REJECT, 5158c2ecf20Sopenharmony_ci}, 5168c2ecf20Sopenharmony_ci{ 5178c2ecf20Sopenharmony_ci "calls: recursive call. test1", 5188c2ecf20Sopenharmony_ci .insns = { 5198c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5208c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5218c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -1), 5228c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5238c2ecf20Sopenharmony_ci }, 5248c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5258c2ecf20Sopenharmony_ci .errstr = "back-edge", 5268c2ecf20Sopenharmony_ci .result = REJECT, 5278c2ecf20Sopenharmony_ci}, 5288c2ecf20Sopenharmony_ci{ 5298c2ecf20Sopenharmony_ci "calls: recursive call. test2", 5308c2ecf20Sopenharmony_ci .insns = { 5318c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5338c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -3), 5348c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5358c2ecf20Sopenharmony_ci }, 5368c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5378c2ecf20Sopenharmony_ci .errstr = "back-edge", 5388c2ecf20Sopenharmony_ci .result = REJECT, 5398c2ecf20Sopenharmony_ci}, 5408c2ecf20Sopenharmony_ci{ 5418c2ecf20Sopenharmony_ci "calls: unreachable code", 5428c2ecf20Sopenharmony_ci .insns = { 5438c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5448c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5458c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5468c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5478c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5488c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5498c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5508c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5518c2ecf20Sopenharmony_ci }, 5528c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5538c2ecf20Sopenharmony_ci .errstr = "unreachable insn 6", 5548c2ecf20Sopenharmony_ci .result = REJECT, 5558c2ecf20Sopenharmony_ci}, 5568c2ecf20Sopenharmony_ci{ 5578c2ecf20Sopenharmony_ci "calls: invalid call", 5588c2ecf20Sopenharmony_ci .insns = { 5598c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5608c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5618c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -4), 5628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5638c2ecf20Sopenharmony_ci }, 5648c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5658c2ecf20Sopenharmony_ci .errstr = "invalid destination", 5668c2ecf20Sopenharmony_ci .result = REJECT, 5678c2ecf20Sopenharmony_ci}, 5688c2ecf20Sopenharmony_ci{ 5698c2ecf20Sopenharmony_ci "calls: invalid call 2", 5708c2ecf20Sopenharmony_ci .insns = { 5718c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 5728c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5738c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 0x7fffffff), 5748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5758c2ecf20Sopenharmony_ci }, 5768c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5778c2ecf20Sopenharmony_ci .errstr = "invalid destination", 5788c2ecf20Sopenharmony_ci .result = REJECT, 5798c2ecf20Sopenharmony_ci}, 5808c2ecf20Sopenharmony_ci{ 5818c2ecf20Sopenharmony_ci "calls: jumping across function bodies. test1", 5828c2ecf20Sopenharmony_ci .insns = { 5838c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5848c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5858c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5868c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -3), 5878c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 5888c2ecf20Sopenharmony_ci }, 5898c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 5908c2ecf20Sopenharmony_ci .errstr = "jump out of range", 5918c2ecf20Sopenharmony_ci .result = REJECT, 5928c2ecf20Sopenharmony_ci}, 5938c2ecf20Sopenharmony_ci{ 5948c2ecf20Sopenharmony_ci "calls: jumping across function bodies. test2", 5958c2ecf20Sopenharmony_ci .insns = { 5968c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 3), 5978c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 5988c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 5998c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6008c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6018c2ecf20Sopenharmony_ci }, 6028c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6038c2ecf20Sopenharmony_ci .errstr = "jump out of range", 6048c2ecf20Sopenharmony_ci .result = REJECT, 6058c2ecf20Sopenharmony_ci}, 6068c2ecf20Sopenharmony_ci{ 6078c2ecf20Sopenharmony_ci "calls: call without exit", 6088c2ecf20Sopenharmony_ci .insns = { 6098c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 6108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6118c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 6128c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6138c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6148c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, -2), 6158c2ecf20Sopenharmony_ci }, 6168c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6178c2ecf20Sopenharmony_ci .errstr = "not an exit", 6188c2ecf20Sopenharmony_ci .result = REJECT, 6198c2ecf20Sopenharmony_ci}, 6208c2ecf20Sopenharmony_ci{ 6218c2ecf20Sopenharmony_ci "calls: call into middle of ld_imm64", 6228c2ecf20Sopenharmony_ci .insns = { 6238c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 6248c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 6258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6278c2ecf20Sopenharmony_ci BPF_LD_IMM64(BPF_REG_0, 0), 6288c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6298c2ecf20Sopenharmony_ci }, 6308c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6318c2ecf20Sopenharmony_ci .errstr = "last insn", 6328c2ecf20Sopenharmony_ci .result = REJECT, 6338c2ecf20Sopenharmony_ci}, 6348c2ecf20Sopenharmony_ci{ 6358c2ecf20Sopenharmony_ci "calls: call into middle of other call", 6368c2ecf20Sopenharmony_ci .insns = { 6378c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 6388c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 6398c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6408c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6418c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6428c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6438c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6448c2ecf20Sopenharmony_ci }, 6458c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6468c2ecf20Sopenharmony_ci .errstr = "last insn", 6478c2ecf20Sopenharmony_ci .result = REJECT, 6488c2ecf20Sopenharmony_ci}, 6498c2ecf20Sopenharmony_ci{ 6508c2ecf20Sopenharmony_ci "calls: subprog call with ld_abs in main prog", 6518c2ecf20Sopenharmony_ci .insns = { 6528c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6538c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_B, 0), 6548c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_H, 0), 6558c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_W, 0), 6568c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_6), 6578c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 6588c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 6598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_7), 6608c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_B, 0), 6618c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_H, 0), 6628c2ecf20Sopenharmony_ci BPF_LD_ABS(BPF_W, 0), 6638c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 1), 6658c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_3, 2), 6668c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_skb_vlan_push), 6678c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6688c2ecf20Sopenharmony_ci }, 6698c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 6708c2ecf20Sopenharmony_ci .result = ACCEPT, 6718c2ecf20Sopenharmony_ci}, 6728c2ecf20Sopenharmony_ci{ 6738c2ecf20Sopenharmony_ci "calls: two calls with bad fallthrough", 6748c2ecf20Sopenharmony_ci .insns = { 6758c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 6768c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6778c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 6788c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 6798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 6808c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 6818c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 6828c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 6838c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 6848c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_0), 6858c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 6868c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, len)), 6878c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 6888c2ecf20Sopenharmony_ci }, 6898c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 6908c2ecf20Sopenharmony_ci .errstr = "not an exit", 6918c2ecf20Sopenharmony_ci .result = REJECT, 6928c2ecf20Sopenharmony_ci}, 6938c2ecf20Sopenharmony_ci{ 6948c2ecf20Sopenharmony_ci "calls: two calls with stack read", 6958c2ecf20Sopenharmony_ci .insns = { 6968c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 6978c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 6988c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 6998c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 7008c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7018c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7028c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 6), 7038c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_0), 7048c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 7058c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 7068c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_7, BPF_REG_0), 7078c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_7), 7088c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7098c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7118c2ecf20Sopenharmony_ci }, 7128c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 7138c2ecf20Sopenharmony_ci .result = ACCEPT, 7148c2ecf20Sopenharmony_ci}, 7158c2ecf20Sopenharmony_ci{ 7168c2ecf20Sopenharmony_ci "calls: two calls with stack write", 7178c2ecf20Sopenharmony_ci .insns = { 7188c2ecf20Sopenharmony_ci /* main prog */ 7198c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 7208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 7218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 7228c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7238c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 7248c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 7258c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 7268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7278c2ecf20Sopenharmony_ci 7288c2ecf20Sopenharmony_ci /* subprog 1 */ 7298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 7308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 7318c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 7), 7328c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_8, BPF_REG_0), 7338c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 7348c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 7358c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_8, BPF_REG_0), 7368c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_8), 7378c2ecf20Sopenharmony_ci /* write into stack frame of main prog */ 7388c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 7398c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7408c2ecf20Sopenharmony_ci 7418c2ecf20Sopenharmony_ci /* subprog 2 */ 7428c2ecf20Sopenharmony_ci /* read from stack frame of main prog */ 7438c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_1, 0), 7448c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7458c2ecf20Sopenharmony_ci }, 7468c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 7478c2ecf20Sopenharmony_ci .result = ACCEPT, 7488c2ecf20Sopenharmony_ci}, 7498c2ecf20Sopenharmony_ci{ 7508c2ecf20Sopenharmony_ci "calls: stack overflow using two frames (pre-call access)", 7518c2ecf20Sopenharmony_ci .insns = { 7528c2ecf20Sopenharmony_ci /* prog 1 */ 7538c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 7548c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), 7558c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7568c2ecf20Sopenharmony_ci 7578c2ecf20Sopenharmony_ci /* prog 2 */ 7588c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 7598c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7608c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7618c2ecf20Sopenharmony_ci }, 7628c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 7638c2ecf20Sopenharmony_ci .errstr = "combined stack size", 7648c2ecf20Sopenharmony_ci .result = REJECT, 7658c2ecf20Sopenharmony_ci}, 7668c2ecf20Sopenharmony_ci{ 7678c2ecf20Sopenharmony_ci "calls: stack overflow using two frames (post-call access)", 7688c2ecf20Sopenharmony_ci .insns = { 7698c2ecf20Sopenharmony_ci /* prog 1 */ 7708c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), 7718c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 7728c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7738c2ecf20Sopenharmony_ci 7748c2ecf20Sopenharmony_ci /* prog 2 */ 7758c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 7768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7778c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7788c2ecf20Sopenharmony_ci }, 7798c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 7808c2ecf20Sopenharmony_ci .errstr = "combined stack size", 7818c2ecf20Sopenharmony_ci .result = REJECT, 7828c2ecf20Sopenharmony_ci}, 7838c2ecf20Sopenharmony_ci{ 7848c2ecf20Sopenharmony_ci "calls: stack depth check using three frames. test1", 7858c2ecf20Sopenharmony_ci .insns = { 7868c2ecf20Sopenharmony_ci /* main */ 7878c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 7888c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 7898c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 7908c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 7918c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7928c2ecf20Sopenharmony_ci /* A */ 7938c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 7948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7958c2ecf20Sopenharmony_ci /* B */ 7968c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 7978c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 7988c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 7998c2ecf20Sopenharmony_ci }, 8008c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 8018c2ecf20Sopenharmony_ci /* stack_main=32, stack_A=256, stack_B=64 8028c2ecf20Sopenharmony_ci * and max(main+A, main+A+B) < 512 8038c2ecf20Sopenharmony_ci */ 8048c2ecf20Sopenharmony_ci .result = ACCEPT, 8058c2ecf20Sopenharmony_ci}, 8068c2ecf20Sopenharmony_ci{ 8078c2ecf20Sopenharmony_ci "calls: stack depth check using three frames. test2", 8088c2ecf20Sopenharmony_ci .insns = { 8098c2ecf20Sopenharmony_ci /* main */ 8108c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 8118c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 5), /* call B */ 8128c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -32, 0), 8138c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8148c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8158c2ecf20Sopenharmony_ci /* A */ 8168c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 8178c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8188c2ecf20Sopenharmony_ci /* B */ 8198c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -3), /* call A */ 8208c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 8218c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8228c2ecf20Sopenharmony_ci }, 8238c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 8248c2ecf20Sopenharmony_ci /* stack_main=32, stack_A=64, stack_B=256 8258c2ecf20Sopenharmony_ci * and max(main+A, main+A+B) < 512 8268c2ecf20Sopenharmony_ci */ 8278c2ecf20Sopenharmony_ci .result = ACCEPT, 8288c2ecf20Sopenharmony_ci}, 8298c2ecf20Sopenharmony_ci{ 8308c2ecf20Sopenharmony_ci "calls: stack depth check using three frames. test3", 8318c2ecf20Sopenharmony_ci .insns = { 8328c2ecf20Sopenharmony_ci /* main */ 8338c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 8348c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 8358c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 8368c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 8), /* call B */ 8378c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JGE, BPF_REG_6, 0, 1), 8388c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -64, 0), 8398c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8408c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8418c2ecf20Sopenharmony_ci /* A */ 8428c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 10, 1), 8438c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8448c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -224, 0), 8458c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -3), 8468c2ecf20Sopenharmony_ci /* B */ 8478c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 1), 8488c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, -6), /* call A */ 8498c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -256, 0), 8508c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8518c2ecf20Sopenharmony_ci }, 8528c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 8538c2ecf20Sopenharmony_ci /* stack_main=64, stack_A=224, stack_B=256 8548c2ecf20Sopenharmony_ci * and max(main+A, main+A+B) > 512 8558c2ecf20Sopenharmony_ci */ 8568c2ecf20Sopenharmony_ci .errstr = "combined stack", 8578c2ecf20Sopenharmony_ci .result = REJECT, 8588c2ecf20Sopenharmony_ci}, 8598c2ecf20Sopenharmony_ci{ 8608c2ecf20Sopenharmony_ci "calls: stack depth check using three frames. test4", 8618c2ecf20Sopenharmony_ci /* void main(void) { 8628c2ecf20Sopenharmony_ci * func1(0); 8638c2ecf20Sopenharmony_ci * func1(1); 8648c2ecf20Sopenharmony_ci * func2(1); 8658c2ecf20Sopenharmony_ci * } 8668c2ecf20Sopenharmony_ci * void func1(int alloc_or_recurse) { 8678c2ecf20Sopenharmony_ci * if (alloc_or_recurse) { 8688c2ecf20Sopenharmony_ci * frame_pointer[-300] = 1; 8698c2ecf20Sopenharmony_ci * } else { 8708c2ecf20Sopenharmony_ci * func2(alloc_or_recurse); 8718c2ecf20Sopenharmony_ci * } 8728c2ecf20Sopenharmony_ci * } 8738c2ecf20Sopenharmony_ci * void func2(int alloc_or_recurse) { 8748c2ecf20Sopenharmony_ci * if (alloc_or_recurse) { 8758c2ecf20Sopenharmony_ci * frame_pointer[-300] = 1; 8768c2ecf20Sopenharmony_ci * } 8778c2ecf20Sopenharmony_ci * } 8788c2ecf20Sopenharmony_ci */ 8798c2ecf20Sopenharmony_ci .insns = { 8808c2ecf20Sopenharmony_ci /* main */ 8818c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 8828c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 6), /* call A */ 8838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 1), 8848c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 4), /* call A */ 8858c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 1), 8868c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 7), /* call B */ 8878c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8888c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8898c2ecf20Sopenharmony_ci /* A */ 8908c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 2), 8918c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 8928c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8938c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 8948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8958c2ecf20Sopenharmony_ci /* B */ 8968c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 8978c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_B, BPF_REG_10, -300, 0), 8988c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 8998c2ecf20Sopenharmony_ci }, 9008c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 9018c2ecf20Sopenharmony_ci .result = REJECT, 9028c2ecf20Sopenharmony_ci .errstr = "combined stack", 9038c2ecf20Sopenharmony_ci}, 9048c2ecf20Sopenharmony_ci{ 9058c2ecf20Sopenharmony_ci "calls: stack depth check using three frames. test5", 9068c2ecf20Sopenharmony_ci .insns = { 9078c2ecf20Sopenharmony_ci /* main */ 9088c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 9098c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9108c2ecf20Sopenharmony_ci /* A */ 9118c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call B */ 9128c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9138c2ecf20Sopenharmony_ci /* B */ 9148c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 9158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9168c2ecf20Sopenharmony_ci /* C */ 9178c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 9188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9198c2ecf20Sopenharmony_ci /* D */ 9208c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 9218c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9228c2ecf20Sopenharmony_ci /* E */ 9238c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 9248c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9258c2ecf20Sopenharmony_ci /* F */ 9268c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 9278c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9288c2ecf20Sopenharmony_ci /* G */ 9298c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 9308c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9318c2ecf20Sopenharmony_ci /* H */ 9328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9338c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9348c2ecf20Sopenharmony_ci }, 9358c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 9368c2ecf20Sopenharmony_ci .errstr = "call stack", 9378c2ecf20Sopenharmony_ci .result = REJECT, 9388c2ecf20Sopenharmony_ci}, 9398c2ecf20Sopenharmony_ci{ 9408c2ecf20Sopenharmony_ci "calls: stack depth check in dead code", 9418c2ecf20Sopenharmony_ci .insns = { 9428c2ecf20Sopenharmony_ci /* main */ 9438c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 9448c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call A */ 9458c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9468c2ecf20Sopenharmony_ci /* A */ 9478c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 9488c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 2), /* call B */ 9498c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9508c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9518c2ecf20Sopenharmony_ci /* B */ 9528c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call C */ 9538c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9548c2ecf20Sopenharmony_ci /* C */ 9558c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call D */ 9568c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9578c2ecf20Sopenharmony_ci /* D */ 9588c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call E */ 9598c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9608c2ecf20Sopenharmony_ci /* E */ 9618c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call F */ 9628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9638c2ecf20Sopenharmony_ci /* F */ 9648c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call G */ 9658c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9668c2ecf20Sopenharmony_ci /* G */ 9678c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP|BPF_CALL, 0, 1, 0, 1), /* call H */ 9688c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9698c2ecf20Sopenharmony_ci /* H */ 9708c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9718c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9728c2ecf20Sopenharmony_ci }, 9738c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 9748c2ecf20Sopenharmony_ci .errstr = "call stack", 9758c2ecf20Sopenharmony_ci .result = REJECT, 9768c2ecf20Sopenharmony_ci}, 9778c2ecf20Sopenharmony_ci{ 9788c2ecf20Sopenharmony_ci "calls: spill into caller stack frame", 9798c2ecf20Sopenharmony_ci .insns = { 9808c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 9818c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 9828c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 9838c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 9848c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9858c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_1, 0), 9868c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 9878c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 9888c2ecf20Sopenharmony_ci }, 9898c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 9908c2ecf20Sopenharmony_ci .errstr = "cannot spill", 9918c2ecf20Sopenharmony_ci .result = REJECT, 9928c2ecf20Sopenharmony_ci}, 9938c2ecf20Sopenharmony_ci{ 9948c2ecf20Sopenharmony_ci "calls: write into caller stack frame", 9958c2ecf20Sopenharmony_ci .insns = { 9968c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 9978c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 9988c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 9998c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10008c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 10018c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10028c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 42), 10038c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 10048c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10058c2ecf20Sopenharmony_ci }, 10068c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 10078c2ecf20Sopenharmony_ci .result = ACCEPT, 10088c2ecf20Sopenharmony_ci .retval = 42, 10098c2ecf20Sopenharmony_ci}, 10108c2ecf20Sopenharmony_ci{ 10118c2ecf20Sopenharmony_ci "calls: write into callee stack frame", 10128c2ecf20Sopenharmony_ci .insns = { 10138c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10148c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 42), 10158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10168c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_10), 10178c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, -8), 10188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10198c2ecf20Sopenharmony_ci }, 10208c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 10218c2ecf20Sopenharmony_ci .errstr = "cannot return stack pointer", 10228c2ecf20Sopenharmony_ci .result = REJECT, 10238c2ecf20Sopenharmony_ci}, 10248c2ecf20Sopenharmony_ci{ 10258c2ecf20Sopenharmony_ci "calls: two calls with stack write and void return", 10268c2ecf20Sopenharmony_ci .insns = { 10278c2ecf20Sopenharmony_ci /* main prog */ 10288c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 10298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10308c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10318c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10328c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10338c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10348c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 10358c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10368c2ecf20Sopenharmony_ci 10378c2ecf20Sopenharmony_ci /* subprog 1 */ 10388c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10398c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 10408c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 10418c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 10428c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 10438c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10448c2ecf20Sopenharmony_ci 10458c2ecf20Sopenharmony_ci /* subprog 2 */ 10468c2ecf20Sopenharmony_ci /* write into stack frame of main prog */ 10478c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_1, 0, 0), 10488c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* void return */ 10498c2ecf20Sopenharmony_ci }, 10508c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 10518c2ecf20Sopenharmony_ci .result = ACCEPT, 10528c2ecf20Sopenharmony_ci}, 10538c2ecf20Sopenharmony_ci{ 10548c2ecf20Sopenharmony_ci "calls: ambiguous return value", 10558c2ecf20Sopenharmony_ci .insns = { 10568c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10578c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 10588c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 10598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 10608c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 10618c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 10628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10638c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 1), 10648c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 10658c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10668c2ecf20Sopenharmony_ci }, 10678c2ecf20Sopenharmony_ci .errstr_unpriv = "allowed for", 10688c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 10698c2ecf20Sopenharmony_ci .errstr = "R0 !read_ok", 10708c2ecf20Sopenharmony_ci .result = REJECT, 10718c2ecf20Sopenharmony_ci}, 10728c2ecf20Sopenharmony_ci{ 10738c2ecf20Sopenharmony_ci "calls: two calls that return map_value", 10748c2ecf20Sopenharmony_ci .insns = { 10758c2ecf20Sopenharmony_ci /* main prog */ 10768c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 10778c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 10788c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 10798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 10808c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 10818c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 8), 10828c2ecf20Sopenharmony_ci 10838c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 10848c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 10858c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 10868c2ecf20Sopenharmony_ci /* write into map value */ 10878c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10888c2ecf20Sopenharmony_ci /* fetch secound map_value_ptr from the stack */ 10898c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -16), 10908c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 10918c2ecf20Sopenharmony_ci /* write into map value */ 10928c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 10938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 10948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 10958c2ecf20Sopenharmony_ci 10968c2ecf20Sopenharmony_ci /* subprog 1 */ 10978c2ecf20Sopenharmony_ci /* call 3rd function twice */ 10988c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 10998c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11008c2ecf20Sopenharmony_ci /* first time with fp-8 */ 11018c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 11028c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11038c2ecf20Sopenharmony_ci /* second time with fp-16 */ 11048c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 11058c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_ci /* subprog 2 */ 11088c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11098c2ecf20Sopenharmony_ci /* lookup from map */ 11108c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11118c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11128c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11138c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 11148c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 11158c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog */ 11168c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11178c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* return 0 */ 11198c2ecf20Sopenharmony_ci }, 11208c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 11218c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 23 }, 11228c2ecf20Sopenharmony_ci .result = ACCEPT, 11238c2ecf20Sopenharmony_ci}, 11248c2ecf20Sopenharmony_ci{ 11258c2ecf20Sopenharmony_ci "calls: two calls that return map_value with bool condition", 11268c2ecf20Sopenharmony_ci .insns = { 11278c2ecf20Sopenharmony_ci /* main prog */ 11288c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 11298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11308c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11318c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11328c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11338c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11348c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11358c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11368c2ecf20Sopenharmony_ci 11378c2ecf20Sopenharmony_ci /* subprog 1 */ 11388c2ecf20Sopenharmony_ci /* call 3rd function twice */ 11398c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11408c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11418c2ecf20Sopenharmony_ci /* first time with fp-8 */ 11428c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 11438c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11448c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 11458c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 11468c2ecf20Sopenharmony_ci /* write into map value */ 11478c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11488c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 11498c2ecf20Sopenharmony_ci /* second time with fp-16 */ 11508c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 11518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11528c2ecf20Sopenharmony_ci /* fetch secound map_value_ptr from the stack */ 11538c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 11548c2ecf20Sopenharmony_ci /* write into map value */ 11558c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 11568c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11578c2ecf20Sopenharmony_ci 11588c2ecf20Sopenharmony_ci /* subprog 2 */ 11598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11608c2ecf20Sopenharmony_ci /* lookup from map */ 11618c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 11628c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11638c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 11648c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 11658c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 11668c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 11678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11688c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* return 0 */ 11698c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog */ 11708c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 11718c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 11728c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* return 1 */ 11738c2ecf20Sopenharmony_ci }, 11748c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 11758c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 23 }, 11768c2ecf20Sopenharmony_ci .result = ACCEPT, 11778c2ecf20Sopenharmony_ci}, 11788c2ecf20Sopenharmony_ci{ 11798c2ecf20Sopenharmony_ci "calls: two calls that return map_value with incorrect bool check", 11808c2ecf20Sopenharmony_ci .insns = { 11818c2ecf20Sopenharmony_ci /* main prog */ 11828c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 11838c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 11848c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 11858c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 11868c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 11878c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 11888c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 11898c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 11908c2ecf20Sopenharmony_ci 11918c2ecf20Sopenharmony_ci /* subprog 1 */ 11928c2ecf20Sopenharmony_ci /* call 3rd function twice */ 11938c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 11948c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 11958c2ecf20Sopenharmony_ci /* first time with fp-8 */ 11968c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 9), 11978c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 1, 2), 11988c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 11998c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_6, 0), 12008c2ecf20Sopenharmony_ci /* write into map value */ 12018c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12028c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), 12038c2ecf20Sopenharmony_ci /* second time with fp-16 */ 12048c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 12058c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12068c2ecf20Sopenharmony_ci /* fetch secound map_value_ptr from the stack */ 12078c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_7, 0), 12088c2ecf20Sopenharmony_ci /* write into map value */ 12098c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12118c2ecf20Sopenharmony_ci 12128c2ecf20Sopenharmony_ci /* subprog 2 */ 12138c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12148c2ecf20Sopenharmony_ci /* lookup from map */ 12158c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12168c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12178c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12188c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 12198c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 12208c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12218c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 12228c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* return 0 */ 12238c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog */ 12248c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), 12268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), /* return 1 */ 12278c2ecf20Sopenharmony_ci }, 12288c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 12298c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 23 }, 12308c2ecf20Sopenharmony_ci .result = REJECT, 12318c2ecf20Sopenharmony_ci .errstr = "invalid read from stack R7 off=-16 size=8", 12328c2ecf20Sopenharmony_ci}, 12338c2ecf20Sopenharmony_ci{ 12348c2ecf20Sopenharmony_ci "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test1", 12358c2ecf20Sopenharmony_ci .insns = { 12368c2ecf20Sopenharmony_ci /* main prog */ 12378c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 12388c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 12398c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 12408c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12418c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 12428c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 12438c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 12448c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12458c2ecf20Sopenharmony_ci 12468c2ecf20Sopenharmony_ci /* subprog 1 */ 12478c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 12488c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 12498c2ecf20Sopenharmony_ci /* 1st lookup from map */ 12508c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 12518c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 12528c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12538c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 12548c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 12558c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12568c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 12578c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12588c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-8 */ 12598c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 12608c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 12618c2ecf20Sopenharmony_ci 12628c2ecf20Sopenharmony_ci /* 2nd lookup from map */ 12638c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 12648c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 12658c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 12668c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 12678c2ecf20Sopenharmony_ci BPF_FUNC_map_lookup_elem), 12688c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 12698c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), 12708c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 12718c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-16 */ 12728c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 12738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 12748c2ecf20Sopenharmony_ci 12758c2ecf20Sopenharmony_ci /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 12768c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 12778c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 12788c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 12798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 12808c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 12818c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12828c2ecf20Sopenharmony_ci 12838c2ecf20Sopenharmony_ci /* subprog 2 */ 12848c2ecf20Sopenharmony_ci /* if arg2 == 1 do *arg1 = 0 */ 12858c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 12868c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 12878c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 12888c2ecf20Sopenharmony_ci /* write into map value */ 12898c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 12908c2ecf20Sopenharmony_ci 12918c2ecf20Sopenharmony_ci /* if arg4 == 1 do *arg3 = 0 */ 12928c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 12938c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 12948c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 12958c2ecf20Sopenharmony_ci /* write into map value */ 12968c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 12978c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 12988c2ecf20Sopenharmony_ci }, 12998c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13008c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 12, 22 }, 13018c2ecf20Sopenharmony_ci .result = REJECT, 13028c2ecf20Sopenharmony_ci .errstr = "invalid access to map value, value_size=8 off=2 size=8", 13038c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 13048c2ecf20Sopenharmony_ci}, 13058c2ecf20Sopenharmony_ci{ 13068c2ecf20Sopenharmony_ci "calls: two calls that receive map_value via arg=ptr_stack_of_caller. test2", 13078c2ecf20Sopenharmony_ci .insns = { 13088c2ecf20Sopenharmony_ci /* main prog */ 13098c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 13108c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13118c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13128c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13138c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13148c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 13158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 13168c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci /* subprog 1 */ 13198c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13218c2ecf20Sopenharmony_ci /* 1st lookup from map */ 13228c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 13238c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13248c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13258c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 13268c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 13278c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13288c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 13298c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13308c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-8 */ 13318c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 13328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 13338c2ecf20Sopenharmony_ci 13348c2ecf20Sopenharmony_ci /* 2nd lookup from map */ 13358c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), /* 20 */ 13368c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 13378c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 13388c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, /* 24 */ 13398c2ecf20Sopenharmony_ci BPF_FUNC_map_lookup_elem), 13408c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13418c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), 13428c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 13438c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-16 */ 13448c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 13458c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 13468c2ecf20Sopenharmony_ci 13478c2ecf20Sopenharmony_ci /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 13488c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), /* 30 */ 13498c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 13508c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 13518c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 13528c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), /* 34 */ 13538c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13548c2ecf20Sopenharmony_ci 13558c2ecf20Sopenharmony_ci /* subprog 2 */ 13568c2ecf20Sopenharmony_ci /* if arg2 == 1 do *arg1 = 0 */ 13578c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 13588c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 13598c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 13608c2ecf20Sopenharmony_ci /* write into map value */ 13618c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13628c2ecf20Sopenharmony_ci 13638c2ecf20Sopenharmony_ci /* if arg4 == 1 do *arg3 = 0 */ 13648c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 13658c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 13668c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 13678c2ecf20Sopenharmony_ci /* write into map value */ 13688c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 13698c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13708c2ecf20Sopenharmony_ci }, 13718c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 13728c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 12, 22 }, 13738c2ecf20Sopenharmony_ci .result = ACCEPT, 13748c2ecf20Sopenharmony_ci}, 13758c2ecf20Sopenharmony_ci{ 13768c2ecf20Sopenharmony_ci "calls: two jumps that receive map_value via arg=ptr_stack_of_jumper. test3", 13778c2ecf20Sopenharmony_ci .insns = { 13788c2ecf20Sopenharmony_ci /* main prog */ 13798c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 13808c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 13818c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 13828c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13838c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 13848c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 2), 13858c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 13868c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_ci /* subprog 1 */ 13898c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 13908c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 13918c2ecf20Sopenharmony_ci /* 1st lookup from map */ 13928c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -24, 0), 13938c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 13948c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 13958c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 13968c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 13978c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 13988c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 13998c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 14008c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-8 */ 14018c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 14028c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 14038c2ecf20Sopenharmony_ci 14048c2ecf20Sopenharmony_ci /* 2nd lookup from map */ 14058c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 14068c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -24), 14078c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 14088c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 14098c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 14108c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), // 26 14118c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 2), 14128c2ecf20Sopenharmony_ci /* write map_value_ptr into stack frame of main prog at fp-16 */ 14138c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 14148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 14158c2ecf20Sopenharmony_ci 14168c2ecf20Sopenharmony_ci /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 14178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), // 30 14188c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 14198c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 14208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 14218c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, 1), // 34 14228c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -30), 14238c2ecf20Sopenharmony_ci 14248c2ecf20Sopenharmony_ci /* subprog 2 */ 14258c2ecf20Sopenharmony_ci /* if arg2 == 1 do *arg1 = 0 */ 14268c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 14278c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 14288c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 14298c2ecf20Sopenharmony_ci /* write into map value */ 14308c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 14318c2ecf20Sopenharmony_ci 14328c2ecf20Sopenharmony_ci /* if arg4 == 1 do *arg3 = 0 */ 14338c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 14348c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 14358c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 14368c2ecf20Sopenharmony_ci /* write into map value */ 14378c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 2, 0), 14388c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, -8), 14398c2ecf20Sopenharmony_ci }, 14408c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 14418c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 12, 22 }, 14428c2ecf20Sopenharmony_ci .result = REJECT, 14438c2ecf20Sopenharmony_ci .errstr = "invalid access to map value, value_size=8 off=2 size=8", 14448c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 14458c2ecf20Sopenharmony_ci}, 14468c2ecf20Sopenharmony_ci{ 14478c2ecf20Sopenharmony_ci "calls: two calls that receive map_value_ptr_or_null via arg. test1", 14488c2ecf20Sopenharmony_ci .insns = { 14498c2ecf20Sopenharmony_ci /* main prog */ 14508c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 14518c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 14528c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 14538c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 14548c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 14558c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 14568c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 14578c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 14588c2ecf20Sopenharmony_ci 14598c2ecf20Sopenharmony_ci /* subprog 1 */ 14608c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 14618c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 14628c2ecf20Sopenharmony_ci /* 1st lookup from map */ 14638c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 14648c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 14658c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 14668c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 14678c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 14688c2ecf20Sopenharmony_ci /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 14698c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 14708c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 14718c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 14728c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 14738c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci /* 2nd lookup from map */ 14768c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 14778c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 14788c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 14798c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 14808c2ecf20Sopenharmony_ci /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 14818c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 14828c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 14838c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), 14848c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 14858c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 14868c2ecf20Sopenharmony_ci 14878c2ecf20Sopenharmony_ci /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 14888c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 14898c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 14908c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 14918c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 14928c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 14938c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 14948c2ecf20Sopenharmony_ci 14958c2ecf20Sopenharmony_ci /* subprog 2 */ 14968c2ecf20Sopenharmony_ci /* if arg2 == 1 do *arg1 = 0 */ 14978c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 14988c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 14998c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 15008c2ecf20Sopenharmony_ci /* write into map value */ 15018c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci /* if arg4 == 1 do *arg3 = 0 */ 15048c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 1, 2), 15058c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 15068c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 15078c2ecf20Sopenharmony_ci /* write into map value */ 15088c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 15098c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 15108c2ecf20Sopenharmony_ci }, 15118c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15128c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 12, 22 }, 15138c2ecf20Sopenharmony_ci .result = ACCEPT, 15148c2ecf20Sopenharmony_ci}, 15158c2ecf20Sopenharmony_ci{ 15168c2ecf20Sopenharmony_ci "calls: two calls that receive map_value_ptr_or_null via arg. test2", 15178c2ecf20Sopenharmony_ci .insns = { 15188c2ecf20Sopenharmony_ci /* main prog */ 15198c2ecf20Sopenharmony_ci /* pass fp-16, fp-8 into a function */ 15208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_10), 15218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), 15228c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 15238c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -16), 15248c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 15258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 15268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 15278c2ecf20Sopenharmony_ci 15288c2ecf20Sopenharmony_ci /* subprog 1 */ 15298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 15308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_7, BPF_REG_2), 15318c2ecf20Sopenharmony_ci /* 1st lookup from map */ 15328c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 15338c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 15348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 15358c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 15368c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 15378c2ecf20Sopenharmony_ci /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 15388c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 15398c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 15408c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 15418c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15428c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 15438c2ecf20Sopenharmony_ci 15448c2ecf20Sopenharmony_ci /* 2nd lookup from map */ 15458c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 15468c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 15478c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 15488c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 15498c2ecf20Sopenharmony_ci /* write map_value_ptr_or_null into stack frame of main prog at fp-16 */ 15508c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), 15518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 2), 15528c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), 15538c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 1), 15548c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 15558c2ecf20Sopenharmony_ci 15568c2ecf20Sopenharmony_ci /* call 3rd func with fp-8, 0|1, fp-16, 0|1 */ 15578c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 15588c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_8), 15598c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_3, BPF_REG_7), 15608c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_9), 15618c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 15628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 15638c2ecf20Sopenharmony_ci 15648c2ecf20Sopenharmony_ci /* subprog 2 */ 15658c2ecf20Sopenharmony_ci /* if arg2 == 1 do *arg1 = 0 */ 15668c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 1, 2), 15678c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 15688c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_1, 0), 15698c2ecf20Sopenharmony_ci /* write into map value */ 15708c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 15718c2ecf20Sopenharmony_ci 15728c2ecf20Sopenharmony_ci /* if arg4 == 0 do *arg3 = 0 */ 15738c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_4, 0, 2), 15748c2ecf20Sopenharmony_ci /* fetch map_value_ptr from the stack of this function */ 15758c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_3, 0), 15768c2ecf20Sopenharmony_ci /* write into map value */ 15778c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_0, 0, 0), 15788c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 15798c2ecf20Sopenharmony_ci }, 15808c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 15818c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 12, 22 }, 15828c2ecf20Sopenharmony_ci .result = REJECT, 15838c2ecf20Sopenharmony_ci .errstr = "R0 invalid mem access 'inv'", 15848c2ecf20Sopenharmony_ci}, 15858c2ecf20Sopenharmony_ci{ 15868c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack", 15878c2ecf20Sopenharmony_ci .insns = { 15888c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 15898c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 15908c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 15918c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 15928c2ecf20Sopenharmony_ci 15938c2ecf20Sopenharmony_ci /* subprog 1 */ 15948c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 15958c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 15968c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 15978c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 15988c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 15998c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 16008c2ecf20Sopenharmony_ci /* spill unchecked pkt_ptr into stack of caller */ 16018c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 16028c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 16038c2ecf20Sopenharmony_ci /* now the pkt range is verified, read pkt_ptr from stack */ 16048c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 16058c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 16068c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 16078c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16088c2ecf20Sopenharmony_ci }, 16098c2ecf20Sopenharmony_ci .result = ACCEPT, 16108c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 16118c2ecf20Sopenharmony_ci .retval = POINTER_VALUE, 16128c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 16138c2ecf20Sopenharmony_ci}, 16148c2ecf20Sopenharmony_ci{ 16158c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 2", 16168c2ecf20Sopenharmony_ci .insns = { 16178c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 16188c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 16198c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 16208c2ecf20Sopenharmony_ci /* Marking is still kept, but not in all cases safe. */ 16218c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 16228c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 16238c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16248c2ecf20Sopenharmony_ci 16258c2ecf20Sopenharmony_ci /* subprog 1 */ 16268c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 16278c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 16288c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 16298c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 16308c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 16318c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 16328c2ecf20Sopenharmony_ci /* spill unchecked pkt_ptr into stack of caller */ 16338c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 16348c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 16358c2ecf20Sopenharmony_ci /* now the pkt range is verified, read pkt_ptr from stack */ 16368c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 16378c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 16388c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 16398c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16408c2ecf20Sopenharmony_ci }, 16418c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 16428c2ecf20Sopenharmony_ci .errstr = "invalid access to packet", 16438c2ecf20Sopenharmony_ci .result = REJECT, 16448c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 16458c2ecf20Sopenharmony_ci}, 16468c2ecf20Sopenharmony_ci{ 16478c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 3", 16488c2ecf20Sopenharmony_ci .insns = { 16498c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 16508c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 16518c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 16528c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 16538c2ecf20Sopenharmony_ci /* Marking is still kept and safe here. */ 16548c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 16558c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 16568c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16578c2ecf20Sopenharmony_ci 16588c2ecf20Sopenharmony_ci /* subprog 1 */ 16598c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 16608c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 16618c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 16628c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 16638c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 16648c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 16658c2ecf20Sopenharmony_ci /* spill unchecked pkt_ptr into stack of caller */ 16668c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 16678c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 16688c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 16698c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 16708c2ecf20Sopenharmony_ci /* now the pkt range is verified, read pkt_ptr from stack */ 16718c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_2, BPF_REG_4, 0), 16728c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 16738c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 16748c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 16758c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16768c2ecf20Sopenharmony_ci }, 16778c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 16788c2ecf20Sopenharmony_ci .result = ACCEPT, 16798c2ecf20Sopenharmony_ci .retval = 1, 16808c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 16818c2ecf20Sopenharmony_ci}, 16828c2ecf20Sopenharmony_ci{ 16838c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 4", 16848c2ecf20Sopenharmony_ci .insns = { 16858c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 16868c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 16878c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 16888c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2), 16898c2ecf20Sopenharmony_ci /* Check marking propagated. */ 16908c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 16918c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_4, 0, 0), 16928c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 16938c2ecf20Sopenharmony_ci 16948c2ecf20Sopenharmony_ci /* subprog 1 */ 16958c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 16968c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 16978c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 16988c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 16998c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 17008c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 17018c2ecf20Sopenharmony_ci /* spill unchecked pkt_ptr into stack of caller */ 17028c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 17038c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 17048c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 17058c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 17068c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 17078c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 17088c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 17098c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 17108c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17118c2ecf20Sopenharmony_ci }, 17128c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 17138c2ecf20Sopenharmony_ci .result = ACCEPT, 17148c2ecf20Sopenharmony_ci .retval = 1, 17158c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 17168c2ecf20Sopenharmony_ci}, 17178c2ecf20Sopenharmony_ci{ 17188c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 5", 17198c2ecf20Sopenharmony_ci .insns = { 17208c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 17218c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 17228c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_1, 0), 17238c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 17248c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 17258c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 17268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ci /* subprog 1 */ 17298c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 17308c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 17318c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 17328c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 17338c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 17348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 17358c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 17368c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 17378c2ecf20Sopenharmony_ci /* spill checked pkt_ptr into stack of caller */ 17388c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 17398c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 17408c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 17418c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 17428c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 17438c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 17448c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17458c2ecf20Sopenharmony_ci }, 17468c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 17478c2ecf20Sopenharmony_ci .errstr = "same insn cannot be used with different", 17488c2ecf20Sopenharmony_ci .result = REJECT, 17498c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 17508c2ecf20Sopenharmony_ci}, 17518c2ecf20Sopenharmony_ci{ 17528c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 6", 17538c2ecf20Sopenharmony_ci .insns = { 17548c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 17558c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 17568c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 17578c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 17588c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 17598c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 17608c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 17618c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 17628c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17638c2ecf20Sopenharmony_ci 17648c2ecf20Sopenharmony_ci /* subprog 1 */ 17658c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 17668c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 17678c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 17688c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 17698c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 17708c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 17718c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 17728c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 17738c2ecf20Sopenharmony_ci /* spill checked pkt_ptr into stack of caller */ 17748c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 17758c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 17768c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 17778c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 17788c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 17798c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 17808c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17818c2ecf20Sopenharmony_ci }, 17828c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 17838c2ecf20Sopenharmony_ci .errstr = "R4 invalid mem access", 17848c2ecf20Sopenharmony_ci .result = REJECT, 17858c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 17868c2ecf20Sopenharmony_ci}, 17878c2ecf20Sopenharmony_ci{ 17888c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 7", 17898c2ecf20Sopenharmony_ci .insns = { 17908c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 17918c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 17928c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 17938c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 17948c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 17958c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 17968c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 17978c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 17988c2ecf20Sopenharmony_ci 17998c2ecf20Sopenharmony_ci /* subprog 1 */ 18008c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 18018c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 18028c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 18038c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 18048c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 18058c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 18068c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 18078c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 18088c2ecf20Sopenharmony_ci /* spill checked pkt_ptr into stack of caller */ 18098c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 18108c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 18118c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 18128c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 18138c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 18148c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 18158c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18168c2ecf20Sopenharmony_ci }, 18178c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 18188c2ecf20Sopenharmony_ci .errstr = "R4 invalid mem access", 18198c2ecf20Sopenharmony_ci .result = REJECT, 18208c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 18218c2ecf20Sopenharmony_ci}, 18228c2ecf20Sopenharmony_ci{ 18238c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 8", 18248c2ecf20Sopenharmony_ci .insns = { 18258c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 18268c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 18278c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 18288c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 18298c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 18308c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 18318c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 18328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18338c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 18348c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 18358c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 18368c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 18378c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 18388c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 18398c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18408c2ecf20Sopenharmony_ci 18418c2ecf20Sopenharmony_ci /* subprog 1 */ 18428c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 18438c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 18448c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 18458c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 18468c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 18478c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 18488c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 18498c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 3), 18508c2ecf20Sopenharmony_ci /* spill checked pkt_ptr into stack of caller */ 18518c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 18528c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 18538c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 18548c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 18558c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 18568c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 18578c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18588c2ecf20Sopenharmony_ci }, 18598c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 18608c2ecf20Sopenharmony_ci .result = ACCEPT, 18618c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 18628c2ecf20Sopenharmony_ci}, 18638c2ecf20Sopenharmony_ci{ 18648c2ecf20Sopenharmony_ci "calls: pkt_ptr spill into caller stack 9", 18658c2ecf20Sopenharmony_ci .insns = { 18668c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 18678c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 18688c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 18698c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 18708c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 18718c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 18728c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JLE, BPF_REG_0, BPF_REG_3, 1), 18738c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18748c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_4, BPF_REG_10), 18758c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_4, -8), 18768c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 18778c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 3), 18788c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_4, BPF_REG_10, -8), 18798c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_4, 0), 18808c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18818c2ecf20Sopenharmony_ci 18828c2ecf20Sopenharmony_ci /* subprog 1 */ 18838c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, 18848c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data)), 18858c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1, 18868c2ecf20Sopenharmony_ci offsetof(struct __sk_buff, data_end)), 18878c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 18888c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 8), 18898c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 0), 18908c2ecf20Sopenharmony_ci /* spill unchecked pkt_ptr into stack of caller */ 18918c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_4, BPF_REG_2, 0), 18928c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JGT, BPF_REG_0, BPF_REG_3, 2), 18938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_5, 1), 18948c2ecf20Sopenharmony_ci /* don't read back pkt_ptr from stack here */ 18958c2ecf20Sopenharmony_ci /* write 4 bytes into packet */ 18968c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0), 18978c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_5), 18988c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 18998c2ecf20Sopenharmony_ci }, 19008c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SCHED_CLS, 19018c2ecf20Sopenharmony_ci .errstr = "invalid access to packet", 19028c2ecf20Sopenharmony_ci .result = REJECT, 19038c2ecf20Sopenharmony_ci .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS, 19048c2ecf20Sopenharmony_ci}, 19058c2ecf20Sopenharmony_ci{ 19068c2ecf20Sopenharmony_ci "calls: caller stack init to zero or map_value_or_null", 19078c2ecf20Sopenharmony_ci .insns = { 19088c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 19098c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 19108c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 19118c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 19128c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 19138c2ecf20Sopenharmony_ci /* fetch map_value_or_null or const_zero from stack */ 19148c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8), 19158c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 19168c2ecf20Sopenharmony_ci /* store into map_value */ 19178c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_W, BPF_REG_0, 0, 0), 19188c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 19198c2ecf20Sopenharmony_ci 19208c2ecf20Sopenharmony_ci /* subprog 1 */ 19218c2ecf20Sopenharmony_ci /* if (ctx == 0) return; */ 19228c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 8), 19238c2ecf20Sopenharmony_ci /* else bpf_map_lookup() and *(fp - 8) = r0 */ 19248c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_2), 19258c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 19268c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 19278c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 19288c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 19298c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 19308c2ecf20Sopenharmony_ci /* write map_value_ptr_or_null into stack frame of main prog at fp-8 */ 19318c2ecf20Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_6, BPF_REG_0, 0), 19328c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 19338c2ecf20Sopenharmony_ci }, 19348c2ecf20Sopenharmony_ci .fixup_map_hash_8b = { 13 }, 19358c2ecf20Sopenharmony_ci .result = ACCEPT, 19368c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 19378c2ecf20Sopenharmony_ci}, 19388c2ecf20Sopenharmony_ci{ 19398c2ecf20Sopenharmony_ci "calls: stack init to zero and pruning", 19408c2ecf20Sopenharmony_ci .insns = { 19418c2ecf20Sopenharmony_ci /* first make allocated_stack 16 byte */ 19428c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -16, 0), 19438c2ecf20Sopenharmony_ci /* now fork the execution such that the false branch 19448c2ecf20Sopenharmony_ci * of JGT insn will be verified second and it skisp zero 19458c2ecf20Sopenharmony_ci * init of fp-8 stack slot. If stack liveness marking 19468c2ecf20Sopenharmony_ci * is missing live_read marks from call map_lookup 19478c2ecf20Sopenharmony_ci * processing then pruning will incorrectly assume 19488c2ecf20Sopenharmony_ci * that fp-8 stack slot was unused in the fall-through 19498c2ecf20Sopenharmony_ci * branch and will accept the program incorrectly 19508c2ecf20Sopenharmony_ci */ 19518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JGT, BPF_REG_1, 2, 2), 19528c2ecf20Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 19538c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JA, 0, 0, 0), 19548c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 19558c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 19568c2ecf20Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_1, 0), 19578c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem), 19588c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 19598c2ecf20Sopenharmony_ci }, 19608c2ecf20Sopenharmony_ci .fixup_map_hash_48b = { 6 }, 19618c2ecf20Sopenharmony_ci .errstr = "invalid indirect read from stack R2 off -8+0 size 8", 19628c2ecf20Sopenharmony_ci .result = REJECT, 19638c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 19648c2ecf20Sopenharmony_ci}, 19658c2ecf20Sopenharmony_ci{ 19668c2ecf20Sopenharmony_ci "calls: ctx read at start of subprog", 19678c2ecf20Sopenharmony_ci .insns = { 19688c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_6, BPF_REG_1), 19698c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 5), 19708c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JSGT, BPF_REG_0, BPF_REG_0, 0), 19718c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_6), 19728c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 2), 19738c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 19748c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 19758c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 19768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 19778c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 19788c2ecf20Sopenharmony_ci }, 19798c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 19808c2ecf20Sopenharmony_ci .errstr_unpriv = "function calls to other bpf functions are allowed for", 19818c2ecf20Sopenharmony_ci .result_unpriv = REJECT, 19828c2ecf20Sopenharmony_ci .result = ACCEPT, 19838c2ecf20Sopenharmony_ci}, 19848c2ecf20Sopenharmony_ci{ 19858c2ecf20Sopenharmony_ci "calls: cross frame pruning", 19868c2ecf20Sopenharmony_ci .insns = { 19878c2ecf20Sopenharmony_ci /* r8 = !!random(); 19888c2ecf20Sopenharmony_ci * call pruner() 19898c2ecf20Sopenharmony_ci * if (r8) 19908c2ecf20Sopenharmony_ci * do something bad; 19918c2ecf20Sopenharmony_ci */ 19928c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 19938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 19948c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 19958c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 19968c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 19978c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 19988c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1), 19998c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_9, BPF_REG_1, 0), 20008c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 20018c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 20028c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 20038c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 20048c2ecf20Sopenharmony_ci }, 20058c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 20068c2ecf20Sopenharmony_ci .errstr_unpriv = "function calls to other bpf functions are allowed for", 20078c2ecf20Sopenharmony_ci .errstr = "!read_ok", 20088c2ecf20Sopenharmony_ci .result = REJECT, 20098c2ecf20Sopenharmony_ci}, 20108c2ecf20Sopenharmony_ci{ 20118c2ecf20Sopenharmony_ci "calls: cross frame pruning - liveness propagation", 20128c2ecf20Sopenharmony_ci .insns = { 20138c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 20148c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 0), 20158c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 20168c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_8, 1), 20178c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 20188c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 0), 20198c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1), 20208c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_9, 1), 20218c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_0), 20228c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 4), 20238c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_8, 1, 1), 20248c2ecf20Sopenharmony_ci BPF_LDX_MEM(BPF_B, BPF_REG_1, BPF_REG_2, 0), 20258c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 20268c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 20278c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 0, 0), 20288c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 20298c2ecf20Sopenharmony_ci }, 20308c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_SOCKET_FILTER, 20318c2ecf20Sopenharmony_ci .errstr_unpriv = "function calls to other bpf functions are allowed for", 20328c2ecf20Sopenharmony_ci .errstr = "!read_ok", 20338c2ecf20Sopenharmony_ci .result = REJECT, 20348c2ecf20Sopenharmony_ci}, 2035