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("program of this type cannot use helper 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("program of this type cannot use helper 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("program of this type cannot use helper 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("program of this type cannot use helper 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