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