Re: [PATCH bpf-next 1/2] libbpf: normalize PT_REGS_xxx() macro definitions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Dec 22, 2021 at 1:39 PM Andrii Nakryiko <andrii@xxxxxxxxxx> wrote:
>
> Refactor PT_REGS macros definitions in  bpf_tracing.h to avoid excessive
> duplication. We currently have classic PT_REGS_xxx() and CO-RE-enabled
> PT_REGS_xxx_CORE(). We are about to add also _SYSCALL variants, which
> would require excessive copying of all the per-architecture definitions.
>
> Instead, separate architecture-specific field/register names from the
> final macro that utilize them. That way for upcoming _SYSCALL variants
> we'll be able to just define x86_64 exception and otherwise have one
> common set of _SYSCALL macro definitions common for all architectures.
>
> Cc: Kenta Tada <Kenta.Tada@xxxxxxxx>
> Cc: Hengqi Chen <hengqi.chen@xxxxxxxxx>
> Cc: Björn Töpel <bjorn@xxxxxxxxxx>
> Cc: Ilya Leoshkevich <iii@xxxxxxxxxxxxx>
> Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx>
> ---
>  tools/lib/bpf/bpf_tracing.h | 377 +++++++++++++++---------------------
>  1 file changed, 152 insertions(+), 225 deletions(-)
>

This is so much easier to review at [0], btw...

  [0] https://github.com/kernel-patches/bpf/pull/2327/commits/81afd5f3956f25da06c36d9d6195a7aa59304252

> diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h
> index db05a5937105..20fe06d0acd9 100644
> --- a/tools/lib/bpf/bpf_tracing.h
> +++ b/tools/lib/bpf/bpf_tracing.h
> @@ -66,277 +66,204 @@
>
>  #if defined(__KERNEL__) || defined(__VMLINUX_H__)
>
> -#define PT_REGS_PARM1(x) ((x)->di)
> -#define PT_REGS_PARM2(x) ((x)->si)
> -#define PT_REGS_PARM3(x) ((x)->dx)
> -#define PT_REGS_PARM4(x) ((x)->cx)
> -#define PT_REGS_PARM5(x) ((x)->r8)
> -#define PT_REGS_RET(x) ((x)->sp)
> -#define PT_REGS_FP(x) ((x)->bp)
> -#define PT_REGS_RC(x) ((x)->ax)
> -#define PT_REGS_SP(x) ((x)->sp)
> -#define PT_REGS_IP(x) ((x)->ip)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), di)
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), si)
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), dx)
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), cx)
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), r8)
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), sp)
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), bp)
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), ax)
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), sp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), ip)
> +#define __PT_PARM1_REG di
> +#define __PT_PARM2_REG si
> +#define __PT_PARM3_REG dx
> +#define __PT_PARM4_REG cx
> +#define __PT_PARM5_REG r8
> +#define __PT_RET_REG sp
> +#define __PT_FP_REG bp
> +#define __PT_RC_REG ax
> +#define __PT_SP_REG sp
> +#define __PT_IP_REG ip
>
>  #else
>
>  #ifdef __i386__
> -/* i386 kernel is built with -mregparm=3 */
> -#define PT_REGS_PARM1(x) ((x)->eax)
> -#define PT_REGS_PARM2(x) ((x)->edx)
> -#define PT_REGS_PARM3(x) ((x)->ecx)
> -#define PT_REGS_PARM4(x) 0
> -#define PT_REGS_PARM5(x) 0
> -#define PT_REGS_RET(x) ((x)->esp)
> -#define PT_REGS_FP(x) ((x)->ebp)
> -#define PT_REGS_RC(x) ((x)->eax)
> -#define PT_REGS_SP(x) ((x)->esp)
> -#define PT_REGS_IP(x) ((x)->eip)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), eax)
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), edx)
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), ecx)
> -#define PT_REGS_PARM4_CORE(x) 0
> -#define PT_REGS_PARM5_CORE(x) 0
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), esp)
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), ebp)
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), eax)
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), esp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), eip)
> -
> -#else
>
> -#define PT_REGS_PARM1(x) ((x)->rdi)
> -#define PT_REGS_PARM2(x) ((x)->rsi)
> -#define PT_REGS_PARM3(x) ((x)->rdx)
> -#define PT_REGS_PARM4(x) ((x)->rcx)
> -#define PT_REGS_PARM5(x) ((x)->r8)
> -#define PT_REGS_RET(x) ((x)->rsp)
> -#define PT_REGS_FP(x) ((x)->rbp)
> -#define PT_REGS_RC(x) ((x)->rax)
> -#define PT_REGS_SP(x) ((x)->rsp)
> -#define PT_REGS_IP(x) ((x)->rip)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), rdi)
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), rsi)
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), rdx)
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), rcx)
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), r8)
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), rsp)
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), rbp)
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), rax)
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), rsp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), rip)
> -
> -#endif
> -#endif
> +#define __PT_PARM1_REG eax
> +#define __PT_PARM2_REG edx
> +#define __PT_PARM3_REG ecx
> +/* i386 kernel is built with -mregparm=3 */
> +#define __PT_PARM4_REG __unsupported__
> +#define __PT_PARM5_REG __unsupported__
> +#define __PT_RET_REG esp
> +#define __PT_FP_REG ebp
> +#define __PT_RC_REG eax
> +#define __PT_SP_REG esp
> +#define __PT_IP_REG eip
> +
> +#else /* __i386__ */
> +
> +#define __PT_PARM1_REG rdi
> +#define __PT_PARM2_REG rsi
> +#define __PT_PARM3_REG rdx
> +#define __PT_PARM4_REG rcx
> +#define __PT_PARM5_REG r8
> +#define __PT_RET_REG rsp
> +#define __PT_FP_REG rbp
> +#define __PT_RC_REG rax
> +#define __PT_SP_REG rsp
> +#define __PT_IP_REG rip
> +
> +#endif /* __i386__ */
> +
> +#endif /* __KERNEL__ || __VMLINUX_H__ */
>
>  #elif defined(bpf_target_s390)
>
>  /* s390 provides user_pt_regs instead of struct pt_regs to userspace */
> -struct pt_regs;
> -#define PT_REGS_S390 const volatile user_pt_regs
> -#define PT_REGS_PARM1(x) (((PT_REGS_S390 *)(x))->gprs[2])
> -#define PT_REGS_PARM2(x) (((PT_REGS_S390 *)(x))->gprs[3])
> -#define PT_REGS_PARM3(x) (((PT_REGS_S390 *)(x))->gprs[4])
> -#define PT_REGS_PARM4(x) (((PT_REGS_S390 *)(x))->gprs[5])
> -#define PT_REGS_PARM5(x) (((PT_REGS_S390 *)(x))->gprs[6])
> -#define PT_REGS_RET(x) (((PT_REGS_S390 *)(x))->gprs[14])
> -/* Works only with CONFIG_FRAME_POINTER */
> -#define PT_REGS_FP(x) (((PT_REGS_S390 *)(x))->gprs[11])
> -#define PT_REGS_RC(x) (((PT_REGS_S390 *)(x))->gprs[2])
> -#define PT_REGS_SP(x) (((PT_REGS_S390 *)(x))->gprs[15])
> -#define PT_REGS_IP(x) (((PT_REGS_S390 *)(x))->psw.addr)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[2])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[3])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[4])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[5])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[6])
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[14])
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[11])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[2])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), gprs[15])
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((PT_REGS_S390 *)(x), psw.addr)
> +#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x))
> +#define __PT_PARM1_REG gprs[2]
> +#define __PT_PARM2_REG gprs[3]
> +#define __PT_PARM3_REG gprs[4]
> +#define __PT_PARM4_REG gprs[5]
> +#define __PT_PARM5_REG gprs[6]
> +#define __PT_RET_REG grps[14]
> +#define __PT_FP_REG gprs[11]   /* Works only with CONFIG_FRAME_POINTER */
> +#define __PT_RC_REG gprs[2]
> +#define __PT_SP_REG gprs[15]
> +#define __PT_IP_REG psw.addr
>
>  #elif defined(bpf_target_arm)
>
> -#define PT_REGS_PARM1(x) ((x)->uregs[0])
> -#define PT_REGS_PARM2(x) ((x)->uregs[1])
> -#define PT_REGS_PARM3(x) ((x)->uregs[2])
> -#define PT_REGS_PARM4(x) ((x)->uregs[3])
> -#define PT_REGS_PARM5(x) ((x)->uregs[4])
> -#define PT_REGS_RET(x) ((x)->uregs[14])
> -#define PT_REGS_FP(x) ((x)->uregs[11]) /* Works only with CONFIG_FRAME_POINTER */
> -#define PT_REGS_RC(x) ((x)->uregs[0])
> -#define PT_REGS_SP(x) ((x)->uregs[13])
> -#define PT_REGS_IP(x) ((x)->uregs[12])
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), uregs[0])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), uregs[1])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), uregs[2])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), uregs[3])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), uregs[4])
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), uregs[14])
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), uregs[11])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), uregs[0])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), uregs[13])
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), uregs[12])
> +#define __PT_PARM1_REG uregs[0]
> +#define __PT_PARM2_REG uregs[1]
> +#define __PT_PARM3_REG uregs[2]
> +#define __PT_PARM4_REG uregs[3]
> +#define __PT_PARM5_REG uregs[4]
> +#define __PT_RET_REG uregs[14]
> +#define __PT_FP_REG uregs[11]  /* Works only with CONFIG_FRAME_POINTER */
> +#define __PT_RC_REG uregs[0]
> +#define __PT_SP_REG uregs[13]
> +#define __PT_IP_REG uregs[12]
>
>  #elif defined(bpf_target_arm64)
>
>  /* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */
> -struct pt_regs;
> -#define PT_REGS_ARM64 const volatile struct user_pt_regs
> -#define PT_REGS_PARM1(x) (((PT_REGS_ARM64 *)(x))->regs[0])
> -#define PT_REGS_PARM2(x) (((PT_REGS_ARM64 *)(x))->regs[1])
> -#define PT_REGS_PARM3(x) (((PT_REGS_ARM64 *)(x))->regs[2])
> -#define PT_REGS_PARM4(x) (((PT_REGS_ARM64 *)(x))->regs[3])
> -#define PT_REGS_PARM5(x) (((PT_REGS_ARM64 *)(x))->regs[4])
> -#define PT_REGS_RET(x) (((PT_REGS_ARM64 *)(x))->regs[30])
> -/* Works only with CONFIG_FRAME_POINTER */
> -#define PT_REGS_FP(x) (((PT_REGS_ARM64 *)(x))->regs[29])
> -#define PT_REGS_RC(x) (((PT_REGS_ARM64 *)(x))->regs[0])
> -#define PT_REGS_SP(x) (((PT_REGS_ARM64 *)(x))->sp)
> -#define PT_REGS_IP(x) (((PT_REGS_ARM64 *)(x))->pc)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[0])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[1])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[2])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[3])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[4])
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[30])
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[29])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), regs[0])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), sp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((PT_REGS_ARM64 *)(x), pc)
> +#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x))
> +#define __PT_PARM1_REG regs[0]
> +#define __PT_PARM2_REG regs[1]
> +#define __PT_PARM3_REG regs[2]
> +#define __PT_PARM4_REG regs[3]
> +#define __PT_PARM5_REG regs[4]
> +#define __PT_RET_REG regs[30]
> +#define __PT_FP_REG regs[29]   /* Works only with CONFIG_FRAME_POINTER */
> +#define __PT_RC_REG regs[0]
> +#define __PT_SP_REG sp
> +#define __PT_IP_REG pc
>
>  #elif defined(bpf_target_mips)
>
> -#define PT_REGS_PARM1(x) ((x)->regs[4])
> -#define PT_REGS_PARM2(x) ((x)->regs[5])
> -#define PT_REGS_PARM3(x) ((x)->regs[6])
> -#define PT_REGS_PARM4(x) ((x)->regs[7])
> -#define PT_REGS_PARM5(x) ((x)->regs[8])
> -#define PT_REGS_RET(x) ((x)->regs[31])
> -#define PT_REGS_FP(x) ((x)->regs[30]) /* Works only with CONFIG_FRAME_POINTER */
> -#define PT_REGS_RC(x) ((x)->regs[2])
> -#define PT_REGS_SP(x) ((x)->regs[29])
> -#define PT_REGS_IP(x) ((x)->cp0_epc)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), regs[4])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), regs[5])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), regs[6])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), regs[7])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), regs[8])
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), regs[31])
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((x), regs[30])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), regs[2])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), regs[29])
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), cp0_epc)
> +#define __PT_PARM1_REG regs[4]
> +#define __PT_PARM2_REG regs[5]
> +#define __PT_PARM3_REG regs[6]
> +#define __PT_PARM4_REG regs[7]
> +#define __PT_PARM5_REG regs[8]
> +#define __PT_RET_REG regs[31]
> +#define __PT_FP_REG regs[30]   /* Works only with CONFIG_FRAME_POINTER */
> +#define __PT_RC_REG regs[2]
> +#define __PT_SP_REG regs[29]
> +#define __PT_IP_REG cp0_epc
>
>  #elif defined(bpf_target_powerpc)
>
> -#define PT_REGS_PARM1(x) ((x)->gpr[3])
> -#define PT_REGS_PARM2(x) ((x)->gpr[4])
> -#define PT_REGS_PARM3(x) ((x)->gpr[5])
> -#define PT_REGS_PARM4(x) ((x)->gpr[6])
> -#define PT_REGS_PARM5(x) ((x)->gpr[7])
> -#define PT_REGS_RC(x) ((x)->gpr[3])
> -#define PT_REGS_SP(x) ((x)->sp)
> -#define PT_REGS_IP(x) ((x)->nip)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), gpr[3])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), gpr[4])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), gpr[5])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), gpr[6])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), gpr[7])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), gpr[3])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), sp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), nip)
> +#define __PT_PARM1_REG gpr[3]
> +#define __PT_PARM2_REG gpr[4]
> +#define __PT_PARM3_REG gpr[5]
> +#define __PT_PARM4_REG gpr[6]
> +#define __PT_PARM5_REG gpr[7]
> +#define __PT_RET_REG regs[31]
> +#define __PT_FP_REG __unsupported__
> +#define __PT_RC_REG gpr[3]
> +#define __PT_SP_REG sp
> +#define __PT_IP_REG nip
>
>  #elif defined(bpf_target_sparc)
>
> -#define PT_REGS_PARM1(x) ((x)->u_regs[UREG_I0])
> -#define PT_REGS_PARM2(x) ((x)->u_regs[UREG_I1])
> -#define PT_REGS_PARM3(x) ((x)->u_regs[UREG_I2])
> -#define PT_REGS_PARM4(x) ((x)->u_regs[UREG_I3])
> -#define PT_REGS_PARM5(x) ((x)->u_regs[UREG_I4])
> -#define PT_REGS_RET(x) ((x)->u_regs[UREG_I7])
> -#define PT_REGS_RC(x) ((x)->u_regs[UREG_I0])
> -#define PT_REGS_SP(x) ((x)->u_regs[UREG_FP])
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I0])
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I1])
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I2])
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I3])
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I4])
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I7])
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((x), u_regs[UREG_I0])
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((x), u_regs[UREG_FP])
> -
> +#define __PT_PARM1_REG u_regs[UREG_I0]
> +#define __PT_PARM2_REG u_regs[UREG_I1]
> +#define __PT_PARM3_REG u_regs[UREG_I2]
> +#define __PT_PARM4_REG u_regs[UREG_I3]
> +#define __PT_PARM5_REG u_regs[UREG_I4]
> +#define __PT_RET_REG u_regs[UREG_I7]
> +#define __PT_FP_REG __unsupported__
> +#define __PT_RC_REG u_regs[UREG_I0]
> +#define __PT_SP_REG u_regs[UREG_FP]
>  /* Should this also be a bpf_target check for the sparc case? */
>  #if defined(__arch64__)
> -#define PT_REGS_IP(x) ((x)->tpc)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), tpc)
> +#define __PT_IP_REG tpc
>  #else
> -#define PT_REGS_IP(x) ((x)->pc)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((x), pc)
> +#define __PT_IP_REG pc
>  #endif
>
>  #elif defined(bpf_target_riscv)
>
> +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x))
> +#define __PT_PARM1_REG a0
> +#define __PT_PARM2_REG a1
> +#define __PT_PARM3_REG a2
> +#define __PT_PARM4_REG a3
> +#define __PT_PARM5_REG a4
> +#define __PT_RET_REG ra
> +#define __PT_FP_REG fp
> +#define __PT_RC_REG a5
> +#define __PT_SP_REG sp
> +#define __PT_IP_REG epc
> +
> +#endif
> +
> +#if defined(bpf_target_defined)
> +
>  struct pt_regs;
> -#define PT_REGS_RV const volatile struct user_regs_struct
> -#define PT_REGS_PARM1(x) (((PT_REGS_RV *)(x))->a0)
> -#define PT_REGS_PARM2(x) (((PT_REGS_RV *)(x))->a1)
> -#define PT_REGS_PARM3(x) (((PT_REGS_RV *)(x))->a2)
> -#define PT_REGS_PARM4(x) (((PT_REGS_RV *)(x))->a3)
> -#define PT_REGS_PARM5(x) (((PT_REGS_RV *)(x))->a4)
> -#define PT_REGS_RET(x) (((PT_REGS_RV *)(x))->ra)
> -#define PT_REGS_FP(x) (((PT_REGS_RV *)(x))->s5)
> -#define PT_REGS_RC(x) (((PT_REGS_RV *)(x))->a5)
> -#define PT_REGS_SP(x) (((PT_REGS_RV *)(x))->sp)
> -#define PT_REGS_IP(x) (((PT_REGS_RV *)(x))->epc)
> -
> -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a0)
> -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a1)
> -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a2)
> -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a3)
> -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a4)
> -#define PT_REGS_RET_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), ra)
> -#define PT_REGS_FP_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), fp)
> -#define PT_REGS_RC_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), a5)
> -#define PT_REGS_SP_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), sp)
> -#define PT_REGS_IP_CORE(x) BPF_CORE_READ((PT_REGS_RV *)(x), epc)
>
> +/* allow some architecutres to override `struct pt_regs` */
> +#ifndef __PT_REGS_CAST
> +#define __PT_REGS_CAST(x) (x)
>  #endif
>
> +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG)
> +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG)
> +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG)
> +#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG)
> +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG)
> +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG)
> +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG)
> +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG)
> +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG)
> +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG)
> +
> +#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_REG)
> +#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_REG)
> +#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_REG)
> +#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_REG)
> +#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_REG)
> +#define PT_REGS_RET_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RET_REG)
> +#define PT_REGS_FP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_FP_REG)
> +#define PT_REGS_RC_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RC_REG)
> +#define PT_REGS_SP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_SP_REG)
> +#define PT_REGS_IP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_IP_REG)
> +
>  #if defined(bpf_target_powerpc)
> +
>  #define BPF_KPROBE_READ_RET_IP(ip, ctx)                ({ (ip) = (ctx)->link; })
>  #define BPF_KRETPROBE_READ_RET_IP              BPF_KPROBE_READ_RET_IP
> +
>  #elif defined(bpf_target_sparc)
> +
>  #define BPF_KPROBE_READ_RET_IP(ip, ctx)                ({ (ip) = PT_REGS_RET(ctx); })
>  #define BPF_KRETPROBE_READ_RET_IP              BPF_KPROBE_READ_RET_IP
> -#elif defined(bpf_target_defined)
> +
> +#else
> +
>  #define BPF_KPROBE_READ_RET_IP(ip, ctx)                                            \
>         ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); })
>  #define BPF_KRETPROBE_READ_RET_IP(ip, ctx)                                 \
> -       ({ bpf_probe_read_kernel(&(ip), sizeof(ip),                         \
> -                         (void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
> +       ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip))); })
> +
>  #endif
>
> -#if !defined(bpf_target_defined)
> +#else /* defined(bpf_target_defined) */
>
>  #define PT_REGS_PARM1(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; })
>  #define PT_REGS_PARM2(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; })
> @@ -363,7 +290,7 @@ struct pt_regs;
>  #define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; })
>  #define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; })
>
> -#endif /* !defined(bpf_target_defined) */
> +#endif /* defined(bpf_target_defined) */
>
>  #ifndef ___bpf_concat
>  #define ___bpf_concat(a, b) a ## b
> --
> 2.30.2
>




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux