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 Chenint 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 Chenint 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