1*4882a593Smuzhiyun /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 2*4882a593Smuzhiyun #ifndef __BPF_TRACING_H__ 3*4882a593Smuzhiyun #define __BPF_TRACING_H__ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Scan the ARCH passed in from ARCH env variable (see Makefile) */ 6*4882a593Smuzhiyun #if defined(__TARGET_ARCH_x86) 7*4882a593Smuzhiyun #define bpf_target_x86 8*4882a593Smuzhiyun #define bpf_target_defined 9*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_s390) 10*4882a593Smuzhiyun #define bpf_target_s390 11*4882a593Smuzhiyun #define bpf_target_defined 12*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_arm) 13*4882a593Smuzhiyun #define bpf_target_arm 14*4882a593Smuzhiyun #define bpf_target_defined 15*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_arm64) 16*4882a593Smuzhiyun #define bpf_target_arm64 17*4882a593Smuzhiyun #define bpf_target_defined 18*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_mips) 19*4882a593Smuzhiyun #define bpf_target_mips 20*4882a593Smuzhiyun #define bpf_target_defined 21*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_powerpc) 22*4882a593Smuzhiyun #define bpf_target_powerpc 23*4882a593Smuzhiyun #define bpf_target_defined 24*4882a593Smuzhiyun #elif defined(__TARGET_ARCH_sparc) 25*4882a593Smuzhiyun #define bpf_target_sparc 26*4882a593Smuzhiyun #define bpf_target_defined 27*4882a593Smuzhiyun #else 28*4882a593Smuzhiyun #undef bpf_target_defined 29*4882a593Smuzhiyun #endif 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* Fall back to what the compiler says */ 32*4882a593Smuzhiyun #ifndef bpf_target_defined 33*4882a593Smuzhiyun #if defined(__x86_64__) 34*4882a593Smuzhiyun #define bpf_target_x86 35*4882a593Smuzhiyun #elif defined(__s390__) 36*4882a593Smuzhiyun #define bpf_target_s390 37*4882a593Smuzhiyun #elif defined(__arm__) 38*4882a593Smuzhiyun #define bpf_target_arm 39*4882a593Smuzhiyun #elif defined(__aarch64__) 40*4882a593Smuzhiyun #define bpf_target_arm64 41*4882a593Smuzhiyun #elif defined(__mips__) 42*4882a593Smuzhiyun #define bpf_target_mips 43*4882a593Smuzhiyun #elif defined(__powerpc__) 44*4882a593Smuzhiyun #define bpf_target_powerpc 45*4882a593Smuzhiyun #elif defined(__sparc__) 46*4882a593Smuzhiyun #define bpf_target_sparc 47*4882a593Smuzhiyun #endif 48*4882a593Smuzhiyun #endif 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #if defined(bpf_target_x86) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #if defined(__KERNEL__) || defined(__VMLINUX_H__) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->di) 55*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->si) 56*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->dx) 57*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->cx) 58*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->r8) 59*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->sp) 60*4882a593Smuzhiyun #define PT_REGS_FP(x) ((x)->bp) 61*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->ax) 62*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->sp) 63*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->ip) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), di) 66*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), si) 67*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), dx) 68*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), cx) 69*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), r8) 70*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), sp) 71*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), bp) 72*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), ax) 73*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), sp) 74*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), ip) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #else 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #ifdef __i386__ 79*4882a593Smuzhiyun /* i386 kernel is built with -mregparm=3 */ 80*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->eax) 81*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->edx) 82*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->ecx) 83*4882a593Smuzhiyun #define PT_REGS_PARM4(x) 0 84*4882a593Smuzhiyun #define PT_REGS_PARM5(x) 0 85*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->esp) 86*4882a593Smuzhiyun #define PT_REGS_FP(x) ((x)->ebp) 87*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->eax) 88*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->esp) 89*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->eip) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), eax) 92*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), edx) 93*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), ecx) 94*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) 0 95*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) 0 96*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), esp) 97*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), ebp) 98*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), eax) 99*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), esp) 100*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), eip) 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #else 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->rdi) 105*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->rsi) 106*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->rdx) 107*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->rcx) 108*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->r8) 109*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->rsp) 110*4882a593Smuzhiyun #define PT_REGS_FP(x) ((x)->rbp) 111*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->rax) 112*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->rsp) 113*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->rip) 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), rdi) 116*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), rsi) 117*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), rdx) 118*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), rcx) 119*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), r8) 120*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), rsp) 121*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), rbp) 122*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), rax) 123*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), rsp) 124*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), rip) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #endif 127*4882a593Smuzhiyun #endif 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #elif defined(bpf_target_s390) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* s390 provides user_pt_regs instead of struct pt_regs to userspace */ 132*4882a593Smuzhiyun struct pt_regs; 133*4882a593Smuzhiyun #define PT_REGS_S390 const volatile user_pt_regs 134*4882a593Smuzhiyun #define PT_REGS_PARM1(x) (((PT_REGS_S390 *)(x))->gprs[2]) 135*4882a593Smuzhiyun #define PT_REGS_PARM2(x) (((PT_REGS_S390 *)(x))->gprs[3]) 136*4882a593Smuzhiyun #define PT_REGS_PARM3(x) (((PT_REGS_S390 *)(x))->gprs[4]) 137*4882a593Smuzhiyun #define PT_REGS_PARM4(x) (((PT_REGS_S390 *)(x))->gprs[5]) 138*4882a593Smuzhiyun #define PT_REGS_PARM5(x) (((PT_REGS_S390 *)(x))->gprs[6]) 139*4882a593Smuzhiyun #define PT_REGS_RET(x) (((PT_REGS_S390 *)(x))->gprs[14]) 140*4882a593Smuzhiyun /* Works only with CONFIG_FRAME_POINTER */ 141*4882a593Smuzhiyun #define PT_REGS_FP(x) (((PT_REGS_S390 *)(x))->gprs[11]) 142*4882a593Smuzhiyun #define PT_REGS_RC(x) (((PT_REGS_S390 *)(x))->gprs[2]) 143*4882a593Smuzhiyun #define PT_REGS_SP(x) (((PT_REGS_S390 *)(x))->gprs[15]) 144*4882a593Smuzhiyun #define PT_REGS_IP(x) (((PT_REGS_S390 *)(x))->psw.addr) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[2]) 147*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[3]) 148*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[4]) 149*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[5]) 150*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[6]) 151*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[14]) 152*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[11]) 153*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[2]) 154*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[15]) 155*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), psw.addr) 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun #elif defined(bpf_target_arm) 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->uregs[0]) 160*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->uregs[1]) 161*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->uregs[2]) 162*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->uregs[3]) 163*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->uregs[4]) 164*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->uregs[14]) 165*4882a593Smuzhiyun #define PT_REGS_FP(x) ((x)->uregs[11]) /* Works only with CONFIG_FRAME_POINTER */ 166*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->uregs[0]) 167*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->uregs[13]) 168*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->uregs[12]) 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), uregs[0]) 171*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), uregs[1]) 172*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), uregs[2]) 173*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), uregs[3]) 174*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), uregs[4]) 175*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), uregs[14]) 176*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), uregs[11]) 177*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), uregs[0]) 178*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), uregs[13]) 179*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), uregs[12]) 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun #elif defined(bpf_target_arm64) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ 184*4882a593Smuzhiyun struct pt_regs; 185*4882a593Smuzhiyun #define PT_REGS_ARM64 const volatile struct user_pt_regs 186*4882a593Smuzhiyun #define PT_REGS_PARM1(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 187*4882a593Smuzhiyun #define PT_REGS_PARM2(x) (((PT_REGS_ARM64 *)(x))->regs[1]) 188*4882a593Smuzhiyun #define PT_REGS_PARM3(x) (((PT_REGS_ARM64 *)(x))->regs[2]) 189*4882a593Smuzhiyun #define PT_REGS_PARM4(x) (((PT_REGS_ARM64 *)(x))->regs[3]) 190*4882a593Smuzhiyun #define PT_REGS_PARM5(x) (((PT_REGS_ARM64 *)(x))->regs[4]) 191*4882a593Smuzhiyun #define PT_REGS_RET(x) (((PT_REGS_ARM64 *)(x))->regs[30]) 192*4882a593Smuzhiyun /* Works only with CONFIG_FRAME_POINTER */ 193*4882a593Smuzhiyun #define PT_REGS_FP(x) (((PT_REGS_ARM64 *)(x))->regs[29]) 194*4882a593Smuzhiyun #define PT_REGS_RC(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 195*4882a593Smuzhiyun #define PT_REGS_SP(x) (((PT_REGS_ARM64 *)(x))->sp) 196*4882a593Smuzhiyun #define PT_REGS_IP(x) (((PT_REGS_ARM64 *)(x))->pc) 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[0]) 199*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[1]) 200*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[2]) 201*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[3]) 202*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[4]) 203*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[30]) 204*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[29]) 205*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[0]) 206*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), sp) 207*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), pc) 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #elif defined(bpf_target_mips) 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->regs[4]) 212*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->regs[5]) 213*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->regs[6]) 214*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->regs[7]) 215*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->regs[8]) 216*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->regs[31]) 217*4882a593Smuzhiyun #define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */ 218*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->regs[2]) 219*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->regs[29]) 220*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->cp0_epc) 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), regs[4]) 223*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), regs[5]) 224*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), regs[6]) 225*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), regs[7]) 226*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), regs[8]) 227*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), regs[31]) 228*4882a593Smuzhiyun #define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), regs[30]) 229*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), regs[2]) 230*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), regs[29]) 231*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), cp0_epc) 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun #elif defined(bpf_target_powerpc) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->gpr[3]) 236*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->gpr[4]) 237*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->gpr[5]) 238*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->gpr[6]) 239*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->gpr[7]) 240*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->gpr[3]) 241*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->sp) 242*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->nip) 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), gpr[3]) 245*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), gpr[4]) 246*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), gpr[5]) 247*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), gpr[6]) 248*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), gpr[7]) 249*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), gpr[3]) 250*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), sp) 251*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), nip) 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun #elif defined(bpf_target_sparc) 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun #define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0]) 256*4882a593Smuzhiyun #define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1]) 257*4882a593Smuzhiyun #define PT_REGS_PARM3(x) ((x)->u_regs[UREG_I2]) 258*4882a593Smuzhiyun #define PT_REGS_PARM4(x) ((x)->u_regs[UREG_I3]) 259*4882a593Smuzhiyun #define PT_REGS_PARM5(x) ((x)->u_regs[UREG_I4]) 260*4882a593Smuzhiyun #define PT_REGS_RET(x) ((x)->u_regs[UREG_I7]) 261*4882a593Smuzhiyun #define PT_REGS_RC(x) ((x)->u_regs[UREG_I0]) 262*4882a593Smuzhiyun #define PT_REGS_SP(x) ((x)->u_regs[UREG_FP]) 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun #define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I0]) 265*4882a593Smuzhiyun #define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I1]) 266*4882a593Smuzhiyun #define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I2]) 267*4882a593Smuzhiyun #define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I3]) 268*4882a593Smuzhiyun #define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I4]) 269*4882a593Smuzhiyun #define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I7]) 270*4882a593Smuzhiyun #define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I0]) 271*4882a593Smuzhiyun #define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), u_regs[UREG_FP]) 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun /* Should this also be a bpf_target check for the sparc case? */ 274*4882a593Smuzhiyun #if defined(__arch64__) 275*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->tpc) 276*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), tpc) 277*4882a593Smuzhiyun #else 278*4882a593Smuzhiyun #define PT_REGS_IP(x) ((x)->pc) 279*4882a593Smuzhiyun #define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), pc) 280*4882a593Smuzhiyun #endif 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #endif 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun #if defined(bpf_target_powerpc) 285*4882a593Smuzhiyun #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) 286*4882a593Smuzhiyun #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 287*4882a593Smuzhiyun #elif defined(bpf_target_sparc) 288*4882a593Smuzhiyun #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) 289*4882a593Smuzhiyun #define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 290*4882a593Smuzhiyun #else 291*4882a593Smuzhiyun #define BPF_KPROBE_READ_RET_IP(ip, ctx) \ 292*4882a593Smuzhiyun ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) 293*4882a593Smuzhiyun #define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ 294*4882a593Smuzhiyun ({ bpf_probe_read_kernel(&(ip), sizeof(ip), \ 295*4882a593Smuzhiyun (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) 296*4882a593Smuzhiyun #endif 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #define ___bpf_concat(a, b) a ## b 299*4882a593Smuzhiyun #define ___bpf_apply(fn, n) ___bpf_concat(fn, n) 300*4882a593Smuzhiyun #define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N 301*4882a593Smuzhiyun #define ___bpf_narg(...) \ 302*4882a593Smuzhiyun ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) 303*4882a593Smuzhiyun #define ___bpf_empty(...) \ 304*4882a593Smuzhiyun ___bpf_nth(_, ##__VA_ARGS__, N, N, N, N, N, N, N, N, N, N, 0) 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun #define ___bpf_ctx_cast0() ctx 307*4882a593Smuzhiyun #define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] 308*4882a593Smuzhiyun #define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] 309*4882a593Smuzhiyun #define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] 310*4882a593Smuzhiyun #define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] 311*4882a593Smuzhiyun #define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] 312*4882a593Smuzhiyun #define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] 313*4882a593Smuzhiyun #define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] 314*4882a593Smuzhiyun #define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] 315*4882a593Smuzhiyun #define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] 316*4882a593Smuzhiyun #define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] 317*4882a593Smuzhiyun #define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] 318*4882a593Smuzhiyun #define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] 319*4882a593Smuzhiyun #define ___bpf_ctx_cast(args...) \ 320*4882a593Smuzhiyun ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /* 323*4882a593Smuzhiyun * BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and 324*4882a593Smuzhiyun * similar kinds of BPF programs, that accept input arguments as a single 325*4882a593Smuzhiyun * pointer to untyped u64 array, where each u64 can actually be a typed 326*4882a593Smuzhiyun * pointer or integer of different size. Instead of requring user to write 327*4882a593Smuzhiyun * manual casts and work with array elements by index, BPF_PROG macro 328*4882a593Smuzhiyun * allows user to declare a list of named and typed input arguments in the 329*4882a593Smuzhiyun * same syntax as for normal C function. All the casting is hidden and 330*4882a593Smuzhiyun * performed transparently, while user code can just assume working with 331*4882a593Smuzhiyun * function arguments of specified type and name. 332*4882a593Smuzhiyun * 333*4882a593Smuzhiyun * Original raw context argument is preserved as well as 'ctx' argument. 334*4882a593Smuzhiyun * This is useful when using BPF helpers that expect original context 335*4882a593Smuzhiyun * as one of the parameters (e.g., for bpf_perf_event_output()). 336*4882a593Smuzhiyun */ 337*4882a593Smuzhiyun #define BPF_PROG(name, args...) \ 338*4882a593Smuzhiyun name(unsigned long long *ctx); \ 339*4882a593Smuzhiyun static __attribute__((always_inline)) typeof(name(0)) \ 340*4882a593Smuzhiyun ____##name(unsigned long long *ctx, ##args); \ 341*4882a593Smuzhiyun typeof(name(0)) name(unsigned long long *ctx) \ 342*4882a593Smuzhiyun { \ 343*4882a593Smuzhiyun _Pragma("GCC diagnostic push") \ 344*4882a593Smuzhiyun _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 345*4882a593Smuzhiyun return ____##name(___bpf_ctx_cast(args)); \ 346*4882a593Smuzhiyun _Pragma("GCC diagnostic pop") \ 347*4882a593Smuzhiyun } \ 348*4882a593Smuzhiyun static __attribute__((always_inline)) typeof(name(0)) \ 349*4882a593Smuzhiyun ____##name(unsigned long long *ctx, ##args) 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun struct pt_regs; 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun #define ___bpf_kprobe_args0() ctx 354*4882a593Smuzhiyun #define ___bpf_kprobe_args1(x) \ 355*4882a593Smuzhiyun ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx) 356*4882a593Smuzhiyun #define ___bpf_kprobe_args2(x, args...) \ 357*4882a593Smuzhiyun ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx) 358*4882a593Smuzhiyun #define ___bpf_kprobe_args3(x, args...) \ 359*4882a593Smuzhiyun ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx) 360*4882a593Smuzhiyun #define ___bpf_kprobe_args4(x, args...) \ 361*4882a593Smuzhiyun ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx) 362*4882a593Smuzhiyun #define ___bpf_kprobe_args5(x, args...) \ 363*4882a593Smuzhiyun ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx) 364*4882a593Smuzhiyun #define ___bpf_kprobe_args(args...) \ 365*4882a593Smuzhiyun ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) 366*4882a593Smuzhiyun 367*4882a593Smuzhiyun /* 368*4882a593Smuzhiyun * BPF_KPROBE serves the same purpose for kprobes as BPF_PROG for 369*4882a593Smuzhiyun * tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific 370*4882a593Smuzhiyun * low-level way of getting kprobe input arguments from struct pt_regs, and 371*4882a593Smuzhiyun * provides a familiar typed and named function arguments syntax and 372*4882a593Smuzhiyun * semantics of accessing kprobe input paremeters. 373*4882a593Smuzhiyun * 374*4882a593Smuzhiyun * Original struct pt_regs* context is preserved as 'ctx' argument. This might 375*4882a593Smuzhiyun * be necessary when using BPF helpers like bpf_perf_event_output(). 376*4882a593Smuzhiyun */ 377*4882a593Smuzhiyun #define BPF_KPROBE(name, args...) \ 378*4882a593Smuzhiyun name(struct pt_regs *ctx); \ 379*4882a593Smuzhiyun static __attribute__((always_inline)) typeof(name(0)) \ 380*4882a593Smuzhiyun ____##name(struct pt_regs *ctx, ##args); \ 381*4882a593Smuzhiyun typeof(name(0)) name(struct pt_regs *ctx) \ 382*4882a593Smuzhiyun { \ 383*4882a593Smuzhiyun _Pragma("GCC diagnostic push") \ 384*4882a593Smuzhiyun _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 385*4882a593Smuzhiyun return ____##name(___bpf_kprobe_args(args)); \ 386*4882a593Smuzhiyun _Pragma("GCC diagnostic pop") \ 387*4882a593Smuzhiyun } \ 388*4882a593Smuzhiyun static __attribute__((always_inline)) typeof(name(0)) \ 389*4882a593Smuzhiyun ____##name(struct pt_regs *ctx, ##args) 390*4882a593Smuzhiyun 391*4882a593Smuzhiyun #define ___bpf_kretprobe_args0() ctx 392*4882a593Smuzhiyun #define ___bpf_kretprobe_args1(x) \ 393*4882a593Smuzhiyun ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx) 394*4882a593Smuzhiyun #define ___bpf_kretprobe_args(args...) \ 395*4882a593Smuzhiyun ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) 396*4882a593Smuzhiyun 397*4882a593Smuzhiyun /* 398*4882a593Smuzhiyun * BPF_KRETPROBE is similar to BPF_KPROBE, except, it only provides optional 399*4882a593Smuzhiyun * return value (in addition to `struct pt_regs *ctx`), but no input 400*4882a593Smuzhiyun * arguments, because they will be clobbered by the time probed function 401*4882a593Smuzhiyun * returns. 402*4882a593Smuzhiyun */ 403*4882a593Smuzhiyun #define BPF_KRETPROBE(name, args...) \ 404*4882a593Smuzhiyun name(struct pt_regs *ctx); \ 405*4882a593Smuzhiyun static __attribute__((always_inline)) typeof(name(0)) \ 406*4882a593Smuzhiyun ____##name(struct pt_regs *ctx, ##args); \ 407*4882a593Smuzhiyun typeof(name(0)) name(struct pt_regs *ctx) \ 408*4882a593Smuzhiyun { \ 409*4882a593Smuzhiyun _Pragma("GCC diagnostic push") \ 410*4882a593Smuzhiyun _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 411*4882a593Smuzhiyun return ____##name(___bpf_kretprobe_args(args)); \ 412*4882a593Smuzhiyun _Pragma("GCC diagnostic pop") \ 413*4882a593Smuzhiyun } \ 414*4882a593Smuzhiyun static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun #define ___bpf_fill0(arr, p, x) do {} while (0) 417*4882a593Smuzhiyun #define ___bpf_fill1(arr, p, x) arr[p] = x 418*4882a593Smuzhiyun #define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) 419*4882a593Smuzhiyun #define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) 420*4882a593Smuzhiyun #define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) 421*4882a593Smuzhiyun #define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) 422*4882a593Smuzhiyun #define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) 423*4882a593Smuzhiyun #define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) 424*4882a593Smuzhiyun #define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) 425*4882a593Smuzhiyun #define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) 426*4882a593Smuzhiyun #define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) 427*4882a593Smuzhiyun #define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) 428*4882a593Smuzhiyun #define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) 429*4882a593Smuzhiyun #define ___bpf_fill(arr, args...) \ 430*4882a593Smuzhiyun ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun /* 433*4882a593Smuzhiyun * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values 434*4882a593Smuzhiyun * in a structure. 435*4882a593Smuzhiyun */ 436*4882a593Smuzhiyun #define BPF_SEQ_PRINTF(seq, fmt, args...) \ 437*4882a593Smuzhiyun ({ \ 438*4882a593Smuzhiyun static const char ___fmt[] = fmt; \ 439*4882a593Smuzhiyun unsigned long long ___param[___bpf_narg(args)]; \ 440*4882a593Smuzhiyun \ 441*4882a593Smuzhiyun _Pragma("GCC diagnostic push") \ 442*4882a593Smuzhiyun _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ 443*4882a593Smuzhiyun ___bpf_fill(___param, args); \ 444*4882a593Smuzhiyun _Pragma("GCC diagnostic pop") \ 445*4882a593Smuzhiyun \ 446*4882a593Smuzhiyun bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ 447*4882a593Smuzhiyun ___param, sizeof(___param)); \ 448*4882a593Smuzhiyun }) 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun #endif 451