xref: /openbmc/linux/tools/testing/selftests/bpf/verifier/basic_instr.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
140f2fbd5SJakub Kicinski {
240f2fbd5SJakub Kicinski 	"add+sub+mul",
340f2fbd5SJakub Kicinski 	.insns = {
440f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 1),
540f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, 2),
640f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_2, 3),
740f2fbd5SJakub Kicinski 	BPF_ALU64_REG(BPF_SUB, BPF_REG_1, BPF_REG_2),
840f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -1),
940f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_MUL, BPF_REG_1, 3),
1040f2fbd5SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_0, BPF_REG_1),
1140f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
1240f2fbd5SJakub Kicinski 	},
1340f2fbd5SJakub Kicinski 	.result = ACCEPT,
1440f2fbd5SJakub Kicinski 	.retval = -3,
1540f2fbd5SJakub Kicinski },
1640f2fbd5SJakub Kicinski {
1740f2fbd5SJakub Kicinski 	"xor32 zero extend check",
1840f2fbd5SJakub Kicinski 	.insns = {
1940f2fbd5SJakub Kicinski 	BPF_MOV32_IMM(BPF_REG_2, -1),
2040f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_2, 32),
2140f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_OR, BPF_REG_2, 0xffff),
2240f2fbd5SJakub Kicinski 	BPF_ALU32_REG(BPF_XOR, BPF_REG_2, BPF_REG_2),
2340f2fbd5SJakub Kicinski 	BPF_MOV32_IMM(BPF_REG_0, 2),
2440f2fbd5SJakub Kicinski 	BPF_JMP_IMM(BPF_JNE, BPF_REG_2, 0, 1),
2540f2fbd5SJakub Kicinski 	BPF_MOV32_IMM(BPF_REG_0, 1),
2640f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
2740f2fbd5SJakub Kicinski 	},
2840f2fbd5SJakub Kicinski 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
2940f2fbd5SJakub Kicinski 	.result = ACCEPT,
3040f2fbd5SJakub Kicinski 	.retval = 1,
3140f2fbd5SJakub Kicinski },
3240f2fbd5SJakub Kicinski {
3340f2fbd5SJakub Kicinski 	"arsh32 on imm",
3440f2fbd5SJakub Kicinski 	.insns = {
3540f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
3640f2fbd5SJakub Kicinski 	BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 5),
3740f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
3840f2fbd5SJakub Kicinski 	},
3940f2fbd5SJakub Kicinski 	.result = ACCEPT,
4040f2fbd5SJakub Kicinski 	.retval = 0,
4140f2fbd5SJakub Kicinski },
4240f2fbd5SJakub Kicinski {
4340f2fbd5SJakub Kicinski 	"arsh32 on imm 2",
4440f2fbd5SJakub Kicinski 	.insns = {
4540f2fbd5SJakub Kicinski 	BPF_LD_IMM64(BPF_REG_0, 0x1122334485667788),
4640f2fbd5SJakub Kicinski 	BPF_ALU32_IMM(BPF_ARSH, BPF_REG_0, 7),
4740f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
4840f2fbd5SJakub Kicinski 	},
4940f2fbd5SJakub Kicinski 	.result = ACCEPT,
5040f2fbd5SJakub Kicinski 	.retval = -16069393,
5140f2fbd5SJakub Kicinski },
5240f2fbd5SJakub Kicinski {
5340f2fbd5SJakub Kicinski 	"arsh32 on reg",
5440f2fbd5SJakub Kicinski 	.insns = {
5540f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
5640f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 5),
5740f2fbd5SJakub Kicinski 	BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
5840f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
5940f2fbd5SJakub Kicinski 	},
6040f2fbd5SJakub Kicinski 	.result = ACCEPT,
6140f2fbd5SJakub Kicinski 	.retval = 0,
6240f2fbd5SJakub Kicinski },
6340f2fbd5SJakub Kicinski {
6440f2fbd5SJakub Kicinski 	"arsh32 on reg 2",
6540f2fbd5SJakub Kicinski 	.insns = {
6640f2fbd5SJakub Kicinski 	BPF_LD_IMM64(BPF_REG_0, 0xffff55667788),
6740f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 15),
6840f2fbd5SJakub Kicinski 	BPF_ALU32_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
6940f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
7040f2fbd5SJakub Kicinski 	},
7140f2fbd5SJakub Kicinski 	.result = ACCEPT,
7240f2fbd5SJakub Kicinski 	.retval = 43724,
7340f2fbd5SJakub Kicinski },
7440f2fbd5SJakub Kicinski {
7540f2fbd5SJakub Kicinski 	"arsh64 on imm",
7640f2fbd5SJakub Kicinski 	.insns = {
7740f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
7840f2fbd5SJakub Kicinski 	BPF_ALU64_IMM(BPF_ARSH, BPF_REG_0, 5),
7940f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
8040f2fbd5SJakub Kicinski 	},
8140f2fbd5SJakub Kicinski 	.result = ACCEPT,
8240f2fbd5SJakub Kicinski },
8340f2fbd5SJakub Kicinski {
8440f2fbd5SJakub Kicinski 	"arsh64 on reg",
8540f2fbd5SJakub Kicinski 	.insns = {
8640f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 1),
8740f2fbd5SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_1, 5),
8840f2fbd5SJakub Kicinski 	BPF_ALU64_REG(BPF_ARSH, BPF_REG_0, BPF_REG_1),
8940f2fbd5SJakub Kicinski 	BPF_EXIT_INSN(),
9040f2fbd5SJakub Kicinski 	},
9140f2fbd5SJakub Kicinski 	.result = ACCEPT,
9240f2fbd5SJakub Kicinski },
9348729226SJakub Kicinski {
94ac8786c7SLuke Nelson 	"lsh64 by 0 imm",
95ac8786c7SLuke Nelson 	.insns = {
96ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
97ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 1),
98ac8786c7SLuke Nelson 	BPF_ALU64_IMM(BPF_LSH, BPF_REG_1, 0),
99ac8786c7SLuke Nelson 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
100ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
101ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
102ac8786c7SLuke Nelson 	},
103ac8786c7SLuke Nelson 	.result = ACCEPT,
104ac8786c7SLuke Nelson 	.retval = 1,
105ac8786c7SLuke Nelson },
106ac8786c7SLuke Nelson {
107ac8786c7SLuke Nelson 	"rsh64 by 0 imm",
108ac8786c7SLuke Nelson 	.insns = {
109ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
110ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
111ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
112ac8786c7SLuke Nelson 	BPF_ALU64_IMM(BPF_RSH, BPF_REG_1, 0),
113ac8786c7SLuke Nelson 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
114ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
115ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
116ac8786c7SLuke Nelson 	},
117ac8786c7SLuke Nelson 	.result = ACCEPT,
118ac8786c7SLuke Nelson 	.retval = 1,
119ac8786c7SLuke Nelson },
120ac8786c7SLuke Nelson {
121ac8786c7SLuke Nelson 	"arsh64 by 0 imm",
122ac8786c7SLuke Nelson 	.insns = {
123ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
124ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
125ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
126ac8786c7SLuke Nelson 	BPF_ALU64_IMM(BPF_ARSH, BPF_REG_1, 0),
127ac8786c7SLuke Nelson 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
128ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
129ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
130ac8786c7SLuke Nelson 	},
131ac8786c7SLuke Nelson 	.result = ACCEPT,
132ac8786c7SLuke Nelson 	.retval = 1,
133ac8786c7SLuke Nelson },
134ac8786c7SLuke Nelson {
135ac8786c7SLuke Nelson 	"lsh64 by 0 reg",
136ac8786c7SLuke Nelson 	.insns = {
137ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
138ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 1),
139ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_2, 0),
140ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_LSH, BPF_REG_1, BPF_REG_2),
141ac8786c7SLuke Nelson 	BPF_JMP_IMM(BPF_JEQ, BPF_REG_1, 1, 1),
142ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
143ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
144ac8786c7SLuke Nelson 	},
145ac8786c7SLuke Nelson 	.result = ACCEPT,
146ac8786c7SLuke Nelson 	.retval = 1,
147ac8786c7SLuke Nelson },
148ac8786c7SLuke Nelson {
149ac8786c7SLuke Nelson 	"rsh64 by 0 reg",
150ac8786c7SLuke Nelson 	.insns = {
151ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
152ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
153ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
154ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_3, 0),
155ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_RSH, BPF_REG_1, BPF_REG_3),
156ac8786c7SLuke Nelson 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
157ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
158ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
159ac8786c7SLuke Nelson 	},
160ac8786c7SLuke Nelson 	.result = ACCEPT,
161ac8786c7SLuke Nelson 	.retval = 1,
162ac8786c7SLuke Nelson },
163ac8786c7SLuke Nelson {
164ac8786c7SLuke Nelson 	"arsh64 by 0 reg",
165ac8786c7SLuke Nelson 	.insns = {
166ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_0, 1),
167ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_1, 0x100000000LL),
168ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_MOV, BPF_REG_2, BPF_REG_1),
169ac8786c7SLuke Nelson 	BPF_LD_IMM64(BPF_REG_3, 0),
170ac8786c7SLuke Nelson 	BPF_ALU64_REG(BPF_ARSH, BPF_REG_1, BPF_REG_3),
171ac8786c7SLuke Nelson 	BPF_JMP_REG(BPF_JEQ, BPF_REG_1, BPF_REG_2, 1),
172ac8786c7SLuke Nelson 	BPF_MOV64_IMM(BPF_REG_0, 2),
173ac8786c7SLuke Nelson 	BPF_EXIT_INSN(),
174ac8786c7SLuke Nelson 	},
175ac8786c7SLuke Nelson 	.result = ACCEPT,
176ac8786c7SLuke Nelson 	.retval = 1,
177ac8786c7SLuke Nelson },
178ac8786c7SLuke Nelson {
179*86180493SYonghong Song 	"invalid 64-bit BPF_END with BPF_TO_BE",
18048729226SJakub Kicinski 	.insns = {
18148729226SJakub Kicinski 	BPF_MOV32_IMM(BPF_REG_0, 0),
18248729226SJakub Kicinski 	{
183*86180493SYonghong Song 		.code  = BPF_ALU64 | BPF_END | BPF_TO_BE,
18448729226SJakub Kicinski 		.dst_reg = BPF_REG_0,
18548729226SJakub Kicinski 		.src_reg = 0,
18648729226SJakub Kicinski 		.off   = 0,
18748729226SJakub Kicinski 		.imm   = 32,
18848729226SJakub Kicinski 	},
18948729226SJakub Kicinski 	BPF_EXIT_INSN(),
19048729226SJakub Kicinski 	},
191*86180493SYonghong Song 	.errstr = "unknown opcode df",
19248729226SJakub Kicinski 	.result = REJECT,
19348729226SJakub Kicinski },
19448729226SJakub Kicinski {
19548729226SJakub Kicinski 	"mov64 src == dst",
19648729226SJakub Kicinski 	.insns = {
19748729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_2, 0),
19848729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_2),
19948729226SJakub Kicinski 	// Check bounds are OK
20048729226SJakub Kicinski 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
20148729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 0),
20248729226SJakub Kicinski 	BPF_EXIT_INSN(),
20348729226SJakub Kicinski 	},
20448729226SJakub Kicinski 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
20548729226SJakub Kicinski 	.result = ACCEPT,
20648729226SJakub Kicinski },
20748729226SJakub Kicinski {
20848729226SJakub Kicinski 	"mov64 src != dst",
20948729226SJakub Kicinski 	.insns = {
21048729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_3, 0),
21148729226SJakub Kicinski 	BPF_MOV64_REG(BPF_REG_2, BPF_REG_3),
21248729226SJakub Kicinski 	// Check bounds are OK
21348729226SJakub Kicinski 	BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_2),
21448729226SJakub Kicinski 	BPF_MOV64_IMM(BPF_REG_0, 0),
21548729226SJakub Kicinski 	BPF_EXIT_INSN(),
21648729226SJakub Kicinski 	},
21748729226SJakub Kicinski 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
21848729226SJakub Kicinski 	.result = ACCEPT,
21948729226SJakub Kicinski },
220