root/tools/testing/selftests/bpf/verifier/atomic_invalid.c
#define __INVALID_ATOMIC_ACCESS_TEST(op)                                \
        {                                                               \
                "atomic " #op " access through non-pointer ",           \
                .insns = {                                              \
                        BPF_MOV64_IMM(BPF_REG_0, 1),                    \
                        BPF_MOV64_IMM(BPF_REG_1, 0),                    \
                        BPF_ATOMIC_OP(BPF_DW, op, BPF_REG_1, BPF_REG_0, -8), \
                        BPF_MOV64_IMM(BPF_REG_0, 0),                    \
                        BPF_EXIT_INSN(),                                \
                },                                                      \
                .result = REJECT,                                       \
                .errstr = "R1 invalid mem access 'scalar'"              \
        }
__INVALID_ATOMIC_ACCESS_TEST(BPF_ADD),
__INVALID_ATOMIC_ACCESS_TEST(BPF_ADD | BPF_FETCH),
__INVALID_ATOMIC_ACCESS_TEST(BPF_ADD),
__INVALID_ATOMIC_ACCESS_TEST(BPF_ADD | BPF_FETCH),
__INVALID_ATOMIC_ACCESS_TEST(BPF_AND),
__INVALID_ATOMIC_ACCESS_TEST(BPF_AND | BPF_FETCH),
__INVALID_ATOMIC_ACCESS_TEST(BPF_OR),
__INVALID_ATOMIC_ACCESS_TEST(BPF_OR | BPF_FETCH),
__INVALID_ATOMIC_ACCESS_TEST(BPF_XOR),
__INVALID_ATOMIC_ACCESS_TEST(BPF_XOR | BPF_FETCH),
__INVALID_ATOMIC_ACCESS_TEST(BPF_XCHG),
__INVALID_ATOMIC_ACCESS_TEST(BPF_CMPXCHG),