Extending user_pt_regs breaks struct bpf_perf_event_data ABI, so instead of exposing orig_gpr2 through it, create its copy with orig_gpr2 at the end and use it in libbpf. The existing members are copy-pasted, so now there are 3 copies in total. It might be tempting to add a user_pt_regs member to user_pt_regs_v2 instead, however, there is no guarantee that then user_pt_regs_v2.orig_gpr2 would be at the same offset as pt_regs.orig_gpr2. Fixes: 61f88e88f263 ("s390/bpf: Add orig_gpr2 to user_pt_regs") Signed-off-by: Ilya Leoshkevich <iii@xxxxxxxxxxxxx> --- arch/s390/include/asm/ptrace.h | 1 + arch/s390/include/uapi/asm/ptrace.h | 10 ++++++++-- tools/lib/bpf/bpf_tracing.h | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/arch/s390/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h index c8698e643904..1a08f36395e5 100644 --- a/arch/s390/include/asm/ptrace.h +++ b/arch/s390/include/asm/ptrace.h @@ -79,6 +79,7 @@ enum { struct pt_regs { union { user_pt_regs user_regs; + user_pt_regs_v2 user_regs_v2; struct { unsigned long args[1]; psw_t psw; diff --git a/arch/s390/include/uapi/asm/ptrace.h b/arch/s390/include/uapi/asm/ptrace.h index b3dec603f507..b9405b8f0d47 100644 --- a/arch/s390/include/uapi/asm/ptrace.h +++ b/arch/s390/include/uapi/asm/ptrace.h @@ -288,16 +288,22 @@ typedef struct { } s390_regs; /* - * The user_pt_regs structure exports the beginning of + * The user_pt_regs and user_pt_regs_v2 structures export the beginning of * the in-kernel pt_regs structure to user space. */ typedef struct { unsigned long args[1]; psw_t psw; unsigned long gprs[NUM_GPRS]; - unsigned long orig_gpr2; } user_pt_regs; +typedef struct { + unsigned long args[1]; + psw_t psw; + unsigned long gprs[NUM_GPRS]; + unsigned long orig_gpr2; +} user_pt_regs_v2; + /* * Now for the user space program event recording (trace) definitions. * The following structures are used only for the ptrace interface, don't diff --git a/tools/lib/bpf/bpf_tracing.h b/tools/lib/bpf/bpf_tracing.h index cf980e54d331..76abbc5ff2e8 100644 --- a/tools/lib/bpf/bpf_tracing.h +++ b/tools/lib/bpf/bpf_tracing.h @@ -114,8 +114,8 @@ #elif defined(bpf_target_s390) -/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ -#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x)) +/* s390 provides user_pt_regs_v2 instead of struct pt_regs to userspace */ +#define __PT_REGS_CAST(x) ((const user_pt_regs_v2 *)(x)) #define __PT_PARM1_REG gprs[2] #define __PT_PARM1_REG_SYSCALL orig_gpr2 #define __PT_PARM2_REG gprs[3] -- 2.34.1