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