xref: /linux/tools/testing/selftests/bpf/progs/verifier_tailcall.c (revision d9104cec3e8fe4b458b74709853231385779001f)
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
invalid_map_for_tail_call(void)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