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