1*baeead21SHengqi Chen /* SPDX-License-Identifier: GPL-2.0 */
2*baeead21SHengqi Chen /* Copyright (c) 2021 Hengqi Chen */
3*baeead21SHengqi Chen 
4*baeead21SHengqi Chen #include "vmlinux.h"
5*baeead21SHengqi Chen #include <bpf/bpf_helpers.h>
6*baeead21SHengqi Chen #include <bpf/bpf_tracing.h>
7*baeead21SHengqi Chen 
8*baeead21SHengqi Chen const volatile pid_t my_pid = 0;
9*baeead21SHengqi Chen int value = 0;
10*baeead21SHengqi Chen 
11*baeead21SHengqi Chen SEC("raw_tp/sys_enter")
tailcall_1(void * ctx)12*baeead21SHengqi Chen int tailcall_1(void *ctx)
13*baeead21SHengqi Chen {
14*baeead21SHengqi Chen 	value = 42;
15*baeead21SHengqi Chen 	return 0;
16*baeead21SHengqi Chen }
17*baeead21SHengqi Chen 
18*baeead21SHengqi Chen struct {
19*baeead21SHengqi Chen 	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
20*baeead21SHengqi Chen 	__uint(max_entries, 2);
21*baeead21SHengqi Chen 	__uint(key_size, sizeof(__u32));
22*baeead21SHengqi Chen 	__array(values, int (void *));
23*baeead21SHengqi Chen } prog_array_init SEC(".maps") = {
24*baeead21SHengqi Chen 	.values = {
25*baeead21SHengqi Chen 		[1] = (void *)&tailcall_1,
26*baeead21SHengqi Chen 	},
27*baeead21SHengqi Chen };
28*baeead21SHengqi Chen 
29*baeead21SHengqi Chen SEC("raw_tp/sys_enter")
entry(void * ctx)30*baeead21SHengqi Chen int entry(void *ctx)
31*baeead21SHengqi Chen {
32*baeead21SHengqi Chen 	pid_t pid = bpf_get_current_pid_tgid() >> 32;
33*baeead21SHengqi Chen 
34*baeead21SHengqi Chen 	if (pid != my_pid)
35*baeead21SHengqi Chen 		return 0;
36*baeead21SHengqi Chen 
37*baeead21SHengqi Chen 	bpf_tail_call(ctx, &prog_array_init, 1);
38*baeead21SHengqi Chen 	return 0;
39*baeead21SHengqi Chen }
40