From ee216fdb6e4e41834e2f10e331f8e737333a37f0 Mon Sep 17 00:00:00 2001 From: Mingzheng Xing Date: Mon, 18 Jul 2022 10:34:25 +0000 Subject: [PATCH] riscv:fix user_regs_struct macro issue Fix #4110 . With this patch, running tools/cachestat on riscv64 can get the expected result. Signed-off-by: Mingzheng Xing --- src/cc/export/helpers.h | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/cc/export/helpers.h b/src/cc/export/helpers.h index 71ed8c8a2c94..c02eb46fe49f 100644 --- a/src/cc/export/helpers.h +++ b/src/cc/export/helpers.h @@ -1363,17 +1363,19 @@ int bpf_usdt_readarg_p(int argc, struct pt_regs *ctx, void *buf, u64 len) asm("l #define PT_REGS_SP(x) ((x)->regs[29]) #define PT_REGS_IP(x) ((x)->cp0_epc) #elif defined(bpf_target_riscv64) -#define PT_REGS_PARM1(x) ((x)->a0) -#define PT_REGS_PARM2(x) ((x)->a1) -#define PT_REGS_PARM3(x) ((x)->a2) -#define PT_REGS_PARM4(x) ((x)->a3) -#define PT_REGS_PARM5(x) ((x)->a4) -#define PT_REGS_PARM6(x) ((x)->a5) -#define PT_REGS_RET(x) ((x)->ra) -#define PT_REGS_FP(x) ((x)->s0) /* Works only with CONFIG_FRAME_POINTER */ -#define PT_REGS_RC(x) ((x)->a0) -#define PT_REGS_SP(x) ((x)->sp) -#define PT_REGS_IP(x) ((x)->pc) +/* riscv64 provides struct user_pt_regs instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) +#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->a0) +#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->a1) +#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->a2) +#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->a3) +#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->a4) +#define PT_REGS_PARM6(x) (__PT_REGS_CAST(x)->a5) +#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->ra) +#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->s0) /* Works only with CONFIG_FRAME_POINTER */ +#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->a0) +#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->sp) +#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->pc) #else #error "bcc does not support this platform yet" #endif