11e8611bbSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
21e8611bbSAndrii Nakryiko // Copyright (c) 2017 Facebook
31e8611bbSAndrii Nakryiko 
4*d814ed62SAndrii Nakryiko #include "vmlinux.h"
53e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
6df8ff353SAndrii Nakryiko #include <bpf/bpf_tracing.h>
7*d814ed62SAndrii Nakryiko #include <bpf/bpf_core_read.h>
832c03c49SAndrii Nakryiko #include "bpf_misc.h"
91e8611bbSAndrii Nakryiko 
10f3c926a4SAndrii Nakryiko int kprobe_res = 0;
1132c03c49SAndrii Nakryiko int kprobe2_res = 0;
12f3c926a4SAndrii Nakryiko int kretprobe_res = 0;
1332c03c49SAndrii Nakryiko int kretprobe2_res = 0;
14f3c926a4SAndrii Nakryiko int uprobe_res = 0;
15f3c926a4SAndrii Nakryiko int uretprobe_res = 0;
16ba7499bcSAlan Maguire int uprobe_byname_res = 0;
17ba7499bcSAlan Maguire int uretprobe_byname_res = 0;
18ba7499bcSAlan Maguire int uprobe_byname2_res = 0;
19ba7499bcSAlan Maguire int uretprobe_byname2_res = 0;
20cb3f4a4aSDelyan Kratunov int uprobe_byname3_sleepable_res = 0;
21cb3f4a4aSDelyan Kratunov int uprobe_byname3_res = 0;
22cb3f4a4aSDelyan Kratunov int uretprobe_byname3_sleepable_res = 0;
23cb3f4a4aSDelyan Kratunov int uretprobe_byname3_res = 0;
24cb3f4a4aSDelyan Kratunov void *user_ptr = 0;
251e8611bbSAndrii Nakryiko 
2632c03c49SAndrii Nakryiko SEC("kprobe")
27f3c926a4SAndrii Nakryiko int handle_kprobe(struct pt_regs *ctx)
281e8611bbSAndrii Nakryiko {
29f3c926a4SAndrii Nakryiko 	kprobe_res = 1;
301e8611bbSAndrii Nakryiko 	return 0;
311e8611bbSAndrii Nakryiko }
321e8611bbSAndrii Nakryiko 
33*d814ed62SAndrii Nakryiko SEC("ksyscall/nanosleep")
34*d814ed62SAndrii Nakryiko int BPF_KSYSCALL(handle_kprobe_auto, struct __kernel_timespec *req, struct __kernel_timespec *rem)
3532c03c49SAndrii Nakryiko {
3632c03c49SAndrii Nakryiko 	kprobe2_res = 11;
3732c03c49SAndrii Nakryiko 	return 0;
3832c03c49SAndrii Nakryiko }
3932c03c49SAndrii Nakryiko 
40cb3f4a4aSDelyan Kratunov /**
41cb3f4a4aSDelyan Kratunov  * This program will be manually made sleepable on the userspace side
42cb3f4a4aSDelyan Kratunov  * and should thus be unattachable.
43cb3f4a4aSDelyan Kratunov  */
44cb3f4a4aSDelyan Kratunov SEC("kprobe/" SYS_PREFIX "sys_nanosleep")
45cb3f4a4aSDelyan Kratunov int handle_kprobe_sleepable(struct pt_regs *ctx)
46cb3f4a4aSDelyan Kratunov {
47cb3f4a4aSDelyan Kratunov 	kprobe_res = 2;
48cb3f4a4aSDelyan Kratunov 	return 0;
49cb3f4a4aSDelyan Kratunov }
50cb3f4a4aSDelyan Kratunov 
5132c03c49SAndrii Nakryiko SEC("kretprobe")
5232c03c49SAndrii Nakryiko int handle_kretprobe(struct pt_regs *ctx)
531e8611bbSAndrii Nakryiko {
54f3c926a4SAndrii Nakryiko 	kretprobe_res = 2;
551e8611bbSAndrii Nakryiko 	return 0;
561e8611bbSAndrii Nakryiko }
571e8611bbSAndrii Nakryiko 
58*d814ed62SAndrii Nakryiko SEC("kretsyscall/nanosleep")
59*d814ed62SAndrii Nakryiko int BPF_KRETPROBE(handle_kretprobe_auto, int ret)
6032c03c49SAndrii Nakryiko {
6132c03c49SAndrii Nakryiko 	kretprobe2_res = 22;
62*d814ed62SAndrii Nakryiko 	return ret;
6332c03c49SAndrii Nakryiko }
6432c03c49SAndrii Nakryiko 
65ba7499bcSAlan Maguire SEC("uprobe")
66f3c926a4SAndrii Nakryiko int handle_uprobe(struct pt_regs *ctx)
671e8611bbSAndrii Nakryiko {
68f3c926a4SAndrii Nakryiko 	uprobe_res = 3;
691e8611bbSAndrii Nakryiko 	return 0;
701e8611bbSAndrii Nakryiko }
711e8611bbSAndrii Nakryiko 
72ba7499bcSAlan Maguire SEC("uretprobe")
73f3c926a4SAndrii Nakryiko int handle_uretprobe(struct pt_regs *ctx)
741e8611bbSAndrii Nakryiko {
75f3c926a4SAndrii Nakryiko 	uretprobe_res = 4;
761e8611bbSAndrii Nakryiko 	return 0;
771e8611bbSAndrii Nakryiko }
781e8611bbSAndrii Nakryiko 
79ba7499bcSAlan Maguire SEC("uprobe")
80ba7499bcSAlan Maguire int handle_uprobe_byname(struct pt_regs *ctx)
81ba7499bcSAlan Maguire {
82ba7499bcSAlan Maguire 	uprobe_byname_res = 5;
83ba7499bcSAlan Maguire 	return 0;
84ba7499bcSAlan Maguire }
85ba7499bcSAlan Maguire 
86ba7499bcSAlan Maguire /* use auto-attach format for section definition. */
87ba7499bcSAlan Maguire SEC("uretprobe//proc/self/exe:trigger_func2")
88ba7499bcSAlan Maguire int handle_uretprobe_byname(struct pt_regs *ctx)
89ba7499bcSAlan Maguire {
90ba7499bcSAlan Maguire 	uretprobe_byname_res = 6;
91ba7499bcSAlan Maguire 	return 0;
92ba7499bcSAlan Maguire }
93ba7499bcSAlan Maguire 
94ba7499bcSAlan Maguire SEC("uprobe")
95ba7499bcSAlan Maguire int handle_uprobe_byname2(struct pt_regs *ctx)
96ba7499bcSAlan Maguire {
97ba7499bcSAlan Maguire 	unsigned int size = PT_REGS_PARM1(ctx);
98ba7499bcSAlan Maguire 
99ba7499bcSAlan Maguire 	/* verify malloc size */
100ba7499bcSAlan Maguire 	if (size == 1)
101ba7499bcSAlan Maguire 		uprobe_byname2_res = 7;
102ba7499bcSAlan Maguire 	return 0;
103ba7499bcSAlan Maguire }
104ba7499bcSAlan Maguire 
105ba7499bcSAlan Maguire SEC("uretprobe")
106ba7499bcSAlan Maguire int handle_uretprobe_byname2(struct pt_regs *ctx)
107ba7499bcSAlan Maguire {
108ba7499bcSAlan Maguire 	uretprobe_byname2_res = 8;
109ba7499bcSAlan Maguire 	return 0;
110ba7499bcSAlan Maguire }
111ba7499bcSAlan Maguire 
112cb3f4a4aSDelyan Kratunov static __always_inline bool verify_sleepable_user_copy(void)
113cb3f4a4aSDelyan Kratunov {
114cb3f4a4aSDelyan Kratunov 	char data[9];
115cb3f4a4aSDelyan Kratunov 
116cb3f4a4aSDelyan Kratunov 	bpf_copy_from_user(data, sizeof(data), user_ptr);
117cb3f4a4aSDelyan Kratunov 	return bpf_strncmp(data, sizeof(data), "test_data") == 0;
118cb3f4a4aSDelyan Kratunov }
119cb3f4a4aSDelyan Kratunov 
120cb3f4a4aSDelyan Kratunov SEC("uprobe.s//proc/self/exe:trigger_func3")
121cb3f4a4aSDelyan Kratunov int handle_uprobe_byname3_sleepable(struct pt_regs *ctx)
122cb3f4a4aSDelyan Kratunov {
123cb3f4a4aSDelyan Kratunov 	if (verify_sleepable_user_copy())
124cb3f4a4aSDelyan Kratunov 		uprobe_byname3_sleepable_res = 9;
125cb3f4a4aSDelyan Kratunov 	return 0;
126cb3f4a4aSDelyan Kratunov }
127cb3f4a4aSDelyan Kratunov 
128cb3f4a4aSDelyan Kratunov /**
129cb3f4a4aSDelyan Kratunov  * same target as the uprobe.s above to force sleepable and non-sleepable
130cb3f4a4aSDelyan Kratunov  * programs in the same bpf_prog_array
131cb3f4a4aSDelyan Kratunov  */
132cb3f4a4aSDelyan Kratunov SEC("uprobe//proc/self/exe:trigger_func3")
133cb3f4a4aSDelyan Kratunov int handle_uprobe_byname3(struct pt_regs *ctx)
134cb3f4a4aSDelyan Kratunov {
135cb3f4a4aSDelyan Kratunov 	uprobe_byname3_res = 10;
136cb3f4a4aSDelyan Kratunov 	return 0;
137cb3f4a4aSDelyan Kratunov }
138cb3f4a4aSDelyan Kratunov 
139cb3f4a4aSDelyan Kratunov SEC("uretprobe.s//proc/self/exe:trigger_func3")
140cb3f4a4aSDelyan Kratunov int handle_uretprobe_byname3_sleepable(struct pt_regs *ctx)
141cb3f4a4aSDelyan Kratunov {
142cb3f4a4aSDelyan Kratunov 	if (verify_sleepable_user_copy())
143cb3f4a4aSDelyan Kratunov 		uretprobe_byname3_sleepable_res = 11;
144cb3f4a4aSDelyan Kratunov 	return 0;
145cb3f4a4aSDelyan Kratunov }
146cb3f4a4aSDelyan Kratunov 
147cb3f4a4aSDelyan Kratunov SEC("uretprobe//proc/self/exe:trigger_func3")
148cb3f4a4aSDelyan Kratunov int handle_uretprobe_byname3(struct pt_regs *ctx)
149cb3f4a4aSDelyan Kratunov {
150cb3f4a4aSDelyan Kratunov 	uretprobe_byname3_res = 12;
151cb3f4a4aSDelyan Kratunov 	return 0;
152cb3f4a4aSDelyan Kratunov }
153cb3f4a4aSDelyan Kratunov 
154cb3f4a4aSDelyan Kratunov 
1551e8611bbSAndrii Nakryiko char _license[] SEC("license") = "GPL";
156