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