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("program of this type cannot use helper bpf_ktime_get_coarse_ns")
in_bpf_prog_type_kprobe_1(void)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("program of this type cannot use helper bpf_ktime_get_coarse_ns")
in_bpf_prog_type_tracepoint_1(void)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("program of this type cannot use helper bpf_ktime_get_coarse_ns")
bpf_prog_type_perf_event_1(void)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("program of this type cannot use helper bpf_ktime_get_coarse_ns")
bpf_prog_type_raw_tracepoint_1(void)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")
in_bpf_prog_type_kprobe_2(void)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")
bpf_prog_type_perf_event_2(void)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")
in_bpf_prog_type_tracepoint_2(void)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")
bpf_prog_type_raw_tracepoint_2(void)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")
in_bpf_prog_type_kprobe_3(void)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")
in_bpf_prog_type_tracepoint_3(void)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")
bpf_prog_type_perf_event_3(void)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")
bpf_prog_type_raw_tracepoint_3(void)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