xref: /linux/tools/testing/selftests/bpf/progs/verifier_helper_restricted.c (revision 6f7e6393d1ce636bb7ec77a7fe7b77458fddf701)
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 SEC("kprobe")
21 __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_KPROBE")
22 __failure __msg("program of this type cannot use helper bpf_ktime_get_coarse_ns")
23 __naked void in_bpf_prog_type_kprobe_1(void)
24 {
25 	asm volatile ("					\
26 	call %[bpf_ktime_get_coarse_ns];		\
27 	r0 = 0;						\
28 	exit;						\
29 "	:
30 	: __imm(bpf_ktime_get_coarse_ns)
31 	: __clobber_all);
32 }
33 
34 SEC("tracepoint")
35 __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_TRACEPOINT")
36 __failure __msg("program of this type cannot use helper bpf_ktime_get_coarse_ns")
37 __naked void in_bpf_prog_type_tracepoint_1(void)
38 {
39 	asm volatile ("					\
40 	call %[bpf_ktime_get_coarse_ns];		\
41 	r0 = 0;						\
42 	exit;						\
43 "	:
44 	: __imm(bpf_ktime_get_coarse_ns)
45 	: __clobber_all);
46 }
47 
48 SEC("perf_event")
49 __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_PERF_EVENT")
50 __failure __msg("program of this type cannot use helper bpf_ktime_get_coarse_ns")
51 __naked void bpf_prog_type_perf_event_1(void)
52 {
53 	asm volatile ("					\
54 	call %[bpf_ktime_get_coarse_ns];		\
55 	r0 = 0;						\
56 	exit;						\
57 "	:
58 	: __imm(bpf_ktime_get_coarse_ns)
59 	: __clobber_all);
60 }
61 
62 SEC("raw_tracepoint")
63 __description("bpf_ktime_get_coarse_ns is forbidden in BPF_PROG_TYPE_RAW_TRACEPOINT")
64 __failure __msg("program of this type cannot use helper bpf_ktime_get_coarse_ns")
65 __naked void bpf_prog_type_raw_tracepoint_1(void)
66 {
67 	asm volatile ("					\
68 	call %[bpf_ktime_get_coarse_ns];		\
69 	r0 = 0;						\
70 	exit;						\
71 "	:
72 	: __imm(bpf_ktime_get_coarse_ns)
73 	: __clobber_all);
74 }
75 
76 SEC("kprobe")
77 __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_KPROBE")
78 __failure __msg("tracing progs cannot use bpf_spin_lock yet")
79 __naked void in_bpf_prog_type_kprobe_3(void)
80 {
81 	asm volatile ("					\
82 	r2 = r10;					\
83 	r2 += -8;					\
84 	r1 = 0;						\
85 	*(u64*)(r2 + 0) = r1;				\
86 	r1 = %[map_spin_lock] ll;			\
87 	call %[bpf_map_lookup_elem];			\
88 	if r0 == 0 goto l0_%=;				\
89 	r1 = r0;					\
90 	call %[bpf_spin_lock];				\
91 l0_%=:	exit;						\
92 "	:
93 	: __imm(bpf_map_lookup_elem),
94 	  __imm(bpf_spin_lock),
95 	  __imm_addr(map_spin_lock)
96 	: __clobber_all);
97 }
98 
99 SEC("tracepoint")
100 __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_TRACEPOINT")
101 __failure __msg("tracing progs cannot use bpf_spin_lock yet")
102 __naked void in_bpf_prog_type_tracepoint_3(void)
103 {
104 	asm volatile ("					\
105 	r2 = r10;					\
106 	r2 += -8;					\
107 	r1 = 0;						\
108 	*(u64*)(r2 + 0) = r1;				\
109 	r1 = %[map_spin_lock] ll;			\
110 	call %[bpf_map_lookup_elem];			\
111 	if r0 == 0 goto l0_%=;				\
112 	r1 = r0;					\
113 	call %[bpf_spin_lock];				\
114 l0_%=:	exit;						\
115 "	:
116 	: __imm(bpf_map_lookup_elem),
117 	  __imm(bpf_spin_lock),
118 	  __imm_addr(map_spin_lock)
119 	: __clobber_all);
120 }
121 
122 SEC("perf_event")
123 __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_PERF_EVENT")
124 __failure __msg("tracing progs cannot use bpf_spin_lock yet")
125 __naked void bpf_prog_type_perf_event_3(void)
126 {
127 	asm volatile ("					\
128 	r2 = r10;					\
129 	r2 += -8;					\
130 	r1 = 0;						\
131 	*(u64*)(r2 + 0) = r1;				\
132 	r1 = %[map_spin_lock] ll;			\
133 	call %[bpf_map_lookup_elem];			\
134 	if r0 == 0 goto l0_%=;				\
135 	r1 = r0;					\
136 	call %[bpf_spin_lock];				\
137 l0_%=:	exit;						\
138 "	:
139 	: __imm(bpf_map_lookup_elem),
140 	  __imm(bpf_spin_lock),
141 	  __imm_addr(map_spin_lock)
142 	: __clobber_all);
143 }
144 
145 SEC("raw_tracepoint")
146 __description("bpf_spin_lock is forbidden in BPF_PROG_TYPE_RAW_TRACEPOINT")
147 __failure __msg("tracing progs cannot use bpf_spin_lock yet")
148 __naked void bpf_prog_type_raw_tracepoint_3(void)
149 {
150 	asm volatile ("					\
151 	r2 = r10;					\
152 	r2 += -8;					\
153 	r1 = 0;						\
154 	*(u64*)(r2 + 0) = r1;				\
155 	r1 = %[map_spin_lock] ll;			\
156 	call %[bpf_map_lookup_elem];			\
157 	if r0 == 0 goto l0_%=;				\
158 	r1 = r0;					\
159 	call %[bpf_spin_lock];				\
160 l0_%=:	exit;						\
161 "	:
162 	: __imm(bpf_map_lookup_elem),
163 	  __imm(bpf_spin_lock),
164 	  __imm_addr(map_spin_lock)
165 	: __clobber_all);
166 }
167 
168 char _license[] SEC("license") = "GPL";
169