xref: /openbmc/linux/tools/testing/selftests/bpf/verifier/jset.c (revision 7fc38225363dd8f19e667ad7c77b63bc4a5c065d)
1 {
2 	"jset: functional",
3 	.insns = {
4 	BPF_DIRECT_PKT_R2,
5 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
6 
7 	/* reg, bit 63 or bit 0 set, taken */
8 	BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
9 	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
10 	BPF_EXIT_INSN(),
11 
12 	/* reg, bit 62, not taken */
13 	BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000),
14 	BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
15 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
16 	BPF_EXIT_INSN(),
17 
18 	/* imm, any bit set, taken */
19 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1),
20 	BPF_EXIT_INSN(),
21 
22 	/* imm, bit 31 set, taken */
23 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
24 	BPF_EXIT_INSN(),
25 
26 	/* all good - return r0 == 2 */
27 	BPF_MOV64_IMM(BPF_REG_0, 2),
28 	BPF_EXIT_INSN(),
29 	},
30 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
31 	.result = ACCEPT,
32 	.runs = 7,
33 	.retvals = {
34 		{ .retval = 2,
35 		  .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), }
36 		},
37 		{ .retval = 2,
38 		  .data64 = { (1ULL << 63) | (1U << 31), }
39 		},
40 		{ .retval = 2,
41 		  .data64 = { (1ULL << 31) | (1U << 0), }
42 		},
43 		{ .retval = 2,
44 		  .data64 = { (__u32)-1, }
45 		},
46 		{ .retval = 2,
47 		  .data64 = { ~0x4000000000000000ULL, }
48 		},
49 		{ .retval = 0,
50 		  .data64 = { 0, }
51 		},
52 		{ .retval = 0,
53 		  .data64 = { ~0ULL, }
54 		},
55 	},
56 },
57 {
58 	"jset: sign-extend",
59 	.insns = {
60 	BPF_DIRECT_PKT_R2,
61 	BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
62 
63 	BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
64 	BPF_EXIT_INSN(),
65 
66 	BPF_MOV64_IMM(BPF_REG_0, 2),
67 	BPF_EXIT_INSN(),
68 	},
69 	.prog_type = BPF_PROG_TYPE_SCHED_CLS,
70 	.result = ACCEPT,
71 	.retval = 2,
72 	.data = { 1, 0, 0, 0, 0, 0, 0, 1, },
73 },
74 {
75 	"jset: known const compare",
76 	.insns = {
77 	BPF_MOV64_IMM(BPF_REG_0, 1),
78 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
79 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
80 	BPF_EXIT_INSN(),
81 	},
82 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
83 	.retval_unpriv = 1,
84 	.result_unpriv = ACCEPT,
85 	.retval = 1,
86 	.result = ACCEPT,
87 },
88 {
89 	"jset: known const compare bad",
90 	.insns = {
91 	BPF_MOV64_IMM(BPF_REG_0, 0),
92 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
93 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
94 	BPF_EXIT_INSN(),
95 	},
96 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
97 	.errstr_unpriv = "!read_ok",
98 	.result_unpriv = REJECT,
99 	.errstr = "!read_ok",
100 	.result = REJECT,
101 },
102 {
103 	"jset: unknown const compare taken",
104 	.insns = {
105 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
106 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
107 	BPF_JMP_IMM(BPF_JA, 0, 0, 1),
108 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
109 	BPF_EXIT_INSN(),
110 	},
111 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
112 	.errstr_unpriv = "!read_ok",
113 	.result_unpriv = REJECT,
114 	.errstr = "!read_ok",
115 	.result = REJECT,
116 },
117 {
118 	"jset: unknown const compare not taken",
119 	.insns = {
120 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
121 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
122 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
123 	BPF_EXIT_INSN(),
124 	},
125 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
126 	.errstr_unpriv = "!read_ok",
127 	.result_unpriv = REJECT,
128 	.errstr = "!read_ok",
129 	.result = REJECT,
130 },
131 {
132 	"jset: half-known const compare",
133 	.insns = {
134 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
135 	BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2),
136 	BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1),
137 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
138 	BPF_MOV64_IMM(BPF_REG_0, 0),
139 	BPF_EXIT_INSN(),
140 	},
141 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
142 	.result_unpriv = ACCEPT,
143 	.result = ACCEPT,
144 },
145 {
146 	"jset: range",
147 	.insns = {
148 	BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
149 	BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
150 	BPF_MOV64_IMM(BPF_REG_0, 0),
151 	BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff),
152 	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3),
153 	BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1),
154 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
155 	BPF_EXIT_INSN(),
156 	BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1),
157 	BPF_EXIT_INSN(),
158 	BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1),
159 	BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
160 	BPF_EXIT_INSN(),
161 	},
162 	.prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
163 	.result_unpriv = ACCEPT,
164 	.result = ACCEPT,
165 },
166