11e8611bbSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
21e8611bbSAndrii Nakryiko // Copyright (c) 2017 Facebook
31e8611bbSAndrii Nakryiko 
4d814ed62SAndrii Nakryiko #include "vmlinux.h"
53e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
6df8ff353SAndrii Nakryiko #include <bpf/bpf_tracing.h>
7d814ed62SAndrii Nakryiko #include <bpf/bpf_core_read.h>
832c03c49SAndrii Nakryiko #include "bpf_misc.h"
91e8611bbSAndrii Nakryiko 
1032c03c49SAndrii Nakryiko int kprobe2_res = 0;
1132c03c49SAndrii Nakryiko int kretprobe2_res = 0;
12ba7499bcSAlan Maguire int uprobe_byname_res = 0;
13ba7499bcSAlan Maguire int uretprobe_byname_res = 0;
14ba7499bcSAlan Maguire int uprobe_byname2_res = 0;
15ba7499bcSAlan Maguire int uretprobe_byname2_res = 0;
16cb3f4a4aSDelyan Kratunov int uprobe_byname3_sleepable_res = 0;
17cb3f4a4aSDelyan Kratunov int uprobe_byname3_res = 0;
18cb3f4a4aSDelyan Kratunov int uretprobe_byname3_sleepable_res = 0;
19cb3f4a4aSDelyan Kratunov int uretprobe_byname3_res = 0;
20cb3f4a4aSDelyan Kratunov void *user_ptr = 0;
211e8611bbSAndrii Nakryiko 
22d814ed62SAndrii Nakryiko SEC("ksyscall/nanosleep")
BPF_KSYSCALL(handle_kprobe_auto,struct __kernel_timespec * req,struct __kernel_timespec * rem)23d814ed62SAndrii Nakryiko int BPF_KSYSCALL(handle_kprobe_auto, struct __kernel_timespec *req, struct __kernel_timespec *rem)
2432c03c49SAndrii Nakryiko {
2532c03c49SAndrii Nakryiko 	kprobe2_res = 11;
2632c03c49SAndrii Nakryiko 	return 0;
2732c03c49SAndrii Nakryiko }
2832c03c49SAndrii Nakryiko 
29d814ed62SAndrii Nakryiko SEC("kretsyscall/nanosleep")
BPF_KRETPROBE(handle_kretprobe_auto,int ret)30d814ed62SAndrii Nakryiko int BPF_KRETPROBE(handle_kretprobe_auto, int ret)
3132c03c49SAndrii Nakryiko {
3232c03c49SAndrii Nakryiko 	kretprobe2_res = 22;
33d814ed62SAndrii Nakryiko 	return ret;
3432c03c49SAndrii Nakryiko }
3532c03c49SAndrii Nakryiko 
36ba7499bcSAlan Maguire SEC("uprobe")
handle_uprobe_ref_ctr(struct pt_regs * ctx)37*7391ec63SMenglong Dong int handle_uprobe_ref_ctr(struct pt_regs *ctx)
38*7391ec63SMenglong Dong {
39*7391ec63SMenglong Dong 	return 0;
40*7391ec63SMenglong Dong }
41*7391ec63SMenglong Dong 
42*7391ec63SMenglong Dong SEC("uretprobe")
handle_uretprobe_ref_ctr(struct pt_regs * ctx)43*7391ec63SMenglong Dong int handle_uretprobe_ref_ctr(struct pt_regs *ctx)
44*7391ec63SMenglong Dong {
45*7391ec63SMenglong Dong 	return 0;
46*7391ec63SMenglong Dong }
47*7391ec63SMenglong Dong 
48*7391ec63SMenglong Dong SEC("uprobe")
handle_uprobe_byname(struct pt_regs * ctx)49ba7499bcSAlan Maguire int handle_uprobe_byname(struct pt_regs *ctx)
50ba7499bcSAlan Maguire {
51ba7499bcSAlan Maguire 	uprobe_byname_res = 5;
52ba7499bcSAlan Maguire 	return 0;
53ba7499bcSAlan Maguire }
54ba7499bcSAlan Maguire 
55ba7499bcSAlan Maguire /* use auto-attach format for section definition. */
56ba7499bcSAlan Maguire SEC("uretprobe//proc/self/exe:trigger_func2")
handle_uretprobe_byname(struct pt_regs * ctx)57ba7499bcSAlan Maguire int handle_uretprobe_byname(struct pt_regs *ctx)
58ba7499bcSAlan Maguire {
59ba7499bcSAlan Maguire 	uretprobe_byname_res = 6;
60ba7499bcSAlan Maguire 	return 0;
61ba7499bcSAlan Maguire }
62ba7499bcSAlan Maguire 
63ba7499bcSAlan Maguire SEC("uprobe")
BPF_UPROBE(handle_uprobe_byname2,const char * pathname,const char * mode)64202702e8SIlya Leoshkevich int BPF_UPROBE(handle_uprobe_byname2, const char *pathname, const char *mode)
65ba7499bcSAlan Maguire {
66202702e8SIlya Leoshkevich 	char mode_buf[2] = {};
67ba7499bcSAlan Maguire 
68202702e8SIlya Leoshkevich 	/* verify fopen mode */
69202702e8SIlya Leoshkevich 	bpf_probe_read_user(mode_buf, sizeof(mode_buf), mode);
70202702e8SIlya Leoshkevich 	if (mode_buf[0] == 'r' && mode_buf[1] == 0)
71ba7499bcSAlan Maguire 		uprobe_byname2_res = 7;
72ba7499bcSAlan Maguire 	return 0;
73ba7499bcSAlan Maguire }
74ba7499bcSAlan Maguire 
75ba7499bcSAlan Maguire SEC("uretprobe")
BPF_URETPROBE(handle_uretprobe_byname2,void * ret)76202702e8SIlya Leoshkevich int BPF_URETPROBE(handle_uretprobe_byname2, void *ret)
77ba7499bcSAlan Maguire {
78ba7499bcSAlan Maguire 	uretprobe_byname2_res = 8;
79ba7499bcSAlan Maguire 	return 0;
80ba7499bcSAlan Maguire }
81ba7499bcSAlan Maguire 
verify_sleepable_user_copy(void)82cb3f4a4aSDelyan Kratunov static __always_inline bool verify_sleepable_user_copy(void)
83cb3f4a4aSDelyan Kratunov {
84cb3f4a4aSDelyan Kratunov 	char data[9];
85cb3f4a4aSDelyan Kratunov 
86cb3f4a4aSDelyan Kratunov 	bpf_copy_from_user(data, sizeof(data), user_ptr);
87cb3f4a4aSDelyan Kratunov 	return bpf_strncmp(data, sizeof(data), "test_data") == 0;
88cb3f4a4aSDelyan Kratunov }
89cb3f4a4aSDelyan Kratunov 
90cb3f4a4aSDelyan Kratunov SEC("uprobe.s//proc/self/exe:trigger_func3")
handle_uprobe_byname3_sleepable(struct pt_regs * ctx)91cb3f4a4aSDelyan Kratunov int handle_uprobe_byname3_sleepable(struct pt_regs *ctx)
92cb3f4a4aSDelyan Kratunov {
93cb3f4a4aSDelyan Kratunov 	if (verify_sleepable_user_copy())
94cb3f4a4aSDelyan Kratunov 		uprobe_byname3_sleepable_res = 9;
95cb3f4a4aSDelyan Kratunov 	return 0;
96cb3f4a4aSDelyan Kratunov }
97cb3f4a4aSDelyan Kratunov 
98cb3f4a4aSDelyan Kratunov /**
99cb3f4a4aSDelyan Kratunov  * same target as the uprobe.s above to force sleepable and non-sleepable
100cb3f4a4aSDelyan Kratunov  * programs in the same bpf_prog_array
101cb3f4a4aSDelyan Kratunov  */
102cb3f4a4aSDelyan Kratunov SEC("uprobe//proc/self/exe:trigger_func3")
handle_uprobe_byname3(struct pt_regs * ctx)103cb3f4a4aSDelyan Kratunov int handle_uprobe_byname3(struct pt_regs *ctx)
104cb3f4a4aSDelyan Kratunov {
105cb3f4a4aSDelyan Kratunov 	uprobe_byname3_res = 10;
106cb3f4a4aSDelyan Kratunov 	return 0;
107cb3f4a4aSDelyan Kratunov }
108cb3f4a4aSDelyan Kratunov 
109cb3f4a4aSDelyan Kratunov SEC("uretprobe.s//proc/self/exe:trigger_func3")
handle_uretprobe_byname3_sleepable(struct pt_regs * ctx)110cb3f4a4aSDelyan Kratunov int handle_uretprobe_byname3_sleepable(struct pt_regs *ctx)
111cb3f4a4aSDelyan Kratunov {
112cb3f4a4aSDelyan Kratunov 	if (verify_sleepable_user_copy())
113cb3f4a4aSDelyan Kratunov 		uretprobe_byname3_sleepable_res = 11;
114cb3f4a4aSDelyan Kratunov 	return 0;
115cb3f4a4aSDelyan Kratunov }
116cb3f4a4aSDelyan Kratunov 
117cb3f4a4aSDelyan Kratunov SEC("uretprobe//proc/self/exe:trigger_func3")
handle_uretprobe_byname3(struct pt_regs * ctx)118cb3f4a4aSDelyan Kratunov int handle_uretprobe_byname3(struct pt_regs *ctx)
119cb3f4a4aSDelyan Kratunov {
120cb3f4a4aSDelyan Kratunov 	uretprobe_byname3_res = 12;
121cb3f4a4aSDelyan Kratunov 	return 0;
122cb3f4a4aSDelyan Kratunov }
123cb3f4a4aSDelyan Kratunov 
124cb3f4a4aSDelyan Kratunov 
1251e8611bbSAndrii Nakryiko char _license[] SEC("license") = "GPL";
126