1 {
2 	"xadd/w check unaligned stack",
3 	.insns = {
4 	BPF_MOV64_IMM(BPF_REG_0, 1),
5 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
6 	BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -7),
7 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
8 	BPF_EXIT_INSN(),
9 	},
10 	.result = REJECT,
11 	.errstr = "misaligned stack access off",
12 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
13 },
14 {
15 	"xadd/w check unaligned map",
16 	.insns = {
17 	BPF_ST_MEM(BPF_DW, BPF_REG_10, -8, 0),
18 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
19 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -8),
20 	BPF_LD_MAP_FD(BPF_REG_1, 0),
21 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
22 	BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 0, 1),
23 	BPF_EXIT_INSN(),
24 	BPF_MOV64_IMM(BPF_REG_1, 1),
25 	BPF_STX_XADD(BPF_W, BPF_REG_0, BPF_REG_1, 3),
26 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_0, 3),
27 	BPF_EXIT_INSN(),
28 	},
29 	.fixup_map_hash_8b = { 3 },
30 	.result = REJECT,
31 	.errstr = "misaligned value access off",
32 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
33 },
34 {
35 	"xadd/w check unaligned pkt",
36 	.insns = {
37 	BPF_LDX_MEM(BPF_W, BPF_REG_2, BPF_REG_1, offsetof(struct xdp_md, data)),
38 	BPF_LDX_MEM(BPF_W, BPF_REG_3, BPF_REG_1,
39 		    offsetof(struct xdp_md, data_end)),
40 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_2),
41 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 8),
42 	BPF_JMP_REG(BPF_JLT, BPF_REG_1, BPF_REG_3, 2),
43 	BPF_MOV64_IMM(BPF_REG_0, 99),
44 	BPF_JMP_IMM(BPF_JA, 0, 0, 6),
45 	BPF_MOV64_IMM(BPF_REG_0, 1),
46 	BPF_ST_MEM(BPF_W, BPF_REG_2, 0, 0),
47 	BPF_ST_MEM(BPF_W, BPF_REG_2, 3, 0),
48 	BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 1),
49 	BPF_STX_XADD(BPF_W, BPF_REG_2, BPF_REG_0, 2),
50 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_2, 1),
51 	BPF_EXIT_INSN(),
52 	},
53 	.result = REJECT,
54 	.errstr = "BPF_XADD stores into R2 pkt is not allowed",
55 	.prog_type = BPF_PROG_TYPE_XDP,
56 	.flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
57 },
58 {
59 	"xadd/w check whether src/dst got mangled, 1",
60 	.insns = {
61 	BPF_MOV64_IMM(BPF_REG_0, 1),
62 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
63 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
64 	BPF_STX_MEM(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
65 	BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
66 	BPF_STX_XADD(BPF_DW, BPF_REG_10, BPF_REG_0, -8),
67 	BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3),
68 	BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2),
69 	BPF_LDX_MEM(BPF_DW, BPF_REG_0, BPF_REG_10, -8),
70 	BPF_EXIT_INSN(),
71 	BPF_MOV64_IMM(BPF_REG_0, 42),
72 	BPF_EXIT_INSN(),
73 	},
74 	.result = ACCEPT,
75 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
76 	.retval = 3,
77 },
78 {
79 	"xadd/w check whether src/dst got mangled, 2",
80 	.insns = {
81 	BPF_MOV64_IMM(BPF_REG_0, 1),
82 	BPF_MOV64_REG(BPF_REG_6, BPF_REG_0),
83 	BPF_MOV64_REG(BPF_REG_7, BPF_REG_10),
84 	BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -8),
85 	BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8),
86 	BPF_STX_XADD(BPF_W, BPF_REG_10, BPF_REG_0, -8),
87 	BPF_JMP_REG(BPF_JNE, BPF_REG_6, BPF_REG_0, 3),
88 	BPF_JMP_REG(BPF_JNE, BPF_REG_7, BPF_REG_10, 2),
89 	BPF_LDX_MEM(BPF_W, BPF_REG_0, BPF_REG_10, -8),
90 	BPF_EXIT_INSN(),
91 	BPF_MOV64_IMM(BPF_REG_0, 42),
92 	BPF_EXIT_INSN(),
93 	},
94 	.result = ACCEPT,
95 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
96 	.retval = 3,
97 },
98