aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2022-02-09 03:17:45 +0100
committerAndrii Nakryiko <andrii.nakryiko@gmail.com>2022-02-09 09:48:32 -0800
commitf7e08b4a8f24ee23dc596710ff85fbcd2ad6f10f (patch)
tree74172359dfadaa296ab732d0f07a2bad5963cd49
parent9f6e3a7a59894af6ff9221083800556e68ffcd8a (diff)
downloadlibbpf-f7e08b4a8f24ee23dc596710ff85fbcd2ad6f10f.tar.gz
libbpf: Fix accessing the first syscall argument on s390
On s390, the first syscall argument should be accessed via orig_gpr2 (see arch/s390/include/asm/syscall.h). Currently gpr[2] is used instead, leading to bpf_syscall_macro test failure. orig_gpr2 cannot be added to user_pt_regs, since its layout is a part of the ABI. Therefore provide access to it only through PT_REGS_PARM1_CORE_SYSCALL() by using a struct pt_regs flavor. Reported-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20220209021745.2215452-11-iii@linux.ibm.com
-rw-r--r--src/bpf_tracing.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/bpf_tracing.h b/src/bpf_tracing.h
index b645310..eb6eb3b 100644
--- a/src/bpf_tracing.h
+++ b/src/bpf_tracing.h
@@ -118,6 +118,10 @@
#elif defined(bpf_target_s390)
+struct pt_regs___s390 {
+ unsigned long orig_gpr2;
+};
+
/* s390 provides user_pt_regs instead of struct pt_regs to userspace */
#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x))
#define __PT_PARM1_REG gprs[2]
@@ -130,6 +134,8 @@
#define __PT_RC_REG gprs[2]
#define __PT_SP_REG gprs[15]
#define __PT_IP_REG psw.addr
+#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma("GCC error \"use PT_REGS_PARM1_CORE_SYSCALL() instead\""); 0l; })
+#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ((const struct pt_regs___s390 *)(x), orig_gpr2)
#elif defined(bpf_target_arm)