1*192e3aa1SPaul Chaignon // SPDX-License-Identifier: GPL-2.0 2*192e3aa1SPaul Chaignon 3*192e3aa1SPaul Chaignon #include <linux/bpf.h> 4*192e3aa1SPaul Chaignon #include <bpf/bpf_helpers.h> 5*192e3aa1SPaul Chaignon #include "bpf_misc.h" 6*192e3aa1SPaul Chaignon 7*192e3aa1SPaul Chaignon struct { 8*192e3aa1SPaul Chaignon __uint(type, BPF_MAP_TYPE_ARRAY); 9*192e3aa1SPaul Chaignon __uint(max_entries, 1); 10*192e3aa1SPaul Chaignon __type(key, __u32); 11*192e3aa1SPaul Chaignon __type(value, __u32); 12*192e3aa1SPaul Chaignon } map_array SEC(".maps"); 13*192e3aa1SPaul Chaignon 14*192e3aa1SPaul Chaignon SEC("socket") 15*192e3aa1SPaul Chaignon __description("invalid map type for tail call") 16*192e3aa1SPaul Chaignon __failure __msg("expected prog array map for tail call") 17*192e3aa1SPaul Chaignon __failure_unpriv 18*192e3aa1SPaul Chaignon __naked void invalid_map_for_tail_call(void) 19*192e3aa1SPaul Chaignon { 20*192e3aa1SPaul Chaignon asm volatile (" \ 21*192e3aa1SPaul Chaignon r2 = %[map_array] ll; \ 22*192e3aa1SPaul Chaignon r3 = 0; \ 23*192e3aa1SPaul Chaignon call %[bpf_tail_call]; \ 24*192e3aa1SPaul Chaignon exit; \ 25*192e3aa1SPaul Chaignon " : 26*192e3aa1SPaul Chaignon : __imm(bpf_tail_call), 27*192e3aa1SPaul Chaignon __imm_addr(map_array) 28*192e3aa1SPaul Chaignon : __clobber_all); 29*192e3aa1SPaul Chaignon } 30*192e3aa1SPaul Chaignon 31*192e3aa1SPaul Chaignon char _license[] SEC("license") = "GPL"; 32