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