162306a36Sopenharmony_ci{ 262306a36Sopenharmony_ci "atomic dw/fetch and address leakage of (map ptr & -1) via stack slot", 362306a36Sopenharmony_ci .insns = { 462306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, -1), 562306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_8, 0), 662306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_9, 0), 762306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 862306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 962306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_9, 0), 1062306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_2, BPF_REG_1, 0), 1162306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_2, 0), 1262306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 1362306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 1462306a36Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 1562306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 1662306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 1762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1862306a36Sopenharmony_ci BPF_EXIT_INSN(), 1962306a36Sopenharmony_ci }, 2062306a36Sopenharmony_ci .fixup_map_array_48b = { 2, 4 }, 2162306a36Sopenharmony_ci .result = ACCEPT, 2262306a36Sopenharmony_ci .result_unpriv = REJECT, 2362306a36Sopenharmony_ci .errstr_unpriv = "leaking pointer from stack off -8", 2462306a36Sopenharmony_ci}, 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci "atomic dw/fetch and address leakage of (map ptr & -1) via returned value", 2762306a36Sopenharmony_ci .insns = { 2862306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, -1), 2962306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_8, 0), 3062306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_9, 0), 3162306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 3262306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 3362306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_9, 0), 3462306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_AND | BPF_FETCH, BPF_REG_2, BPF_REG_1, 0), 3562306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_9, BPF_REG_1), 3662306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 3762306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 3862306a36Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 3962306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 4062306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 4162306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 4262306a36Sopenharmony_ci BPF_EXIT_INSN(), 4362306a36Sopenharmony_ci }, 4462306a36Sopenharmony_ci .fixup_map_array_48b = { 2, 4 }, 4562306a36Sopenharmony_ci .result = ACCEPT, 4662306a36Sopenharmony_ci .result_unpriv = REJECT, 4762306a36Sopenharmony_ci .errstr_unpriv = "leaking pointer from stack off -8", 4862306a36Sopenharmony_ci}, 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci "atomic w/fetch and address leakage of (map ptr & -1) via stack slot", 5162306a36Sopenharmony_ci .insns = { 5262306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, -1), 5362306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_8, 0), 5462306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_9, 0), 5562306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 5662306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 5762306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_9, 0), 5862306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_W, BPF_AND | BPF_FETCH, BPF_REG_2, BPF_REG_1, 0), 5962306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_2, 0), 6062306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 6162306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 6262306a36Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 6362306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 6462306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 6562306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 6662306a36Sopenharmony_ci BPF_EXIT_INSN(), 6762306a36Sopenharmony_ci }, 6862306a36Sopenharmony_ci .fixup_map_array_48b = { 2, 4 }, 6962306a36Sopenharmony_ci .result = REJECT, 7062306a36Sopenharmony_ci .errstr = "invalid size of register fill", 7162306a36Sopenharmony_ci}, 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci "atomic w/fetch and address leakage of (map ptr & -1) via returned value", 7462306a36Sopenharmony_ci .insns = { 7562306a36Sopenharmony_ci BPF_LD_IMM64(BPF_REG_1, -1), 7662306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_8, 0), 7762306a36Sopenharmony_ci BPF_LD_MAP_FD(BPF_REG_9, 0), 7862306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_2, BPF_REG_10), 7962306a36Sopenharmony_ci BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8), 8062306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_2, BPF_REG_9, 0), 8162306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_W, BPF_AND | BPF_FETCH, BPF_REG_2, BPF_REG_1, 0), 8262306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_9, BPF_REG_1), 8362306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_2, 0, 0), 8462306a36Sopenharmony_ci BPF_MOV64_REG(BPF_REG_1, BPF_REG_8), 8562306a36Sopenharmony_ci BPF_EMIT_CALL(BPF_FUNC_map_lookup_elem), 8662306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 1), 8762306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_0, BPF_REG_9, 0), 8862306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 8962306a36Sopenharmony_ci BPF_EXIT_INSN(), 9062306a36Sopenharmony_ci }, 9162306a36Sopenharmony_ci .fixup_map_array_48b = { 2, 4 }, 9262306a36Sopenharmony_ci .result = REJECT, 9362306a36Sopenharmony_ci .errstr = "invalid size of register fill", 9462306a36Sopenharmony_ci}, 9562306a36Sopenharmony_ci#define __ATOMIC_FETCH_OP_TEST(src_reg, dst_reg, operand1, op, operand2, expect) \ 9662306a36Sopenharmony_ci { \ 9762306a36Sopenharmony_ci "atomic fetch " #op ", src=" #dst_reg " dst=" #dst_reg, \ 9862306a36Sopenharmony_ci .insns = { \ 9962306a36Sopenharmony_ci /* u64 val = operan1; */ \ 10062306a36Sopenharmony_ci BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, operand1), \ 10162306a36Sopenharmony_ci /* u64 old = atomic_fetch_add(&val, operand2); */ \ 10262306a36Sopenharmony_ci BPF_MOV64_REG(dst_reg, BPF_REG_10), \ 10362306a36Sopenharmony_ci BPF_MOV64_IMM(src_reg, operand2), \ 10462306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, op, \ 10562306a36Sopenharmony_ci dst_reg, src_reg, -8), \ 10662306a36Sopenharmony_ci /* if (old != operand1) exit(1); */ \ 10762306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, src_reg, operand1, 2), \ 10862306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 1), \ 10962306a36Sopenharmony_ci BPF_EXIT_INSN(), \ 11062306a36Sopenharmony_ci /* if (val != result) exit (2); */ \ 11162306a36Sopenharmony_ci BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_10, -8), \ 11262306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, expect, 2), \ 11362306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 2), \ 11462306a36Sopenharmony_ci BPF_EXIT_INSN(), \ 11562306a36Sopenharmony_ci /* exit(0); */ \ 11662306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), \ 11762306a36Sopenharmony_ci BPF_EXIT_INSN(), \ 11862306a36Sopenharmony_ci }, \ 11962306a36Sopenharmony_ci .result = ACCEPT, \ 12062306a36Sopenharmony_ci } 12162306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_2, 1, BPF_ADD | BPF_FETCH, 2, 3), 12262306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_0, BPF_REG_1, 1, BPF_ADD | BPF_FETCH, 2, 3), 12362306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_0, 1, BPF_ADD | BPF_FETCH, 2, 3), 12462306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_2, BPF_REG_3, 1, BPF_ADD | BPF_FETCH, 2, 3), 12562306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_4, BPF_REG_5, 1, BPF_ADD | BPF_FETCH, 2, 3), 12662306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_9, BPF_REG_8, 1, BPF_ADD | BPF_FETCH, 2, 3), 12762306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_2, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 12862306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_0, BPF_REG_1, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 12962306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_0, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 13062306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_2, BPF_REG_3, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 13162306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_4, BPF_REG_5, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 13262306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_9, BPF_REG_8, 0x010, BPF_AND | BPF_FETCH, 0x011, 0x010), 13362306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_2, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13462306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_0, BPF_REG_1, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13562306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_0, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13662306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_2, BPF_REG_3, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13762306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_4, BPF_REG_5, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13862306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_9, BPF_REG_8, 0x010, BPF_OR | BPF_FETCH, 0x011, 0x011), 13962306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_2, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14062306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_0, BPF_REG_1, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14162306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_0, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14262306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_2, BPF_REG_3, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14362306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_4, BPF_REG_5, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14462306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_9, BPF_REG_8, 0x010, BPF_XOR | BPF_FETCH, 0x011, 0x001), 14562306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_2, 0x010, BPF_XCHG, 0x011, 0x011), 14662306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_0, BPF_REG_1, 0x010, BPF_XCHG, 0x011, 0x011), 14762306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_1, BPF_REG_0, 0x010, BPF_XCHG, 0x011, 0x011), 14862306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_2, BPF_REG_3, 0x010, BPF_XCHG, 0x011, 0x011), 14962306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_4, BPF_REG_5, 0x010, BPF_XCHG, 0x011, 0x011), 15062306a36Sopenharmony_ci__ATOMIC_FETCH_OP_TEST(BPF_REG_9, BPF_REG_8, 0x010, BPF_XCHG, 0x011, 0x011), 15162306a36Sopenharmony_ci#undef __ATOMIC_FETCH_OP_TEST 152