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