1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Converted from tools/testing/selftests/bpf/verifier/helper_restricted.c */ |
3 | |
4 | #include <linux/bpf.h> |
5 | #include <bpf/bpf_helpers.h> |
6 | #include "bpf_misc.h" |
7 | |
8 | struct val { |
9 | int cnt; |
10 | struct bpf_spin_lock l; |
11 | }; |
12 | |
13 | struct { |
14 | __uint(type, BPF_MAP_TYPE_ARRAY); |
15 | __uint(max_entries, 1); |
16 | __type(key, int); |
17 | __type(value, struct val); |
18 | } map_spin_lock SEC(".maps" ); |
19 | |
20 | struct timer { |
21 | struct bpf_timer t; |
22 | }; |
23 | |
24 | struct { |
25 | __uint(type, BPF_MAP_TYPE_ARRAY); |
26 | __uint(max_entries, 1); |
27 | __type(key, int); |
28 | __type(value, struct timer); |
29 | } map_timer SEC(".maps" ); |
30 | |
31 | SEC("kprobe" ) |
32 | __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_KPROBE" ) |
33 | __failure __msg("unknown func bpf_ktime_get_coarse_ns" ) |
34 | __naked void in_bpf_prog_type_kprobe_1(void) |
35 | { |
36 | asm volatile (" \ |
37 | call %[bpf_ktime_get_coarse_ns]; \ |
38 | r0 = 0; \ |
39 | exit; \ |
40 | " : |
41 | : __imm(bpf_ktime_get_coarse_ns) |
42 | : __clobber_all); |
43 | } |
44 | |
45 | SEC("tracepoint" ) |
46 | __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_TRACEPOINT" ) |
47 | __failure __msg("unknown func bpf_ktime_get_coarse_ns" ) |
48 | __naked void in_bpf_prog_type_tracepoint_1(void) |
49 | { |
50 | asm volatile (" \ |
51 | call %[bpf_ktime_get_coarse_ns]; \ |
52 | r0 = 0; \ |
53 | exit; \ |
54 | " : |
55 | : __imm(bpf_ktime_get_coarse_ns) |
56 | : __clobber_all); |
57 | } |
58 | |
59 | SEC("perf_event" ) |
60 | __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_PERF_EVENT" ) |
61 | __failure __msg("unknown func bpf_ktime_get_coarse_ns" ) |
62 | __naked void bpf_prog_type_perf_event_1(void) |
63 | { |
64 | asm volatile (" \ |
65 | call %[bpf_ktime_get_coarse_ns]; \ |
66 | r0 = 0; \ |
67 | exit; \ |
68 | " : |
69 | : __imm(bpf_ktime_get_coarse_ns) |
70 | : __clobber_all); |
71 | } |
72 | |
73 | SEC("raw_tracepoint" ) |
74 | __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_RAW_TRACEPOINT" ) |
75 | __failure __msg("unknown func bpf_ktime_get_coarse_ns" ) |
76 | __naked void bpf_prog_type_raw_tracepoint_1(void) |
77 | { |
78 | asm volatile (" \ |
79 | call %[bpf_ktime_get_coarse_ns]; \ |
80 | r0 = 0; \ |
81 | exit; \ |
82 | " : |
83 | : __imm(bpf_ktime_get_coarse_ns) |
84 | : __clobber_all); |
85 | } |
86 | |
87 | SEC("kprobe" ) |
88 | __description("bpf_timer_init isn restricted in BPF_PROG_TYPE_KPROBE" ) |
89 | __failure __msg("tracing progs cannot use bpf_timer yet" ) |
90 | __naked void in_bpf_prog_type_kprobe_2(void) |
91 | { |
92 | asm volatile (" \ |
93 | r2 = r10; \ |
94 | r2 += -8; \ |
95 | r1 = 0; \ |
96 | *(u64*)(r2 + 0) = r1; \ |
97 | r1 = %[map_timer] ll; \ |
98 | call %[bpf_map_lookup_elem]; \ |
99 | if r0 == 0 goto l0_%=; \ |
100 | r1 = r0; \ |
101 | r2 = %[map_timer] ll; \ |
102 | r3 = 1; \ |
103 | l0_%=: call %[bpf_timer_init]; \ |
104 | exit; \ |
105 | " : |
106 | : __imm(bpf_map_lookup_elem), |
107 | __imm(bpf_timer_init), |
108 | __imm_addr(map_timer) |
109 | : __clobber_all); |
110 | } |
111 | |
112 | SEC("perf_event" ) |
113 | __description("bpf_timer_init is forbidden in BPF_PROG_TYPE_PERF_EVENT" ) |
114 | __failure __msg("tracing progs cannot use bpf_timer yet" ) |
115 | __naked void bpf_prog_type_perf_event_2(void) |
116 | { |
117 | asm volatile (" \ |
118 | r2 = r10; \ |
119 | r2 += -8; \ |
120 | r1 = 0; \ |
121 | *(u64*)(r2 + 0) = r1; \ |
122 | r1 = %[map_timer] ll; \ |
123 | call %[bpf_map_lookup_elem]; \ |
124 | if r0 == 0 goto l0_%=; \ |
125 | r1 = r0; \ |
126 | r2 = %[map_timer] ll; \ |
127 | r3 = 1; \ |
128 | l0_%=: call %[bpf_timer_init]; \ |
129 | exit; \ |
130 | " : |
131 | : __imm(bpf_map_lookup_elem), |
132 | __imm(bpf_timer_init), |
133 | __imm_addr(map_timer) |
134 | : __clobber_all); |
135 | } |
136 | |
137 | SEC("tracepoint" ) |
138 | __description("bpf_timer_init is forbidden in BPF_PROG_TYPE_TRACEPOINT" ) |
139 | __failure __msg("tracing progs cannot use bpf_timer yet" ) |
140 | __naked void in_bpf_prog_type_tracepoint_2(void) |
141 | { |
142 | asm volatile (" \ |
143 | r2 = r10; \ |
144 | r2 += -8; \ |
145 | r1 = 0; \ |
146 | *(u64*)(r2 + 0) = r1; \ |
147 | r1 = %[map_timer] ll; \ |
148 | call %[bpf_map_lookup_elem]; \ |
149 | if r0 == 0 goto l0_%=; \ |
150 | r1 = r0; \ |
151 | r2 = %[map_timer] ll; \ |
152 | r3 = 1; \ |
153 | l0_%=: call %[bpf_timer_init]; \ |
154 | exit; \ |
155 | " : |
156 | : __imm(bpf_map_lookup_elem), |
157 | __imm(bpf_timer_init), |
158 | __imm_addr(map_timer) |
159 | : __clobber_all); |
160 | } |
161 | |
162 | SEC("raw_tracepoint" ) |
163 | __description("bpf_timer_init is forbidden in BPF_PROG_TYPE_RAW_TRACEPOINT" ) |
164 | __failure __msg("tracing progs cannot use bpf_timer yet" ) |
165 | __naked void bpf_prog_type_raw_tracepoint_2(void) |
166 | { |
167 | asm volatile (" \ |
168 | r2 = r10; \ |
169 | r2 += -8; \ |
170 | r1 = 0; \ |
171 | *(u64*)(r2 + 0) = r1; \ |
172 | r1 = %[map_timer] ll; \ |
173 | call %[bpf_map_lookup_elem]; \ |
174 | if r0 == 0 goto l0_%=; \ |
175 | r1 = r0; \ |
176 | r2 = %[map_timer] ll; \ |
177 | r3 = 1; \ |
178 | l0_%=: call %[bpf_timer_init]; \ |
179 | exit; \ |
180 | " : |
181 | : __imm(bpf_map_lookup_elem), |
182 | __imm(bpf_timer_init), |
183 | __imm_addr(map_timer) |
184 | : __clobber_all); |
185 | } |
186 | |
187 | SEC("kprobe" ) |
188 | __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_KPROBE" ) |
189 | __failure __msg("tracing progs cannot use bpf_spin_lock yet" ) |
190 | __naked void in_bpf_prog_type_kprobe_3(void) |
191 | { |
192 | asm volatile (" \ |
193 | r2 = r10; \ |
194 | r2 += -8; \ |
195 | r1 = 0; \ |
196 | *(u64*)(r2 + 0) = r1; \ |
197 | r1 = %[map_spin_lock] ll; \ |
198 | call %[bpf_map_lookup_elem]; \ |
199 | if r0 == 0 goto l0_%=; \ |
200 | r1 = r0; \ |
201 | call %[bpf_spin_lock]; \ |
202 | l0_%=: exit; \ |
203 | " : |
204 | : __imm(bpf_map_lookup_elem), |
205 | __imm(bpf_spin_lock), |
206 | __imm_addr(map_spin_lock) |
207 | : __clobber_all); |
208 | } |
209 | |
210 | SEC("tracepoint" ) |
211 | __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_TRACEPOINT" ) |
212 | __failure __msg("tracing progs cannot use bpf_spin_lock yet" ) |
213 | __naked void in_bpf_prog_type_tracepoint_3(void) |
214 | { |
215 | asm volatile (" \ |
216 | r2 = r10; \ |
217 | r2 += -8; \ |
218 | r1 = 0; \ |
219 | *(u64*)(r2 + 0) = r1; \ |
220 | r1 = %[map_spin_lock] ll; \ |
221 | call %[bpf_map_lookup_elem]; \ |
222 | if r0 == 0 goto l0_%=; \ |
223 | r1 = r0; \ |
224 | call %[bpf_spin_lock]; \ |
225 | l0_%=: exit; \ |
226 | " : |
227 | : __imm(bpf_map_lookup_elem), |
228 | __imm(bpf_spin_lock), |
229 | __imm_addr(map_spin_lock) |
230 | : __clobber_all); |
231 | } |
232 | |
233 | SEC("perf_event" ) |
234 | __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_PERF_EVENT" ) |
235 | __failure __msg("tracing progs cannot use bpf_spin_lock yet" ) |
236 | __naked void bpf_prog_type_perf_event_3(void) |
237 | { |
238 | asm volatile (" \ |
239 | r2 = r10; \ |
240 | r2 += -8; \ |
241 | r1 = 0; \ |
242 | *(u64*)(r2 + 0) = r1; \ |
243 | r1 = %[map_spin_lock] ll; \ |
244 | call %[bpf_map_lookup_elem]; \ |
245 | if r0 == 0 goto l0_%=; \ |
246 | r1 = r0; \ |
247 | call %[bpf_spin_lock]; \ |
248 | l0_%=: exit; \ |
249 | " : |
250 | : __imm(bpf_map_lookup_elem), |
251 | __imm(bpf_spin_lock), |
252 | __imm_addr(map_spin_lock) |
253 | : __clobber_all); |
254 | } |
255 | |
256 | SEC("raw_tracepoint" ) |
257 | __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_RAW_TRACEPOINT" ) |
258 | __failure __msg("tracing progs cannot use bpf_spin_lock yet" ) |
259 | __naked void bpf_prog_type_raw_tracepoint_3(void) |
260 | { |
261 | asm volatile (" \ |
262 | r2 = r10; \ |
263 | r2 += -8; \ |
264 | r1 = 0; \ |
265 | *(u64*)(r2 + 0) = r1; \ |
266 | r1 = %[map_spin_lock] ll; \ |
267 | call %[bpf_map_lookup_elem]; \ |
268 | if r0 == 0 goto l0_%=; \ |
269 | r1 = r0; \ |
270 | call %[bpf_spin_lock]; \ |
271 | l0_%=: exit; \ |
272 | " : |
273 | : __imm(bpf_map_lookup_elem), |
274 | __imm(bpf_spin_lock), |
275 | __imm_addr(map_spin_lock) |
276 | : __clobber_all); |
277 | } |
278 | |
279 | char _license[] SEC("license" ) = "GPL" ; |
280 | |