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
8struct val {
9 int cnt;
10 struct bpf_spin_lock l;
11};
12
13struct {
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
20struct timer {
21 struct bpf_timer t;
22};
23
24struct {
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
31SEC("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
45SEC("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
59SEC("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
73SEC("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
87SEC("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; \
103l0_%=: 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
112SEC("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; \
128l0_%=: 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
137SEC("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; \
153l0_%=: 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
162SEC("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; \
178l0_%=: 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
187SEC("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]; \
202l0_%=: exit; \
203" :
204 : __imm(bpf_map_lookup_elem),
205 __imm(bpf_spin_lock),
206 __imm_addr(map_spin_lock)
207 : __clobber_all);
208}
209
210SEC("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]; \
225l0_%=: exit; \
226" :
227 : __imm(bpf_map_lookup_elem),
228 __imm(bpf_spin_lock),
229 __imm_addr(map_spin_lock)
230 : __clobber_all);
231}
232
233SEC("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]; \
248l0_%=: exit; \
249" :
250 : __imm(bpf_map_lookup_elem),
251 __imm(bpf_spin_lock),
252 __imm_addr(map_spin_lock)
253 : __clobber_all);
254}
255
256SEC("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]; \
271l0_%=: exit; \
272" :
273 : __imm(bpf_map_lookup_elem),
274 __imm(bpf_spin_lock),
275 __imm_addr(map_spin_lock)
276 : __clobber_all);
277}
278
279char _license[] SEC("license") = "GPL";
280

source code of linux/tools/testing/selftests/bpf/progs/verifier_helper_restricted.c