162306a36Sopenharmony_ci{
262306a36Sopenharmony_ci	"atomic compare-and-exchange smoketest - 64bit",
362306a36Sopenharmony_ci	.insns = {
462306a36Sopenharmony_ci		/* val = 3; */
562306a36Sopenharmony_ci		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 3),
662306a36Sopenharmony_ci		/* old = atomic_cmpxchg(&val, 2, 4); */
762306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 4),
862306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 2),
962306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
1062306a36Sopenharmony_ci		/* if (old != 3) exit(2); */
1162306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
1262306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 2),
1362306a36Sopenharmony_ci		BPF_EXIT_INSN(),
1462306a36Sopenharmony_ci		/* if (val != 3) exit(3); */
1562306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
1662306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
1762306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 3),
1862306a36Sopenharmony_ci		BPF_EXIT_INSN(),
1962306a36Sopenharmony_ci		/* old = atomic_cmpxchg(&val, 3, 4); */
2062306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 4),
2162306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 3),
2262306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
2362306a36Sopenharmony_ci		/* if (old != 3) exit(4); */
2462306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
2562306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 4),
2662306a36Sopenharmony_ci		BPF_EXIT_INSN(),
2762306a36Sopenharmony_ci		/* if (val != 4) exit(5); */
2862306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
2962306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
3062306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 5),
3162306a36Sopenharmony_ci		BPF_EXIT_INSN(),
3262306a36Sopenharmony_ci		/* exit(0); */
3362306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
3462306a36Sopenharmony_ci		BPF_EXIT_INSN(),
3562306a36Sopenharmony_ci	},
3662306a36Sopenharmony_ci	.result = ACCEPT,
3762306a36Sopenharmony_ci},
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	"atomic compare-and-exchange smoketest - 32bit",
4062306a36Sopenharmony_ci	.insns = {
4162306a36Sopenharmony_ci		/* val = 3; */
4262306a36Sopenharmony_ci		BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 3),
4362306a36Sopenharmony_ci		/* old = atomic_cmpxchg(&val, 2, 4); */
4462306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_1, 4),
4562306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 2),
4662306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -4),
4762306a36Sopenharmony_ci		/* if (old != 3) exit(2); */
4862306a36Sopenharmony_ci		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
4962306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 2),
5062306a36Sopenharmony_ci		BPF_EXIT_INSN(),
5162306a36Sopenharmony_ci		/* if (val != 3) exit(3); */
5262306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
5362306a36Sopenharmony_ci		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
5462306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 3),
5562306a36Sopenharmony_ci		BPF_EXIT_INSN(),
5662306a36Sopenharmony_ci		/* old = atomic_cmpxchg(&val, 3, 4); */
5762306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_1, 4),
5862306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 3),
5962306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -4),
6062306a36Sopenharmony_ci		/* if (old != 3) exit(4); */
6162306a36Sopenharmony_ci		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 3, 2),
6262306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 4),
6362306a36Sopenharmony_ci		BPF_EXIT_INSN(),
6462306a36Sopenharmony_ci		/* if (val != 4) exit(5); */
6562306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
6662306a36Sopenharmony_ci		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
6762306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 5),
6862306a36Sopenharmony_ci		BPF_EXIT_INSN(),
6962306a36Sopenharmony_ci		/* exit(0); */
7062306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 0),
7162306a36Sopenharmony_ci		BPF_EXIT_INSN(),
7262306a36Sopenharmony_ci	},
7362306a36Sopenharmony_ci	.result = ACCEPT,
7462306a36Sopenharmony_ci},
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	"Can't use cmpxchg on uninit src reg",
7762306a36Sopenharmony_ci	.insns = {
7862306a36Sopenharmony_ci		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 3),
7962306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 3),
8062306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_2, -8),
8162306a36Sopenharmony_ci		BPF_EXIT_INSN(),
8262306a36Sopenharmony_ci	},
8362306a36Sopenharmony_ci	.result = REJECT,
8462306a36Sopenharmony_ci	.errstr = "!read_ok",
8562306a36Sopenharmony_ci},
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	"BPF_W cmpxchg should zero top 32 bits",
8862306a36Sopenharmony_ci	.insns = {
8962306a36Sopenharmony_ci		/* r0 = U64_MAX; */
9062306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
9162306a36Sopenharmony_ci		BPF_ALU64_IMM(BPF_SUB, BPF_REG_0, 1),
9262306a36Sopenharmony_ci		/* u64 val = r0; */
9362306a36Sopenharmony_ci		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
9462306a36Sopenharmony_ci		/* r0 = (u32)atomic_cmpxchg((u32 *)&val, r0, 1); */
9562306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_1, 1),
9662306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
9762306a36Sopenharmony_ci		/* r1 = 0x00000000FFFFFFFFull; */
9862306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 1),
9962306a36Sopenharmony_ci		BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 32),
10062306a36Sopenharmony_ci		BPF_ALU64_IMM(BPF_SUB, BPF_REG_1, 1),
10162306a36Sopenharmony_ci		/* if (r0 != r1) exit(1); */
10262306a36Sopenharmony_ci		BPF_JMP_REG(BPF_JEQ, BPF_REG_0, BPF_REG_1, 2),
10362306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 1),
10462306a36Sopenharmony_ci		BPF_EXIT_INSN(),
10562306a36Sopenharmony_ci		/* exit(0); */
10662306a36Sopenharmony_ci		BPF_MOV32_IMM(BPF_REG_0, 0),
10762306a36Sopenharmony_ci		BPF_EXIT_INSN(),
10862306a36Sopenharmony_ci	},
10962306a36Sopenharmony_ci	.result = ACCEPT,
11062306a36Sopenharmony_ci},
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	"Dest pointer in r0 - fail",
11362306a36Sopenharmony_ci	.insns = {
11462306a36Sopenharmony_ci		/* val = 0; */
11562306a36Sopenharmony_ci		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
11662306a36Sopenharmony_ci		/* r0 = &val */
11762306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
11862306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, 1); */
11962306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 1),
12062306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
12162306a36Sopenharmony_ci		/* if (r0 != 0) exit(1); */
12262306a36Sopenharmony_ci		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
12362306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 1),
12462306a36Sopenharmony_ci		BPF_EXIT_INSN(),
12562306a36Sopenharmony_ci		/* exit(0); */
12662306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
12762306a36Sopenharmony_ci		BPF_EXIT_INSN(),
12862306a36Sopenharmony_ci	},
12962306a36Sopenharmony_ci	.result = ACCEPT,
13062306a36Sopenharmony_ci	.result_unpriv = REJECT,
13162306a36Sopenharmony_ci	.errstr_unpriv = "R0 leaks addr into mem",
13262306a36Sopenharmony_ci},
13362306a36Sopenharmony_ci{
13462306a36Sopenharmony_ci	"Dest pointer in r0 - succeed",
13562306a36Sopenharmony_ci	.insns = {
13662306a36Sopenharmony_ci		/* r0 = &val */
13762306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
13862306a36Sopenharmony_ci		/* val = r0; */
13962306a36Sopenharmony_ci		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
14062306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, 0); */
14162306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_1, 0),
14262306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_1, -8),
14362306a36Sopenharmony_ci		/* r1 = *r0 */
14462306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
14562306a36Sopenharmony_ci		/* exit(0); */
14662306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
14762306a36Sopenharmony_ci		BPF_EXIT_INSN(),
14862306a36Sopenharmony_ci	},
14962306a36Sopenharmony_ci	.result = ACCEPT,
15062306a36Sopenharmony_ci	.result_unpriv = REJECT,
15162306a36Sopenharmony_ci	.errstr_unpriv = "R0 leaks addr into mem",
15262306a36Sopenharmony_ci},
15362306a36Sopenharmony_ci{
15462306a36Sopenharmony_ci	"Dest pointer in r0 - succeed, check 2",
15562306a36Sopenharmony_ci	.insns = {
15662306a36Sopenharmony_ci		/* r0 = &val */
15762306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
15862306a36Sopenharmony_ci		/* val = r0; */
15962306a36Sopenharmony_ci		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
16062306a36Sopenharmony_ci		/* r5 = &val */
16162306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_5, BPF_REG_10),
16262306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, r5); */
16362306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_DW, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
16462306a36Sopenharmony_ci		/* r1 = *r0 */
16562306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_DW, BPF_REG_1, BPF_REG_0, -8),
16662306a36Sopenharmony_ci		/* exit(0); */
16762306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
16862306a36Sopenharmony_ci		BPF_EXIT_INSN(),
16962306a36Sopenharmony_ci	},
17062306a36Sopenharmony_ci	.result = ACCEPT,
17162306a36Sopenharmony_ci	.result_unpriv = REJECT,
17262306a36Sopenharmony_ci	.errstr_unpriv = "R0 leaks addr into mem",
17362306a36Sopenharmony_ci},
17462306a36Sopenharmony_ci{
17562306a36Sopenharmony_ci	"Dest pointer in r0 - succeed, check 3",
17662306a36Sopenharmony_ci	.insns = {
17762306a36Sopenharmony_ci		/* r0 = &val */
17862306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_0, BPF_REG_10),
17962306a36Sopenharmony_ci		/* val = r0; */
18062306a36Sopenharmony_ci		BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
18162306a36Sopenharmony_ci		/* r5 = &val */
18262306a36Sopenharmony_ci		BPF_MOV64_REG(BPF_REG_5, BPF_REG_10),
18362306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, r5); */
18462306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
18562306a36Sopenharmony_ci		/* exit(0); */
18662306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
18762306a36Sopenharmony_ci		BPF_EXIT_INSN(),
18862306a36Sopenharmony_ci	},
18962306a36Sopenharmony_ci	.result = REJECT,
19062306a36Sopenharmony_ci	.errstr = "invalid size of register fill",
19162306a36Sopenharmony_ci	.errstr_unpriv = "R0 leaks addr into mem",
19262306a36Sopenharmony_ci},
19362306a36Sopenharmony_ci{
19462306a36Sopenharmony_ci	"Dest pointer in r0 - succeed, check 4",
19562306a36Sopenharmony_ci	.insns = {
19662306a36Sopenharmony_ci		/* r0 = &val */
19762306a36Sopenharmony_ci		BPF_MOV32_REG(BPF_REG_0, BPF_REG_10),
19862306a36Sopenharmony_ci		/* val = r0; */
19962306a36Sopenharmony_ci		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8),
20062306a36Sopenharmony_ci		/* r5 = &val */
20162306a36Sopenharmony_ci		BPF_MOV32_REG(BPF_REG_5, BPF_REG_10),
20262306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, r5); */
20362306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
20462306a36Sopenharmony_ci		/* r1 = *r10 */
20562306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_10, -8),
20662306a36Sopenharmony_ci		/* exit(0); */
20762306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
20862306a36Sopenharmony_ci		BPF_EXIT_INSN(),
20962306a36Sopenharmony_ci	},
21062306a36Sopenharmony_ci	.result = ACCEPT,
21162306a36Sopenharmony_ci	.result_unpriv = REJECT,
21262306a36Sopenharmony_ci	.errstr_unpriv = "R10 partial copy of pointer",
21362306a36Sopenharmony_ci},
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	"Dest pointer in r0 - succeed, check 5",
21662306a36Sopenharmony_ci	.insns = {
21762306a36Sopenharmony_ci		/* r0 = &val */
21862306a36Sopenharmony_ci		BPF_MOV32_REG(BPF_REG_0, BPF_REG_10),
21962306a36Sopenharmony_ci		/* val = r0; */
22062306a36Sopenharmony_ci		BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8),
22162306a36Sopenharmony_ci		/* r5 = &val */
22262306a36Sopenharmony_ci		BPF_MOV32_REG(BPF_REG_5, BPF_REG_10),
22362306a36Sopenharmony_ci		/* r0 = atomic_cmpxchg(&val, r0, r5); */
22462306a36Sopenharmony_ci		BPF_ATOMIC_OP(BPF_W, BPF_CMPXCHG, BPF_REG_10, BPF_REG_5, -8),
22562306a36Sopenharmony_ci		/* r1 = *r0 */
22662306a36Sopenharmony_ci		BPF_LDX_MEM(BPF_W, BPF_REG_1, BPF_REG_0, -8),
22762306a36Sopenharmony_ci		/* exit(0); */
22862306a36Sopenharmony_ci		BPF_MOV64_IMM(BPF_REG_0, 0),
22962306a36Sopenharmony_ci		BPF_EXIT_INSN(),
23062306a36Sopenharmony_ci	},
23162306a36Sopenharmony_ci	.result = REJECT,
23262306a36Sopenharmony_ci	.errstr = "R0 invalid mem access",
23362306a36Sopenharmony_ci	.errstr_unpriv = "R10 partial copy of pointer",
23462306a36Sopenharmony_ci	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
23562306a36Sopenharmony_ci},
236