xref: /linux/tools/testing/selftests/bpf/verifier/atomic_xchg.c (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1*98d666d0SBrendan Jackman {
2*98d666d0SBrendan Jackman 	"atomic exchange smoketest - 64bit",
3*98d666d0SBrendan Jackman 	.insns = {
4*98d666d0SBrendan Jackman 		/* val = 3; */
5*98d666d0SBrendan Jackman 		BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 3),
6*98d666d0SBrendan Jackman 		/* old = atomic_xchg(&val, 4); */
7*98d666d0SBrendan Jackman 		BPF_MOV64_IMM(BPF_REG_1, 4),
8*98d666d0SBrendan Jackman 		BPF_ATOMIC_OP(BPF_DW, BPF_XCHG, BPF_REG_10, BPF_REG_1, -8),
9*98d666d0SBrendan Jackman 		/* if (old != 3) exit(1); */
10*98d666d0SBrendan Jackman 		BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 3, 2),
11*98d666d0SBrendan Jackman 		BPF_MOV64_IMM(BPF_REG_0, 1),
12*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
13*98d666d0SBrendan Jackman 		/* if (val != 4) exit(2); */
14*98d666d0SBrendan Jackman 		BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
15*98d666d0SBrendan Jackman 		BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
16*98d666d0SBrendan Jackman 		BPF_MOV64_IMM(BPF_REG_0, 2),
17*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
18*98d666d0SBrendan Jackman 		/* exit(0); */
19*98d666d0SBrendan Jackman 		BPF_MOV64_IMM(BPF_REG_0, 0),
20*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
21*98d666d0SBrendan Jackman 	},
22*98d666d0SBrendan Jackman 	.result = ACCEPT,
23*98d666d0SBrendan Jackman },
24*98d666d0SBrendan Jackman {
25*98d666d0SBrendan Jackman 	"atomic exchange smoketest - 32bit",
26*98d666d0SBrendan Jackman 	.insns = {
27*98d666d0SBrendan Jackman 		/* val = 3; */
28*98d666d0SBrendan Jackman 		BPF_ST_MEM(BPF_W, BPF_REG_10, -4, 3),
29*98d666d0SBrendan Jackman 		/* old = atomic_xchg(&val, 4); */
30*98d666d0SBrendan Jackman 		BPF_MOV32_IMM(BPF_REG_1, 4),
31*98d666d0SBrendan Jackman 		BPF_ATOMIC_OP(BPF_W, BPF_XCHG, BPF_REG_10, BPF_REG_1, -4),
32*98d666d0SBrendan Jackman 		/* if (old != 3) exit(1); */
33*98d666d0SBrendan Jackman 		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_1, 3, 2),
34*98d666d0SBrendan Jackman 		BPF_MOV32_IMM(BPF_REG_0, 1),
35*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
36*98d666d0SBrendan Jackman 		/* if (val != 4) exit(2); */
37*98d666d0SBrendan Jackman 		BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -4),
38*98d666d0SBrendan Jackman 		BPF_JMP32_IMM(BPF_JEQ, BPF_REG_0, 4, 2),
39*98d666d0SBrendan Jackman 		BPF_MOV32_IMM(BPF_REG_0, 2),
40*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
41*98d666d0SBrendan Jackman 		/* exit(0); */
42*98d666d0SBrendan Jackman 		BPF_MOV32_IMM(BPF_REG_0, 0),
43*98d666d0SBrendan Jackman 		BPF_EXIT_INSN(),
44*98d666d0SBrendan Jackman 	},
45*98d666d0SBrendan Jackman 	.result = ACCEPT,
46*98d666d0SBrendan Jackman },
47