280 lines · c
1// SPDX-License-Identifier: GPL-2.02/* 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