Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v5.6-rc7 195 lines 6.5 kB view raw
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#else 28 #undef bpf_target_defined 29#endif 30 31/* Fall back to what the compiler says */ 32#ifndef bpf_target_defined 33#if defined(__x86_64__) 34 #define bpf_target_x86 35#elif defined(__s390__) 36 #define bpf_target_s390 37#elif defined(__arm__) 38 #define bpf_target_arm 39#elif defined(__aarch64__) 40 #define bpf_target_arm64 41#elif defined(__mips__) 42 #define bpf_target_mips 43#elif defined(__powerpc__) 44 #define bpf_target_powerpc 45#elif defined(__sparc__) 46 #define bpf_target_sparc 47#endif 48#endif 49 50#if defined(bpf_target_x86) 51 52#ifdef __KERNEL__ 53#define PT_REGS_PARM1(x) ((x)->di) 54#define PT_REGS_PARM2(x) ((x)->si) 55#define PT_REGS_PARM3(x) ((x)->dx) 56#define PT_REGS_PARM4(x) ((x)->cx) 57#define PT_REGS_PARM5(x) ((x)->r8) 58#define PT_REGS_RET(x) ((x)->sp) 59#define PT_REGS_FP(x) ((x)->bp) 60#define PT_REGS_RC(x) ((x)->ax) 61#define PT_REGS_SP(x) ((x)->sp) 62#define PT_REGS_IP(x) ((x)->ip) 63#else 64#ifdef __i386__ 65/* i386 kernel is built with -mregparm=3 */ 66#define PT_REGS_PARM1(x) ((x)->eax) 67#define PT_REGS_PARM2(x) ((x)->edx) 68#define PT_REGS_PARM3(x) ((x)->ecx) 69#define PT_REGS_PARM4(x) 0 70#define PT_REGS_PARM5(x) 0 71#define PT_REGS_RET(x) ((x)->esp) 72#define PT_REGS_FP(x) ((x)->ebp) 73#define PT_REGS_RC(x) ((x)->eax) 74#define PT_REGS_SP(x) ((x)->esp) 75#define PT_REGS_IP(x) ((x)->eip) 76#else 77#define PT_REGS_PARM1(x) ((x)->rdi) 78#define PT_REGS_PARM2(x) ((x)->rsi) 79#define PT_REGS_PARM3(x) ((x)->rdx) 80#define PT_REGS_PARM4(x) ((x)->rcx) 81#define PT_REGS_PARM5(x) ((x)->r8) 82#define PT_REGS_RET(x) ((x)->rsp) 83#define PT_REGS_FP(x) ((x)->rbp) 84#define PT_REGS_RC(x) ((x)->rax) 85#define PT_REGS_SP(x) ((x)->rsp) 86#define PT_REGS_IP(x) ((x)->rip) 87#endif 88#endif 89 90#elif defined(bpf_target_s390) 91 92/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ 93struct pt_regs; 94#define PT_REGS_S390 const volatile user_pt_regs 95#define PT_REGS_PARM1(x) (((PT_REGS_S390 *)(x))->gprs[2]) 96#define PT_REGS_PARM2(x) (((PT_REGS_S390 *)(x))->gprs[3]) 97#define PT_REGS_PARM3(x) (((PT_REGS_S390 *)(x))->gprs[4]) 98#define PT_REGS_PARM4(x) (((PT_REGS_S390 *)(x))->gprs[5]) 99#define PT_REGS_PARM5(x) (((PT_REGS_S390 *)(x))->gprs[6]) 100#define PT_REGS_RET(x) (((PT_REGS_S390 *)(x))->gprs[14]) 101/* Works only with CONFIG_FRAME_POINTER */ 102#define PT_REGS_FP(x) (((PT_REGS_S390 *)(x))->gprs[11]) 103#define PT_REGS_RC(x) (((PT_REGS_S390 *)(x))->gprs[2]) 104#define PT_REGS_SP(x) (((PT_REGS_S390 *)(x))->gprs[15]) 105#define PT_REGS_IP(x) (((PT_REGS_S390 *)(x))->psw.addr) 106 107#elif defined(bpf_target_arm) 108 109#define PT_REGS_PARM1(x) ((x)->uregs[0]) 110#define PT_REGS_PARM2(x) ((x)->uregs[1]) 111#define PT_REGS_PARM3(x) ((x)->uregs[2]) 112#define PT_REGS_PARM4(x) ((x)->uregs[3]) 113#define PT_REGS_PARM5(x) ((x)->uregs[4]) 114#define PT_REGS_RET(x) ((x)->uregs[14]) 115#define PT_REGS_FP(x) ((x)->uregs[11]) /* Works only with CONFIG_FRAME_POINTER */ 116#define PT_REGS_RC(x) ((x)->uregs[0]) 117#define PT_REGS_SP(x) ((x)->uregs[13]) 118#define PT_REGS_IP(x) ((x)->uregs[12]) 119 120#elif defined(bpf_target_arm64) 121 122/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ 123struct pt_regs; 124#define PT_REGS_ARM64 const volatile struct user_pt_regs 125#define PT_REGS_PARM1(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 126#define PT_REGS_PARM2(x) (((PT_REGS_ARM64 *)(x))->regs[1]) 127#define PT_REGS_PARM3(x) (((PT_REGS_ARM64 *)(x))->regs[2]) 128#define PT_REGS_PARM4(x) (((PT_REGS_ARM64 *)(x))->regs[3]) 129#define PT_REGS_PARM5(x) (((PT_REGS_ARM64 *)(x))->regs[4]) 130#define PT_REGS_RET(x) (((PT_REGS_ARM64 *)(x))->regs[30]) 131/* Works only with CONFIG_FRAME_POINTER */ 132#define PT_REGS_FP(x) (((PT_REGS_ARM64 *)(x))->regs[29]) 133#define PT_REGS_RC(x) (((PT_REGS_ARM64 *)(x))->regs[0]) 134#define PT_REGS_SP(x) (((PT_REGS_ARM64 *)(x))->sp) 135#define PT_REGS_IP(x) (((PT_REGS_ARM64 *)(x))->pc) 136 137#elif defined(bpf_target_mips) 138 139#define PT_REGS_PARM1(x) ((x)->regs[4]) 140#define PT_REGS_PARM2(x) ((x)->regs[5]) 141#define PT_REGS_PARM3(x) ((x)->regs[6]) 142#define PT_REGS_PARM4(x) ((x)->regs[7]) 143#define PT_REGS_PARM5(x) ((x)->regs[8]) 144#define PT_REGS_RET(x) ((x)->regs[31]) 145#define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */ 146#define PT_REGS_RC(x) ((x)->regs[1]) 147#define PT_REGS_SP(x) ((x)->regs[29]) 148#define PT_REGS_IP(x) ((x)->cp0_epc) 149 150#elif defined(bpf_target_powerpc) 151 152#define PT_REGS_PARM1(x) ((x)->gpr[3]) 153#define PT_REGS_PARM2(x) ((x)->gpr[4]) 154#define PT_REGS_PARM3(x) ((x)->gpr[5]) 155#define PT_REGS_PARM4(x) ((x)->gpr[6]) 156#define PT_REGS_PARM5(x) ((x)->gpr[7]) 157#define PT_REGS_RC(x) ((x)->gpr[3]) 158#define PT_REGS_SP(x) ((x)->sp) 159#define PT_REGS_IP(x) ((x)->nip) 160 161#elif defined(bpf_target_sparc) 162 163#define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0]) 164#define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1]) 165#define PT_REGS_PARM3(x) ((x)->u_regs[UREG_I2]) 166#define PT_REGS_PARM4(x) ((x)->u_regs[UREG_I3]) 167#define PT_REGS_PARM5(x) ((x)->u_regs[UREG_I4]) 168#define PT_REGS_RET(x) ((x)->u_regs[UREG_I7]) 169#define PT_REGS_RC(x) ((x)->u_regs[UREG_I0]) 170#define PT_REGS_SP(x) ((x)->u_regs[UREG_FP]) 171 172/* Should this also be a bpf_target check for the sparc case? */ 173#if defined(__arch64__) 174#define PT_REGS_IP(x) ((x)->tpc) 175#else 176#define PT_REGS_IP(x) ((x)->pc) 177#endif 178 179#endif 180 181#if defined(bpf_target_powerpc) 182#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) 183#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 184#elif defined(bpf_target_sparc) 185#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) 186#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP 187#else 188#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ 189 ({ bpf_probe_read(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) 190#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ 191 ({ bpf_probe_read(&(ip), sizeof(ip), \ 192 (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) 193#endif 194 195#endif