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