18c2ecf20Sopenharmony_ci{ 28c2ecf20Sopenharmony_ci "bounded loop, count to 4", 38c2ecf20Sopenharmony_ci .insns = { 48c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 58c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 68c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -2), 78c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 88c2ecf20Sopenharmony_ci }, 98c2ecf20Sopenharmony_ci .result = ACCEPT, 108c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 118c2ecf20Sopenharmony_ci .retval = 4, 128c2ecf20Sopenharmony_ci}, 138c2ecf20Sopenharmony_ci{ 148c2ecf20Sopenharmony_ci "bounded loop, count to 20", 158c2ecf20Sopenharmony_ci .insns = { 168c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 178c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 3), 188c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 20, -2), 198c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 208c2ecf20Sopenharmony_ci }, 218c2ecf20Sopenharmony_ci .result = ACCEPT, 228c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 238c2ecf20Sopenharmony_ci}, 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci "bounded loop, count from positive unknown to 4", 268c2ecf20Sopenharmony_ci .insns = { 278c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 288c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JSLT, BPF_REG_0, 0, 2), 298c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 308c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -2), 318c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 328c2ecf20Sopenharmony_ci }, 338c2ecf20Sopenharmony_ci .result = ACCEPT, 348c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 358c2ecf20Sopenharmony_ci .retval = 4, 368c2ecf20Sopenharmony_ci}, 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci "bounded loop, count from totally unknown to 4", 398c2ecf20Sopenharmony_ci .insns = { 408c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 418c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 428c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -2), 438c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 448c2ecf20Sopenharmony_ci }, 458c2ecf20Sopenharmony_ci .result = ACCEPT, 468c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 478c2ecf20Sopenharmony_ci}, 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci "bounded loop, count to 4 with equality", 508c2ecf20Sopenharmony_ci .insns = { 518c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 528c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 538c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 4, -2), 548c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 558c2ecf20Sopenharmony_ci }, 568c2ecf20Sopenharmony_ci .result = ACCEPT, 578c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 588c2ecf20Sopenharmony_ci}, 598c2ecf20Sopenharmony_ci{ 608c2ecf20Sopenharmony_ci "bounded loop, start in the middle", 618c2ecf20Sopenharmony_ci .insns = { 628c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 638c2ecf20Sopenharmony_ci BPF_JMP_A(1), 648c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 658c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -2), 668c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 678c2ecf20Sopenharmony_ci }, 688c2ecf20Sopenharmony_ci .result = REJECT, 698c2ecf20Sopenharmony_ci .errstr = "back-edge", 708c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 718c2ecf20Sopenharmony_ci .retval = 4, 728c2ecf20Sopenharmony_ci}, 738c2ecf20Sopenharmony_ci{ 748c2ecf20Sopenharmony_ci "bounded loop containing a forward jump", 758c2ecf20Sopenharmony_ci .insns = { 768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 778c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 788c2ecf20Sopenharmony_ci BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_0, 0), 798c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -3), 808c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 818c2ecf20Sopenharmony_ci }, 828c2ecf20Sopenharmony_ci .result = ACCEPT, 838c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 848c2ecf20Sopenharmony_ci .retval = 4, 858c2ecf20Sopenharmony_ci}, 868c2ecf20Sopenharmony_ci{ 878c2ecf20Sopenharmony_ci "bounded loop that jumps out rather than in", 888c2ecf20Sopenharmony_ci .insns = { 898c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_6, 0), 908c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_6, 1), 918c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JGT, BPF_REG_6, 10000, 2), 928c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32), 938c2ecf20Sopenharmony_ci BPF_JMP_A(-4), 948c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 958c2ecf20Sopenharmony_ci }, 968c2ecf20Sopenharmony_ci .result = ACCEPT, 978c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 988c2ecf20Sopenharmony_ci}, 998c2ecf20Sopenharmony_ci{ 1008c2ecf20Sopenharmony_ci "infinite loop after a conditional jump", 1018c2ecf20Sopenharmony_ci .insns = { 1028c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 5), 1038c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, 2), 1048c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 1058c2ecf20Sopenharmony_ci BPF_JMP_A(-2), 1068c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1078c2ecf20Sopenharmony_ci }, 1088c2ecf20Sopenharmony_ci .result = REJECT, 1098c2ecf20Sopenharmony_ci .errstr = "program is too large", 1108c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1118c2ecf20Sopenharmony_ci}, 1128c2ecf20Sopenharmony_ci{ 1138c2ecf20Sopenharmony_ci "bounded recursion", 1148c2ecf20Sopenharmony_ci .insns = { 1158c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 0), 1168c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 1178c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1188c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 1), 1198c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_1), 1208c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 4, 1), 1218c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1228c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, -5), 1238c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1248c2ecf20Sopenharmony_ci }, 1258c2ecf20Sopenharmony_ci .result = REJECT, 1268c2ecf20Sopenharmony_ci .errstr = "back-edge", 1278c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1288c2ecf20Sopenharmony_ci}, 1298c2ecf20Sopenharmony_ci{ 1308c2ecf20Sopenharmony_ci "infinite loop in two jumps", 1318c2ecf20Sopenharmony_ci .insns = { 1328c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1338c2ecf20Sopenharmony_ci BPF_JMP_A(0), 1348c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 4, -2), 1358c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1368c2ecf20Sopenharmony_ci }, 1378c2ecf20Sopenharmony_ci .result = REJECT, 1388c2ecf20Sopenharmony_ci .errstr = "loop detected", 1398c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1408c2ecf20Sopenharmony_ci}, 1418c2ecf20Sopenharmony_ci{ 1428c2ecf20Sopenharmony_ci "infinite loop: three-jump trick", 1438c2ecf20Sopenharmony_ci .insns = { 1448c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1458c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 1468c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 1478c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 2, 1), 1488c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1498c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 1508c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 1518c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 2, 1), 1528c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1538c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_0, 1), 1548c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 1), 1558c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JLT, BPF_REG_0, 2, -11), 1568c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1578c2ecf20Sopenharmony_ci }, 1588c2ecf20Sopenharmony_ci .result = REJECT, 1598c2ecf20Sopenharmony_ci .errstr = "loop detected", 1608c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_TRACEPOINT, 1618c2ecf20Sopenharmony_ci}, 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci "not-taken loop with back jump to 1st insn", 1648c2ecf20Sopenharmony_ci .insns = { 1658c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 123), 1668c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 4, -2), 1678c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1688c2ecf20Sopenharmony_ci }, 1698c2ecf20Sopenharmony_ci .result = ACCEPT, 1708c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 1718c2ecf20Sopenharmony_ci .retval = 123, 1728c2ecf20Sopenharmony_ci}, 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ci "taken loop with back jump to 1st insn", 1758c2ecf20Sopenharmony_ci .insns = { 1768c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 10), 1778c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 1788c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 1798c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1808c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 1818c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 1828c2ecf20Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, -3), 1838c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 1848c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1858c2ecf20Sopenharmony_ci }, 1868c2ecf20Sopenharmony_ci .result = ACCEPT, 1878c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 1888c2ecf20Sopenharmony_ci .retval = 55, 1898c2ecf20Sopenharmony_ci}, 1908c2ecf20Sopenharmony_ci{ 1918c2ecf20Sopenharmony_ci "taken loop with back jump to 1st insn, 2", 1928c2ecf20Sopenharmony_ci .insns = { 1938c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 10), 1948c2ecf20Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_2, 0), 1958c2ecf20Sopenharmony_ci BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 1, 0, 1), 1968c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 1978c2ecf20Sopenharmony_ci BPF_ALU64_REG(BPF_ADD, BPF_REG_2, BPF_REG_1), 1988c2ecf20Sopenharmony_ci BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1), 1998c2ecf20Sopenharmony_ci BPF_JMP32_IMM(BPF_JNE, BPF_REG_1, 0, -3), 2008c2ecf20Sopenharmony_ci BPF_MOV64_REG(BPF_REG_0, BPF_REG_2), 2018c2ecf20Sopenharmony_ci BPF_EXIT_INSN(), 2028c2ecf20Sopenharmony_ci }, 2038c2ecf20Sopenharmony_ci .result = ACCEPT, 2048c2ecf20Sopenharmony_ci .prog_type = BPF_PROG_TYPE_XDP, 2058c2ecf20Sopenharmony_ci .retval = 55, 2068c2ecf20Sopenharmony_ci}, 207