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