xref: /linux/tools/testing/selftests/bpf/progs/test_sleepable_tracepoints.c (revision 637315cb400eed1dbe721954fea437a61a2d65b2)
1*8a206557SMykyta Yatsenko // SPDX-License-Identifier: GPL-2.0
2*8a206557SMykyta Yatsenko /* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */
3*8a206557SMykyta Yatsenko 
4*8a206557SMykyta Yatsenko #include <vmlinux.h>
5*8a206557SMykyta Yatsenko #include <asm/unistd.h>
6*8a206557SMykyta Yatsenko #include <bpf/bpf_tracing.h>
7*8a206557SMykyta Yatsenko #include <bpf/bpf_core_read.h>
8*8a206557SMykyta Yatsenko #include <bpf/bpf_helpers.h>
9*8a206557SMykyta Yatsenko 
10*8a206557SMykyta Yatsenko char _license[] SEC("license") = "GPL";
11*8a206557SMykyta Yatsenko 
12*8a206557SMykyta Yatsenko int target_pid;
13*8a206557SMykyta Yatsenko int prog_triggered;
14*8a206557SMykyta Yatsenko long err;
15*8a206557SMykyta Yatsenko char copied_byte;
16*8a206557SMykyta Yatsenko 
17*8a206557SMykyta Yatsenko static int copy_getcwd_arg(char *ubuf)
18*8a206557SMykyta Yatsenko {
19*8a206557SMykyta Yatsenko 	err = bpf_copy_from_user(&copied_byte, sizeof(copied_byte), ubuf);
20*8a206557SMykyta Yatsenko 	if (err)
21*8a206557SMykyta Yatsenko 		return err;
22*8a206557SMykyta Yatsenko 
23*8a206557SMykyta Yatsenko 	prog_triggered = 1;
24*8a206557SMykyta Yatsenko 	return 0;
25*8a206557SMykyta Yatsenko }
26*8a206557SMykyta Yatsenko 
27*8a206557SMykyta Yatsenko SEC("tp_btf.s/sys_enter")
28*8a206557SMykyta Yatsenko int BPF_PROG(handle_sys_enter_tp_btf, struct pt_regs *regs, long id)
29*8a206557SMykyta Yatsenko {
30*8a206557SMykyta Yatsenko 	if ((bpf_get_current_pid_tgid() >> 32) != target_pid ||
31*8a206557SMykyta Yatsenko 	    id != __NR_getcwd)
32*8a206557SMykyta Yatsenko 		return 0;
33*8a206557SMykyta Yatsenko 
34*8a206557SMykyta Yatsenko 	return copy_getcwd_arg((void *)PT_REGS_PARM1_SYSCALL(regs));
35*8a206557SMykyta Yatsenko }
36*8a206557SMykyta Yatsenko 
37*8a206557SMykyta Yatsenko SEC("raw_tp.s/sys_enter")
38*8a206557SMykyta Yatsenko int BPF_PROG(handle_sys_enter_raw_tp, struct pt_regs *regs, long id)
39*8a206557SMykyta Yatsenko {
40*8a206557SMykyta Yatsenko 	if ((bpf_get_current_pid_tgid() >> 32) != target_pid ||
41*8a206557SMykyta Yatsenko 	    id != __NR_getcwd)
42*8a206557SMykyta Yatsenko 		return 0;
43*8a206557SMykyta Yatsenko 
44*8a206557SMykyta Yatsenko 	return copy_getcwd_arg((void *)PT_REGS_PARM1_CORE_SYSCALL(regs));
45*8a206557SMykyta Yatsenko }
46*8a206557SMykyta Yatsenko 
47*8a206557SMykyta Yatsenko SEC("tp.s/syscalls/sys_enter_getcwd")
48*8a206557SMykyta Yatsenko int handle_sys_enter_tp(struct syscall_trace_enter *args)
49*8a206557SMykyta Yatsenko {
50*8a206557SMykyta Yatsenko 	if ((bpf_get_current_pid_tgid() >> 32) != target_pid)
51*8a206557SMykyta Yatsenko 		return 0;
52*8a206557SMykyta Yatsenko 
53*8a206557SMykyta Yatsenko 	return copy_getcwd_arg((void *)args->args[0]);
54*8a206557SMykyta Yatsenko }
55*8a206557SMykyta Yatsenko 
56*8a206557SMykyta Yatsenko SEC("tp.s/syscalls/sys_exit_getcwd")
57*8a206557SMykyta Yatsenko int handle_sys_exit_tp(struct syscall_trace_exit *args)
58*8a206557SMykyta Yatsenko {
59*8a206557SMykyta Yatsenko 	struct pt_regs *regs;
60*8a206557SMykyta Yatsenko 
61*8a206557SMykyta Yatsenko 	if ((bpf_get_current_pid_tgid() >> 32) != target_pid)
62*8a206557SMykyta Yatsenko 		return 0;
63*8a206557SMykyta Yatsenko 
64*8a206557SMykyta Yatsenko 	regs = (struct pt_regs *)bpf_task_pt_regs(bpf_get_current_task_btf());
65*8a206557SMykyta Yatsenko 	return copy_getcwd_arg((void *)PT_REGS_PARM1_CORE_SYSCALL(regs));
66*8a206557SMykyta Yatsenko }
67*8a206557SMykyta Yatsenko 
68*8a206557SMykyta Yatsenko SEC("raw_tp.s")
69*8a206557SMykyta Yatsenko int BPF_PROG(handle_raw_tp_bare, struct pt_regs *regs, long id)
70*8a206557SMykyta Yatsenko {
71*8a206557SMykyta Yatsenko 	return 0;
72*8a206557SMykyta Yatsenko }
73*8a206557SMykyta Yatsenko 
74*8a206557SMykyta Yatsenko SEC("tp.s")
75*8a206557SMykyta Yatsenko int handle_tp_bare(void *ctx)
76*8a206557SMykyta Yatsenko {
77*8a206557SMykyta Yatsenko 	return 0;
78*8a206557SMykyta Yatsenko }
79*8a206557SMykyta Yatsenko 
80*8a206557SMykyta Yatsenko SEC("tracepoint.s/syscalls/sys_enter_getcwd")
81*8a206557SMykyta Yatsenko int handle_sys_enter_tp_alias(struct syscall_trace_enter *args)
82*8a206557SMykyta Yatsenko {
83*8a206557SMykyta Yatsenko 	return 0;
84*8a206557SMykyta Yatsenko }
85*8a206557SMykyta Yatsenko 
86*8a206557SMykyta Yatsenko SEC("raw_tracepoint.s/sys_enter")
87*8a206557SMykyta Yatsenko int BPF_PROG(handle_sys_enter_raw_tp_alias, struct pt_regs *regs, long id)
88*8a206557SMykyta Yatsenko {
89*8a206557SMykyta Yatsenko 	return 0;
90*8a206557SMykyta Yatsenko }
91*8a206557SMykyta Yatsenko 
92*8a206557SMykyta Yatsenko SEC("raw_tp.s/sys_enter")
93*8a206557SMykyta Yatsenko int BPF_PROG(handle_test_run, struct pt_regs *regs, long id)
94*8a206557SMykyta Yatsenko {
95*8a206557SMykyta Yatsenko 	if ((__u64)regs == 0x1234ULL && (__u64)id == 0x5678ULL)
96*8a206557SMykyta Yatsenko 		return (__u64)regs + (__u64)id;
97*8a206557SMykyta Yatsenko 
98*8a206557SMykyta Yatsenko 	return 0;
99*8a206557SMykyta Yatsenko }
100*8a206557SMykyta Yatsenko 
101*8a206557SMykyta Yatsenko SEC("raw_tp.s/sched_switch")
102*8a206557SMykyta Yatsenko int BPF_PROG(handle_raw_tp_non_faultable, bool preempt,
103*8a206557SMykyta Yatsenko 	     struct task_struct *prev, struct task_struct *next)
104*8a206557SMykyta Yatsenko {
105*8a206557SMykyta Yatsenko 	return 0;
106*8a206557SMykyta Yatsenko }
107*8a206557SMykyta Yatsenko 
108*8a206557SMykyta Yatsenko SEC("tp.s/sched/sched_switch")
109*8a206557SMykyta Yatsenko int handle_tp_non_syscall(void *ctx)
110*8a206557SMykyta Yatsenko {
111*8a206557SMykyta Yatsenko 	return 0;
112*8a206557SMykyta Yatsenko }
113