1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2022, Oracle and/or its affiliates. */ 3 4#include "vmlinux.h" 5 6#include <bpf/bpf_core_read.h> 7#include <bpf/bpf_helpers.h> 8#include <bpf/bpf_tracing.h> 9#include "bpf_misc.h" 10 11int uprobe_byname_parm1 = 0; 12int uprobe_byname_ran = 0; 13int uretprobe_byname_rc = 0; 14int uretprobe_byname_ret = 0; 15int uretprobe_byname_ran = 0; 16u64 uprobe_byname2_parm1 = 0; 17int uprobe_byname2_ran = 0; 18u64 uretprobe_byname2_rc = 0; 19int uretprobe_byname2_ran = 0; 20 21int test_pid; 22 23int a[8]; 24 25/* This program cannot auto-attach, but that should not stop other 26 * programs from attaching. 27 */ 28SEC("uprobe") 29int handle_uprobe_noautoattach(struct pt_regs *ctx) 30{ 31 return 0; 32} 33 34SEC("uprobe//proc/self/exe:autoattach_trigger_func") 35int BPF_UPROBE(handle_uprobe_byname 36 , int arg1 37 , int arg2 38 , int arg3 39#if FUNC_REG_ARG_CNT > 3 40 , int arg4 41#endif 42#if FUNC_REG_ARG_CNT > 4 43 , int arg5 44#endif 45#if FUNC_REG_ARG_CNT > 5 46 , int arg6 47#endif 48#if FUNC_REG_ARG_CNT > 6 49 , int arg7 50#endif 51#if FUNC_REG_ARG_CNT > 7 52 , int arg8 53#endif 54) 55{ 56 uprobe_byname_parm1 = PT_REGS_PARM1_CORE(ctx); 57 uprobe_byname_ran = 1; 58 59 a[0] = arg1; 60 a[1] = arg2; 61 a[2] = arg3; 62#if FUNC_REG_ARG_CNT > 3 63 a[3] = arg4; 64#endif 65#if FUNC_REG_ARG_CNT > 4 66 a[4] = arg5; 67#endif 68#if FUNC_REG_ARG_CNT > 5 69 a[5] = arg6; 70#endif 71#if FUNC_REG_ARG_CNT > 6 72 a[6] = arg7; 73#endif 74#if FUNC_REG_ARG_CNT > 7 75 a[7] = arg8; 76#endif 77 return 0; 78} 79 80SEC("uretprobe//proc/self/exe:autoattach_trigger_func") 81int BPF_URETPROBE(handle_uretprobe_byname, int ret) 82{ 83 uretprobe_byname_rc = PT_REGS_RC_CORE(ctx); 84 uretprobe_byname_ret = ret; 85 uretprobe_byname_ran = 2; 86 87 return 0; 88} 89 90 91SEC("uprobe/libc.so.6:fopen") 92int BPF_UPROBE(handle_uprobe_byname2, const char *pathname, const char *mode) 93{ 94 int pid = bpf_get_current_pid_tgid() >> 32; 95 96 /* ignore irrelevant invocations */ 97 if (test_pid != pid) 98 return 0; 99 uprobe_byname2_parm1 = (u64)(long)pathname; 100 uprobe_byname2_ran = 3; 101 return 0; 102} 103 104SEC("uretprobe/libc.so.6:fopen") 105int BPF_URETPROBE(handle_uretprobe_byname2, void *ret) 106{ 107 int pid = bpf_get_current_pid_tgid() >> 32; 108 109 /* ignore irrelevant invocations */ 110 if (test_pid != pid) 111 return 0; 112 uretprobe_byname2_rc = (u64)(long)ret; 113 uretprobe_byname2_ran = 4; 114 return 0; 115} 116 117char _license[] SEC("license") = "GPL"; 118