162306a36Sopenharmony_ci{ 262306a36Sopenharmony_ci "BPF_ATOMIC bounds propagation, mem->reg", 362306a36Sopenharmony_ci .insns = { 462306a36Sopenharmony_ci /* a = 0; */ 562306a36Sopenharmony_ci /* 662306a36Sopenharmony_ci * Note this is implemented with two separate instructions, 762306a36Sopenharmony_ci * where you might think one would suffice: 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0), 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * This is because BPF_ST_MEM doesn't seem to set the stack slot 1262306a36Sopenharmony_ci * type to 0 when storing an immediate. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_0, 0), 1562306a36Sopenharmony_ci BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8), 1662306a36Sopenharmony_ci /* b = atomic_fetch_add(&a, 1); */ 1762306a36Sopenharmony_ci BPF_MOV64_IMM(BPF_REG_1, 1), 1862306a36Sopenharmony_ci BPF_ATOMIC_OP(BPF_DW, BPF_ADD | BPF_FETCH, BPF_REG_10, BPF_REG_1, -8), 1962306a36Sopenharmony_ci /* Verifier should be able to tell that this infinite loop isn't reachable. */ 2062306a36Sopenharmony_ci /* if (b) while (true) continue; */ 2162306a36Sopenharmony_ci BPF_JMP_IMM(BPF_JNE, BPF_REG_1, 0, -1), 2262306a36Sopenharmony_ci BPF_EXIT_INSN(), 2362306a36Sopenharmony_ci }, 2462306a36Sopenharmony_ci .result = ACCEPT, 2562306a36Sopenharmony_ci .result_unpriv = REJECT, 2662306a36Sopenharmony_ci .errstr_unpriv = "back-edge", 2762306a36Sopenharmony_ci}, 28