aboutsummaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2015-12-10 10:10:13 -0800
committerElliott Hughes <enh@google.com>2015-12-10 10:10:13 -0800
commitf4b2cf666b676496f413064761d44bbd93522dbb (patch)
treea772d2f3d3796fe18f4f014f33d6bd87e25999e0 /linux
parent6967bc2e4b39e3e67a8ff4e75cf6602c34a8d039 (diff)
parentbab4ef4272cd2596c7390b34ea8acc086ee8fdb2 (diff)
downloadstrace-f4b2cf666b676496f413064761d44bbd93522dbb.tar.gz
Merge remote-tracking branch 'strace/master' into HEAD
Change-Id: I65e4a0c7b98d3a813829088e8bcb34ed7d71fa3e
Diffstat (limited to 'linux')
-rw-r--r--linux/32/syscallent.h5
-rw-r--r--linux/64/syscallent.h3
-rw-r--r--linux/aarch64/arch_regs.c1
-rw-r--r--linux/aarch64/errnoent1.h2
-rw-r--r--linux/aarch64/get_error.c15
-rw-r--r--linux/aarch64/get_scno.c36
-rw-r--r--linux/aarch64/get_syscall_args.c14
-rw-r--r--linux/aarch64/ioctls_arch0.h2
-rw-r--r--linux/aarch64/ioctls_arch1.h2
-rw-r--r--linux/aarch64/ioctls_inc0.h2
-rw-r--r--linux/aarch64/ioctls_inc1.h2
-rw-r--r--linux/aarch64/print_pc.c4
-rw-r--r--linux/aarch64/syscallent.h72
-rw-r--r--linux/aarch64/syscallent1.h72
-rw-r--r--linux/alpha/arch_regs.c1
-rw-r--r--linux/alpha/arch_sigreturn.c18
-rw-r--r--linux/alpha/get_error.c14
-rw-r--r--linux/alpha/get_scno.c36
-rw-r--r--linux/alpha/get_syscall_args.c14
-rw-r--r--linux/alpha/get_syscall_result.c10
-rw-r--r--linux/alpha/print_pc.c6
-rw-r--r--linux/alpha/syscallent.h27
-rw-r--r--linux/arc/arch_regs.c1
-rw-r--r--linux/arc/get_error.c14
-rw-r--r--linux/arc/get_scno.c8
-rw-r--r--linux/arc/get_syscall_args.c14
-rw-r--r--linux/arc/print_pc.c1
-rw-r--r--linux/arch_sigreturn.c5
-rw-r--r--linux/arm/arch_regs.c1
-rw-r--r--linux/arm/arch_sigreturn.c22
-rw-r--r--linux/arm/get_error.c14
-rw-r--r--linux/arm/get_scno.c80
-rw-r--r--linux/arm/get_syscall_args.c18
-rw-r--r--linux/arm/print_pc.c1
-rw-r--r--linux/arm/syscallent.h17
-rw-r--r--linux/asm_stat.h2
-rw-r--r--linux/avr32/arch_regs.c1
-rw-r--r--linux/avr32/get_error.c14
-rw-r--r--linux/avr32/get_scno.c8
-rw-r--r--linux/avr32/get_syscall_args.c18
-rw-r--r--linux/avr32/print_pc.c1
-rw-r--r--linux/avr32/syscallent.h49
-rw-r--r--linux/bfin/arch_regs.c1
-rw-r--r--linux/bfin/get_error.c14
-rw-r--r--linux/bfin/get_scno.c8
-rw-r--r--linux/bfin/get_syscall_args.c17
-rw-r--r--linux/bfin/get_syscall_result.c7
-rw-r--r--linux/bfin/print_pc.c6
-rw-r--r--linux/bfin/syscallent.h19
-rw-r--r--linux/crisv10/arch_regs.c1
-rw-r--r--linux/crisv10/arch_sigreturn.c22
-rw-r--r--linux/crisv10/get_error.c14
-rw-r--r--linux/crisv10/get_scno.c8
-rw-r--r--linux/crisv10/get_syscall_args.c22
-rw-r--r--linux/crisv10/get_syscall_result.c7
-rw-r--r--linux/crisv10/print_pc.c6
-rw-r--r--linux/crisv32/arch_regs.c1
-rw-r--r--linux/crisv32/print_pc.c6
-rw-r--r--linux/dummy.h34
-rw-r--r--linux/hppa/arch_regs.c1
-rw-r--r--linux/hppa/get_error.c14
-rw-r--r--linux/hppa/get_scno.c8
-rw-r--r--linux/hppa/get_syscall_args.c14
-rw-r--r--linux/hppa/get_syscall_result.c7
-rw-r--r--linux/hppa/print_pc.c6
-rw-r--r--linux/hppa/syscallent.h15
-rw-r--r--linux/i386/arch_regs.c1
-rw-r--r--linux/i386/arch_sigreturn.c40
-rw-r--r--linux/i386/get_error.c14
-rw-r--r--linux/i386/get_scno.c8
-rw-r--r--linux/i386/get_syscall_args.c18
-rw-r--r--linux/i386/print_pc.c1
-rw-r--r--linux/i386/syscallent.h39
-rw-r--r--linux/ia64/arch_regs.c1
-rw-r--r--linux/ia64/arch_sigreturn.c18
-rw-r--r--linux/ia64/get_error.c30
-rw-r--r--linux/ia64/get_scno.c10
-rw-r--r--linux/ia64/get_syscall_args.c45
-rw-r--r--linux/ia64/print_pc.c1
-rw-r--r--linux/ia64/syscallent.h223
-rw-r--r--linux/m68k/arch_regs.c1
-rw-r--r--linux/m68k/arch_sigreturn.c36
-rw-r--r--linux/m68k/get_error.c14
-rw-r--r--linux/m68k/get_scno.c8
-rw-r--r--linux/m68k/get_syscall_args.c14
-rw-r--r--linux/m68k/get_syscall_result.c7
-rw-r--r--linux/m68k/print_pc.c6
-rw-r--r--linux/m68k/syscallent.h40
-rw-r--r--linux/metag/arch_regs.c1
-rw-r--r--linux/metag/get_error.c16
-rw-r--r--linux/metag/get_scno.c8
-rw-r--r--linux/metag/get_syscall_args.c15
-rw-r--r--linux/metag/print_pc.c1
-rw-r--r--linux/microblaze/arch_regs.c1
-rw-r--r--linux/microblaze/arch_sigreturn.c22
-rw-r--r--linux/microblaze/get_error.c14
-rw-r--r--linux/microblaze/get_scno.c8
-rw-r--r--linux/microblaze/get_syscall_args.c14
-rw-r--r--linux/microblaze/get_syscall_result.c7
-rw-r--r--linux/microblaze/print_pc.c6
-rw-r--r--linux/microblaze/syscallent.h19
-rw-r--r--linux/mips/arch_regs.c1
-rw-r--r--linux/mips/arch_sigreturn.c40
-rw-r--r--linux/mips/get_error.c21
-rw-r--r--linux/mips/get_scno.c20
-rw-r--r--linux/mips/get_syscall_args.c13
-rw-r--r--linux/mips/print_pc.c1
-rw-r--r--linux/mips/syscallent-n32.h17
-rw-r--r--linux/mips/syscallent-n64.h15
-rw-r--r--linux/mips/syscallent-o32.h15
-rw-r--r--linux/nios2/arch_regs.c1
-rw-r--r--linux/nios2/get_error.c28
-rw-r--r--linux/nios2/get_scno.c8
-rw-r--r--linux/nios2/get_syscall_args.c18
-rw-r--r--linux/nios2/print_pc.c1
-rw-r--r--linux/or1k/arch_regs.c1
-rw-r--r--linux/or1k/get_error.c14
-rw-r--r--linux/or1k/get_scno.c8
-rw-r--r--linux/or1k/get_syscall_args.c18
-rw-r--r--linux/or1k/print_pc.c1
-rw-r--r--linux/powerpc/arch_regs.c1
-rw-r--r--linux/powerpc/arch_sigreturn.c36
-rw-r--r--linux/powerpc/get_error.c14
-rw-r--r--linux/powerpc/get_scno.c8
-rw-r--r--linux/powerpc/get_syscall_args.c18
-rw-r--r--linux/powerpc/print_pc.c1
-rw-r--r--linux/powerpc/syscallent.h38
-rw-r--r--linux/powerpc64/arch_regs.c1
-rw-r--r--linux/powerpc64/get_scno.c26
-rw-r--r--linux/powerpc64/print_pc.c1
-rw-r--r--linux/powerpc64/syscallent.h407
-rw-r--r--linux/s390/arch_regs.c1
-rw-r--r--linux/s390/arch_sigreturn.c24
-rw-r--r--linux/s390/get_error.c14
-rw-r--r--linux/s390/get_scno.c8
-rw-r--r--linux/s390/get_syscall_args.c18
-rw-r--r--linux/s390/print_pc.c1
-rw-r--r--linux/s390/syscallent.h32
-rw-r--r--linux/s390x/arch_regs.c1
-rw-r--r--linux/s390x/print_pc.c1
-rw-r--r--linux/s390x/syscallent.h28
-rw-r--r--linux/sh/arch_regs.c1
-rw-r--r--linux/sh/get_error.c14
-rw-r--r--linux/sh/get_scno.c40
-rw-r--r--linux/sh/get_syscall_args.c27
-rw-r--r--linux/sh/get_syscall_result.c9
-rw-r--r--linux/sh/print_pc.c6
-rw-r--r--linux/sh/syscallent.h20
-rw-r--r--linux/sh64/arch_regs.c1
-rw-r--r--linux/sh64/get_error.c14
-rw-r--r--linux/sh64/get_scno.c12
-rw-r--r--linux/sh64/get_syscall_args.c19
-rw-r--r--linux/sh64/get_syscall_result.c9
-rw-r--r--linux/sh64/print_pc.c6
-rw-r--r--linux/sh64/syscallent.h22
-rw-r--r--linux/sparc/arch_regs.c1
-rw-r--r--linux/sparc/arch_sigreturn.c36
-rw-r--r--linux/sparc/get_error.c14
-rw-r--r--linux/sparc/get_scno.c8
-rw-r--r--linux/sparc/get_syscall_args.c18
-rw-r--r--linux/sparc/print_pc.c1
-rw-r--r--linux/sparc/syscallent.h17
-rw-r--r--linux/sparc64/arch_regs.c1
-rw-r--r--linux/sparc64/get_error.c14
-rw-r--r--linux/sparc64/get_scno.c42
-rw-r--r--linux/sparc64/print_pc.c1
-rw-r--r--linux/tile/arch_regs.c1
-rw-r--r--linux/tile/arch_sigreturn.c18
-rw-r--r--linux/tile/get_error.c26
-rw-r--r--linux/tile/get_scno.c23
-rw-r--r--linux/tile/get_syscall_args.c18
-rw-r--r--linux/tile/print_pc.c1
-rw-r--r--linux/x32/arch_regs.c1
-rw-r--r--linux/x32/asm_stat.h47
-rw-r--r--linux/x32/print_pc.c1
-rw-r--r--linux/x32/syscallent.h15
-rw-r--r--linux/x86_64/arch_regs.c1
-rw-r--r--linux/x86_64/arch_sigreturn.c34
-rw-r--r--linux/x86_64/get_error.c44
-rw-r--r--linux/x86_64/get_scno.c186
-rw-r--r--linux/x86_64/get_syscall_args.c58
-rw-r--r--linux/x86_64/getregs_old.c9
-rw-r--r--linux/x86_64/print_pc.c4
-rw-r--r--linux/x86_64/syscallent.h13
-rw-r--r--linux/xtensa/arch_regs.c1
-rw-r--r--linux/xtensa/get_error.c14
-rw-r--r--linux/xtensa/get_scno.c8
-rw-r--r--linux/xtensa/get_syscall_args.c25
-rw-r--r--linux/xtensa/get_syscall_result.c7
-rw-r--r--linux/xtensa/print_pc.c6
-rw-r--r--linux/xtensa/syscallent.h18
191 files changed, 2173 insertions, 1291 deletions
diff --git a/linux/32/syscallent.h b/linux/32/syscallent.h
index f3731cb30..5f997e720 100644
--- a/linux/32/syscallent.h
+++ b/linux/32/syscallent.h
@@ -26,7 +26,7 @@
[ 22] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[ 23] = { 1, TD, SEN(dup), "dup" },
[ 24] = { 3, TD, SEN(dup3), "dup3" },
-[ 25] = { 3, TD, SEN(fcntl), "fcntl64" },
+[ 25] = { 3, TD, SEN(fcntl64), "fcntl64" },
[ 26] = { 1, TD, SEN(inotify_init1), "inotify_init1" },
[ 27] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
[ 28] = { 2, TD, SEN(inotify_rm_watch), "inotify_rm_watch" },
@@ -272,6 +272,9 @@
[279] = { 2, TD, SEN(memfd_create), "memfd_create", },
[280] = { 3, TD, SEN(bpf), "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[282] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[283] = { 2, 0, SEN(membarrier), "membarrier", },
+[284] = { 3, TM, SEN(mlock2), "mlock2" },
#undef ARCH_mmap
#undef ARCH_WANT_SYNC_FILE_RANGE2
diff --git a/linux/64/syscallent.h b/linux/64/syscallent.h
index 84c201a73..ec75d3cb8 100644
--- a/linux/64/syscallent.h
+++ b/linux/64/syscallent.h
@@ -265,3 +265,6 @@
[279] = { 2, TD, SEN(memfd_create), "memfd_create", },
[280] = { 3, TD, SEN(bpf), "bpf", },
[281] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[282] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[283] = { 2, 0, SEN(membarrier), "membarrier", },
+[284] = { 3, TM, SEN(mlock2), "mlock2" },
diff --git a/linux/aarch64/arch_regs.c b/linux/aarch64/arch_regs.c
index 3b9c2f641..78b747089 100644
--- a/linux/aarch64/arch_regs.c
+++ b/linux/aarch64/arch_regs.c
@@ -35,3 +35,4 @@ static struct iovec aarch64_io = {
#define ARCH_REGS_FOR_GETREGSET arm_regs_union
#define ARCH_IOVEC_FOR_GETREGSET aarch64_io
+#define ARCH_PC_REG ((aarch64_io.iov_len == sizeof(arm_regs)) ? arm_regs.ARM_pc : aarch64_regs.pc)
diff --git a/linux/aarch64/errnoent1.h b/linux/aarch64/errnoent1.h
index babc7f2f1..a0394d45b 100644
--- a/linux/aarch64/errnoent1.h
+++ b/linux/aarch64/errnoent1.h
@@ -1,2 +1,2 @@
-/* Native AArch64 */
+/* ARM personality */
#include "errnoent.h"
diff --git a/linux/aarch64/get_error.c b/linux/aarch64/get_error.c
index 7dd67790f..a3aa12727 100644
--- a/linux/aarch64/get_error.c
+++ b/linux/aarch64/get_error.c
@@ -1,10 +1,19 @@
-if (tcp->currpers == 1) {
+#define get_error arm_get_error
+#include "arm/get_error.c"
+#undef get_error
+
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (tcp->currpers == 1) {
+ arm_get_error(tcp, check_errno);
+ return;
+ }
+
if (check_errno && is_negated_errno(aarch64_regs.regs[0])) {
tcp->u_rval = -1;
tcp->u_error = -aarch64_regs.regs[0];
} else {
tcp->u_rval = aarch64_regs.regs[0];
}
-} else {
-#include "arm/get_error.c"
}
diff --git a/linux/aarch64/get_scno.c b/linux/aarch64/get_scno.c
index 610b38d76..c0fd48223 100644
--- a/linux/aarch64/get_scno.c
+++ b/linux/aarch64/get_scno.c
@@ -1,14 +1,24 @@
-switch (aarch64_io.iov_len) {
- case sizeof(aarch64_regs):
- /* We are in 64-bit mode */
- scno = aarch64_regs.regs[8];
- update_personality(tcp, 1);
- break;
- case sizeof(arm_regs):
- /* We are in 32-bit mode */
- /* Note: we don't support OABI, unlike 32-bit ARM build */
- scno = arm_regs.ARM_r7;
- scno = shuffle_scno(scno);
- update_personality(tcp, 0);
- break;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ long scno = 0;
+
+ switch (aarch64_io.iov_len) {
+ case sizeof(aarch64_regs):
+ /* We are in 64-bit mode */
+ scno = aarch64_regs.regs[8];
+ update_personality(tcp, 0);
+ break;
+ case sizeof(arm_regs):
+ /* We are in 32-bit mode */
+ /* Note: we don't support OABI, unlike 32-bit ARM build */
+ scno = arm_regs.ARM_r7;
+ scno = shuffle_scno(scno);
+ update_personality(tcp, 1);
+ break;
+ }
+
+ tcp->scno = scno;
+ return 1;
}
diff --git a/linux/aarch64/get_syscall_args.c b/linux/aarch64/get_syscall_args.c
index 41ce8b448..ea6e497dc 100644
--- a/linux/aarch64/get_syscall_args.c
+++ b/linux/aarch64/get_syscall_args.c
@@ -1,10 +1,18 @@
-if (tcp->currpers == 1) {
+#define get_syscall_args arm_get_syscall_args
+#include "arm/get_syscall_args.c"
+#undef get_syscall_args
+
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ if (tcp->currpers == 1)
+ return arm_get_syscall_args(tcp);
tcp->u_arg[0] = aarch64_regs.regs[0];
tcp->u_arg[1] = aarch64_regs.regs[1];
tcp->u_arg[2] = aarch64_regs.regs[2];
tcp->u_arg[3] = aarch64_regs.regs[3];
tcp->u_arg[4] = aarch64_regs.regs[4];
tcp->u_arg[5] = aarch64_regs.regs[5];
-} else {
-#include "arm/get_syscall_args.c"
+ return 1;
}
diff --git a/linux/aarch64/ioctls_arch0.h b/linux/aarch64/ioctls_arch0.h
index b722d22b4..6a674ccd2 100644
--- a/linux/aarch64/ioctls_arch0.h
+++ b/linux/aarch64/ioctls_arch0.h
@@ -1 +1 @@
-#include "arm/ioctls_arch0.h"
+/* Generated by ioctls_gen.sh from definitions found in $linux/arch/arm64/include/ tree. */
diff --git a/linux/aarch64/ioctls_arch1.h b/linux/aarch64/ioctls_arch1.h
index 6a674ccd2..b722d22b4 100644
--- a/linux/aarch64/ioctls_arch1.h
+++ b/linux/aarch64/ioctls_arch1.h
@@ -1 +1 @@
-/* Generated by ioctls_gen.sh from definitions found in $linux/arch/arm64/include/ tree. */
+#include "arm/ioctls_arch0.h"
diff --git a/linux/aarch64/ioctls_inc0.h b/linux/aarch64/ioctls_inc0.h
index 46c11b11f..f9939faa4 100644
--- a/linux/aarch64/ioctls_inc0.h
+++ b/linux/aarch64/ioctls_inc0.h
@@ -1 +1 @@
-#include "arm/ioctls_inc0.h"
+#include "64/ioctls_inc.h"
diff --git a/linux/aarch64/ioctls_inc1.h b/linux/aarch64/ioctls_inc1.h
index f9939faa4..46c11b11f 100644
--- a/linux/aarch64/ioctls_inc1.h
+++ b/linux/aarch64/ioctls_inc1.h
@@ -1 +1 @@
-#include "64/ioctls_inc.h"
+#include "arm/ioctls_inc0.h"
diff --git a/linux/aarch64/print_pc.c b/linux/aarch64/print_pc.c
deleted file mode 100644
index 23c0e5cbb..000000000
--- a/linux/aarch64/print_pc.c
+++ /dev/null
@@ -1,4 +0,0 @@
-if (aarch64_io.iov_len == sizeof(arm_regs))
- tprintf(fmt, (unsigned long) arm_regs.ARM_pc);
-else
- tprintf(fmt, (unsigned long) aarch64_regs.pc);
diff --git a/linux/aarch64/syscallent.h b/linux/aarch64/syscallent.h
index 1b892be03..286e0cb37 100644
--- a/linux/aarch64/syscallent.h
+++ b/linux/aarch64/syscallent.h
@@ -1 +1,71 @@
-#include "../arm/syscallent.h"
+#include "64/syscallent.h"
+
+/* Arch-specific block, not used on AArch64 */
+[244 ... 259] = { },
+
+/* Quote from asm-generic/unistd.h:
+ *
+ * All syscalls below here should go away really,
+ * these are provided for both review and as a porting
+ * help for the C library version.
+ *
+ * Last chance: are any of these important enough to
+ * enable by default?
+ */
+
+[1024] = { 3, TD|TF, SEN(open), "open" },
+[1025] = { 2, TF, SEN(link), "link" },
+[1026] = { 1, TF, SEN(unlink), "unlink" },
+[1027] = { 3, TF, SEN(mknod), "mknod" },
+[1028] = { 2, TF, SEN(chmod), "chmod" },
+[1029] = { 3, TF, SEN(chown), "chown" },
+[1030] = { 2, TF, SEN(mkdir), "mkdir" },
+[1031] = { 1, TF, SEN(rmdir), "rmdir" },
+[1032] = { 3, TF, SEN(chown), "lchown" },
+[1033] = { 2, TF, SEN(access), "access" },
+[1034] = { 2, TF, SEN(rename), "rename" },
+[1035] = { 3, TF, SEN(readlink), "readlink" },
+[1036] = { 2, TF, SEN(symlink), "symlink" },
+[1037] = { 2, TF, SEN(utimes), "utimes" },
+[1038] = { 2, TF, SEN(stat), "stat" },
+[1039] = { 2, TF, SEN(lstat), "lstat" },
+[1040] = { 1, TD, SEN(pipe), "pipe" },
+[1041] = { 2, TD, SEN(dup2), "dup2" },
+[1042] = { 1, TD, SEN(epoll_create), "epoll_create" },
+[1043] = { 0, TD, SEN(inotify_init), "inotify_init" },
+[1044] = { 1, TD, SEN(eventfd), "eventfd" },
+[1045] = { 3, TD|TS, SEN(signalfd), "signalfd" },
+[1046] = { 4, TD|TN, SEN(sendfile64), "sendfile" },
+[1047] = { 2, TD, SEN(ftruncate), "ftruncate" },
+[1048] = { 2, TF, SEN(truncate), "truncate" },
+[1049] = { 2, TF, SEN(stat), "stat" },
+[1050] = { 2, TF, SEN(lstat), "lstat" },
+[1051] = { 2, TD, SEN(fstat), "fstat" },
+[1052] = { 3, TD, SEN(fcntl), "fcntl" },
+[1053] = { 4, TD, SEN(fadvise64), "fadvise64" },
+[1054] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[1055] = { 2, TD, SEN(fstatfs), "fstatfs" },
+[1056] = { 2, TF, SEN(statfs), "statfs" },
+[1057] = { 3, TD, SEN(lseek), "lseek" },
+[1058] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
+[1059] = { 1, 0, SEN(alarm), "alarm" },
+[1060] = { 0, 0, SEN(getpgrp), "getpgrp" },
+[1061] = { 0, TS, SEN(pause), "pause" },
+[1062] = { 1, 0, SEN(time), "time" },
+[1063] = { 2, TF, SEN(utime), "utime" },
+[1064] = { 2, TD|TF, SEN(creat), "creat" },
+[1065] = { 3, TD, SEN(getdents), "getdents" },
+[1066] = { 3, TD|TF, SEN(futimesat), "futimesat" },
+[1067] = { 5, TD, SEN(select), "select" },
+[1068] = { 3, TD, SEN(poll), "poll" },
+[1069] = { 4, TD, SEN(epoll_wait), "epoll_wait" },
+[1070] = { 2, 0, SEN(ustat), "ustat" },
+[1071] = { 0, TP, SEN(vfork), "vfork" },
+[1072] = { 4, TP, SEN(wait4), "wait4" },
+[1073] = { 6, TN, SEN(recv), "recv" },
+[1074] = { 4, TN, SEN(send), "send" },
+[1075] = { 2, 0, SEN(bdflush), "bdflush" },
+[1076] = { 1, TF, SEN(umount), "umount" },
+[1077] = { 1, TF, SEN(uselib), "uselib" },
+[1078] = { 1, 0, SEN(sysctl), "sysctl" },
+[1079] = { 0, TP, SEN(fork), "fork" },
diff --git a/linux/aarch64/syscallent1.h b/linux/aarch64/syscallent1.h
index 286e0cb37..1b892be03 100644
--- a/linux/aarch64/syscallent1.h
+++ b/linux/aarch64/syscallent1.h
@@ -1,71 +1 @@
-#include "64/syscallent.h"
-
-/* Arch-specific block, not used on AArch64 */
-[244 ... 259] = { },
-
-/* Quote from asm-generic/unistd.h:
- *
- * All syscalls below here should go away really,
- * these are provided for both review and as a porting
- * help for the C library version.
- *
- * Last chance: are any of these important enough to
- * enable by default?
- */
-
-[1024] = { 3, TD|TF, SEN(open), "open" },
-[1025] = { 2, TF, SEN(link), "link" },
-[1026] = { 1, TF, SEN(unlink), "unlink" },
-[1027] = { 3, TF, SEN(mknod), "mknod" },
-[1028] = { 2, TF, SEN(chmod), "chmod" },
-[1029] = { 3, TF, SEN(chown), "chown" },
-[1030] = { 2, TF, SEN(mkdir), "mkdir" },
-[1031] = { 1, TF, SEN(rmdir), "rmdir" },
-[1032] = { 3, TF, SEN(chown), "lchown" },
-[1033] = { 2, TF, SEN(access), "access" },
-[1034] = { 2, TF, SEN(rename), "rename" },
-[1035] = { 3, TF, SEN(readlink), "readlink" },
-[1036] = { 2, TF, SEN(symlink), "symlink" },
-[1037] = { 2, TF, SEN(utimes), "utimes" },
-[1038] = { 2, TF, SEN(stat), "stat" },
-[1039] = { 2, TF, SEN(lstat), "lstat" },
-[1040] = { 1, TD, SEN(pipe), "pipe" },
-[1041] = { 2, TD, SEN(dup2), "dup2" },
-[1042] = { 1, TD, SEN(epoll_create), "epoll_create" },
-[1043] = { 0, TD, SEN(inotify_init), "inotify_init" },
-[1044] = { 1, TD, SEN(eventfd), "eventfd" },
-[1045] = { 3, TD|TS, SEN(signalfd), "signalfd" },
-[1046] = { 4, TD|TN, SEN(sendfile64), "sendfile" },
-[1047] = { 2, TD, SEN(ftruncate), "ftruncate" },
-[1048] = { 2, TF, SEN(truncate), "truncate" },
-[1049] = { 2, TF, SEN(stat), "stat" },
-[1050] = { 2, TF, SEN(lstat), "lstat" },
-[1051] = { 2, TD, SEN(fstat), "fstat" },
-[1052] = { 3, TD, SEN(fcntl), "fcntl" },
-[1053] = { 4, TD, SEN(fadvise64), "fadvise64" },
-[1054] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
-[1055] = { 2, TD, SEN(fstatfs), "fstatfs" },
-[1056] = { 2, TF, SEN(statfs), "statfs" },
-[1057] = { 3, TD, SEN(lseek), "lseek" },
-[1058] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
-[1059] = { 1, 0, SEN(alarm), "alarm" },
-[1060] = { 0, 0, SEN(getpgrp), "getpgrp" },
-[1061] = { 0, TS, SEN(pause), "pause" },
-[1062] = { 1, 0, SEN(time), "time" },
-[1063] = { 2, TF, SEN(utime), "utime" },
-[1064] = { 2, TD|TF, SEN(creat), "creat" },
-[1065] = { 3, TD, SEN(getdents), "getdents" },
-[1066] = { 3, TD|TF, SEN(futimesat), "futimesat" },
-[1067] = { 5, TD, SEN(select), "select" },
-[1068] = { 3, TD, SEN(poll), "poll" },
-[1069] = { 4, TD, SEN(epoll_wait), "epoll_wait" },
-[1070] = { 2, 0, SEN(ustat), "ustat" },
-[1071] = { 0, TP, SEN(vfork), "vfork" },
-[1072] = { 4, TP, SEN(wait4), "wait4" },
-[1073] = { 6, TN, SEN(recv), "recv" },
-[1074] = { 4, TN, SEN(send), "send" },
-[1075] = { 2, 0, SEN(bdflush), "bdflush" },
-[1076] = { 1, TF, SEN(umount), "umount" },
-[1077] = { 1, TF, SEN(uselib), "uselib" },
-[1078] = { 1, 0, SEN(sysctl), "sysctl" },
-[1079] = { 0, TP, SEN(fork), "fork" },
+#include "../arm/syscallent.h"
diff --git a/linux/alpha/arch_regs.c b/linux/alpha/arch_regs.c
index e2783ca40..df1878e2d 100644
--- a/linux/alpha/arch_regs.c
+++ b/linux/alpha/arch_regs.c
@@ -1,2 +1,3 @@
static long alpha_r0;
static long alpha_a3;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/alpha/arch_sigreturn.c b/linux/alpha/arch_sigreturn.c
index b70eb1d73..71a84ef2e 100644
--- a/linux/alpha/arch_sigreturn.c
+++ b/linux/alpha/arch_sigreturn.c
@@ -1,9 +1,13 @@
-long addr;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long addr;
-if (upeek(tcp->pid, REG_FP, &addr) < 0)
- return;
-addr += offsetof(struct sigcontext, sc_mask);
+ if (upeek(tcp->pid, REG_FP, &addr) < 0)
+ return;
+ addr += offsetof(struct sigcontext, sc_mask);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/alpha/get_error.c b/linux/alpha/get_error.c
index 5b615a529..ddf3dae9c 100644
--- a/linux/alpha/get_error.c
+++ b/linux/alpha/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && alpha_a3) {
- tcp->u_rval = -1;
- tcp->u_error = alpha_r0;
-} else {
- tcp->u_rval = alpha_r0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && alpha_a3) {
+ tcp->u_rval = -1;
+ tcp->u_error = alpha_r0;
+ } else {
+ tcp->u_rval = alpha_r0;
+ }
}
diff --git a/linux/alpha/get_scno.c b/linux/alpha/get_scno.c
index bf8c3ada5..fc099216f 100644
--- a/linux/alpha/get_scno.c
+++ b/linux/alpha/get_scno.c
@@ -1,16 +1,26 @@
-if (upeek(tcp->pid, REG_A3, &alpha_a3) < 0)
- return -1;
-if (upeek(tcp->pid, REG_R0, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ long scno = 0;
-/*
- * Do some sanity checks to figure out if it's
- * really a syscall entry
- */
-if (!SCNO_IN_RANGE(scno)) {
- if (alpha_a3 == 0 || alpha_a3 == -1) {
- if (debug_flag)
- error_msg("stray syscall exit: r0 = %ld", scno);
- return 0;
+ if (upeek(tcp->pid, REG_A3, &alpha_a3) < 0)
+ return -1;
+ if (upeek(tcp->pid, REG_R0, &scno) < 0)
+ return -1;
+
+ /*
+ * Do some sanity checks to figure out if it's
+ * really a syscall entry
+ */
+ if (!SCNO_IN_RANGE(scno)) {
+ if (alpha_a3 == 0 || alpha_a3 == -1) {
+ if (debug_flag)
+ error_msg("stray syscall exit: r0 = %ld", scno);
+ return 0;
+ }
}
+
+ tcp->scno = scno;
+ return 1;
}
diff --git a/linux/alpha/get_syscall_args.c b/linux/alpha/get_syscall_args.c
index 7f7d493a7..a3857263d 100644
--- a/linux/alpha/get_syscall_args.c
+++ b/linux/alpha/get_syscall_args.c
@@ -1,5 +1,11 @@
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, REG_A0+i, &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, REG_A0+i, &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/alpha/get_syscall_result.c b/linux/alpha/get_syscall_result.c
index 11e273623..f4c504f15 100644
--- a/linux/alpha/get_syscall_result.c
+++ b/linux/alpha/get_syscall_result.c
@@ -1,4 +1,6 @@
-if (upeek(tcp->pid, REG_A3, &alpha_a3) < 0)
- return -1;
-if (upeek(tcp->pid, REG_R0, &alpha_r0) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return (upeek(tcp->pid, REG_A3, &alpha_a3) < 0 ||
+ upeek(tcp->pid, REG_R0, &alpha_r0) < 0) ? -1 : 0;
+}
diff --git a/linux/alpha/print_pc.c b/linux/alpha/print_pc.c
deleted file mode 100644
index c0232e555..000000000
--- a/linux/alpha/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/alpha/syscallent.h b/linux/alpha/syscallent.h
index 8271c36dd..fd6e1daeb 100644
--- a/linux/alpha/syscallent.h
+++ b/linux/alpha/syscallent.h
@@ -126,7 +126,7 @@
[ 97] = { 3, TN, SEN(socket), "socket" },
[ 98] = { 3, TN, SEN(connect), "connect" },
[ 99] = { 3, TN, SEN(accept), "accept" },
-[100] = { 2, 0, SEN(getpriority), "osf_getpriority" },
+[100] = { 2, 0, SEN(getpriority), "getpriority" },
[101] = { 4, TN, SEN(send), "send" },
[102] = { 4, TN, SEN(recv), "recv" },
[103] = { 0, TS, SEN(sigreturn), "sigreturn" },
@@ -227,7 +227,12 @@
[221] = { },
[222] = { 5, 0, SEN(printargs), "osf_security" }, /*not implemented */
[223] = { 5, 0, SEN(printargs), "osf_kloadcall" }, /*not implemented */
-[224 ... 232] = { },
+[224] = { 5, 0, SEN(printargs), "osf_stat" }, /*not implemented */
+[225] = { 5, 0, SEN(printargs), "osf_lstat" }, /*not implemented */
+[226] = { 5, 0, SEN(printargs), "osf_fstat" }, /*not implemented */
+[227] = { 5, 0, SEN(printargs), "osf_statfs64" }, /*not implemented */
+[228] = { 5, 0, SEN(printargs), "osf_fstatfs64" }, /*not implemented */
+[229 ... 232] = { },
[233] = { 1, 0, SEN(getpgid), "getpgid" },
[234] = { 1, 0, SEN(getsid), "getsid" },
[235] = { 5, TS, SEN(sigaltstack), "sigaltstack" },
@@ -249,8 +254,8 @@
[251] = { 2, 0, SEN(printargs), "osf_usleep_thread" },
[252] = { 5, 0, SEN(printargs), "osf_audcntl" }, /*not implemented */
[253] = { 5, 0, SEN(printargs), "osf_audgen" }, /*not implemented */
-[254] = { 5, 0, SEN(sysfs), "sysfs" },
-[255] = { 5, 0, SEN(printargs), "osf_subsysinfo" }, /*not implemented */
+[254] = { 3, 0, SEN(sysfs), "sysfs" },
+[255] = { 5, 0, SEN(printargs), "osf_subsys_info" }, /*not implemented */
[256] = { 5, 0, SEN(printargs), "osf_getsysinfo" },
[257] = { 5, 0, SEN(printargs), "osf_setsysinfo" },
[258] = { 5, 0, SEN(printargs), "osf_afs_syscall" }, /*not implemented */
@@ -258,10 +263,10 @@
[260] = { 5, 0, SEN(printargs), "osf_memcntl" }, /*not implemented */
[261] = { 5, 0, SEN(printargs), "osf_fdatasync" }, /*not implemented */
[262 ... 299] = { },
-[300] = { 0, 0, SEN(bdflush), "bdflush" },
+[300] = { 2, 0, SEN(bdflush), "bdflush" },
[301] = { 3, 0, SEN(printargs), "sethae" },
[302] = { 5, TF, SEN(mount), "mount" },
-[303] = { 1, 0, SEN(adjtimex), "adjtimex32" },
+[303] = { 1, 0, SEN(adjtimex), "old_adjtimex" },
[304] = { 1, TF, SEN(swapoff), "swapoff" },
[305] = { 3, TD, SEN(getdents), "getdents" },
[306] = { 2, 0, SEN(create_module), "create_module" },
@@ -277,8 +282,8 @@
[316] = { 1, TM, SEN(mlockall), "mlockall" },
[317] = { 0, TM, SEN(munlockall), "munlockall" },
[318] = { 1, 0, SEN(sysinfo), "sysinfo" },
-[319] = { 1, 0, SEN(sysctl), "sysctl" },
-[320] = { 0, 0, SEN(idle), "idle" },
+[319] = { 1, 0, SEN(sysctl), "_sysctl" },
+[320] = { },
[321] = { 1, TF, SEN(umount), "oldumount" },
[322] = { 2, TF, SEN(swapon), "swapon" },
[323] = { 1, 0, SEN(times), "times" },
@@ -307,8 +312,8 @@
[346] = { 5, 0, SEN(printargs), "pciconfig_write" },
[347] = { 5, 0, SEN(query_module), "query_module" },
[348] = { 5, 0, SEN(prctl), "prctl" },
-[349] = { 4, TD, SEN(pread), "pread" },
-[350] = { 4, TD, SEN(pwrite), "pwrite" },
+[349] = { 4, TD, SEN(pread), "pread64" },
+[350] = { 4, TD, SEN(pwrite), "pwrite64" },
[351] = { 0, TS, SEN(rt_sigreturn), "rt_sigreturn" },
[352] = { 5, TS, SEN(rt_sigaction), "rt_sigaction" },
[353] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
@@ -412,7 +417,7 @@
[452] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[453] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[454] = { 3, TD|TF, SEN(futimesat), "futimesat" },
-[455] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[455] = { 4, TD|TF, SEN(newfstatat), "fstatat64" },
[456] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[457] = { 4, TD|TF, SEN(renameat), "renameat" },
[458] = { 5, TD|TF, SEN(linkat), "linkat" },
diff --git a/linux/arc/arch_regs.c b/linux/arc/arch_regs.c
index 0d57ae4e6..18460080e 100644
--- a/linux/arc/arch_regs.c
+++ b/linux/arc/arch_regs.c
@@ -1,2 +1,3 @@
static struct user_regs_struct arc_regs;
#define ARCH_REGS_FOR_GETREGSET arc_regs
+#define ARCH_PC_REG arc_regs.efa
diff --git a/linux/arc/get_error.c b/linux/arc/get_error.c
index 1741c1790..e19debc10 100644
--- a/linux/arc/get_error.c
+++ b/linux/arc/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(arc_regs.scratch.r0)) {
- tcp->u_rval = -1;
- tcp->u_error = -arc_regs.scratch.r0;
-} else {
- tcp->u_rval = arc_regs.scratch.r0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(arc_regs.scratch.r0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -arc_regs.scratch.r0;
+ } else {
+ tcp->u_rval = arc_regs.scratch.r0;
+ }
}
diff --git a/linux/arc/get_scno.c b/linux/arc/get_scno.c
index cc45d4680..d2046b2db 100644
--- a/linux/arc/get_scno.c
+++ b/linux/arc/get_scno.c
@@ -1 +1,7 @@
-scno = arc_regs.scratch.r8;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = arc_regs.scratch.r8;
+ return 1;
+}
diff --git a/linux/arc/get_syscall_args.c b/linux/arc/get_syscall_args.c
index bb003c8d5..4d6ace5c3 100644
--- a/linux/arc/get_syscall_args.c
+++ b/linux/arc/get_syscall_args.c
@@ -1,5 +1,11 @@
-long *arc_args = &arc_regs.scratch.r0;
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ long *arc_args = &arc_regs.scratch.r0;
+ unsigned int i;
-for (i = 0; i < MAX_ARGS; ++i)
- tcp->u_arg[i] = *arc_args--;
+ for (i = 0; i < MAX_ARGS; ++i)
+ tcp->u_arg[i] = *arc_args--;
+ return 1;
+}
diff --git a/linux/arc/print_pc.c b/linux/arc/print_pc.c
deleted file mode 100644
index f904544a4..000000000
--- a/linux/arc/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, arc_regs.efa);
diff --git a/linux/arch_sigreturn.c b/linux/arch_sigreturn.c
index 80ec98485..73a2b103e 100644
--- a/linux/arch_sigreturn.c
+++ b/linux/arch_sigreturn.c
@@ -1 +1,6 @@
#warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture
+
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+}
diff --git a/linux/arm/arch_regs.c b/linux/arm/arch_regs.c
index ca1fb6d96..f5c02f0d7 100644
--- a/linux/arm/arch_regs.c
+++ b/linux/arm/arch_regs.c
@@ -2,3 +2,4 @@ static struct pt_regs arm_regs;
long *const arm_sp_ptr = &arm_regs.ARM_sp;
#define ARCH_REGS_FOR_GETREGS arm_regs
+#define ARCH_PC_REG arm_regs.ARM_pc
diff --git a/linux/arm/arch_sigreturn.c b/linux/arm/arch_sigreturn.c
index 046e19a18..28726a27f 100644
--- a/linux/arm/arch_sigreturn.c
+++ b/linux/arm/arch_sigreturn.c
@@ -1,15 +1,19 @@
+static void
+arch_sigreturn(struct tcb *tcp)
+{
#define SIZEOF_STRUCT_SIGINFO 128
#define SIZEOF_STRUCT_SIGCONTEXT (21 * 4)
#define OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK (5 * 4 + SIZEOF_STRUCT_SIGCONTEXT)
-const long addr =
+ const long addr =
#ifdef AARCH64
- current_personality == 1 ?
- (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO +
- offsetof(struct ucontext, uc_sigmask)) :
+ tcp->currpers == 0 ?
+ (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO +
+ offsetof(struct ucontext, uc_sigmask)) :
#endif
- (*arm_sp_ptr +
- OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ (*arm_sp_ptr +
+ OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/arm/get_error.c b/linux/arm/get_error.c
index d2ae09b10..fa81dd76f 100644
--- a/linux/arm/get_error.c
+++ b/linux/arm/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(arm_regs.ARM_r0)) {
- tcp->u_rval = -1;
- tcp->u_error = -arm_regs.ARM_r0;
-} else {
- tcp->u_rval = arm_regs.ARM_r0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(arm_regs.ARM_r0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -arm_regs.ARM_r0;
+ } else {
+ tcp->u_rval = arm_regs.ARM_r0;
+ }
}
diff --git a/linux/arm/get_scno.c b/linux/arm/get_scno.c
index 6591aa842..d9b6ffc51 100644
--- a/linux/arm/get_scno.c
+++ b/linux/arm/get_scno.c
@@ -1,45 +1,57 @@
-/* Note: we support only 32-bit CPUs, not 26-bit */
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ long scno = 0;
+
+ /* Note: we support only 32-bit CPUs, not 26-bit */
#if !defined(__ARM_EABI__) || ENABLE_ARM_OABI
-if (arm_regs.ARM_cpsr & 0x20) {
- /* Thumb mode */
- goto scno_in_r7;
-}
-/* ARM mode */
-/* Check EABI/OABI by examining SVC insn's low 24 bits */
-errno = 0;
-scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(arm_regs.ARM_pc - 4), NULL);
-if (errno)
- return -1;
-/* EABI syscall convention? */
-if ((unsigned long) scno != 0xef000000) {
- /* No, it's OABI */
- if ((scno & 0x0ff00000) != 0x0f900000) {
- error_msg("pid %d unknown syscall trap 0x%08lx",
- tcp->pid, scno);
+ if (arm_regs.ARM_cpsr & 0x20) {
+ /* Thumb mode */
+ goto scno_in_r7;
+ }
+ /* ARM mode */
+ /* Check EABI/OABI by examining SVC insn's low 24 bits */
+ errno = 0;
+ scno = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *)(arm_regs.ARM_pc - 4), NULL);
+ if (errno)
return -1;
+ /* EABI syscall convention? */
+ if ((unsigned long) scno != 0xef000000) {
+ /* No, it's OABI */
+ if ((scno & 0x0ff00000) != 0x0f900000) {
+ error_msg("pid %d unknown syscall trap 0x%08lx",
+ tcp->pid, scno);
+ return -1;
+ }
+ /* Fixup the syscall number */
+ scno &= 0x000fffff;
+ } else {
+ scno_in_r7:
+ scno = arm_regs.ARM_r7;
}
- /* Fixup the syscall number */
- scno &= 0x000fffff;
-} else {
-scno_in_r7:
- scno = arm_regs.ARM_r7;
-}
#else /* __ARM_EABI__ || !ENABLE_ARM_OABI */
-scno = arm_regs.ARM_r7;
+ scno = arm_regs.ARM_r7;
#endif
-scno = shuffle_scno(scno);
+ scno = shuffle_scno(scno);
+
+ /*
+ * Do some sanity checks to figure out
+ * whether it's really a syscall entry.
+ */
+ if (arm_regs.ARM_ip && !SCNO_IN_RANGE(scno)) {
+ if (debug_flag)
+ error_msg("pid %d stray syscall exit:"
+ " ARM_ip = %ld, scno = %ld",
+ tcp->pid, arm_regs.ARM_ip,
+ shuffle_scno(scno));
+ return 0;
+ }
-/*
- * Do some sanity checks to figure out
- * whether it's really a syscall entry.
- */
-if (arm_regs.ARM_ip && !SCNO_IN_RANGE(scno)) {
- if (debug_flag)
- error_msg("pid %d stray syscall exit: ARM_ip = %ld, scno = %ld",
- tcp->pid, arm_regs.ARM_ip, shuffle_scno(scno));
- return 0;
+ tcp->scno = scno;
+ return 1;
}
diff --git a/linux/arm/get_syscall_args.c b/linux/arm/get_syscall_args.c
index 1bd4faf20..6be175019 100644
--- a/linux/arm/get_syscall_args.c
+++ b/linux/arm/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = arm_regs.uregs[0];
-tcp->u_arg[1] = arm_regs.uregs[1];
-tcp->u_arg[2] = arm_regs.uregs[2];
-tcp->u_arg[3] = arm_regs.uregs[3];
-tcp->u_arg[4] = arm_regs.uregs[4];
-tcp->u_arg[5] = arm_regs.uregs[5];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = arm_regs.uregs[0];
+ tcp->u_arg[1] = arm_regs.uregs[1];
+ tcp->u_arg[2] = arm_regs.uregs[2];
+ tcp->u_arg[3] = arm_regs.uregs[3];
+ tcp->u_arg[4] = arm_regs.uregs[4];
+ tcp->u_arg[5] = arm_regs.uregs[5];
+ return 1;
+}
diff --git a/linux/arm/print_pc.c b/linux/arm/print_pc.c
deleted file mode 100644
index b9d9622f5..000000000
--- a/linux/arm/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, arm_regs.ARM_pc);
diff --git a/linux/arm/syscallent.h b/linux/arm/syscallent.h
index d0b680fa5..5538dfed6 100644
--- a/linux/arm/syscallent.h
+++ b/linux/arm/syscallent.h
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -214,8 +214,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[192] = { 6, TD|TM|SI, SEN(mmap_4koff), "mmap2" },
@@ -247,7 +247,7 @@
[218] = { 2, TF, SEN(pivotroot), "pivot_root" },
[219] = { 3, TM, SEN(mincore), "mincore" },
[220] = { 3, TM, SEN(madvise), "madvise" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
[222 ... 223] = { },
[224] = { 0, 0, SEN(gettid), "gettid" },
[225] = { 5, TD, SEN(readahead), "readahead" },
@@ -412,7 +412,10 @@
[385] = { 2, TD, SEN(memfd_create), "memfd_create", },
[386] = { 3, TD, SEN(bpf), "bpf", },
[387] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[388 ... 399] = { },
+[388] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[389] = { 2, 0, SEN(membarrier), "membarrier", },
+[390] = { 3, TM, SEN(mlock2), "mlock2" },
+[391 ... 399] = { },
#ifdef __ARM_EABI__
# define ARM_FIRST_SHUFFLED_SYSCALL 400
diff --git a/linux/asm_stat.h b/linux/asm_stat.h
new file mode 100644
index 000000000..c941f22d3
--- /dev/null
+++ b/linux/asm_stat.h
@@ -0,0 +1,2 @@
+#include "kernel_types.h"
+#include <asm/stat.h>
diff --git a/linux/avr32/arch_regs.c b/linux/avr32/arch_regs.c
index aab03389c..8b52a8d0e 100644
--- a/linux/avr32/arch_regs.c
+++ b/linux/avr32/arch_regs.c
@@ -1,2 +1,3 @@
static struct pt_regs avr32_regs;
#define ARCH_REGS_FOR_GETREGS avr32_regs
+#define ARCH_PC_REG avr32_regs.pc
diff --git a/linux/avr32/get_error.c b/linux/avr32/get_error.c
index ef445844b..75e7f67f6 100644
--- a/linux/avr32/get_error.c
+++ b/linux/avr32/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(avr32_regs.r12)) {
- tcp->u_rval = -1;
- tcp->u_error = -avr32_regs.r12;
-} else {
- tcp->u_rval = avr32_regs.r12;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(avr32_regs.r12)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -avr32_regs.r12;
+ } else {
+ tcp->u_rval = avr32_regs.r12;
+ }
}
diff --git a/linux/avr32/get_scno.c b/linux/avr32/get_scno.c
index 014232990..092dad307 100644
--- a/linux/avr32/get_scno.c
+++ b/linux/avr32/get_scno.c
@@ -1 +1,7 @@
-scno = avr32_regs.r8;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = avr32_regs.r8;
+ return 1;
+}
diff --git a/linux/avr32/get_syscall_args.c b/linux/avr32/get_syscall_args.c
index 2e3cd3b6e..e8c41198b 100644
--- a/linux/avr32/get_syscall_args.c
+++ b/linux/avr32/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = avr32_regs.r12;
-tcp->u_arg[1] = avr32_regs.r11;
-tcp->u_arg[2] = avr32_regs.r10;
-tcp->u_arg[3] = avr32_regs.r9;
-tcp->u_arg[4] = avr32_regs.r5;
-tcp->u_arg[5] = avr32_regs.r3;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = avr32_regs.r12;
+ tcp->u_arg[1] = avr32_regs.r11;
+ tcp->u_arg[2] = avr32_regs.r10;
+ tcp->u_arg[3] = avr32_regs.r9;
+ tcp->u_arg[4] = avr32_regs.r5;
+ tcp->u_arg[5] = avr32_regs.r3;
+ return 1;
+}
diff --git a/linux/avr32/print_pc.c b/linux/avr32/print_pc.c
deleted file mode 100644
index ca293e630..000000000
--- a/linux/avr32/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, avr32_regs.pc);
diff --git a/linux/avr32/syscallent.h b/linux/avr32/syscallent.h
index a563b67d5..626b08cfd 100644
--- a/linux/avr32/syscallent.h
+++ b/linux/avr32/syscallent.h
@@ -25,8 +25,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-[ 0] = { 0, 0, SEN(setup), "setup" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -47,7 +47,7 @@
[ 19] = { 5, TD, SEN(llseek), "_llseek" },
[ 20] = { 0, 0, SEN(getpid), "getpid" },
[ 21] = { 5, TF, SEN(mount), "mount" },
-[ 22] = { 1, TF, SEN(umount), "umount" },
+[ 22] = { 1, TF, SEN(umount2), "umount2" },
[ 23] = { 1, 0, SEN(setuid), "setuid" },
[ 24] = { 0, NF, SEN(getuid), "getuid" },
[ 25] = { 1, 0, SEN(stime), "stime" },
@@ -115,7 +115,7 @@
[ 87] = { 5, TD, SEN(pwrite), "pwrite" },
[ 88] = { 2, TF, SEN(swapon), "swapon" },
[ 89] = { 4, 0, SEN(reboot), "reboot" },
-[ 90] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap" },
+[ 90] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap2" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -144,7 +144,7 @@
[116] = { 2, 0, SEN(delete_module), "delete_module" },
[117] = { 4, TF, SEN(quotactl), "quotactl" },
[118] = { 1, 0, SEN(getpgid), "getpgid" },
-[119] = { 0, 0, SEN(bdflush), "bdflush" },
+[119] = { 2, 0, SEN(bdflush), "bdflush" },
[120] = { 3, 0, SEN(sysfs), "sysfs" },
[121] = { 1, 0, SEN(personality), "personality" },
[122] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -200,7 +200,7 @@
[172] = { 3, TM, SEN(mincore), "mincore" },
[173] = { 3, TM, SEN(madvise), "madvise" },
[174] = { 3, TD, SEN(getdents64), "getdents64" },
-[175] = { 3, TD, SEN(fcntl), "fcntl64" },
+[175] = { 3, TD, SEN(fcntl64), "fcntl64" },
[176] = { 0, 0, SEN(gettid), "gettid" },
[177] = { 4, TD, SEN(readahead), "readahead" },
[178] = { 5, TF, SEN(setxattr), "setxattr" },
@@ -309,3 +309,40 @@
[281] = { 1, TD, SEN(eventfd), "eventfd" },
[282] = { },
[283] = { 2, TD, SEN(setns), "setns" },
+[284] = { 5, TD, SEN(pread), "pread64" },
+[285] = { 5, TD, SEN(pwrite), "pwrite64" },
+[286] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
+[287] = { 6, TD, SEN(fallocate), "fallocate" },
+[288] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
+[289] = { 2, TD, SEN(timerfd_gettime), "timerfd_gettime" },
+[290] = { 4, TD|TS, SEN(signalfd4), "signalfd4" },
+[291] = { 2, TD, SEN(eventfd2), "eventfd2" },
+[292] = { 1, TD, SEN(epoll_create1), "epoll_create1" },
+[293] = { 3, TD, SEN(dup3), "dup3" },
+[294] = { 2, TD, SEN(pipe2), "pipe2" },
+[295] = { 1, TD, SEN(inotify_init1), "inotify_init1" },
+[296] = { 5, TD, SEN(preadv), "preadv" },
+[297] = { 5, TD, SEN(pwritev), "pwritev" },
+[298] = { 4, TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
+[299] = { 5, TD, SEN(perf_event_open), "perf_event_open" },
+[300] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
+[301] = { 2, TD, SEN(fanotify_init), "fanotify_init" },
+[302] = { 6, TD|TF, SEN(fanotify_mark), "fanotify_mark" },
+[303] = { 4, 0, SEN(prlimit64), "prlimit64" },
+[304] = { 5, TD|TF, SEN(name_to_handle_at), "name_to_handle_at" },
+[305] = { 3, TD, SEN(open_by_handle_at), "open_by_handle_at" },
+[306] = { 2, 0, SEN(clock_adjtime), "clock_adjtime" },
+[307] = { 1, TD, SEN(syncfs), "syncfs" },
+[308] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
+[309] = { 6, 0, SEN(process_vm_readv), "process_vm_readv" },
+[310] = { 6, 0, SEN(process_vm_writev), "process_vm_writev" },
+[311] = { 5, 0, SEN(kcmp), "kcmp" },
+[312] = { 3, TD, SEN(finit_module), "finit_module" },
+[313] = { 3, 0, SEN(sched_setattr), "sched_setattr" },
+[314] = { 4, 0, SEN(sched_getattr), "sched_getattr" },
+[315] = { 5, TD|TF, SEN(renameat2), "renameat2" },
+[316] = { 3, 0, SEN(seccomp), "seccomp", },
+[317] = { 3, 0, SEN(getrandom), "getrandom", },
+[318] = { 2, TD, SEN(memfd_create), "memfd_create", },
+[319] = { 3, TD, SEN(bpf), "bpf", },
+[320] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
diff --git a/linux/bfin/arch_regs.c b/linux/bfin/arch_regs.c
index f6f420452..e1aa15e4f 100644
--- a/linux/bfin/arch_regs.c
+++ b/linux/bfin/arch_regs.c
@@ -1 +1,2 @@
static long bfin_r0;
+#define ARCH_PC_PEEK_ADDR PT_PC
diff --git a/linux/bfin/get_error.c b/linux/bfin/get_error.c
index d7ff24767..80aeb377f 100644
--- a/linux/bfin/get_error.c
+++ b/linux/bfin/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(bfin_r0)) {
- tcp->u_rval = -1;
- tcp->u_error = -bfin_r0;
-} else {
- tcp->u_rval = bfin_r0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(bfin_r0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -bfin_r0;
+ } else {
+ tcp->u_rval = bfin_r0;
+ }
}
diff --git a/linux/bfin/get_scno.c b/linux/bfin/get_scno.c
index dfdb0a7ce..8c3a7d216 100644
--- a/linux/bfin/get_scno.c
+++ b/linux/bfin/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, PT_ORIG_P0, &scno))
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, PT_ORIG_P0, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/bfin/get_syscall_args.c b/linux/bfin/get_syscall_args.c
index ac6e6cd2c..13d58bd7e 100644
--- a/linux/bfin/get_syscall_args.c
+++ b/linux/bfin/get_syscall_args.c
@@ -1,6 +1,13 @@
-static const int argreg[MAX_ARGS] = { PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5 };
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ static const int argreg[MAX_ARGS] =
+ { PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5 };
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, argreg[i], &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, argreg[i], &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/bfin/get_syscall_result.c b/linux/bfin/get_syscall_result.c
index c9d94d480..c189a5fd8 100644
--- a/linux/bfin/get_syscall_result.c
+++ b/linux/bfin/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, PT_R0, &bfin_r0) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, PT_R0, &bfin_r0) < 0 ? -1 : 0;
+}
diff --git a/linux/bfin/print_pc.c b/linux/bfin/print_pc.c
deleted file mode 100644
index b1eef145c..000000000
--- a/linux/bfin/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/bfin/syscallent.h b/linux/bfin/syscallent.h
index 46b710c7a..c30e73181 100644
--- a/linux/bfin/syscallent.h
+++ b/linux/bfin/syscallent.h
@@ -27,7 +27,7 @@
*/
[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -116,7 +116,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 6, TD|TM|SI, SEN(printargs), "old_mmap" }, /*not implemented in kernel */
+[ 90] = { 6, TD|TM|SI, SEN(printargs), "mmap" }, /*not implemented in kernel */
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -214,8 +214,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "getrlimit" },
[192] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap2" },
@@ -247,9 +247,8 @@
[218] = { 3, TM, SEN(mincore), "mincore" },
[219] = { 3, TM, SEN(madvise), "madvise" },
[220] = { 3, TD, SEN(getdents64), "getdents64" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
-[222] = { },
-[223] = { 5, 0, SEN(security), "security" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
+[222 ... 223] = { },
[224] = { 0, 0, SEN(gettid), "gettid" },
[225] = { 4, TD, SEN(readahead), "readahead" },
[226] = { 5, TF, SEN(setxattr), "setxattr" },
diff --git a/linux/crisv10/arch_regs.c b/linux/crisv10/arch_regs.c
index 573f5932b..8f69b8738 100644
--- a/linux/crisv10/arch_regs.c
+++ b/linux/crisv10/arch_regs.c
@@ -1 +1,2 @@
static long cris_r10;
+#define ARCH_PC_PEEK_ADDR (4 * PT_IRP)
diff --git a/linux/crisv10/arch_sigreturn.c b/linux/crisv10/arch_sigreturn.c
index 9dc09f344..9086d5336 100644
--- a/linux/crisv10/arch_sigreturn.c
+++ b/linux/crisv10/arch_sigreturn.c
@@ -1,11 +1,15 @@
-long regs[PT_MAX + 1];
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long regs[PT_MAX + 1];
-if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
- perror_msg("sigreturn: PTRACE_GETREGS");
- return;
-}
-const long addr = regs[PT_USP] + offsetof(struct sigcontext, oldmask);
+ if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
+ perror_msg("sigreturn: PTRACE_GETREGS");
+ return;
+ }
+ const long addr = regs[PT_USP] + offsetof(struct sigcontext, oldmask);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/crisv10/get_error.c b/linux/crisv10/get_error.c
index 3f947ae6c..b9da923f8 100644
--- a/linux/crisv10/get_error.c
+++ b/linux/crisv10/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(cris_r10)) {
- tcp->u_rval = -1;
- tcp->u_error = -cris_r10;
-} else {
- tcp->u_rval = cris_r10;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(cris_r10)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -cris_r10;
+ } else {
+ tcp->u_rval = cris_r10;
+ }
}
diff --git a/linux/crisv10/get_scno.c b/linux/crisv10/get_scno.c
index 5bbbe8be0..14ff3386d 100644
--- a/linux/crisv10/get_scno.c
+++ b/linux/crisv10/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, 4*PT_R9, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 4 * PT_R9, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/crisv10/get_syscall_args.c b/linux/crisv10/get_syscall_args.c
index 66b5ac7e2..bdd05746e 100644
--- a/linux/crisv10/get_syscall_args.c
+++ b/linux/crisv10/get_syscall_args.c
@@ -1,9 +1,15 @@
-static const int crisregs[MAX_ARGS] = {
- 4*PT_ORIG_R10, 4*PT_R11, 4*PT_R12,
- 4*PT_R13 , 4*PT_MOF, 4*PT_SRP
-};
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ static const int crisregs[MAX_ARGS] = {
+ 4*PT_ORIG_R10, 4*PT_R11, 4*PT_R12,
+ 4*PT_R13 , 4*PT_MOF, 4*PT_SRP
+ };
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, crisregs[i], &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, crisregs[i], &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/crisv10/get_syscall_result.c b/linux/crisv10/get_syscall_result.c
index 53b087a3e..6b3679c15 100644
--- a/linux/crisv10/get_syscall_result.c
+++ b/linux/crisv10/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, 4*PT_R10, &cris_r10) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 4 * PT_R10, &cris_r10) < 0 ? -1 : 0;
+}
diff --git a/linux/crisv10/print_pc.c b/linux/crisv10/print_pc.c
deleted file mode 100644
index cc76216e7..000000000
--- a/linux/crisv10/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_IRP, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/crisv32/arch_regs.c b/linux/crisv32/arch_regs.c
index a088e172a..8e59c156a 100644
--- a/linux/crisv32/arch_regs.c
+++ b/linux/crisv32/arch_regs.c
@@ -1 +1,2 @@
#include "crisv10/arch_regs.c"
+#define ARCH_PC_PEEK_ADDR (4 * PT_ERP)
diff --git a/linux/crisv32/print_pc.c b/linux/crisv32/print_pc.c
deleted file mode 100644
index b4af6927d..000000000
--- a/linux/crisv32/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_ERP, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/dummy.h b/linux/dummy.h
index 939490430..0c89d22e3 100644
--- a/linux/dummy.h
+++ b/linux/dummy.h
@@ -32,14 +32,6 @@
#endif
/* still unfinished */
-#define sys_ioperm printargs
-#define sys_iopl printargs
-#define sys_kcmp printargs
-#define sys_kexec_file_load printargs
-#define sys_lookup_dcookie printargs
-#define sys_name_to_handle_at printargs
-#define sys_open_by_handle_at printargs
-#define sys_sysfs printargs
#define sys_vm86 printargs
#define sys_vm86old printargs
@@ -126,7 +118,6 @@
/* printargs_lu/ld does the right thing */
#define sys_alarm printargs_lu
-#define sys_epoll_create printargs_ld
#define sys_getpgrp printargs_lu
#define sys_getsid printargs_lu
#define sys_nice printargs_ld
@@ -138,13 +129,16 @@
#define sys_break printargs
#define sys_ftime printargs
#define sys_get_kernel_syms printargs
+#define sys_getpmsg printargs
#define sys_gtty printargs
#define sys_lock printargs
#define sys_mpx printargs
#define sys_nfsservctl printargs
#define sys_phys printargs
-#define sys_profil printargs
#define sys_prof printargs
+#define sys_profil printargs
+#define sys_putpmsg printargs
+#define sys_query_module printargs
#define sys_security printargs
#define sys_stty printargs
#define sys_tuxcall printargs
@@ -156,22 +150,4 @@
#define sys_bdflush printargs
#define sys_oldolduname printargs
#define sys_olduname printargs
-
-/* no library support */
-#ifndef HAVE_SENDMSG
-#define sys_recvmsg printargs
-#define sys_sendmsg printargs
-#endif
-
-/* Who has STREAMS syscalls?
- * Linux hasn't. Solaris has (had?).
- * Just in case I miss something, retain in for Sparc.
- * Note: SYS_get/putpmsg may be defined even though syscalls
- * return ENOSYS. Can't just check defined(SYS_getpmsg).
- */
-#if (!defined(SPARC) && !defined(SPARC64)) || !defined(SYS_getpmsg)
-#define sys_getpmsg printargs
-#endif
-#if (!defined(SPARC) && !defined(SPARC64)) || !defined(SYS_putpmsg)
-#define sys_putpmsg printargs
-#endif
+#define sys_sysfs printargs
diff --git a/linux/hppa/arch_regs.c b/linux/hppa/arch_regs.c
index 56d1ee367..65432abb4 100644
--- a/linux/hppa/arch_regs.c
+++ b/linux/hppa/arch_regs.c
@@ -1 +1,2 @@
static long hppa_r28;
+#define ARCH_PC_PEEK_ADDR PT_IAOQ0
diff --git a/linux/hppa/get_error.c b/linux/hppa/get_error.c
index 901aa5450..a2a7c0ea6 100644
--- a/linux/hppa/get_error.c
+++ b/linux/hppa/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(hppa_r28)) {
- tcp->u_rval = -1;
- tcp->u_error = -hppa_r28;
-} else {
- tcp->u_rval = hppa_r28;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(hppa_r28)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -hppa_r28;
+ } else {
+ tcp->u_rval = hppa_r28;
+ }
}
diff --git a/linux/hppa/get_scno.c b/linux/hppa/get_scno.c
index 0dc1a4653..7da2fc403 100644
--- a/linux/hppa/get_scno.c
+++ b/linux/hppa/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, PT_GR20, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, PT_GR20, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/hppa/get_syscall_args.c b/linux/hppa/get_syscall_args.c
index 117b68b91..2258ea87c 100644
--- a/linux/hppa/get_syscall_args.c
+++ b/linux/hppa/get_syscall_args.c
@@ -1,5 +1,11 @@
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, PT_GR26-4*i, &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/hppa/get_syscall_result.c b/linux/hppa/get_syscall_result.c
index d929b9f18..0d15d4db7 100644
--- a/linux/hppa/get_syscall_result.c
+++ b/linux/hppa/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, PT_GR28, &hppa_r28) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, PT_GR28, &hppa_r28) < 0 ? -1 : 0;
+}
diff --git a/linux/hppa/print_pc.c b/linux/hppa/print_pc.c
deleted file mode 100644
index 765634648..000000000
--- a/linux/hppa/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_IAOQ0, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/hppa/syscallent.h b/linux/hppa/syscallent.h
index 4ef47b2cb..f6b754956 100644
--- a/linux/hppa/syscallent.h
+++ b/linux/hppa/syscallent.h
@@ -136,15 +136,15 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
-[135] = { 5, 0, SEN(sysfs), "sysfs" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
+[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
[138] = { 1, NF, SEN(setfsuid), "setfsuid" },
[139] = { 1, NF, SEN(setfsgid), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -198,13 +198,13 @@
[193] = { 1, TI|TM|SI, SEN(shmdt), "shmdt" },
[194] = { 3, TI, SEN(shmget), "shmget" },
[195] = { 3, TI, SEN(shmctl), "shmctl" },
-[196] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[197] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[196] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[197] = { 5, TN, SEN(putpmsg), "putpmsg" },
[198] = { 2, TF, SEN(lstat64), "lstat64" },
[199] = { 3, TF, SEN(truncate64), "truncate64" },
[200] = { 3, TD, SEN(ftruncate64), "ftruncate64" },
[201] = { 3, TD, SEN(getdents64), "getdents64" },
-[202] = { 3, TD, SEN(fcntl), "fcntl64" },
+[202] = { 3, TD, SEN(fcntl64), "fcntl64" },
[203] = { 5, 0, SEN(printargs), "attrctl" },
[204] = { 5, 0, SEN(printargs), "acl_get" },
[205] = { 5, 0, SEN(printargs), "acl_set" },
@@ -345,3 +345,6 @@
[340] = { 2, TD, SEN(memfd_create), "memfd_create", },
[341] = { 3, TD, SEN(bpf), "bpf", },
[342] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[343] = { 2, 0, SEN(membarrier), "membarrier", },
+[344] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[345] = { 3, TM, SEN(mlock2), "mlock2" },
diff --git a/linux/i386/arch_regs.c b/linux/i386/arch_regs.c
index 15b561582..ef3004654 100644
--- a/linux/i386/arch_regs.c
+++ b/linux/i386/arch_regs.c
@@ -2,3 +2,4 @@ static struct user_regs_struct i386_regs;
long *const i386_esp_ptr = &i386_regs.esp;
#define ARCH_REGS_FOR_GETREGS i386_regs
+#define ARCH_PC_REG i386_regs.eip
diff --git a/linux/i386/arch_sigreturn.c b/linux/i386/arch_sigreturn.c
index e726bf1ad..9446994ef 100644
--- a/linux/i386/arch_sigreturn.c
+++ b/linux/i386/arch_sigreturn.c
@@ -1,20 +1,24 @@
-/*
- * On i386, sigcontext is followed on stack by struct fpstate
- * and after it an additional u32 extramask which holds
- * upper half of the mask.
- */
-struct {
- uint32_t struct_sigcontext_padding1[20];
- uint32_t oldmask;
- uint32_t struct_sigcontext_padding2;
- uint32_t struct_fpstate_padding[156];
- uint32_t extramask;
-} frame;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ /*
+ * On i386, sigcontext is followed on stack by struct fpstate
+ * and after it an additional u32 extramask which holds
+ * upper half of the mask.
+ */
+ struct {
+ uint32_t struct_sigcontext_padding1[20];
+ uint32_t oldmask;
+ uint32_t struct_sigcontext_padding2;
+ uint32_t struct_fpstate_padding[156];
+ uint32_t extramask;
+ } frame;
-if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
- tprintf("{mask=%#lx}", (unsigned long) *i386_esp_ptr);
-} else {
- uint32_t mask[2] = { frame.oldmask, frame.extramask };
- tprintsigmask_addr("{mask=", mask);
- tprints("}");
+ if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
+ tprintf("{mask=%#lx}", (unsigned long) *i386_esp_ptr);
+ } else {
+ uint32_t mask[2] = { frame.oldmask, frame.extramask };
+ tprintsigmask_addr("{mask=", mask);
+ tprints("}");
+ }
}
diff --git a/linux/i386/get_error.c b/linux/i386/get_error.c
index 465118b26..1f63605e1 100644
--- a/linux/i386/get_error.c
+++ b/linux/i386/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(i386_regs.eax)) {
- tcp->u_rval = -1;
- tcp->u_error = -i386_regs.eax;
-} else {
- tcp->u_rval = i386_regs.eax;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(i386_regs.eax)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -i386_regs.eax;
+ } else {
+ tcp->u_rval = i386_regs.eax;
+ }
}
diff --git a/linux/i386/get_scno.c b/linux/i386/get_scno.c
index fa22fa6cc..c2e55510d 100644
--- a/linux/i386/get_scno.c
+++ b/linux/i386/get_scno.c
@@ -1 +1,7 @@
-scno = i386_regs.orig_eax;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = i386_regs.orig_eax;
+ return 1;
+}
diff --git a/linux/i386/get_syscall_args.c b/linux/i386/get_syscall_args.c
index 30cce6a45..d5de1d959 100644
--- a/linux/i386/get_syscall_args.c
+++ b/linux/i386/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = i386_regs.ebx;
-tcp->u_arg[1] = i386_regs.ecx;
-tcp->u_arg[2] = i386_regs.edx;
-tcp->u_arg[3] = i386_regs.esi;
-tcp->u_arg[4] = i386_regs.edi;
-tcp->u_arg[5] = i386_regs.ebp;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = i386_regs.ebx;
+ tcp->u_arg[1] = i386_regs.ecx;
+ tcp->u_arg[2] = i386_regs.edx;
+ tcp->u_arg[3] = i386_regs.esi;
+ tcp->u_arg[4] = i386_regs.edi;
+ tcp->u_arg[5] = i386_regs.ebp;
+ return 1;
+}
diff --git a/linux/i386/print_pc.c b/linux/i386/print_pc.c
deleted file mode 100644
index 0d5c9575a..000000000
--- a/linux/i386/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, i386_regs.eip);
diff --git a/linux/i386/syscallent.h b/linux/i386/syscallent.h
index b51f4a1b4..20ba789f8 100644
--- a/linux/i386/syscallent.h
+++ b/linux/i386/syscallent.h
@@ -27,7 +27,7 @@
*/
[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -116,7 +116,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 6, TD|TM|SI, SEN(old_mmap), "old_mmap" },
+[ 90] = { 6, TD|TM|SI, SEN(old_mmap), "mmap" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -214,8 +214,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[192] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap2" },
@@ -247,9 +247,8 @@
[218] = { 3, TM, SEN(mincore), "mincore" },
[219] = { 3, TM, SEN(madvise), "madvise" },
[220] = { 3, TD, SEN(getdents64), "getdents64" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
-[222] = { },
-[223] = { 5, 0, SEN(security), "security" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
+[222 ... 223] = { },
[224] = { 0, 0, SEN(gettid), "gettid" },
[225] = { 4, TD, SEN(readahead), "readahead" },
[226] = { 5, TF, SEN(setxattr), "setxattr" },
@@ -385,7 +384,25 @@
[356] = { 2, TD, SEN(memfd_create), "memfd_create", },
[357] = { 3, TD, SEN(bpf), "bpf", },
[358] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[359 ... 399] = { },
+[359] = { 3, TN, SEN(socket), "socket" },
+[360] = { 4, TN, SEN(socketpair), "socketpair" },
+[361] = { 3, TN, SEN(bind), "bind" },
+[362] = { 3, TN, SEN(connect), "connect" },
+[363] = { 2, TN, SEN(listen), "listen" },
+[364] = { 4, TN, SEN(accept4), "accept4" },
+[365] = { 5, TN, SEN(getsockopt), "getsockopt" },
+[366] = { 5, TN, SEN(setsockopt), "setsockopt" },
+[367] = { 3, TN, SEN(getsockname), "getsockname" },
+[368] = { 3, TN, SEN(getpeername), "getpeername" },
+[369] = { 6, TN, SEN(sendto), "sendto" },
+[370] = { 3, TN, SEN(sendmsg), "sendmsg" },
+[371] = { 6, TN, SEN(recvfrom), "recvfrom" },
+[372] = { 3, TN, SEN(recvmsg), "recvmsg" },
+[373] = { 2, TN, SEN(shutdown), "shutdown" },
+[374] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[375] = { 2, 0, SEN(membarrier), "membarrier", },
+[376] = { 3, TM, SEN(mlock2), "mlock2" },
+[377 ... 399] = { },
#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/ia64/arch_regs.c b/linux/ia64/arch_regs.c
index d7de2018d..14fffd5c4 100644
--- a/linux/ia64/arch_regs.c
+++ b/linux/ia64/arch_regs.c
@@ -5,3 +5,4 @@ unsigned long *const ia64_frame_ptr = &ia64_regs.gr[12];
#define ia64_ia32mode (ia64_regs.cr_ipsr & IA64_PSR_IS)
#define ARCH_REGS_FOR_GETREGS ia64_regs
+#define ARCH_PC_REG ia64_regs.br[0]
diff --git a/linux/ia64/arch_sigreturn.c b/linux/ia64/arch_sigreturn.c
index 94e89cfac..8b54d6c15 100644
--- a/linux/ia64/arch_sigreturn.c
+++ b/linux/ia64/arch_sigreturn.c
@@ -1,8 +1,12 @@
-/* offsetof(struct sigframe, sc) */
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ /* offsetof(struct sigframe, sc) */
#define OFFSETOF_STRUCT_SIGFRAME_SC 0xA0
-const long addr = *ia64_frame_ptr + 16 +
- OFFSETOF_STRUCT_SIGFRAME_SC +
- offsetof(struct sigcontext, sc_mask);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ const long addr = *ia64_frame_ptr + 16 +
+ OFFSETOF_STRUCT_SIGFRAME_SC +
+ offsetof(struct sigcontext, sc_mask);
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/ia64/get_error.c b/linux/ia64/get_error.c
index fb6b9f4a8..09dfdef68 100644
--- a/linux/ia64/get_error.c
+++ b/linux/ia64/get_error.c
@@ -1,16 +1,20 @@
-if (ia64_ia32mode) {
- int err = ia64_regs.gr[8];
- if (check_errno && is_negated_errno(err)) {
- tcp->u_rval = -1;
- tcp->u_error = -err;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (ia64_ia32mode) {
+ int err = ia64_regs.gr[8];
+ if (check_errno && is_negated_errno(err)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -err;
+ } else {
+ tcp->u_rval = err;
+ }
} else {
- tcp->u_rval = err;
- }
-} else {
- if (check_errno && ia64_regs.gr[10]) {
- tcp->u_rval = -1;
- tcp->u_error = ia64_regs.gr[8];
- } else {
- tcp->u_rval = ia64_regs.gr[8];
+ if (check_errno && ia64_regs.gr[10]) {
+ tcp->u_rval = -1;
+ tcp->u_error = ia64_regs.gr[8];
+ } else {
+ tcp->u_rval = ia64_regs.gr[8];
+ }
}
}
diff --git a/linux/ia64/get_scno.c b/linux/ia64/get_scno.c
index 86333fd84..0ddc17a93 100644
--- a/linux/ia64/get_scno.c
+++ b/linux/ia64/get_scno.c
@@ -1,5 +1,7 @@
-if (ia64_ia32mode) {
- scno = ia64_regs.gr[0];
-} else {
- scno = ia64_regs.gr[15];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = ia64_ia32mode ? ia64_regs.gr[0] : ia64_regs.gr[15];
+ return 1;
}
diff --git a/linux/ia64/get_syscall_args.c b/linux/ia64/get_syscall_args.c
index 95273965d..2295d08dc 100644
--- a/linux/ia64/get_syscall_args.c
+++ b/linux/ia64/get_syscall_args.c
@@ -1,22 +1,29 @@
-if (!ia64_ia32mode) {
- unsigned long *rbs_end =
- (unsigned long *) ia64_regs.ar[PT_AUR_BSP];
- unsigned long sof = (ia64_regs.cfm >> 0) & 0x7f;
- unsigned long sol = (ia64_regs.cfm >> 7) & 0x7f;
- unsigned long *out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
- unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ if (!ia64_ia32mode) {
+ unsigned long *rbs_end =
+ (unsigned long *) ia64_regs.ar[PT_AUR_BSP];
+ unsigned long sof = (ia64_regs.cfm >> 0) & 0x7f;
+ unsigned long sol = (ia64_regs.cfm >> 7) & 0x7f;
+ unsigned long *out0 = ia64_rse_skip_regs(rbs_end, -sof + sol);
+ unsigned int i;
- for (i = 0; i < tcp->s_ent->nargs; ++i) {
- if (umoven(tcp, (unsigned long) ia64_rse_skip_regs(out0, i),
- sizeof(long), &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i) {
+ if (umoven(tcp,
+ (unsigned long) ia64_rse_skip_regs(out0, i),
+ sizeof(long), &tcp->u_arg[i]) < 0)
+ return -1;
+ }
+ } else {
+ /* truncate away IVE sign-extension */
+ tcp->u_arg[0] = 0xffffffff & ia64_regs.gr[11]; /* EBX */
+ tcp->u_arg[1] = 0xffffffff & ia64_regs.gr[ 9]; /* ECX */
+ tcp->u_arg[2] = 0xffffffff & ia64_regs.gr[10]; /* EDX */
+ tcp->u_arg[3] = 0xffffffff & ia64_regs.gr[14]; /* ESI */
+ tcp->u_arg[4] = 0xffffffff & ia64_regs.gr[15]; /* EDI */
+ tcp->u_arg[5] = 0xffffffff & ia64_regs.gr[13]; /* EBP */
}
-} else {
- /* truncate away IVE sign-extension */
- tcp->u_arg[0] = 0xffffffff & ia64_regs.gr[11]; /* EBX */
- tcp->u_arg[1] = 0xffffffff & ia64_regs.gr[ 9]; /* ECX */
- tcp->u_arg[2] = 0xffffffff & ia64_regs.gr[10]; /* EDX */
- tcp->u_arg[3] = 0xffffffff & ia64_regs.gr[14]; /* ESI */
- tcp->u_arg[4] = 0xffffffff & ia64_regs.gr[15]; /* EDI */
- tcp->u_arg[5] = 0xffffffff & ia64_regs.gr[13]; /* EBP */
+ return 1;
}
diff --git a/linux/ia64/print_pc.c b/linux/ia64/print_pc.c
deleted file mode 100644
index fe9678092..000000000
--- a/linux/ia64/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, ia64_regs.br[0]);
diff --git a/linux/ia64/syscallent.h b/linux/ia64/syscallent.h
index a17c766d3..3bfa3479e 100644
--- a/linux/ia64/syscallent.h
+++ b/linux/ia64/syscallent.h
@@ -30,205 +30,11 @@
* IA-32 syscalls that have pointer arguments which are incompatible
* with 64-bit layout get redirected to printargs.
*/
-#define sys_getrlimit printargs
-#define sys_afs_syscall printargs
-#define sys_getpmsg printargs
-#define sys_putpmsg printargs
-#define sys_ugetrlimit printargs
-#define sys_waitpid printargs
-#define sys_time printargs
-#define sys_break printargs
-#define sys_oldstat printargs
-#define sys_lseek printargs
-#undef sys_stime
-#define sys_stime printargs
-#define sys_ptrace printargs
-#define sys_oldfstat printargs
-#define sys_pause printargs
-#define sys_utime printargs
-#define sys_stty printargs
-#define sys_gtty printargs
-#define sys_ftime printargs
-#define sys_pipe printargs
-#define sys_times printargs
-#define sys_prof printargs
-#define sys_signal printargs
-#define sys_lock printargs
-#define sys_ioctl printargs
-#define sys_fcntl printargs
-#define sys_mpx printargs
-#define sys_ulimit printargs
-#define sys_oldolduname printargs
-#define sys_sigaction printargs
-#define sys_siggetmask printargs
-#define sys_sigsetmask printargs
-#define sys_sigsuspend printargs
-#define sys_sigpending printargs
-#define sys_setrlimit printargs
-#define sys_getrusage printargs
-#define sys_gettimeofday printargs
-#define sys_settimeofday printargs
-#define sys_getgroups printargs
-#define sys_setgroups printargs
-#define sys_select printargs
-#undef sys_oldlstat
-#define sys_oldlstat printargs
-#define sys_readdir printargs
-#define sys_profil printargs
-#define sys_statfs printargs
-#define sys_fstatfs printargs
-#define sys_ioperm printargs
-#define sys_setitimer printargs
-#define sys_getitimer printargs
-#define sys_stat printargs
-#undef sys_lstat
-#define sys_lstat printargs
-#define sys_fstat printargs
-#define sys_olduname printargs
-#define sys_iopl printargs
-#define sys_idle printargs
-#define sys_vm86old printargs
-#define sys_wait4 printargs
-#define sys_sysinfo printargs
-#define sys_sigreturn printargs
-#define sys_uname printargs
-#define sys_modify_ldt printargs
-#define sys_adjtimex printargs
-#define sys_sigprocmask printargs
-#define sys_create_module printargs
-#define sys_init_module printargs
-#define sys_get_kernel_syms printargs
-#define sys_quotactl printargs
-#define sys_bdflush printargs
-#define sys_personality printargs
-#define sys_getdents printargs
-#define sys__newselect printargs
-#define sys_msync printargs
-#define sys_readv printargs
-#define sys_writev printargs
-#define sys__sysctl printargs
-#define sys_sched_rr_get_interval printargs
-#define sys_getresuid printargs
-#define sys_vm86 printargs
-#define sys_query_module printargs
-#define sys_nfsservctl printargs
-#define sys_rt_sigreturn printargs
-#define sys_rt_sigaction printargs
-#define sys_rt_sigprocmask printargs
-#define sys_rt_sigtimedwait printargs
-#define sys_rt_sigqueueinfo printargs
-#define sys_rt_sigsuspend printargs
-#define sys_pread printargs
-#define sys_pwrite printargs
-#define sys_sigaltstack printargs
-#define sys_sendfile printargs
-#define sys_truncate64 printargs
-#define sys_ftruncate64 printargs
-#define sys_stat64 printargs
-#undef sys_lstat64
-#define sys_lstat64 printargs
-#define sys_fstat64 printargs
-#define sys_fcntl64 printargs
-
+#undef SYS_FUNC_NAME
+#define SYS_FUNC_NAME(syscall_name) printargs
#include "../i386/syscallent.h"
-
-#undef sys_getrlimit
-#undef sys_afs_syscall
-#undef sys_getpmsg
-#undef sys_putpmsg
-#undef sys_ugetrlimit
-#undef sys_waitpid
-#undef sys_time
-#undef sys_break
-#undef sys_oldstat
-#undef sys_lseek
-#undef sys_stime
-#undef sys_ptrace
-#undef sys_oldfstat
-#undef sys_pause
-#undef sys_utime
-#undef sys_stty
-#undef sys_gtty
-#undef sys_ftime
-#undef sys_pipe
-#undef sys_times
-#undef sys_prof
-#undef sys_signal
-#undef sys_lock
-#undef sys_ioctl
-#undef sys_fcntl
-#undef sys_mpx
-#undef sys_ulimit
-#undef sys_oldolduname
-#undef sys_sigaction
-#undef sys_siggetmask
-#undef sys_sigsetmask
-#undef sys_sigsuspend
-#undef sys_sigpending
-#undef sys_setrlimit
-#undef sys_getrusage
-#undef sys_gettimeofday
-#undef sys_settimeofday
-#undef sys_getgroups
-#undef sys_setgroups
-#undef sys_select
-#undef sys_oldlstat
-#undef sys_readdir
-#undef sys_profil
-#undef sys_statfs
-#undef sys_fstatfs
-#undef sys_ioperm
-#undef sys_setitimer
-#undef sys_getitimer
-#undef sys_stat
-#undef sys_lstat
-#undef sys_fstat
-#undef sys_olduname
-#undef sys_iopl
-#undef sys_idle
-#undef sys_vm86old
-#undef sys_wait4
-#undef sys_sysinfo
-#undef sys_sigreturn
-#undef sys_uname
-#undef sys_modify_ldt
-#undef sys_adjtimex
-#undef sys_sigprocmask
-#undef sys_create_module
-#undef sys_init_module
-#undef sys_get_kernel_syms
-#undef sys_quotactl
-#undef sys_bdflush
-#undef sys_personality
-#undef sys_getdents
-#undef sys__newselect
-#undef sys_msync
-#undef sys_readv
-#undef sys_writev
-#undef sys__sysctl
-#undef sys_sched_rr_get_interval
-#undef sys_getresuid
-#undef sys_vm86
-#undef sys_query_module
-#undef sys_nfsservctl
-#undef sys_rt_sigreturn
-#undef sys_rt_sigaction
-#undef sys_rt_sigprocmask
-#undef sys_rt_sigtimedwait
-#undef sys_rt_sigqueueinfo
-#undef sys_rt_sigsuspend
-#undef sys_pread
-#undef sys_pwrite
-#undef sys_sigaltstack
-#undef sys_sendfile
-#undef sys_truncate64
-#undef sys_ftruncate64
-#undef sys_stat64
-#undef sys_lstat64
-#undef sys_fstat64
-#undef sys_fcntl64
-
-#include "../dummy.h"
+#undef SYS_FUNC_NAME
+#define SYS_FUNC_NAME(syscall_name) MPERS_FUNC_NAME(sys_ ## syscall_name)
/* You must be careful to check ../i386/syscallent.h so that this table
starts where that one leaves off.
@@ -335,7 +141,7 @@
[1122] = { 2, TD, SEN(fstat), "fstat" },
[1123] = { 0, 0, SEN(vhangup), "vhangup" },
[1124] = { 3, TF, SEN(chown), "lchown" },
-[1125] = { 5, 0, SEN(vm86), "vm86" },
+[1125] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
[1126] = { 4, TP, SEN(wait4), "wait4" },
[1127] = { 1, 0, SEN(sysinfo), "sysinfo" },
[1128] = { 5, TP, SEN(clone), "clone" },
@@ -348,7 +154,7 @@
[1135] = { 1, 0, SEN(get_kernel_syms), "get_kernel_syms" },
[1136] = { 5, 0, SEN(query_module), "query_module" },
[1137] = { 4, TF, SEN(quotactl), "quotactl" },
-[1138] = { 0, 0, SEN(bdflush), "bdflush" },
+[1138] = { 2, 0, SEN(bdflush), "bdflush" },
[1139] = { 3, 0, SEN(sysfs), "sysfs" },
[1140] = { 1, 0, SEN(personality), "personality" },
[1141] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -358,8 +164,8 @@
[1145] = { 2, TD, SEN(flock), "flock" },
[1146] = { 5, TD, SEN(readv), "readv" },
[1147] = { 5, TD, SEN(writev), "writev" },
-[1148] = { 4, TD, SEN(pread), "pread" },
-[1149] = { 4, TD, SEN(pwrite), "pwrite" },
+[1148] = { 4, TD, SEN(pread), "pread64" },
+[1149] = { 4, TD, SEN(pwrite), "pwrite64" },
[1150] = { 1, 0, SEN(printargs), "_sysctl" },
[1151] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[1152] = { 2, TM|SI, SEN(munmap), "munmap" },
@@ -398,8 +204,8 @@
[1185] = { 2, 0, SEN(capget), "capget" },
[1186] = { 2, 0, SEN(capset), "capset" },
[1187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[1188] = { 5, TN, SEN(printargs), "getpmsg" },
-[1189] = { 5, TN, SEN(printargs), "putpmsg" },
+[1188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[1189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[1190] = { 3, TN, SEN(socket), "socket" },
[1191] = { 3, TN, SEN(bind), "bind" },
[1192] = { 3, TN, SEN(connect), "connect" },
@@ -507,9 +313,9 @@
[1294] = { 6, TD, SEN(pselect6), "pselect6" },
[1295] = { 5, TD, SEN(ppoll), "ppoll" },
[1296] = { 1, TP, SEN(unshare), "unshare" },
-[1297] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
-[1298] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
-[1299] = { 6, TD, SEN(splice), "splice" },
+[1297] = { 6, TD, SEN(splice), "splice" },
+[1298] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
+[1299] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
[1300] = { 4, TD, SEN(sync_file_range), "sync_file_range" },
[1301] = { 4, TD, SEN(tee), "tee" },
[1302] = { 4, TD, SEN(vmsplice), "vmsplice" },
@@ -553,3 +359,6 @@
[1340] = { 2, TD, SEN(memfd_create), "memfd_create", },
[1341] = { 3, TD, SEN(bpf), "bpf", },
[1342] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[1343] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[1344] = { 2, 0, SEN(membarrier), "membarrier", },
+[1345] = { 5, 0, SEN(kcmp), "kcmp" },
diff --git a/linux/m68k/arch_regs.c b/linux/m68k/arch_regs.c
index 5d4182513..8f0ab79ad 100644
--- a/linux/m68k/arch_regs.c
+++ b/linux/m68k/arch_regs.c
@@ -1 +1,2 @@
static long m68k_d0;
+#define ARCH_PC_PEEK_ADDR (4 * PT_PC)
diff --git a/linux/m68k/arch_sigreturn.c b/linux/m68k/arch_sigreturn.c
index a2ccac64e..0011c1748 100644
--- a/linux/m68k/arch_sigreturn.c
+++ b/linux/m68k/arch_sigreturn.c
@@ -1,20 +1,24 @@
-long addr;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long addr;
-if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
- return;
-/* Fetch pointer to struct sigcontext. */
-if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
- return;
+ if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
+ return;
+ /* Fetch pointer to struct sigcontext. */
+ if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
+ return;
-unsigned long mask[NSIG / 8 / sizeof(long)];
-/* Fetch first word of signal mask. */
-if (umove(tcp, addr, &mask[0]) < 0)
- return;
+ unsigned long mask[NSIG / 8 / sizeof(long)];
+ /* Fetch first word of signal mask. */
+ if (umove(tcp, addr, &mask[0]) < 0)
+ return;
-/* Fetch remaining words of signal mask, located immediately before. */
-addr -= sizeof(mask) - sizeof(long);
-if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
- return;
+ /* Fetch remaining words of signal mask, located immediately before. */
+ addr -= sizeof(mask) - sizeof(long);
+ if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
+ return;
-tprintsigmask_addr("{mask=", mask);
-tprints("}");
+ tprintsigmask_addr("{mask=", mask);
+ tprints("}");
+}
diff --git a/linux/m68k/get_error.c b/linux/m68k/get_error.c
index 8bf5359b0..a792835d4 100644
--- a/linux/m68k/get_error.c
+++ b/linux/m68k/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(m68k_d0)) {
- tcp->u_rval = -1;
- tcp->u_error = -m68k_d0;
-} else {
- tcp->u_rval = m68k_d0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(m68k_d0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -m68k_d0;
+ } else {
+ tcp->u_rval = m68k_d0;
+ }
}
diff --git a/linux/m68k/get_scno.c b/linux/m68k/get_scno.c
index 1a6d28e5e..716a76161 100644
--- a/linux/m68k/get_scno.c
+++ b/linux/m68k/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, 4*PT_ORIG_D0, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 4 * PT_ORIG_D0, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/m68k/get_syscall_args.c b/linux/m68k/get_syscall_args.c
index bdffcb1d9..bc69a1957 100644
--- a/linux/m68k/get_syscall_args.c
+++ b/linux/m68k/get_syscall_args.c
@@ -1,5 +1,11 @@
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, (i < 5 ? i : i + 2)*4, &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/m68k/get_syscall_result.c b/linux/m68k/get_syscall_result.c
index fc452b49a..005cf60cd 100644
--- a/linux/m68k/get_syscall_result.c
+++ b/linux/m68k/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, 4*PT_D0, &m68k_d0) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 4 * PT_D0, &m68k_d0) < 0 ? -1 : 0;
+}
diff --git a/linux/m68k/print_pc.c b/linux/m68k/print_pc.c
deleted file mode 100644
index aa4497d51..000000000
--- a/linux/m68k/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*PT_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/m68k/syscallent.h b/linux/m68k/syscallent.h
index aa3621176..c3ce07dfd 100644
--- a/linux/m68k/syscallent.h
+++ b/linux/m68k/syscallent.h
@@ -27,7 +27,7 @@
*/
[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -116,7 +116,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 1, TD|TM|SI, SEN(old_mmap), "old_mmap" },
+[ 90] = { 1, TD|TM|SI, SEN(old_mmap), "mmap" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -214,8 +214,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[192] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap2" },
@@ -264,7 +264,7 @@
[236] = { 4, TD|TN, SEN(sendfile64), "sendfile64" },
[237] = { 3, TM, SEN(mincore), "mincore" },
[238] = { 3, TM, SEN(madvise), "madvise" },
-[239] = { 3, TD, SEN(fcntl), "fcntl64" },
+[239] = { 3, TD, SEN(fcntl64), "fcntl64" },
[240] = { 4, TD, SEN(readahead), "readahead" },
[241] = { 2, 0, SEN(io_setup), "io_setup" },
[242] = { 1, 0, SEN(io_destroy), "io_destroy" },
@@ -360,7 +360,7 @@
[332] = { 5, TD, SEN(perf_event_open), "perf_event_open" },
[333] = { 0, 0, SEN(get_thread_area), "get_thread_area" },
[334] = { 1, 0, SEN(set_thread_area), "set_thread_area" },
-[335] = { 6, 0, SEN(printargs), "atomic_comxchg_32" },
+[335] = { 6, 0, SEN(printargs), "atomic_cmpxchg_32" },
[336] = { 0, 0, SEN(printargs), "atomic_barrier" },
[337] = { 2, TD, SEN(fanotify_init), "fanotify_init" },
[338] = { 6, TD|TF, SEN(fanotify_mark), "fanotify_mark" },
@@ -381,7 +381,27 @@
[353] = { 2, TD, SEN(memfd_create), "memfd_create", },
[354] = { 3, TD, SEN(bpf), "bpf", },
[355] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[356 ... 399] = { },
+[356] = { 3, TN, SEN(socket), "socket" },
+[357] = { 4, TN, SEN(socketpair), "socketpair" },
+[358] = { 3, TN, SEN(bind), "bind" },
+[359] = { 3, TN, SEN(connect), "connect" },
+[360] = { 2, TN, SEN(listen), "listen" },
+[361] = { 4, TN, SEN(accept4), "accept4" },
+[362] = { 5, TN, SEN(getsockopt), "getsockopt" },
+[363] = { 5, TN, SEN(setsockopt), "setsockopt" },
+[364] = { 3, TN, SEN(getsockname), "getsockname" },
+[365] = { 3, TN, SEN(getpeername), "getpeername" },
+[366] = { 6, TN, SEN(sendto), "sendto" },
+[367] = { 3, TN, SEN(sendmsg), "sendmsg" },
+[368] = { 6, TN, SEN(recvfrom), "recvfrom" },
+[369] = { 3, TN, SEN(recvmsg), "recvmsg" },
+[370] = { 2, TN, SEN(shutdown), "shutdown" },
+[371] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
+[372] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
+[373] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[374] = { 2, 0, SEN(membarrier), "membarrier", },
+[375] = { 3, TM, SEN(mlock2), "mlock2" },
+[376 ... 399] = { },
#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/metag/arch_regs.c b/linux/metag/arch_regs.c
index b7923babb..e9f0d78aa 100644
--- a/linux/metag/arch_regs.c
+++ b/linux/metag/arch_regs.c
@@ -1,2 +1,3 @@
static struct user_gp_regs metag_regs;
#define ARCH_REGS_FOR_GETREGSET metag_regs
+#define ARCH_PC_REG metag_regs.pc
diff --git a/linux/metag/get_error.c b/linux/metag/get_error.c
index 809eec54c..b7d287f9a 100644
--- a/linux/metag/get_error.c
+++ b/linux/metag/get_error.c
@@ -1,7 +1,11 @@
-/* result pointer in D0Re0 (D0.0) */
-if (check_errno && is_negated_errno(metag_regs.dx[0][0])) {
- tcp->u_rval = -1;
- tcp->u_error = -metag_regs.dx[0][0];
-} else {
- tcp->u_rval = metag_regs.dx[0][0];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ /* result pointer in D0Re0 (D0.0) */
+ if (check_errno && is_negated_errno(metag_regs.dx[0][0])) {
+ tcp->u_rval = -1;
+ tcp->u_error = -metag_regs.dx[0][0];
+ } else {
+ tcp->u_rval = metag_regs.dx[0][0];
+ }
}
diff --git a/linux/metag/get_scno.c b/linux/metag/get_scno.c
index 45cfa48e4..6dc2ab4ab 100644
--- a/linux/metag/get_scno.c
+++ b/linux/metag/get_scno.c
@@ -1 +1,7 @@
-scno = metag_regs.dx[0][1]; /* syscall number in D1Re0 (D1.0) */
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = metag_regs.dx[0][1]; /* syscall number in D1Re0 (D1.0) */
+ return 1;
+}
diff --git a/linux/metag/get_syscall_args.c b/linux/metag/get_syscall_args.c
index 269f4eb8e..b7c10f45f 100644
--- a/linux/metag/get_syscall_args.c
+++ b/linux/metag/get_syscall_args.c
@@ -1,5 +1,12 @@
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ unsigned int i;
-for (i = 0; i < MAX_ARGS; i++)
- /* arguments go backwards from D1Ar1 (D1.3) */
- tcp->u_arg[i] = ((unsigned long *)&metag_regs.dx[3][1])[-i];
+ for (i = 0; i < MAX_ARGS; i++) {
+ /* arguments go backwards from D1Ar1 (D1.3) */
+ tcp->u_arg[i] = ((unsigned long *)&metag_regs.dx[3][1])[-i];
+ }
+ return 1;
+}
diff --git a/linux/metag/print_pc.c b/linux/metag/print_pc.c
deleted file mode 100644
index 4415f67b0..000000000
--- a/linux/metag/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, metag_regs.pc);
diff --git a/linux/microblaze/arch_regs.c b/linux/microblaze/arch_regs.c
index 9c26aad9d..c7bafabd2 100644
--- a/linux/microblaze/arch_regs.c
+++ b/linux/microblaze/arch_regs.c
@@ -1 +1,2 @@
static long microblaze_r3;
+#define ARCH_PC_PEEK_ADDR PT_PC
diff --git a/linux/microblaze/arch_sigreturn.c b/linux/microblaze/arch_sigreturn.c
index 0c7f99cd8..839c80578 100644
--- a/linux/microblaze/arch_sigreturn.c
+++ b/linux/microblaze/arch_sigreturn.c
@@ -1,12 +1,16 @@
-/* TODO: Verify that this is correct... */
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ /* TODO: Verify that this is correct... */
-long addr;
+ long addr;
-/* Read r1, the stack pointer. */
-if (upeek(tcp->pid, 1 * 4, &addr) < 0)
- return;
-addr += offsetof(struct sigcontext, oldmask);
+ /* Read r1, the stack pointer. */
+ if (upeek(tcp->pid, 1 * 4, &addr) < 0)
+ return;
+ addr += offsetof(struct sigcontext, oldmask);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/microblaze/get_error.c b/linux/microblaze/get_error.c
index d36e281c5..878e24f67 100644
--- a/linux/microblaze/get_error.c
+++ b/linux/microblaze/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(microblaze_r3)) {
- tcp->u_rval = -1;
- tcp->u_error = -microblaze_r3;
-} else {
- tcp->u_rval = microblaze_r3;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(microblaze_r3)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -microblaze_r3;
+ } else {
+ tcp->u_rval = microblaze_r3;
+ }
}
diff --git a/linux/microblaze/get_scno.c b/linux/microblaze/get_scno.c
index cf1d919b0..6f98f834c 100644
--- a/linux/microblaze/get_scno.c
+++ b/linux/microblaze/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, 0, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 0, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/microblaze/get_syscall_args.c b/linux/microblaze/get_syscall_args.c
index 373911c1c..830c8c321 100644
--- a/linux/microblaze/get_syscall_args.c
+++ b/linux/microblaze/get_syscall_args.c
@@ -1,5 +1,11 @@
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, (5 + i) * 4, &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, (5 + i) * 4, &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/microblaze/get_syscall_result.c b/linux/microblaze/get_syscall_result.c
index b7ec27f29..9ece53e82 100644
--- a/linux/microblaze/get_syscall_result.c
+++ b/linux/microblaze/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, 3 * 4, &microblaze_r3) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, 3 * 4, &microblaze_r3) < 0 ? -1 : 0;
+}
diff --git a/linux/microblaze/print_pc.c b/linux/microblaze/print_pc.c
deleted file mode 100644
index b1eef145c..000000000
--- a/linux/microblaze/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, PT_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/microblaze/syscallent.h b/linux/microblaze/syscallent.h
index 379e6cf09..0336a5639 100644
--- a/linux/microblaze/syscallent.h
+++ b/linux/microblaze/syscallent.h
@@ -27,7 +27,7 @@
*/
[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -116,7 +116,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 6, TD|TM|SI, SEN(mmap), "old_mmap" },
+[ 90] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -214,8 +214,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[192] = { 6, TD|TM|SI, SEN(mmap_pgoff), "mmap2" },
@@ -247,7 +247,7 @@
[218] = { 3, TM, SEN(mincore), "mincore" },
[219] = { 3, TM, SEN(madvise), "madvise" },
[220] = { 3, TD, SEN(getdents64), "getdents64" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
[222 ... 223] = { },
[224] = { 0, 0, SEN(gettid), "gettid" },
[225] = { 4, TD, SEN(readahead), "readahead" },
@@ -414,3 +414,6 @@
[386] = { 2, TD, SEN(memfd_create), "memfd_create", },
[387] = { 3, TD, SEN(bpf), "bpf", },
[388] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[389] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[390] = { 2, 0, SEN(membarrier), "membarrier", },
+[391] = { 3, TM, SEN(mlock2), "mlock2" },
diff --git a/linux/mips/arch_regs.c b/linux/mips/arch_regs.c
index c46e6ebac..44f6bd5e8 100644
--- a/linux/mips/arch_regs.c
+++ b/linux/mips/arch_regs.c
@@ -1,3 +1,4 @@
struct mips_regs mips_regs; /* not static */
/* PTRACE_GETREGS on MIPS is available since linux v2.6.15. */
#define ARCH_REGS_FOR_GETREGS mips_regs
+#define ARCH_PC_REG mips_REG_EPC
diff --git a/linux/mips/arch_sigreturn.c b/linux/mips/arch_sigreturn.c
index 687f871db..3095fe591 100644
--- a/linux/mips/arch_sigreturn.c
+++ b/linux/mips/arch_sigreturn.c
@@ -1,22 +1,26 @@
+static void
+arch_sigreturn(struct tcb *tcp)
+{
#if defined LINUX_MIPSO32
-/*
- * offsetof(struct sigframe, sf_mask) ==
- * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
- */
-const long addr = mips_REG_SP + 6 * 4 +
- sizeof(struct sigcontext);
+ /*
+ * offsetof(struct sigframe, sf_mask) ==
+ * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
+ */
+ const long addr = mips_REG_SP + 6 * 4 +
+ sizeof(struct sigcontext);
#else
-/*
- * This decodes rt_sigreturn.
- * The 64-bit ABIs do not have sigreturn.
- *
- * offsetof(struct rt_sigframe, rs_uc) ==
- * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
- */
-const long addr = mips_REG_SP + 6 * 4 + 128 +
- offsetof(struct ucontext, uc_sigmask);
+ /*
+ * This decodes rt_sigreturn.
+ * The 64-bit ABIs do not have sigreturn.
+ *
+ * offsetof(struct rt_sigframe, rs_uc) ==
+ * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
+ */
+ const long addr = mips_REG_SP + 6 * 4 + 128 +
+ offsetof(struct ucontext, uc_sigmask);
#endif
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/mips/get_error.c b/linux/mips/get_error.c
index e934af08f..e58055e13 100644
--- a/linux/mips/get_error.c
+++ b/linux/mips/get_error.c
@@ -1,9 +1,14 @@
-if (check_errno && mips_REG_A3) {
- tcp->u_rval = -1;
- tcp->u_error = mips_REG_V0;
-} else {
-# if defined LINUX_MIPSN32
- tcp->u_lrval = mips_REG_V0;
-# endif
- tcp->u_rval = mips_REG_V0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && mips_REG_A3) {
+ tcp->u_rval = -1;
+ tcp->u_error = mips_REG_V0;
+ } else {
+ tcp->u_rval = mips_REG_V0;
+#ifdef LINUX_MIPSN32
+ /* tcp->u_rval contains a truncated value */
+ tcp->u_lrval = mips_REG_V0;
+#endif
+ }
}
diff --git a/linux/mips/get_scno.c b/linux/mips/get_scno.c
index 126cedecb..f9b5e7d71 100644
--- a/linux/mips/get_scno.c
+++ b/linux/mips/get_scno.c
@@ -1,9 +1,17 @@
-scno = mips_REG_V0;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = mips_REG_V0;
-if (!SCNO_IN_RANGE(scno)) {
- if (mips_REG_A3 == 0 || mips_REG_A3 == (uint64_t) -1) {
- if (debug_flag)
- error_msg("stray syscall exit: v0 = %ld", scno);
- return 0;
+ if (!SCNO_IN_RANGE(tcp->scno)) {
+ if (mips_REG_A3 == 0 || mips_REG_A3 == (uint64_t) -1) {
+ if (debug_flag)
+ error_msg("stray syscall exit: v0 = %ld",
+ tcp->scno);
+ return 0;
+ }
}
+
+ return 1;
}
diff --git a/linux/mips/get_syscall_args.c b/linux/mips/get_syscall_args.c
index 4e4a22b77..a20be8dee 100644
--- a/linux/mips/get_syscall_args.c
+++ b/linux/mips/get_syscall_args.c
@@ -1,3 +1,7 @@
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
#if defined LINUX_MIPSN64
tcp->u_arg[0] = mips_REG_A0;
tcp->u_arg[1] = mips_REG_A1;
@@ -18,10 +22,13 @@
tcp->u_arg[2] = mips_REG_A2;
tcp->u_arg[3] = mips_REG_A3;
if (tcp->s_ent->nargs > 4) {
- umoven(tcp, mips_REG_SP + 4 * 4,
- (tcp->s_ent->nargs - 4) * sizeof(tcp->u_arg[0]),
- &tcp->u_arg[4]);
+ if (umoven(tcp, mips_REG_SP + 4 * 4,
+ (tcp->s_ent->nargs - 4) * sizeof(tcp->u_arg[0]),
+ &tcp->u_arg[4]) < 0)
+ return -1;
}
#else
# error unsupported mips abi
#endif
+ return 1;
+}
diff --git a/linux/mips/print_pc.c b/linux/mips/print_pc.c
deleted file mode 100644
index 569b0b6b7..000000000
--- a/linux/mips/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, (unsigned long) mips_REG_EPC);
diff --git a/linux/mips/syscallent-n32.h b/linux/mips/syscallent-n32.h
index ea3fb9815..f97511dae 100644
--- a/linux/mips/syscallent-n32.h
+++ b/linux/mips/syscallent-n32.h
@@ -22,7 +22,7 @@
[6019] = { 3, TD, SEN(writev), "writev" },
[6020] = { 2, TF, SEN(access), "access" },
[6021] = { 1, TD, SEN(pipe), "pipe" },
-[6022] = { 5, TD, SEN(select), "select" },
+[6022] = { 5, TD, SEN(select), "_newselect" },
[6023] = { 0, 0, SEN(sched_yield), "sched_yield" },
[6024] = { 5, TM|SI, SEN(mremap), "mremap" },
[6025] = { 3, TM, SEN(msync), "msync" },
@@ -136,7 +136,7 @@
[6133] = { 2, 0, SEN(ustat), "ustat" },
[6134] = { 3, TF, SEN(statfs), "statfs" },
[6135] = { 3, TD, SEN(fstatfs), "fstatfs" },
-[6136] = { 5, 0, SEN(sysfs), "sysfs" },
+[6136] = { 3, 0, SEN(sysfs), "sysfs" },
[6137] = { 2, 0, SEN(getpriority), "getpriority" },
[6138] = { 3, 0, SEN(setpriority), "setpriority" },
[6139] = { 2, 0, SEN(sched_setparam), "sched_setparam" },
@@ -174,8 +174,8 @@
[6171] = { 5, 0, SEN(query_module), "query_module" },
[6172] = { 4, TF, SEN(quotactl), "quotactl" },
[6173] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
-[6174] = { 5, TN, SEN(printargs), "getpmsg" },
-[6175] = { 5, TN, SEN(printargs), "putpmsg" },
+[6174] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[6175] = { 5, TN, SEN(putpmsg), "putpmsg" },
[6176] = { 0, 0, SEN(afs_syscall), "afs_syscall" },
[6177] = { 0, 0, SEN(printargs), "reserved177" },
[6178] = { 0, 0, SEN(gettid), "gettid" },
@@ -212,11 +212,11 @@
[6209] = { 4, TD, SEN(epoll_wait), "epoll_wait" },
[6210] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
[6211] = { 0, TS, SEN(rt_sigreturn), "rt_sigreturn" },
-[6212] = { 3, TD, SEN(fcntl), "fcntl64" },
+[6212] = { 3, TD, SEN(fcntl64), "fcntl64" },
[6213] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
[6214] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
[6215] = { 4, TI, SEN(semtimedop), "semtimedop" },
-[6216] = { 4, TD, SEN(fadvise64), "fadvise64" },
+[6216] = { 4, TD, SEN(fadvise64_64), "fadvise64" },
[6217] = { 3, TF, SEN(statfs64), "statfs64" },
[6218] = { 3, TD, SEN(fstatfs64), "fstatfs64" },
[6219] = { 4, TD|TN, SEN(sendfile64), "sendfile64" },
@@ -321,7 +321,10 @@
[6318] = { 2, TD, SEN(memfd_create), "memfd_create", },
[6319] = { 3, TD, SEN(bpf), "bpf", },
[6320] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[6321 ... 6399] = { },
+[6321] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[6322] = { 2, 0, SEN(membarrier), "membarrier", },
+[6323] = { 3, TM, SEN(mlock2), "mlock2" },
+[6324 ... 6399] = { },
# define SYS_socket_subcall 6400
# include "subcall.h"
diff --git a/linux/mips/syscallent-n64.h b/linux/mips/syscallent-n64.h
index 1a7147ed6..9f3203809 100644
--- a/linux/mips/syscallent-n64.h
+++ b/linux/mips/syscallent-n64.h
@@ -22,7 +22,7 @@
[5019] = { 3, TD, SEN(writev), "writev" },
[5020] = { 2, TF, SEN(access), "access" },
[5021] = { 1, TD, SEN(pipe), "pipe" },
-[5022] = { 5, TD, SEN(select), "select" },
+[5022] = { 5, TD, SEN(select), "_newselect" },
[5023] = { 0, 0, SEN(sched_yield), "sched_yield" },
[5024] = { 5, TM|SI, SEN(mremap), "mremap" },
[5025] = { 3, TM, SEN(msync), "msync" },
@@ -136,7 +136,7 @@
[5133] = { 2, 0, SEN(ustat), "ustat" },
[5134] = { 3, TF, SEN(statfs), "statfs" },
[5135] = { 3, TD, SEN(fstatfs), "fstatfs" },
-[5136] = { 5, 0, SEN(sysfs), "sysfs" },
+[5136] = { 3, 0, SEN(sysfs), "sysfs" },
[5137] = { 2, 0, SEN(getpriority), "getpriority" },
[5138] = { 3, 0, SEN(setpriority), "setpriority" },
[5139] = { 2, 0, SEN(sched_setparam), "sched_setparam" },
@@ -174,8 +174,8 @@
[5171] = { 5, 0, SEN(query_module), "query_module" },
[5172] = { 4, TF, SEN(quotactl), "quotactl" },
[5173] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
-[5174] = { 5, TN, SEN(printargs), "getpmsg" },
-[5175] = { 5, TN, SEN(printargs), "putpmsg" },
+[5174] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[5175] = { 5, TN, SEN(putpmsg), "putpmsg" },
[5176] = { 0, 0, SEN(afs_syscall), "afs_syscall" },
[5177] = { 0, 0, SEN(printargs), "reserved177" },
[5178] = { 0, 0, SEN(gettid), "gettid" },
@@ -215,7 +215,7 @@
[5212] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
[5213] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
[5214] = { 4, TI, SEN(semtimedop), "semtimedop" },
-[5215] = { 4, TD, SEN(fadvise64_64), "fadvise64_64" },
+[5215] = { 4, TD, SEN(fadvise64_64), "fadvise64" },
[5216] = { 3, 0, SEN(timer_create), "timer_create" },
[5217] = { 4, 0, SEN(timer_settime), "timer_settime" },
[5218] = { 2, 0, SEN(timer_gettime), "timer_gettime" },
@@ -317,7 +317,10 @@
[5314] = { 2, TD, SEN(memfd_create), "memfd_create", },
[5315] = { 3, TD, SEN(bpf), "bpf", },
[5316] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[5317 ... 5399] = { },
+[5317] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[5318] = { 2, 0, SEN(membarrier), "membarrier", },
+[5319] = { 3, TM, SEN(mlock2), "mlock2" },
+[5320 ... 5399] = { },
# define SYS_socket_subcall 5400
# include "subcall.h"
diff --git a/linux/mips/syscallent-o32.h b/linux/mips/syscallent-o32.h
index ef9752dfe..ab1f6c57e 100644
--- a/linux/mips/syscallent-o32.h
+++ b/linux/mips/syscallent-o32.h
@@ -142,7 +142,7 @@
[4139] = { 1, NF, SEN(setfsgid), "setfsgid" },
[4140] = { 5, TD, SEN(llseek), "_llseek" },
[4141] = { 3, TD, SEN(getdents), "getdents" },
-[4142] = { 5, TD, SEN(select), "select" },
+[4142] = { 5, TD, SEN(select), "_newselect" },
[4143] = { 2, TD, SEN(flock), "flock" },
[4144] = { 3, TM, SEN(msync), "msync" },
[4145] = { 3, TD, SEN(readv), "readv" },
@@ -208,8 +208,8 @@
[4205] = { 2, 0, SEN(capset), "capset" },
[4206] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[4207] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[4208] = { 5, TN, SEN(printargs), "getpmsg" },
-[4209] = { 5, TN, SEN(printargs), "putpmsg" },
+[4208] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[4209] = { 5, TN, SEN(putpmsg), "putpmsg" },
[4210] = { 6, TD|TM|SI, SEN(mmap_4koff), "mmap2" },
[4211] = { 4, TF, SEN(truncate64), "truncate64" },
[4212] = { 4, TD, SEN(ftruncate64), "ftruncate64" },
@@ -220,7 +220,7 @@
[4217] = { 3, TM, SEN(mincore), "mincore" },
[4218] = { 3, TM, SEN(madvise), "madvise" },
[4219] = { 3, TD, SEN(getdents64), "getdents64" },
-[4220] = { 3, TD, SEN(fcntl), "fcntl64" },
+[4220] = { 3, TD, SEN(fcntl64), "fcntl64" },
[4221] = { },
[4222] = { 0, 0, SEN(gettid), "gettid" },
[4223] = { 5, TD, SEN(readahead), "readahead" },
@@ -254,7 +254,7 @@
[4251] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
[4252] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
[4253] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[4254] = { 7, TD, SEN(fadvise64_64), "fadvise64_64" },
+[4254] = { 7, TD, SEN(fadvise64_64), "fadvise64" },
[4255] = { 3, TF, SEN(statfs64), "statfs64" },
[4256] = { 2, TD, SEN(fstatfs64), "fstatfs64" },
[4257] = { 3, 0, SEN(timer_create), "timer_create" },
@@ -357,7 +357,10 @@
[4354] = { 2, TD, SEN(memfd_create), "memfd_create", },
[4355] = { 3, TD, SEN(bpf), "bpf", },
[4356] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[4357 ... 4399] = { },
+[4357] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[4358] = { 2, 0, SEN(membarrier), "membarrier", },
+[4359] = { 3, TM, SEN(mlock2), "mlock2" },
+[4360 ... 4399] = { },
# define SYS_socket_subcall 4400
# include "subcall.h"
diff --git a/linux/nios2/arch_regs.c b/linux/nios2/arch_regs.c
index 62827f972..2c30321f3 100644
--- a/linux/nios2/arch_regs.c
+++ b/linux/nios2/arch_regs.c
@@ -1,2 +1,3 @@
static struct user_pt_regs nios2_regs;
# define ARCH_REGS_FOR_GETREGSET nios2_regs
+#define ARCH_PC_REG nios2_regs.regs[PTR_EA]
diff --git a/linux/nios2/get_error.c b/linux/nios2/get_error.c
index 5d7e6db69..52c05ad91 100644
--- a/linux/nios2/get_error.c
+++ b/linux/nios2/get_error.c
@@ -1,13 +1,17 @@
-/*
- * The system call convention specifies that r2 contains the return
- * value on success or a positive error number on failure. A flag
- * indicating successful completion is written to r7; r7=0 indicates
- * the system call success, r7=1 indicates an error. The positive
- * errno value written in r2.
- */
-if (check_errno && nios2_regs.regs[7]) {
- tcp->u_rval = -1;
- tcp->u_error = nios2_regs.regs[2];
-} else {
- tcp->u_rval = nios2_regs.regs[2];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ /*
+ * The system call convention specifies that r2 contains the return
+ * value on success or a positive error number on failure. A flag
+ * indicating successful completion is written to r7; r7=0 indicates
+ * the system call success, r7=1 indicates an error. The positive
+ * errno value written in r2.
+ */
+ if (check_errno && nios2_regs.regs[7]) {
+ tcp->u_rval = -1;
+ tcp->u_error = nios2_regs.regs[2];
+ } else {
+ tcp->u_rval = nios2_regs.regs[2];
+ }
}
diff --git a/linux/nios2/get_scno.c b/linux/nios2/get_scno.c
index c820bceaf..f4db85eed 100644
--- a/linux/nios2/get_scno.c
+++ b/linux/nios2/get_scno.c
@@ -1 +1,7 @@
-scno = nios2_regs.regs[2];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = nios2_regs.regs[2];
+ return 1;
+}
diff --git a/linux/nios2/get_syscall_args.c b/linux/nios2/get_syscall_args.c
index d12c2f7e2..707f594a6 100644
--- a/linux/nios2/get_syscall_args.c
+++ b/linux/nios2/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = nios2_regs.regs[4];
-tcp->u_arg[1] = nios2_regs.regs[5];
-tcp->u_arg[2] = nios2_regs.regs[6];
-tcp->u_arg[3] = nios2_regs.regs[7];
-tcp->u_arg[4] = nios2_regs.regs[8];
-tcp->u_arg[5] = nios2_regs.regs[9];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = nios2_regs.regs[4];
+ tcp->u_arg[1] = nios2_regs.regs[5];
+ tcp->u_arg[2] = nios2_regs.regs[6];
+ tcp->u_arg[3] = nios2_regs.regs[7];
+ tcp->u_arg[4] = nios2_regs.regs[8];
+ tcp->u_arg[5] = nios2_regs.regs[9];
+ return 1;
+}
diff --git a/linux/nios2/print_pc.c b/linux/nios2/print_pc.c
deleted file mode 100644
index d22e8f73b..000000000
--- a/linux/nios2/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, nios2_regs.regs[PTR_EA]);
diff --git a/linux/or1k/arch_regs.c b/linux/or1k/arch_regs.c
index 7415e0885..78693e5ae 100644
--- a/linux/or1k/arch_regs.c
+++ b/linux/or1k/arch_regs.c
@@ -1,2 +1,3 @@
static struct user_regs_struct or1k_regs;
#define ARCH_REGS_FOR_GETREGSET or1k_regs
+#define ARCH_PC_REG or1k_regs.pc
diff --git a/linux/or1k/get_error.c b/linux/or1k/get_error.c
index cbf9a6eb1..40e00bf46 100644
--- a/linux/or1k/get_error.c
+++ b/linux/or1k/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(or1k_regs.gpr[11])) {
- tcp->u_rval = -1;
- tcp->u_error = -or1k_regs.gpr[11];
-} else {
- tcp->u_rval = or1k_regs.gpr[11];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(or1k_regs.gpr[11])) {
+ tcp->u_rval = -1;
+ tcp->u_error = -or1k_regs.gpr[11];
+ } else {
+ tcp->u_rval = or1k_regs.gpr[11];
+ }
}
diff --git a/linux/or1k/get_scno.c b/linux/or1k/get_scno.c
index 99fada292..f446c9070 100644
--- a/linux/or1k/get_scno.c
+++ b/linux/or1k/get_scno.c
@@ -1 +1,7 @@
-scno = or1k_regs.gpr[11];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = or1k_regs.gpr[11];
+ return 1;
+}
diff --git a/linux/or1k/get_syscall_args.c b/linux/or1k/get_syscall_args.c
index 751cba05b..b72e01f09 100644
--- a/linux/or1k/get_syscall_args.c
+++ b/linux/or1k/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = or1k_regs.gpr[3 + 0];
-tcp->u_arg[1] = or1k_regs.gpr[3 + 1];
-tcp->u_arg[2] = or1k_regs.gpr[3 + 2];
-tcp->u_arg[3] = or1k_regs.gpr[3 + 3];
-tcp->u_arg[4] = or1k_regs.gpr[3 + 4];
-tcp->u_arg[5] = or1k_regs.gpr[3 + 5];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = or1k_regs.gpr[3 + 0];
+ tcp->u_arg[1] = or1k_regs.gpr[3 + 1];
+ tcp->u_arg[2] = or1k_regs.gpr[3 + 2];
+ tcp->u_arg[3] = or1k_regs.gpr[3 + 3];
+ tcp->u_arg[4] = or1k_regs.gpr[3 + 4];
+ tcp->u_arg[5] = or1k_regs.gpr[3 + 5];
+ return 1;
+}
diff --git a/linux/or1k/print_pc.c b/linux/or1k/print_pc.c
deleted file mode 100644
index 3fe4a1a19..000000000
--- a/linux/or1k/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, or1k_regs.pc);
diff --git a/linux/powerpc/arch_regs.c b/linux/powerpc/arch_regs.c
index cd92d21dd..dd573f71e 100644
--- a/linux/powerpc/arch_regs.c
+++ b/linux/powerpc/arch_regs.c
@@ -1,3 +1,4 @@
struct pt_regs ppc_regs; /* not static */
#define ARCH_REGS_FOR_GETREGS ppc_regs
+#define ARCH_PC_REG ppc_regs.nip
diff --git a/linux/powerpc/arch_sigreturn.c b/linux/powerpc/arch_sigreturn.c
index bc4802ac6..c28a19621 100644
--- a/linux/powerpc/arch_sigreturn.c
+++ b/linux/powerpc/arch_sigreturn.c
@@ -1,24 +1,28 @@
-long esp = ppc_regs.gpr[1];
-struct sigcontext sc;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long esp = ppc_regs.gpr[1];
+ struct sigcontext sc;
-/* Skip dummy stack frame. */
+ /* Skip dummy stack frame. */
#ifdef POWERPC64
-if (current_personality == 0)
- esp += 128;
-else
+ if (current_personality == 0)
+ esp += 128;
+ else
#endif
- esp += 64;
+ esp += 64;
-if (umove(tcp, esp, &sc) < 0) {
- tprintf("{mask=%#lx}", esp);
-} else {
- unsigned long mask[NSIG / 8 / sizeof(long)];
+ if (umove(tcp, esp, &sc) < 0) {
+ tprintf("{mask=%#lx}", esp);
+ } else {
+ unsigned long mask[NSIG / 8 / sizeof(long)];
#ifdef POWERPC64
- mask[0] = sc.oldmask | (sc._unused[3] << 32);
+ mask[0] = sc.oldmask | (sc._unused[3] << 32);
#else
- mask[0] = sc.oldmask;
- mask[1] = sc._unused[3];
+ mask[0] = sc.oldmask;
+ mask[1] = sc._unused[3];
#endif
- tprintsigmask_addr("{mask=", mask);
- tprints("}");
+ tprintsigmask_addr("{mask=", mask);
+ tprints("}");
+ }
}
diff --git a/linux/powerpc/get_error.c b/linux/powerpc/get_error.c
index f0f0a4e71..41506fb72 100644
--- a/linux/powerpc/get_error.c
+++ b/linux/powerpc/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && (ppc_regs.ccr & 0x10000000)) {
- tcp->u_rval = -1;
- tcp->u_error = ppc_regs.gpr[3];
-} else {
- tcp->u_rval = ppc_regs.gpr[3];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && (ppc_regs.ccr & 0x10000000)) {
+ tcp->u_rval = -1;
+ tcp->u_error = ppc_regs.gpr[3];
+ } else {
+ tcp->u_rval = ppc_regs.gpr[3];
+ }
}
diff --git a/linux/powerpc/get_scno.c b/linux/powerpc/get_scno.c
index a311734b3..ef06656ff 100644
--- a/linux/powerpc/get_scno.c
+++ b/linux/powerpc/get_scno.c
@@ -1 +1,7 @@
-scno = ppc_regs.gpr[0];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = ppc_regs.gpr[0];
+ return 1;
+}
diff --git a/linux/powerpc/get_syscall_args.c b/linux/powerpc/get_syscall_args.c
index 237cf77fe..66bcae31f 100644
--- a/linux/powerpc/get_syscall_args.c
+++ b/linux/powerpc/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = ppc_regs.orig_gpr3;
-tcp->u_arg[1] = ppc_regs.gpr[4];
-tcp->u_arg[2] = ppc_regs.gpr[5];
-tcp->u_arg[3] = ppc_regs.gpr[6];
-tcp->u_arg[4] = ppc_regs.gpr[7];
-tcp->u_arg[5] = ppc_regs.gpr[8];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = ppc_regs.orig_gpr3;
+ tcp->u_arg[1] = ppc_regs.gpr[4];
+ tcp->u_arg[2] = ppc_regs.gpr[5];
+ tcp->u_arg[3] = ppc_regs.gpr[6];
+ tcp->u_arg[4] = ppc_regs.gpr[7];
+ tcp->u_arg[5] = ppc_regs.gpr[8];
+ return 1;
+}
diff --git a/linux/powerpc/print_pc.c b/linux/powerpc/print_pc.c
deleted file mode 100644
index 34112fb6c..000000000
--- a/linux/powerpc/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, ppc_regs.nip);
diff --git a/linux/powerpc/syscallent.h b/linux/powerpc/syscallent.h
index f8587ab99..741be4442 100644
--- a/linux/powerpc/syscallent.h
+++ b/linux/powerpc/syscallent.h
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -213,8 +213,8 @@
[184] = { 2, 0, SEN(capset), "capset" },
[185] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[186] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[187] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[188] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[187] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[188] = { 5, TN, SEN(putpmsg), "putpmsg" },
[189] = { 0, TP, SEN(vfork), "vfork" },
[190] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[191] = { 5, TD, SEN(readahead), "readahead" },
@@ -227,10 +227,10 @@
[198] = { 5, 0, SEN(printargs), "pciconfig_read" },
[199] = { 5, 0, SEN(printargs), "pciconfig_write" },
[200] = { 3, 0, SEN(printargs), "pciconfig_iobase" },
-[201] = { 6, 0, SEN(printargs), "MOL" },
+[201] = { 6, 0, SEN(printargs), "multiplexer" },
[202] = { 3, TD, SEN(getdents64), "getdents64" },
[203] = { 2, TF, SEN(pivotroot), "pivot_root" },
-[204] = { 3, TD, SEN(fcntl), "fcntl64" },
+[204] = { 3, TD, SEN(fcntl64), "fcntl64" },
[205] = { 3, TM, SEN(madvise), "madvise" },
[206] = { 3, TM, SEN(mincore), "mincore" },
[207] = { 0, 0, SEN(gettid), "gettid" },
@@ -251,7 +251,7 @@
[222] = { 3, 0, SEN(sched_setaffinity), "sched_setaffinity" },
[223] = { 3, 0, SEN(sched_getaffinity), "sched_getaffinity" },
[224] = { },
-[225] = { 5, 0, SEN(printargs), "tux" },
+[225] = { 5, 0, SEN(printargs), "tuxcall" },
[226] = { 4, TD|TN, SEN(sendfile64), "sendfile64" },
[227] = { 2, 0, SEN(io_setup), "io_setup" },
[228] = { 1, 0, SEN(io_destroy), "io_destroy" },
@@ -282,7 +282,7 @@
[253] = { 3, TD, SEN(fstatfs64), "fstatfs64" },
[254] = { 6, TD, SEN(fadvise64_64), "fadvise64_64" },
[255] = { 1, 0, SEN(printargs), "rtas" },
-[256] = { 5, 0, SEN(printargs), "debug_setcontext" },
+[256] = { 5, 0, SEN(printargs), "sys_debug_setcontext" },
[257] = { 5, 0, SEN(vserver), "vserver" },
[258] = { 4, TM, SEN(migrate_pages), "migrate_pages" },
[259] = { 6, TM, SEN(mbind), "mbind" },
@@ -317,7 +317,7 @@
[288] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[289] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[290] = { 3, TD|TF, SEN(futimesat), "futimesat" },
-[291] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[291] = { 4, TD|TF, SEN(newfstatat), "fstatat64" },
[292] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[293] = { 4, TD|TF, SEN(renameat), "renameat" },
[294] = { 5, TD|TF, SEN(linkat), "linkat" },
@@ -389,7 +389,23 @@
[360] = { 2, TD, SEN(memfd_create), "memfd_create", },
[361] = { 3, TD, SEN(bpf), "bpf", },
[362] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[363 ... 399] = { },
+[363] = { 0, 0, SEN(printargs), "switch_endian" },
+[364] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[365] = { 2, 0, SEN(membarrier), "membarrier", },
+[366] = { 3, TI, SEN(semop), "semop" },
+[367] = { 3, TI, SEN(semget), "semget" },
+[368] = { 4, TI, SEN(semctl), "semctl" },
+[369] = { 4, TI, SEN(semtimedop), "semtimedop" },
+[370] = { 4, TI, SEN(msgsnd), "msgsnd" },
+[371] = { 5, TI, SEN(msgrcv), "msgrcv" },
+[372] = { 2, TI, SEN(msgget), "msgget" },
+[373] = { 3, TI, SEN(msgctl), "msgctl" },
+[374] = { 3, TI|TM|SI, SEN(shmat), "shmat" },
+[375] = { 1, TI|TM|SI, SEN(shmdt), "shmdt" },
+[376] = { 3, TI, SEN(shmget), "shmget" },
+[377] = { 3, TI, SEN(shmctl), "shmctl" },
+[378] = { 3, TM, SEN(mlock2), "mlock2" },
+[379 ... 399] = { },
#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/powerpc64/arch_regs.c b/linux/powerpc64/arch_regs.c
index b5c572dcc..90646515d 100644
--- a/linux/powerpc64/arch_regs.c
+++ b/linux/powerpc64/arch_regs.c
@@ -1 +1,2 @@
#include "powerpc/arch_regs.c"
+#define ARCH_PC_REG ppc_regs.nip
diff --git a/linux/powerpc64/get_scno.c b/linux/powerpc64/get_scno.c
index 1e6701024..8a943e8da 100644
--- a/linux/powerpc64/get_scno.c
+++ b/linux/powerpc64/get_scno.c
@@ -1,11 +1,15 @@
-scno = ppc_regs.gpr[0];
-unsigned int currpers;
-
-/*
- * Check for 64/32 bit mode.
- * Embedded implementations covered by Book E extension of PPC use
- * bit 0 (CM) of 32-bit Machine state register (MSR).
- * Other implementations use bit 0 (SF) of 64-bit MSR.
- */
-currpers = (ppc_regs.msr & 0x8000000080000000) ? 0 : 1;
-update_personality(tcp, currpers);
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = ppc_regs.gpr[0];
+ /*
+ * Check for 64/32 bit mode.
+ * Embedded implementations covered by Book E extension of PPC use
+ * bit 0 (CM) of 32-bit Machine state register (MSR).
+ * Other implementations use bit 0 (SF) of 64-bit MSR.
+ */
+ unsigned int currpers = (ppc_regs.msr & 0x8000000080000000) ? 0 : 1;
+ update_personality(tcp, currpers);
+ return 1;
+}
diff --git a/linux/powerpc64/print_pc.c b/linux/powerpc64/print_pc.c
deleted file mode 100644
index ddaf880b0..000000000
--- a/linux/powerpc64/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "powerpc/print_pc.c"
diff --git a/linux/powerpc64/syscallent.h b/linux/powerpc64/syscallent.h
index 64a9f01c7..81152afb4 100644
--- a/linux/powerpc64/syscallent.h
+++ b/linux/powerpc64/syscallent.h
@@ -1 +1,406 @@
-#include "powerpc/syscallent.h"
+/*
+ * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
+ * Copyright (c) 1993, 1994, 1995 Rick Sladkey <jrs@world.std.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
+[ 2] = { 0, TP, SEN(fork), "fork" },
+[ 3] = { 3, TD, SEN(read), "read" },
+[ 4] = { 3, TD, SEN(write), "write" },
+[ 5] = { 3, TD|TF, SEN(open), "open" },
+[ 6] = { 1, TD, SEN(close), "close" },
+[ 7] = { 3, TP, SEN(waitpid), "waitpid" },
+[ 8] = { 2, TD|TF, SEN(creat), "creat" },
+[ 9] = { 2, TF, SEN(link), "link" },
+[ 10] = { 1, TF, SEN(unlink), "unlink" },
+[ 11] = { 3, TF|TP|SE|SI, SEN(execve), "execve" },
+[ 12] = { 1, TF, SEN(chdir), "chdir" },
+[ 13] = { 1, 0, SEN(time), "time" },
+[ 14] = { 3, TF, SEN(mknod), "mknod" },
+[ 15] = { 2, TF, SEN(chmod), "chmod" },
+[ 16] = { 3, TF, SEN(chown), "lchown" },
+[ 17] = { 0, TM, SEN(break), "break" },
+[ 18] = { 2, TF, SEN(oldstat), "oldstat" },
+[ 19] = { 3, TD, SEN(lseek), "lseek" },
+[ 20] = { 0, 0, SEN(getpid), "getpid" },
+[ 21] = { 5, TF, SEN(mount), "mount" },
+[ 22] = { 1, TF, SEN(umount), "umount" },
+[ 23] = { 1, 0, SEN(setuid), "setuid" },
+[ 24] = { 0, NF, SEN(getuid), "getuid" },
+[ 25] = { 1, 0, SEN(stime), "stime" },
+[ 26] = { 4, 0, SEN(ptrace), "ptrace" },
+[ 27] = { 1, 0, SEN(alarm), "alarm" },
+[ 28] = { 2, TD, SEN(oldfstat), "oldfstat" },
+[ 29] = { 0, TS, SEN(pause), "pause" },
+[ 30] = { 2, TF, SEN(utime), "utime" },
+[ 31] = { 2, 0, SEN(stty), "stty" },
+[ 32] = { 2, 0, SEN(gtty), "gtty" },
+[ 33] = { 2, TF, SEN(access), "access" },
+[ 34] = { 1, 0, SEN(nice), "nice" },
+[ 35] = { 0, 0, SEN(ftime), "ftime" },
+[ 36] = { 0, 0, SEN(sync), "sync" },
+[ 37] = { 2, TS, SEN(kill), "kill" },
+[ 38] = { 2, TF, SEN(rename), "rename" },
+[ 39] = { 2, TF, SEN(mkdir), "mkdir" },
+[ 40] = { 1, TF, SEN(rmdir), "rmdir" },
+[ 41] = { 1, TD, SEN(dup), "dup" },
+[ 42] = { 1, TD, SEN(pipe), "pipe" },
+[ 43] = { 1, 0, SEN(times), "times" },
+[ 44] = { 0, 0, SEN(prof), "prof" },
+[ 45] = { 1, TM|SI, SEN(brk), "brk" },
+[ 46] = { 1, 0, SEN(setgid), "setgid" },
+[ 47] = { 0, NF, SEN(getgid), "getgid" },
+[ 48] = { 3, TS, SEN(signal), "signal" },
+[ 49] = { 0, NF, SEN(geteuid), "geteuid" },
+[ 50] = { 0, NF, SEN(getegid), "getegid" },
+[ 51] = { 1, TF, SEN(acct), "acct" },
+[ 52] = { 2, TF, SEN(umount2), "umount2" },
+[ 53] = { 0, 0, SEN(lock), "lock" },
+[ 54] = { 3, TD, SEN(ioctl), "ioctl" },
+[ 55] = { 3, TD, SEN(fcntl), "fcntl" },
+[ 56] = { 0, 0, SEN(mpx), "mpx" },
+[ 57] = { 2, 0, SEN(setpgid), "setpgid" },
+[ 58] = { 2, 0, SEN(ulimit), "ulimit" },
+[ 59] = { 1, 0, SEN(oldolduname), "oldolduname" },
+[ 60] = { 1, 0, SEN(umask), "umask" },
+[ 61] = { 1, TF, SEN(chroot), "chroot" },
+[ 62] = { 2, 0, SEN(ustat), "ustat" },
+[ 63] = { 2, TD, SEN(dup2), "dup2" },
+[ 64] = { 0, 0, SEN(getppid), "getppid" },
+[ 65] = { 0, 0, SEN(getpgrp), "getpgrp" },
+[ 66] = { 0, 0, SEN(setsid), "setsid" },
+[ 67] = { 3, TS, SEN(sigaction), "sigaction" },
+[ 68] = { 0, TS, SEN(siggetmask), "sgetmask" },
+[ 69] = { 1, TS, SEN(sigsetmask), "ssetmask" },
+[ 70] = { 2, 0, SEN(setreuid), "setreuid" },
+[ 71] = { 2, 0, SEN(setregid), "setregid" },
+[ 72] = { 3, TS, SEN(sigsuspend), "sigsuspend" },
+[ 73] = { 1, TS, SEN(sigpending), "sigpending" },
+[ 74] = { 2, 0, SEN(sethostname), "sethostname" },
+[ 75] = { 2, 0, SEN(setrlimit), "setrlimit" },
+[ 76] = { 2, 0, SEN(getrlimit), "getrlimit" },
+[ 77] = { 2, 0, SEN(getrusage), "getrusage" },
+[ 78] = { 2, 0, SEN(gettimeofday), "gettimeofday" },
+[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
+[ 80] = { 2, 0, SEN(getgroups), "getgroups" },
+[ 81] = { 2, 0, SEN(setgroups), "setgroups" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
+[ 83] = { 2, TF, SEN(symlink), "symlink" },
+[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
+[ 85] = { 3, TF, SEN(readlink), "readlink" },
+[ 86] = { 1, TF, SEN(uselib), "uselib" },
+[ 87] = { 2, TF, SEN(swapon), "swapon" },
+[ 88] = { 4, 0, SEN(reboot), "reboot" },
+[ 89] = { 3, TD, SEN(readdir), "readdir" },
+[ 90] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
+[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
+[ 92] = { 2, TF, SEN(truncate), "truncate" },
+[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
+[ 94] = { 2, TD, SEN(fchmod), "fchmod" },
+[ 95] = { 3, TD, SEN(fchown), "fchown" },
+[ 96] = { 2, 0, SEN(getpriority), "getpriority" },
+[ 97] = { 3, 0, SEN(setpriority), "setpriority" },
+[ 98] = { 4, 0, SEN(profil), "profil" },
+[ 99] = { 2, TF, SEN(statfs), "statfs" },
+[100] = { 2, TD, SEN(fstatfs), "fstatfs" },
+[101] = { 3, 0, SEN(ioperm), "ioperm" },
+[102] = { 2, TD, SEN(socketcall), "socketcall" },
+[103] = { 3, 0, SEN(syslog), "syslog" },
+[104] = { 3, 0, SEN(setitimer), "setitimer" },
+[105] = { 2, 0, SEN(getitimer), "getitimer" },
+[106] = { 2, TF, SEN(stat), "stat" },
+[107] = { 2, TF, SEN(lstat), "lstat" },
+[108] = { 2, TD, SEN(fstat), "fstat" },
+[109] = { 1, 0, SEN(olduname), "olduname" },
+[110] = { 5, 0, SEN(printargs), "iopl" },
+[111] = { 0, 0, SEN(vhangup), "vhangup" },
+[112] = { 0, 0, SEN(idle), "idle" },
+[113] = { 5, 0, SEN(vm86), "vm86" },
+[114] = { 4, TP, SEN(wait4), "wait4" },
+[115] = { 1, TF, SEN(swapoff), "swapoff" },
+[116] = { 1, 0, SEN(sysinfo), "sysinfo" },
+[117] = { 6, TI, SEN(ipc), "ipc" },
+[118] = { 1, TD, SEN(fsync), "fsync" },
+[119] = { 0, TS, SEN(sigreturn), "sigreturn" },
+[120] = { 5, TP, SEN(clone), "clone" },
+[121] = { 2, 0, SEN(setdomainname), "setdomainname" },
+[122] = { 1, 0, SEN(uname), "uname" },
+[123] = { 5, 0, SEN(printargs), "modify_ldt" },
+[124] = { 1, 0, SEN(adjtimex), "adjtimex" },
+[125] = { 3, TM|SI, SEN(mprotect), "mprotect" },
+[126] = { 3, TS, SEN(sigprocmask), "sigprocmask" },
+[127] = { 2, 0, SEN(create_module), "create_module" },
+[128] = { 3, 0, SEN(init_module), "init_module" },
+[129] = { 2, 0, SEN(delete_module), "delete_module" },
+[130] = { 1, 0, SEN(get_kernel_syms), "get_kernel_syms" },
+[131] = { 4, TF, SEN(quotactl), "quotactl" },
+[132] = { 1, 0, SEN(getpgid), "getpgid" },
+[133] = { 1, TD, SEN(fchdir), "fchdir" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
+[135] = { 3, 0, SEN(sysfs), "sysfs" },
+[136] = { 1, 0, SEN(personality), "personality" },
+[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
+[138] = { 1, NF, SEN(setfsuid), "setfsuid" },
+[139] = { 1, NF, SEN(setfsgid), "setfsgid" },
+[140] = { 5, TD, SEN(llseek), "_llseek" },
+[141] = { 3, TD, SEN(getdents), "getdents" },
+[142] = { 5, TD, SEN(select), "_newselect" },
+[143] = { 2, TD, SEN(flock), "flock" },
+[144] = { 3, TM, SEN(msync), "msync" },
+[145] = { 3, TD, SEN(readv), "readv" },
+[146] = { 3, TD, SEN(writev), "writev" },
+[147] = { 1, 0, SEN(getsid), "getsid" },
+[148] = { 1, TD, SEN(fdatasync), "fdatasync" },
+[149] = { 1, 0, SEN(sysctl), "_sysctl" },
+[150] = { 2, TM, SEN(mlock), "mlock" },
+[151] = { 2, TM, SEN(munlock), "munlock" },
+[152] = { 1, TM, SEN(mlockall), "mlockall" },
+[153] = { 0, TM, SEN(munlockall), "munlockall" },
+[154] = { 2, 0, SEN(sched_setparam), "sched_setparam" },
+[155] = { 2, 0, SEN(sched_getparam), "sched_getparam" },
+[156] = { 3, 0, SEN(sched_setscheduler), "sched_setscheduler" },
+[157] = { 1, 0, SEN(sched_getscheduler), "sched_getscheduler" },
+[158] = { 0, 0, SEN(sched_yield), "sched_yield" },
+[159] = { 1, 0, SEN(sched_get_priority_max), "sched_get_priority_max"},
+[160] = { 1, 0, SEN(sched_get_priority_min), "sched_get_priority_min"},
+[161] = { 2, 0, SEN(sched_rr_get_interval), "sched_rr_get_interval" },
+[162] = { 2, 0, SEN(nanosleep), "nanosleep" },
+[163] = { 5, TM|SI, SEN(mremap), "mremap" },
+[164] = { 3, 0, SEN(setresuid), "setresuid" },
+[165] = { 3, 0, SEN(getresuid), "getresuid" },
+[166] = { 5, 0, SEN(query_module), "query_module" },
+[167] = { 3, TD, SEN(poll), "poll" },
+[168] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
+[169] = { 3, 0, SEN(setresgid), "setresgid" },
+[170] = { 3, 0, SEN(getresgid), "getresgid" },
+[171] = { 5, 0, SEN(prctl), "prctl" },
+[172] = { 0, TS, SEN(rt_sigreturn), "rt_sigreturn" },
+[173] = { 4, TS, SEN(rt_sigaction), "rt_sigaction" },
+[174] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
+[175] = { 2, TS, SEN(rt_sigpending), "rt_sigpending" },
+[176] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
+[177] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
+[178] = { 2, TS, SEN(rt_sigsuspend), "rt_sigsuspend" },
+[179] = { 6, TD, SEN(pread), "pread64" },
+[180] = { 6, TD, SEN(pwrite), "pwrite64" },
+[181] = { 3, TF, SEN(chown), "chown" },
+[182] = { 2, TF, SEN(getcwd), "getcwd" },
+[183] = { 2, 0, SEN(capget), "capget" },
+[184] = { 2, 0, SEN(capset), "capset" },
+[185] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
+[186] = { 4, TD|TN, SEN(sendfile), "sendfile" },
+[187] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[188] = { 5, TN, SEN(putpmsg), "putpmsg" },
+[189] = { 0, TP, SEN(vfork), "vfork" },
+[190] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
+[191] = { 5, TD, SEN(readahead), "readahead" },
+[192 ... 197] = { },
+[198] = { 5, 0, SEN(printargs), "pciconfig_read" },
+[199] = { 5, 0, SEN(printargs), "pciconfig_write" },
+[200] = { 3, 0, SEN(printargs), "pciconfig_iobase" },
+[201] = { 6, 0, SEN(printargs), "multiplexer" },
+[202] = { 3, TD, SEN(getdents64), "getdents64" },
+[203] = { 2, TF, SEN(pivotroot), "pivot_root" },
+[204] = { },
+[205] = { 3, TM, SEN(madvise), "madvise" },
+[206] = { 3, TM, SEN(mincore), "mincore" },
+[207] = { 0, 0, SEN(gettid), "gettid" },
+[208] = { 2, TS, SEN(kill), "tkill" },
+[209] = { 5, TF, SEN(setxattr), "setxattr" },
+[210] = { 5, TF, SEN(setxattr), "lsetxattr" },
+[211] = { 5, TD, SEN(fsetxattr), "fsetxattr" },
+[212] = { 4, TF, SEN(getxattr), "getxattr" },
+[213] = { 4, TF, SEN(getxattr), "lgetxattr" },
+[214] = { 4, TD, SEN(fgetxattr), "fgetxattr" },
+[215] = { 3, TF, SEN(listxattr), "listxattr" },
+[216] = { 3, TF, SEN(listxattr), "llistxattr" },
+[217] = { 3, TD, SEN(flistxattr), "flistxattr" },
+[218] = { 2, TF, SEN(removexattr), "removexattr" },
+[219] = { 2, TF, SEN(removexattr), "lremovexattr" },
+[220] = { 2, TD, SEN(fremovexattr), "fremovexattr" },
+[221] = { 6, 0, SEN(futex), "futex" },
+[222] = { 3, 0, SEN(sched_setaffinity), "sched_setaffinity" },
+[223] = { 3, 0, SEN(sched_getaffinity), "sched_getaffinity" },
+[224] = { },
+[225] = { 5, 0, SEN(printargs), "tuxcall" },
+[226] = { },
+[227] = { 2, 0, SEN(io_setup), "io_setup" },
+[228] = { 1, 0, SEN(io_destroy), "io_destroy" },
+[229] = { 5, 0, SEN(io_getevents), "io_getevents" },
+[230] = { 3, 0, SEN(io_submit), "io_submit" },
+[231] = { 3, 0, SEN(io_cancel), "io_cancel" },
+[232] = { 1, 0, SEN(set_tid_address), "set_tid_address" },
+[233] = { 6, TD, SEN(fadvise64), "fadvise64" },
+[234] = { 1, TP|SE, SEN(exit), "exit_group" },
+[235] = { 4, 0, SEN(lookup_dcookie), "lookup_dcookie" },
+[236] = { 1, TD, SEN(epoll_create), "epoll_create" },
+[237] = { 4, TD, SEN(epoll_ctl), "epoll_ctl" },
+[238] = { 4, TD, SEN(epoll_wait), "epoll_wait" },
+[239] = { 5, TM|SI, SEN(remap_file_pages), "remap_file_pages" },
+[240] = { 3, 0, SEN(timer_create), "timer_create" },
+[241] = { 4, 0, SEN(timer_settime), "timer_settime" },
+[242] = { 2, 0, SEN(timer_gettime), "timer_gettime" },
+[243] = { 1, 0, SEN(timer_getoverrun), "timer_getoverrun" },
+[244] = { 1, 0, SEN(timer_delete), "timer_delete" },
+[245] = { 2, 0, SEN(clock_settime), "clock_settime" },
+[246] = { 2, 0, SEN(clock_gettime), "clock_gettime" },
+[247] = { 2, 0, SEN(clock_getres), "clock_getres" },
+[248] = { 4, 0, SEN(clock_nanosleep), "clock_nanosleep" },
+[249] = { 2, 0, SEN(printargs), "swapcontext" },
+[250] = { 3, TS, SEN(tgkill), "tgkill" },
+[251] = { 2, TF, SEN(utimes), "utimes" },
+[252] = { 3, TF, SEN(statfs64), "statfs64" },
+[253] = { 3, TD, SEN(fstatfs64), "fstatfs64" },
+[254] = { },
+[255] = { 1, 0, SEN(printargs), "rtas" },
+[256] = { 5, 0, SEN(printargs), "sys_debug_setcontext" },
+[257] = { 5, 0, SEN(vserver), "vserver" },
+[258] = { 4, TM, SEN(migrate_pages), "migrate_pages" },
+[259] = { 6, TM, SEN(mbind), "mbind" },
+[260] = { 5, TM, SEN(get_mempolicy), "get_mempolicy" },
+[261] = { 3, TM, SEN(set_mempolicy), "set_mempolicy" },
+[262] = { 4, 0, SEN(mq_open), "mq_open" },
+[263] = { 1, 0, SEN(mq_unlink), "mq_unlink" },
+[264] = { 5, 0, SEN(mq_timedsend), "mq_timedsend" },
+[265] = { 5, 0, SEN(mq_timedreceive), "mq_timedreceive" },
+[266] = { 2, 0, SEN(mq_notify), "mq_notify" },
+[267] = { 3, 0, SEN(mq_getsetattr), "mq_getsetattr" },
+[268] = { 4, 0, SEN(kexec_load), "kexec_load" },
+[269] = { 5, 0, SEN(add_key), "add_key" },
+[270] = { 4, 0, SEN(request_key), "request_key" },
+[271] = { 5, 0, SEN(keyctl), "keyctl" },
+[272] = { 5, TP, SEN(waitid), "waitid" },
+[273] = { 3, 0, SEN(ioprio_set), "ioprio_set" },
+[274] = { 2, 0, SEN(ioprio_get), "ioprio_get" },
+[275] = { 0, TD, SEN(inotify_init), "inotify_init" },
+[276] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
+[277] = { 2, TD, SEN(inotify_rm_watch), "inotify_rm_watch" },
+[278] = { 5, 0, SEN(printargs), "spu_run" },
+[279] = { 5, 0, SEN(printargs), "spu_create" },
+[280] = { 6, TD, SEN(pselect6), "pselect6" },
+[281] = { 5, TD, SEN(ppoll), "ppoll" },
+[282] = { 1, TP, SEN(unshare), "unshare" },
+[283] = { 6, TD, SEN(splice), "splice" },
+[284] = { 4, TD, SEN(tee), "tee" },
+[285] = { 4, TD, SEN(vmsplice), "vmsplice" },
+[286] = { 4, TD|TF, SEN(openat), "openat" },
+[287] = { 3, TD|TF, SEN(mkdirat), "mkdirat" },
+[288] = { 4, TD|TF, SEN(mknodat), "mknodat" },
+[289] = { 5, TD|TF, SEN(fchownat), "fchownat" },
+[290] = { 3, TD|TF, SEN(futimesat), "futimesat" },
+[291] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[292] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
+[293] = { 4, TD|TF, SEN(renameat), "renameat" },
+[294] = { 5, TD|TF, SEN(linkat), "linkat" },
+[295] = { 3, TD|TF, SEN(symlinkat), "symlinkat" },
+[296] = { 4, TD|TF, SEN(readlinkat), "readlinkat" },
+[297] = { 3, TD|TF, SEN(fchmodat), "fchmodat" },
+[298] = { 3, TD|TF, SEN(faccessat), "faccessat" },
+[299] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
+[300] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
+[301] = { 6, TM, SEN(move_pages), "move_pages" },
+[302] = { 3, 0, SEN(getcpu), "getcpu" },
+[303] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
+[304] = { 4, TD|TF, SEN(utimensat), "utimensat" },
+[305] = { 3, TD|TS, SEN(signalfd), "signalfd" },
+[306] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
+[307] = { 1, TD, SEN(eventfd), "eventfd" },
+[308] = { 6, TD, SEN(sync_file_range2), "sync_file_range2" },
+[309] = { 6, TD, SEN(fallocate), "fallocate" },
+[310] = { 3, 0, SEN(subpage_prot), "subpage_prot" },
+[311] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
+[312] = { 2, TD, SEN(timerfd_gettime), "timerfd_gettime" },
+[313] = { 4, TD|TS, SEN(signalfd4), "signalfd4" },
+[314] = { 2, TD, SEN(eventfd2), "eventfd2" },
+[315] = { 1, TD, SEN(epoll_create1), "epoll_create1" },
+[316] = { 3, TD, SEN(dup3), "dup3" },
+[317] = { 2, TD, SEN(pipe2), "pipe2" },
+[318] = { 1, TD, SEN(inotify_init1), "inotify_init1" },
+[319] = { 5, TD, SEN(perf_event_open), "perf_event_open" },
+[320] = { 5, TD, SEN(preadv), "preadv" },
+[321] = { 5, TD, SEN(pwritev), "pwritev" },
+[322] = { 4, TP|TS, SEN(rt_tgsigqueueinfo), "rt_tgsigqueueinfo" },
+[323] = { 2, TD, SEN(fanotify_init), "fanotify_init" },
+[324] = { 6, TD|TF, SEN(fanotify_mark), "fanotify_mark" },
+[325] = { 4, 0, SEN(prlimit64), "prlimit64" },
+[326] = { 3, TN, SEN(socket), "socket" },
+[327] = { 3, TN, SEN(bind), "bind" },
+[328] = { 3, TN, SEN(connect), "connect" },
+[329] = { 2, TN, SEN(listen), "listen" },
+[330] = { 3, TN, SEN(accept), "accept" },
+[331] = { 3, TN, SEN(getsockname), "getsockname" },
+[332] = { 3, TN, SEN(getpeername), "getpeername" },
+[333] = { 4, TN, SEN(socketpair), "socketpair" },
+[334] = { 4, TN, SEN(send), "send" },
+[335] = { 6, TN, SEN(sendto), "sendto" },
+[336] = { 4, TN, SEN(recv), "recv" },
+[337] = { 6, TN, SEN(recvfrom), "recvfrom" },
+[338] = { 2, TN, SEN(shutdown), "shutdown" },
+[339] = { 5, TN, SEN(setsockopt), "setsockopt" },
+[340] = { 5, TN, SEN(getsockopt), "getsockopt" },
+[341] = { 3, TN, SEN(sendmsg), "sendmsg" },
+[342] = { 3, TN, SEN(recvmsg), "recvmsg" },
+[343] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
+[344] = { 4, TN, SEN(accept4), "accept4" },
+[345] = { 5, TD|TF, SEN(name_to_handle_at), "name_to_handle_at" },
+[346] = { 3, TD, SEN(open_by_handle_at), "open_by_handle_at" },
+[347] = { 2, 0, SEN(clock_adjtime), "clock_adjtime" },
+[348] = { 1, TD, SEN(syncfs), "syncfs" },
+[349] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
+[350] = { 2, TD, SEN(setns), "setns" },
+[351] = { 6, 0, SEN(process_vm_readv), "process_vm_readv" },
+[352] = { 6, 0, SEN(process_vm_writev), "process_vm_writev" },
+[353] = { 3, TD, SEN(finit_module), "finit_module" },
+[354] = { 5, 0, SEN(kcmp), "kcmp" },
+[355] = { 3, 0, SEN(sched_setattr), "sched_setattr" },
+[356] = { 4, 0, SEN(sched_getattr), "sched_getattr" },
+[357] = { 5, TD|TF, SEN(renameat2), "renameat2" },
+[358] = { 3, 0, SEN(seccomp), "seccomp", },
+[359] = { 3, 0, SEN(getrandom), "getrandom", },
+[360] = { 2, TD, SEN(memfd_create), "memfd_create", },
+[361] = { 3, TD, SEN(bpf), "bpf", },
+[362] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[363] = { 0, 0, SEN(printargs), "switch_endian" },
+[364] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[365] = { 2, 0, SEN(membarrier), "membarrier", },
+[366] = { 3, TI, SEN(semop), "semop" },
+[367] = { 3, TI, SEN(semget), "semget" },
+[368] = { 4, TI, SEN(semctl), "semctl" },
+[369] = { 4, TI, SEN(semtimedop), "semtimedop" },
+[370] = { 4, TI, SEN(msgsnd), "msgsnd" },
+[371] = { 5, TI, SEN(msgrcv), "msgrcv" },
+[372] = { 2, TI, SEN(msgget), "msgget" },
+[373] = { 3, TI, SEN(msgctl), "msgctl" },
+[374] = { 3, TI|TM|SI, SEN(shmat), "shmat" },
+[375] = { 1, TI|TM|SI, SEN(shmdt), "shmdt" },
+[376] = { 3, TI, SEN(shmget), "shmget" },
+[377] = { 3, TI, SEN(shmctl), "shmctl" },
+[378] = { 3, TM, SEN(mlock2), "mlock2" },
+[379 ... 399] = { },
+
+#define SYS_socket_subcall 400
+#include "subcall.h"
diff --git a/linux/s390/arch_regs.c b/linux/s390/arch_regs.c
index 32c50a157..fefb7630d 100644
--- a/linux/s390/arch_regs.c
+++ b/linux/s390/arch_regs.c
@@ -2,3 +2,4 @@
static struct user_regs_struct s390_regset;
unsigned long *const s390_frame_ptr = &s390_regset.gprs[15];
#define ARCH_REGS_FOR_GETREGSET s390_regset
+#define ARCH_PC_REG s390_regset.psw.addr
diff --git a/linux/s390/arch_sigreturn.c b/linux/s390/arch_sigreturn.c
index 43afd9545..6baf035c0 100644
--- a/linux/s390/arch_sigreturn.c
+++ b/linux/s390/arch_sigreturn.c
@@ -1,14 +1,18 @@
-long mask[NSIG / 8 / sizeof(long)];
-const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long mask[NSIG / 8 / sizeof(long)];
+ const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
-if (umove(tcp, addr, &mask) < 0) {
- tprintf("{mask=%#lx}", addr);
-} else {
+ if (umove(tcp, addr, &mask) < 0) {
+ tprintf("{mask=%#lx}", addr);
+ } else {
#ifdef S390
- long v = mask[0];
- mask[0] = mask[1];
- mask[1] = v;
+ long v = mask[0];
+ mask[0] = mask[1];
+ mask[1] = v;
#endif
- tprintsigmask_addr("{mask=", mask);
- tprints("}");
+ tprintsigmask_addr("{mask=", mask);
+ tprints("}");
+ }
}
diff --git a/linux/s390/get_error.c b/linux/s390/get_error.c
index 29fffbd19..f491962de 100644
--- a/linux/s390/get_error.c
+++ b/linux/s390/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(s390_regset.gprs[2])) {
- tcp->u_rval = -1;
- tcp->u_error = -s390_regset.gprs[2];
-} else {
- tcp->u_rval = s390_regset.gprs[2];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(s390_regset.gprs[2])) {
+ tcp->u_rval = -1;
+ tcp->u_error = -s390_regset.gprs[2];
+ } else {
+ tcp->u_rval = s390_regset.gprs[2];
+ }
}
diff --git a/linux/s390/get_scno.c b/linux/s390/get_scno.c
index b9e1c19d9..8650e1f13 100644
--- a/linux/s390/get_scno.c
+++ b/linux/s390/get_scno.c
@@ -1 +1,7 @@
-scno = s390_regset.gprs[2];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = s390_regset.gprs[2];
+ return 1;
+}
diff --git a/linux/s390/get_syscall_args.c b/linux/s390/get_syscall_args.c
index 85f258511..ebf6c6c4a 100644
--- a/linux/s390/get_syscall_args.c
+++ b/linux/s390/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = s390_regset.orig_gpr2;
-tcp->u_arg[1] = s390_regset.gprs[3];
-tcp->u_arg[2] = s390_regset.gprs[4];
-tcp->u_arg[3] = s390_regset.gprs[5];
-tcp->u_arg[4] = s390_regset.gprs[6];
-tcp->u_arg[5] = s390_regset.gprs[7];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = s390_regset.orig_gpr2;
+ tcp->u_arg[1] = s390_regset.gprs[3];
+ tcp->u_arg[2] = s390_regset.gprs[4];
+ tcp->u_arg[3] = s390_regset.gprs[5];
+ tcp->u_arg[4] = s390_regset.gprs[6];
+ tcp->u_arg[5] = s390_regset.gprs[7];
+ return 1;
+}
diff --git a/linux/s390/print_pc.c b/linux/s390/print_pc.c
deleted file mode 100644
index f92ccd438..000000000
--- a/linux/s390/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, s390_regset.psw.addr);
diff --git a/linux/s390/syscallent.h b/linux/s390/syscallent.h
index f97d41ce8..ad2827a97 100644
--- a/linux/s390/syscallent.h
+++ b/linux/s390/syscallent.h
@@ -162,7 +162,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -170,7 +170,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -216,8 +216,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "ugetrlimit" },
[192] = { 1, TD|TM|SI, SEN(old_mmap_pgoff), "mmap2" },
@@ -249,7 +249,7 @@
[218] = { 3, TM, SEN(mincore), "mincore" },
[219] = { 3, TM, SEN(madvise), "madvise" },
[220] = { 3, TD, SEN(getdents64), "getdents64" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
[222] = { 4, TD, SEN(readahead), "readahead" },
[223] = { 4, TD|TN, SEN(sendfile64), "sendfile64" },
[224] = { 5, TF, SEN(setxattr), "setxattr" },
@@ -383,7 +383,27 @@
[352] = { 3, 0, SEN(printargs), "s390_pci_mmio_write", },
[353] = { 3, 0, SEN(printargs), "s390_pci_mmio_read", },
[354] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[355 ... 399] = { },
+[355] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[356] = { 2, 0, SEN(membarrier), "membarrier", },
+[357] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
+[358] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
+[359] = { 3, TN, SEN(socket), "socket" },
+[360] = { 4, TN, SEN(socketpair), "socketpair" },
+[361] = { 3, TN, SEN(bind), "bind" },
+[362] = { 3, TN, SEN(connect), "connect" },
+[363] = { 2, TN, SEN(listen), "listen" },
+[364] = { 4, TN, SEN(accept4), "accept4" },
+[365] = { 5, TN, SEN(getsockopt), "getsockopt" },
+[366] = { 5, TN, SEN(setsockopt), "setsockopt" },
+[367] = { 3, TN, SEN(getsockname), "getsockname" },
+[368] = { 3, TN, SEN(getpeername), "getpeername" },
+[369] = { 6, TN, SEN(sendto), "sendto" },
+[370] = { 3, TN, SEN(sendmsg), "sendmsg" },
+[371] = { 6, TN, SEN(recvfrom), "recvfrom" },
+[372] = { 3, TN, SEN(recvmsg), "recvmsg" },
+[373] = { 2, TN, SEN(shutdown), "shutdown" },
+[374] = { 3, TM, SEN(mlock2), "mlock2" },
+[375 ... 399] = { },
#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/s390x/arch_regs.c b/linux/s390x/arch_regs.c
index 62aece720..74aaaf6d1 100644
--- a/linux/s390x/arch_regs.c
+++ b/linux/s390x/arch_regs.c
@@ -1 +1,2 @@
#include "s390/arch_regs.c"
+#define ARCH_PC_REG s390_regset.psw.addr
diff --git a/linux/s390x/print_pc.c b/linux/s390x/print_pc.c
deleted file mode 100644
index 9a445f7de..000000000
--- a/linux/s390x/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "s390/print_pc.c"
diff --git a/linux/s390x/syscallent.h b/linux/s390x/syscallent.h
index 90c5a9d07..a43526d0a 100644
--- a/linux/s390x/syscallent.h
+++ b/linux/s390x/syscallent.h
@@ -156,7 +156,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -205,8 +205,8 @@
[185] = { 2, 0, SEN(capset), "capset" },
[186] = { 2, TS, SEN(sigaltstack), "sigaltstack" },
[187] = { 4, TD|TN, SEN(sendfile), "sendfile" },
-[188] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[189] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[188] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[189] = { 5, TN, SEN(putpmsg), "putpmsg" },
[190] = { 0, TP, SEN(vfork), "vfork" },
[191] = { 2, 0, SEN(getrlimit), "getrlimit" },
[196 ... 197] = { },
@@ -367,7 +367,27 @@
[352] = { 3, 0, SEN(printargs), "s390_pci_mmio_write", },
[353] = { 3, 0, SEN(printargs), "s390_pci_mmio_read", },
[354] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[355 ... 399] = { },
+[355] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[356] = { 2, 0, SEN(membarrier), "membarrier", },
+[357] = { 5, TN, SEN(recvmmsg), "recvmmsg" },
+[358] = { 4, TN, SEN(sendmmsg), "sendmmsg" },
+[359] = { 3, TN, SEN(socket), "socket" },
+[360] = { 4, TN, SEN(socketpair), "socketpair" },
+[361] = { 3, TN, SEN(bind), "bind" },
+[362] = { 3, TN, SEN(connect), "connect" },
+[363] = { 2, TN, SEN(listen), "listen" },
+[364] = { 4, TN, SEN(accept4), "accept4" },
+[365] = { 5, TN, SEN(getsockopt), "getsockopt" },
+[366] = { 5, TN, SEN(setsockopt), "setsockopt" },
+[367] = { 3, TN, SEN(getsockname), "getsockname" },
+[368] = { 3, TN, SEN(getpeername), "getpeername" },
+[369] = { 6, TN, SEN(sendto), "sendto" },
+[370] = { 3, TN, SEN(sendmsg), "sendmsg" },
+[371] = { 6, TN, SEN(recvfrom), "recvfrom" },
+[372] = { 3, TN, SEN(recvmsg), "recvmsg" },
+[373] = { 2, TN, SEN(shutdown), "shutdown" },
+[374] = { 3, TM, SEN(mlock2), "mlock2" },
+[375 ... 399] = { },
#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/sh/arch_regs.c b/linux/sh/arch_regs.c
index 9d24ee753..0ce81843e 100644
--- a/linux/sh/arch_regs.c
+++ b/linux/sh/arch_regs.c
@@ -1 +1,2 @@
static long sh_r0;
+#define ARCH_PC_PEEK_ADDR (4 * REG_PC)
diff --git a/linux/sh/get_error.c b/linux/sh/get_error.c
index 2375e3c83..158ff9e6c 100644
--- a/linux/sh/get_error.c
+++ b/linux/sh/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(sh_r0)) {
- tcp->u_rval = -1;
- tcp->u_error = -sh_r0;
-} else {
- tcp->u_rval = sh_r0;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(sh_r0)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -sh_r0;
+ } else {
+ tcp->u_rval = sh_r0;
+ }
}
diff --git a/linux/sh/get_scno.c b/linux/sh/get_scno.c
index b8ce272c3..a9bc5d8fc 100644
--- a/linux/sh/get_scno.c
+++ b/linux/sh/get_scno.c
@@ -1,17 +1,27 @@
-/*
- * In the new syscall ABI, the system call number is in R3.
- */
-if (upeek(tcp->pid, 4*(REG_REG0+3), &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ long scno = 0;
-if (scno < 0) {
- /* Odd as it may seem, a glibc bug has been known to cause
- glibc to issue bogus negative syscall numbers. So for
- our purposes, make strace print what it *should* have been */
- long correct_scno = (scno & 0xff);
- if (debug_flag)
- error_msg("Detected glibc bug: bogus system call"
- " number = %ld, correcting to %ld",
- scno, correct_scno);
- scno = correct_scno;
+ /*
+ * In the new syscall ABI, the system call number is in R3.
+ */
+ if (upeek(tcp->pid, 4*(REG_REG0+3), &scno) < 0)
+ return -1;
+
+ if (scno < 0) {
+ /* Odd as it may seem, a glibc bug has been known to cause
+ glibc to issue bogus negative syscall numbers. So for
+ our purposes, make strace print what it *should* have been */
+ long correct_scno = (scno & 0xff);
+ if (debug_flag)
+ error_msg("Detected glibc bug: bogus system call"
+ " number = %ld, correcting to %ld",
+ scno, correct_scno);
+ scno = correct_scno;
+ }
+
+ tcp->scno = scno;
+ return 1;
}
diff --git a/linux/sh/get_syscall_args.c b/linux/sh/get_syscall_args.c
index 7c94f4885..0b6c8819d 100644
--- a/linux/sh/get_syscall_args.c
+++ b/linux/sh/get_syscall_args.c
@@ -1,10 +1,19 @@
-static const int syscall_regs[MAX_ARGS] = {
- 4 * (REG_REG0+4), 4 * (REG_REG0+5), 4 * (REG_REG0+6),
- 4 * (REG_REG0+7), 4 * (REG_REG0 ), 4 * (REG_REG0+1)
-};
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ static const int syscall_regs[MAX_ARGS] = {
+ 4 * (REG_REG0+4),
+ 4 * (REG_REG0+5),
+ 4 * (REG_REG0+6),
+ 4 * (REG_REG0+7),
+ 4 * (REG_REG0 ),
+ 4 * (REG_REG0+1)
+ };
+ unsigned int i;
-unsigned int i;
-
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, syscall_regs[i], &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, syscall_regs[i], &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/sh/get_syscall_result.c b/linux/sh/get_syscall_result.c
index 3ee054673..5db302548 100644
--- a/linux/sh/get_syscall_result.c
+++ b/linux/sh/get_syscall_result.c
@@ -1,3 +1,6 @@
-/* new syscall ABI returns result in R0 */
-if (upeek(tcp->pid, 4*REG_REG0, (long *)&sh_r0) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ /* new syscall ABI returns result in R0 */
+ return upeek(tcp->pid, 4 * REG_REG0, (long *)&sh_r0) < 0 ? -1 : 0;
+}
diff --git a/linux/sh/print_pc.c b/linux/sh/print_pc.c
deleted file mode 100644
index 2f43eff3f..000000000
--- a/linux/sh/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, 4*REG_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/sh/syscallent.h b/linux/sh/syscallent.h
index 67de81433..4715d2719 100644
--- a/linux/sh/syscallent.h
+++ b/linux/sh/syscallent.h
@@ -29,7 +29,7 @@
*/
[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -110,7 +110,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { 1, TD, SEN(oldselect), "select" },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -118,7 +118,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 6, TD|TM|SI, SEN(mmap), "old_mmap" },
+[ 90] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -162,7 +162,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -170,7 +170,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -208,8 +208,8 @@
[177] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
[178] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
[179] = { 2, TS, SEN(rt_sigsuspend), "rt_sigsuspend" },
-[180] = { 6, TD, SEN(pread), "pread" },
-[181] = { 6, TD, SEN(pwrite), "pwrite" },
+[180] = { 6, TD, SEN(pread), "pread64" },
+[181] = { 6, TD, SEN(pwrite), "pwrite64" },
[182] = { 3, TF, SEN(chown16), "chown" },
[183] = { 2, TF, SEN(getcwd), "getcwd" },
[184] = { 2, 0, SEN(capget), "capget" },
@@ -248,7 +248,7 @@
[218] = { 3, TM, SEN(mincore), "mincore" },
[219] = { 3, TM, SEN(madvise), "madvise" },
[220] = { 3, TD, SEN(getdents64), "getdents64" },
-[221] = { 3, TD, SEN(fcntl), "fcntl64" },
+[221] = { 3, TD, SEN(fcntl64), "fcntl64" },
[222 ... 223] = { },
[224] = { 4, 0, SEN(gettid), "gettid" },
[225] = { 4, TD, SEN(readahead), "readahead" },
@@ -325,7 +325,7 @@
[297] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[298] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[299] = { 3, TD|TF, SEN(futimesat), "futimesat" },
-[300] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[300] = { 4, TD|TF, SEN(newfstatat), "fstatat64" },
[301] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[302] = { 4, TD|TF, SEN(renameat), "renameat" },
[303] = { 5, TD|TF, SEN(linkat), "linkat" },
@@ -347,7 +347,7 @@
[319] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[320] = { 4, TD|TF, SEN(utimensat), "utimensat" },
[321] = { 3, TD|TS, SEN(signalfd), "signalfd" },
-[322] = { 4, TD, SEN(timerfd), "timerfd" },
+[322] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
[323] = { 1, TD, SEN(eventfd), "eventfd" },
[324] = { 6, TD, SEN(fallocate), "fallocate" },
[325] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
diff --git a/linux/sh64/arch_regs.c b/linux/sh64/arch_regs.c
index e09cac5a5..eb6701b95 100644
--- a/linux/sh64/arch_regs.c
+++ b/linux/sh64/arch_regs.c
@@ -1 +1,2 @@
static long sh64_r9;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/sh64/get_error.c b/linux/sh64/get_error.c
index 9e8aeafb0..7858df7c2 100644
--- a/linux/sh64/get_error.c
+++ b/linux/sh64/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(sh64_r9)) {
- tcp->u_rval = -1;
- tcp->u_error = -sh64_r9;
-} else {
- tcp->u_rval = sh64_r9;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(sh64_r9)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -sh64_r9;
+ } else {
+ tcp->u_rval = sh64_r9;
+ }
}
diff --git a/linux/sh64/get_scno.c b/linux/sh64/get_scno.c
index 9e7ecd431..50a52232a 100644
--- a/linux/sh64/get_scno.c
+++ b/linux/sh64/get_scno.c
@@ -1,3 +1,9 @@
-if (upeek(tcp->pid, REG_SYSCALL, &scno) < 0)
- return -1;
-scno &= 0xFFFF;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ if (upeek(tcp->pid, REG_SYSCALL, &tcp->scno) < 0)
+ return -1;
+ tcp->scno &= 0xffff;
+ return 1;
+}
diff --git a/linux/sh64/get_syscall_args.c b/linux/sh64/get_syscall_args.c
index dcc8967ac..3970df8f7 100644
--- a/linux/sh64/get_syscall_args.c
+++ b/linux/sh64/get_syscall_args.c
@@ -1,7 +1,14 @@
-/* Registers used by SH5 Linux system calls for parameters */
-static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ /* Registers used by SH5 Linux system calls for parameters */
+ static const int syscall_regs[MAX_ARGS] = { 2, 3, 4, 5, 6, 7 };
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, REG_GENERAL(syscall_regs[i]), &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, REG_GENERAL(syscall_regs[i]),
+ &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/sh64/get_syscall_result.c b/linux/sh64/get_syscall_result.c
index e53bd0f47..93faf3dfc 100644
--- a/linux/sh64/get_syscall_result.c
+++ b/linux/sh64/get_syscall_result.c
@@ -1,3 +1,6 @@
-/* ABI defines result returned in r9 */
-if (upeek(tcp->pid, REG_GENERAL(9), (long *)&sh64_r9) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ /* ABI defines result returned in r9 */
+ return upeek(tcp->pid, REG_GENERAL(9), (long *)&sh64_r9) < 0 ? -1 : 0;
+}
diff --git a/linux/sh64/print_pc.c b/linux/sh64/print_pc.c
deleted file mode 100644
index c0232e555..000000000
--- a/linux/sh64/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/sh64/syscallent.h b/linux/sh64/syscallent.h
index 852c03fdc..614ba81e5 100644
--- a/linux/sh64/syscallent.h
+++ b/linux/sh64/syscallent.h
@@ -26,8 +26,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-[ 0] = { 0, 0, SEN(setup), "setup" },
-[ 1] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 0] = { 0, 0, SEN(restart_syscall), "restart_syscall" },
+[ 1] = { 1, TP|SE, SEN(exit), "exit" },
[ 2] = { 0, TP, SEN(fork), "fork" },
[ 3] = { 3, TD, SEN(read), "read" },
[ 4] = { 3, TD, SEN(write), "write" },
@@ -108,7 +108,7 @@
[ 79] = { 2, 0, SEN(settimeofday), "settimeofday" },
[ 80] = { 2, 0, SEN(getgroups16), "getgroups" },
[ 81] = { 2, 0, SEN(setgroups16), "setgroups" },
-[ 82] = { 1, TD, SEN(oldselect), "oldselect" },
+[ 82] = { },
[ 83] = { 2, TF, SEN(symlink), "symlink" },
[ 84] = { 2, TF, SEN(oldlstat), "oldlstat" },
[ 85] = { 3, TF, SEN(readlink), "readlink" },
@@ -116,7 +116,7 @@
[ 87] = { 2, TF, SEN(swapon), "swapon" },
[ 88] = { 4, 0, SEN(reboot), "reboot" },
[ 89] = { 3, TD, SEN(readdir), "readdir" },
-[ 90] = { 6, TD|TM|SI, SEN(mmap), "old_mmap" },
+[ 90] = { 6, TD|TM|SI, SEN(mmap), "mmap" },
[ 91] = { 2, TM|SI, SEN(munmap), "munmap" },
[ 92] = { 2, TF, SEN(truncate), "truncate" },
[ 93] = { 2, TD, SEN(ftruncate), "ftruncate" },
@@ -160,7 +160,7 @@
[131] = { 4, TF, SEN(quotactl), "quotactl" },
[132] = { 1, 0, SEN(getpgid), "getpgid" },
[133] = { 1, TD, SEN(fchdir), "fchdir" },
-[134] = { 0, 0, SEN(bdflush), "bdflush" },
+[134] = { 2, 0, SEN(bdflush), "bdflush" },
[135] = { 3, 0, SEN(sysfs), "sysfs" },
[136] = { 1, 0, SEN(personality), "personality" },
[137] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
@@ -168,7 +168,7 @@
[139] = { 1, NF, SEN(setfsgid16), "setfsgid" },
[140] = { 5, TD, SEN(llseek), "_llseek" },
[141] = { 3, TD, SEN(getdents), "getdents" },
-[142] = { 5, TD, SEN(select), "select" },
+[142] = { 5, TD, SEN(select), "_newselect" },
[143] = { 2, TD, SEN(flock), "flock" },
[144] = { 3, TM, SEN(msync), "msync" },
[145] = { 3, TD, SEN(readv), "readv" },
@@ -206,8 +206,8 @@
[177] = { 4, TS, SEN(rt_sigtimedwait), "rt_sigtimedwait" },
[178] = { 3, TS, SEN(rt_sigqueueinfo), "rt_sigqueueinfo" },
[179] = { 2, TS, SEN(rt_sigsuspend), "rt_sigsuspend" },
-[180] = { 4, TD, SEN(pread), "pread" },
-[181] = { 4, TD, SEN(pwrite), "pwrite" },
+[180] = { 4, TD, SEN(pread), "pread64" },
+[181] = { 4, TD, SEN(pwrite), "pwrite64" },
[182] = { 3, TF, SEN(chown16), "chown" },
[183] = { 2, TF, SEN(getcwd), "getcwd" },
[184] = { 2, 0, SEN(capget), "capget" },
@@ -274,7 +274,7 @@
[246] = { 3, TI, SEN(shmget), "shmget" },
[247] = { 4, TI, SEN(shmctl), "shmctl" },
[248] = { 3, TD, SEN(getdents64), "getdents64" },
-[249] = { 3, TD, SEN(fcntl), "fcntl64" },
+[249] = { 3, TD, SEN(fcntl64), "fcntl64" },
[250 ... 251] = { },
[252] = { 4, 0, SEN(gettid), "gettid" },
[253] = { 3, TD, SEN(readahead), "readahead" },
@@ -351,7 +351,7 @@
[325] = { 4, TD|TF, SEN(mknodat), "mknodat" },
[326] = { 5, TD|TF, SEN(fchownat), "fchownat" },
[327] = { 3, TD|TF, SEN(futimesat), "futimesat" },
-[328] = { 4, TD|TF, SEN(newfstatat), "newfstatat" },
+[328] = { 4, TD|TF, SEN(newfstatat), "fstatat64" },
[329] = { 3, TD|TF, SEN(unlinkat), "unlinkat" },
[330] = { 4, TD|TF, SEN(renameat), "renameat" },
[331] = { 5, TD|TF, SEN(linkat), "linkat" },
@@ -373,7 +373,7 @@
[347] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[348] = { 4, TD|TF, SEN(utimensat), "utimensat" },
[349] = { 3, TD|TS, SEN(signalfd), "signalfd" },
-[350] = { 4, TD, SEN(timerfd), "timerfd" },
+[350] = { 2, TD, SEN(timerfd_create), "timerfd_create" },
[351] = { 1, TD, SEN(eventfd), "eventfd" },
[352] = { 4, TD, SEN(fallocate), "fallocate" },
[353] = { 4, TD, SEN(timerfd_settime), "timerfd_settime" },
diff --git a/linux/sparc/arch_regs.c b/linux/sparc/arch_regs.c
index ed13029e3..c0f22e6c8 100644
--- a/linux/sparc/arch_regs.c
+++ b/linux/sparc/arch_regs.c
@@ -1,2 +1,3 @@
struct pt_regs sparc_regs; /* not static */
#define ARCH_REGS_FOR_GETREGS sparc_regs
+#define ARCH_PC_REG sparc_regs.pc
diff --git a/linux/sparc/arch_sigreturn.c b/linux/sparc/arch_sigreturn.c
index 144b3a6d9..9e86efa91 100644
--- a/linux/sparc/arch_sigreturn.c
+++ b/linux/sparc/arch_sigreturn.c
@@ -1,19 +1,23 @@
-long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
-struct {
- struct pt_regs si_regs;
- int si_mask;
- void *fpu_save;
- long insns[2] ATTRIBUTE_ALIGNED(8);
- unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
-} frame;
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
+ struct {
+ struct pt_regs si_regs;
+ int si_mask;
+ void *fpu_save;
+ long insns[2] ATTRIBUTE_ALIGNED(8);
+ unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
+ } frame;
-if (umove(tcp, fp, &frame) < 0) {
- tprintf("{mask=%#lx}", fp);
-} else {
- unsigned int mask[NSIG / 8 / sizeof(int)];
+ if (umove(tcp, fp, &frame) < 0) {
+ tprintf("{mask=%#lx}", fp);
+ } else {
+ unsigned int mask[NSIG / 8 / sizeof(int)];
- mask[0] = frame.si_mask;
- memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
- tprintsigmask_addr("{mask=", mask);
- tprints("}");
+ mask[0] = frame.si_mask;
+ memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
+ tprintsigmask_addr("{mask=", mask);
+ tprints("}");
+ }
}
diff --git a/linux/sparc/get_error.c b/linux/sparc/get_error.c
index 3531f01cc..fa57ed091 100644
--- a/linux/sparc/get_error.c
+++ b/linux/sparc/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && sparc_regs.psr & PSR_C) {
- tcp->u_rval = -1;
- tcp->u_error = sparc_regs.u_regs[U_REG_O0];
-} else {
- tcp->u_rval = sparc_regs.u_regs[U_REG_O0];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && sparc_regs.psr & PSR_C) {
+ tcp->u_rval = -1;
+ tcp->u_error = sparc_regs.u_regs[U_REG_O0];
+ } else {
+ tcp->u_rval = sparc_regs.u_regs[U_REG_O0];
+ }
}
diff --git a/linux/sparc/get_scno.c b/linux/sparc/get_scno.c
index b190b6c57..f041259d6 100644
--- a/linux/sparc/get_scno.c
+++ b/linux/sparc/get_scno.c
@@ -1 +1,7 @@
-scno = sparc_regs.u_regs[U_REG_G1];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ tcp->scno = sparc_regs.u_regs[U_REG_G1];
+ return 1;
+}
diff --git a/linux/sparc/get_syscall_args.c b/linux/sparc/get_syscall_args.c
index 14bce8f95..57b5488e4 100644
--- a/linux/sparc/get_syscall_args.c
+++ b/linux/sparc/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = sparc_regs.u_regs[U_REG_O0 + 0];
-tcp->u_arg[1] = sparc_regs.u_regs[U_REG_O0 + 1];
-tcp->u_arg[2] = sparc_regs.u_regs[U_REG_O0 + 2];
-tcp->u_arg[3] = sparc_regs.u_regs[U_REG_O0 + 3];
-tcp->u_arg[4] = sparc_regs.u_regs[U_REG_O0 + 4];
-tcp->u_arg[5] = sparc_regs.u_regs[U_REG_O0 + 5];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = sparc_regs.u_regs[U_REG_O0 + 0];
+ tcp->u_arg[1] = sparc_regs.u_regs[U_REG_O0 + 1];
+ tcp->u_arg[2] = sparc_regs.u_regs[U_REG_O0 + 2];
+ tcp->u_arg[3] = sparc_regs.u_regs[U_REG_O0 + 3];
+ tcp->u_arg[4] = sparc_regs.u_regs[U_REG_O0 + 4];
+ tcp->u_arg[5] = sparc_regs.u_regs[U_REG_O0 + 5];
+ return 1;
+}
diff --git a/linux/sparc/print_pc.c b/linux/sparc/print_pc.c
deleted file mode 100644
index 683e3b17b..000000000
--- a/linux/sparc/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, sparc_regs.pc);
diff --git a/linux/sparc/syscallent.h b/linux/sparc/syscallent.h
index ec81ad73d..a41f732bf 100644
--- a/linux/sparc/syscallent.h
+++ b/linux/sparc/syscallent.h
@@ -153,13 +153,13 @@
[152] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
[153] = { 3, TD, SEN(poll), "poll" },
[154] = { 3, TD, SEN(getdents64), "getdents64" },
-[155] = { 3, TD, SEN(fcntl), "fcntl64" },
+[155] = { 3, TD, SEN(fcntl64), "fcntl64" },
[156] = { 2, TD, SEN(inotify_rm_watch), "inotify_rm_watch" },
[157] = { 2, TF, SEN(statfs), "statfs" },
[158] = { 2, TD, SEN(fstatfs), "fstatfs" },
[159] = { 1, TF, SEN(umount), "umount" },
-[160] = { 3, 0, SEN(sched_setaffinity), "sched_setaffinity" },
-[161] = { 3, 0, SEN(sched_getaffinity), "sched_getaffinity" },
+[160] = { 3, 0, SEN(sched_setaffinity), "sched_set_affinity" },
+[161] = { 3, 0, SEN(sched_getaffinity), "sched_get_affinity" },
[162] = { 2, 0, SEN(printargs), "getdomainname" },
[163] = { 2, 0, SEN(setdomainname), "setdomainname" },
[164] = { 5, 0, SEN(printargs), "utrap_install" },
@@ -223,12 +223,12 @@
[222] = { 2, 0, SEN(delete_module), "delete_module" },
[223] = { 1, 0, SEN(get_kernel_syms), "get_kernel_syms" },
[224] = { 1, 0, SEN(getpgid), "getpgid" },
-[225] = { 0, 0, SEN(bdflush), "bdflush" },
+[225] = { 2, 0, SEN(bdflush), "bdflush" },
[226] = { 3, 0, SEN(sysfs), "sysfs" },
[227] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
[228] = { 1, NF, SEN(setfsuid16), "setfsuid" },
[229] = { 1, NF, SEN(setfsgid16), "setfsgid" },
-[230] = { 5, TD, SEN(select), "select" },
+[230] = { 5, TD, SEN(select), "_newselect" },
[231] = { 1, 0, SEN(time), "time" },
[232] = { 6, TD, SEN(splice), "splice" },
[233] = { 1, 0, SEN(stime), "stime" },
@@ -349,7 +349,10 @@
[348] = { 2, TD, SEN(memfd_create), "memfd_create", },
[349] = { 3, TD, SEN(bpf), "bpf", },
[350] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
-[351 ... 352] = { },
+[351] = { 2, 0, SEN(membarrier), "membarrier", },
+[352] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[353] = { 3, TM, SEN(mlock2), "mlock2" },
+[354 ... 399] = { },
-#define SYS_socket_subcall 353
+#define SYS_socket_subcall 400
#include "subcall.h"
diff --git a/linux/sparc64/arch_regs.c b/linux/sparc64/arch_regs.c
index db38d8863..072a35534 100644
--- a/linux/sparc64/arch_regs.c
+++ b/linux/sparc64/arch_regs.c
@@ -1 +1,2 @@
#include "sparc/arch_regs.c"
+#define ARCH_PC_REG sparc_regs.tpc
diff --git a/linux/sparc64/get_error.c b/linux/sparc64/get_error.c
index ee3a7e50f..bacd04fbd 100644
--- a/linux/sparc64/get_error.c
+++ b/linux/sparc64/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && sparc_regs.tstate & 0x1100000000UL) {
- tcp->u_rval = -1;
- tcp->u_error = sparc_regs.u_regs[U_REG_O0];
-} else {
- tcp->u_rval = sparc_regs.u_regs[U_REG_O0];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && sparc_regs.tstate & 0x1100000000UL) {
+ tcp->u_rval = -1;
+ tcp->u_error = sparc_regs.u_regs[U_REG_O0];
+ } else {
+ tcp->u_rval = sparc_regs.u_regs[U_REG_O0];
+ }
}
diff --git a/linux/sparc64/get_scno.c b/linux/sparc64/get_scno.c
index b92366e9d..32384e698 100644
--- a/linux/sparc64/get_scno.c
+++ b/linux/sparc64/get_scno.c
@@ -1,19 +1,25 @@
-/* Retrieve the syscall trap instruction. */
-unsigned long trap;
-errno = 0;
-trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)sparc_regs.tpc, 0);
-if (errno)
- return -1;
-trap >>= 32;
-switch (trap) {
-case 0x91d02010:
- /* Linux/SPARC syscall trap. */
- update_personality(tcp, 0);
- break;
-case 0x91d0206d:
- /* Linux/SPARC64 syscall trap. */
- update_personality(tcp, 1);
- break;
-}
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ /* Retrieve the syscall trap instruction. */
+ unsigned long trap;
+ errno = 0;
+ trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)sparc_regs.tpc, 0);
+ if (errno)
+ return -1;
+ trap >>= 32;
+ switch (trap) {
+ case 0x91d02010:
+ /* Linux/SPARC syscall trap. */
+ update_personality(tcp, 0);
+ break;
+ case 0x91d0206d:
+ /* Linux/SPARC64 syscall trap. */
+ update_personality(tcp, 1);
+ break;
+ }
-scno = sparc_regs.u_regs[U_REG_G1];
+ tcp->scno = sparc_regs.u_regs[U_REG_G1];
+ return 1;
+}
diff --git a/linux/sparc64/print_pc.c b/linux/sparc64/print_pc.c
deleted file mode 100644
index 11c0ac43e..000000000
--- a/linux/sparc64/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, sparc_regs.tpc);
diff --git a/linux/tile/arch_regs.c b/linux/tile/arch_regs.c
index 455077c58..6a7309d23 100644
--- a/linux/tile/arch_regs.c
+++ b/linux/tile/arch_regs.c
@@ -1,2 +1,3 @@
struct pt_regs tile_regs; /* not static */
#define ARCH_REGS_FOR_GETREGS tile_regs
+#define ARCH_PC_REG tile_regs.pc
diff --git a/linux/tile/arch_sigreturn.c b/linux/tile/arch_sigreturn.c
index 99e2bf8f3..b1182fced 100644
--- a/linux/tile/arch_sigreturn.c
+++ b/linux/tile/arch_sigreturn.c
@@ -1,8 +1,12 @@
-/* offset of ucontext in the kernel's sigframe structure */
-# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
-const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
- offsetof(struct ucontext, uc_sigmask);
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ /* offset of ucontext in the kernel's sigframe structure */
+#define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
+ const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
+ offsetof(struct ucontext, uc_sigmask);
-tprints("{mask=");
-print_sigset_addr_len(tcp, addr, NSIG / 8);
-tprints("}");
+ tprints("{mask=");
+ print_sigset_addr_len(tcp, addr, NSIG / 8);
+ tprints("}");
+}
diff --git a/linux/tile/get_error.c b/linux/tile/get_error.c
index 8b73dfa20..9949af4f2 100644
--- a/linux/tile/get_error.c
+++ b/linux/tile/get_error.c
@@ -1,12 +1,16 @@
-/*
- * The standard tile calling convention returns the value (or negative
- * errno) in r0, and zero (or positive errno) in r1.
- * Until at least kernel 3.8, however, the r1 value is not reflected
- * in ptregs at this point, so we use r0 here.
- */
-if (check_errno && is_negated_errno(tile_regs.regs[0])) {
- tcp->u_rval = -1;
- tcp->u_error = -tile_regs.regs[0];
-} else {
- tcp->u_rval = tile_regs.regs[0];
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ /*
+ * The standard tile calling convention returns the value
+ * (or negative errno) in r0, and zero (or positive errno) in r1.
+ * Until at least kernel 3.8, however, the r1 value is not
+ * reflected in ptregs at this point, so we use r0 here.
+ */
+ if (check_errno && is_negated_errno(tile_regs.regs[0])) {
+ tcp->u_rval = -1;
+ tcp->u_error = -tile_regs.regs[0];
+ } else {
+ tcp->u_rval = tile_regs.regs[0];
+ }
}
diff --git a/linux/tile/get_scno.c b/linux/tile/get_scno.c
index 1ae65c96b..e8403d9b2 100644
--- a/linux/tile/get_scno.c
+++ b/linux/tile/get_scno.c
@@ -1,17 +1,22 @@
-unsigned int currpers;
-
-scno = tile_regs.regs[10];
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ unsigned int currpers;
#ifdef __tilepro__
-currpers = 1;
+ currpers = 1;
#else
# ifndef PT_FLAGS_COMPAT
# define PT_FLAGS_COMPAT 0x10000 /* from Linux 3.8 on */
# endif
-if (tile_regs.flags & PT_FLAGS_COMPAT)
- currpers = 1;
-else
- currpers = 0;
+ if (tile_regs.flags & PT_FLAGS_COMPAT)
+ currpers = 1;
+ else
+ currpers = 0;
#endif
+ update_personality(tcp, currpers);
+ tcp->scno = tile_regs.regs[10];
-update_personality(tcp, currpers);
+ return 1;
+}
diff --git a/linux/tile/get_syscall_args.c b/linux/tile/get_syscall_args.c
index 33371d5c4..b2043d394 100644
--- a/linux/tile/get_syscall_args.c
+++ b/linux/tile/get_syscall_args.c
@@ -1,6 +1,12 @@
-tcp->u_arg[0] = tile_regs.regs[0];
-tcp->u_arg[1] = tile_regs.regs[1];
-tcp->u_arg[2] = tile_regs.regs[2];
-tcp->u_arg[3] = tile_regs.regs[3];
-tcp->u_arg[4] = tile_regs.regs[4];
-tcp->u_arg[5] = tile_regs.regs[5];
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ tcp->u_arg[0] = tile_regs.regs[0];
+ tcp->u_arg[1] = tile_regs.regs[1];
+ tcp->u_arg[2] = tile_regs.regs[2];
+ tcp->u_arg[3] = tile_regs.regs[3];
+ tcp->u_arg[4] = tile_regs.regs[4];
+ tcp->u_arg[5] = tile_regs.regs[5];
+ return 1;
+}
diff --git a/linux/tile/print_pc.c b/linux/tile/print_pc.c
deleted file mode 100644
index 8a6894f54..000000000
--- a/linux/tile/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-tprintf(fmt, (unsigned long) tile_regs.pc);
diff --git a/linux/x32/arch_regs.c b/linux/x32/arch_regs.c
index 62c70be82..8140bc09b 100644
--- a/linux/x32/arch_regs.c
+++ b/linux/x32/arch_regs.c
@@ -1 +1,2 @@
#include "x86_64/arch_regs.c"
+#define ARCH_PC_REG (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
diff --git a/linux/x32/asm_stat.h b/linux/x32/asm_stat.h
new file mode 100644
index 000000000..6713ac456
--- /dev/null
+++ b/linux/x32/asm_stat.h
@@ -0,0 +1,47 @@
+/*
+ * This is a replacement for x32 <asm/stat.h> which
+ * appears to be wrong in older kernel headers.
+ */
+
+#ifndef STRACE_ASM_STAT_H
+
+# define STRACE_ASM_STAT_H
+
+# include "kernel_types.h"
+
+struct stat {
+ kernel_ulong_t st_dev;
+ kernel_ulong_t st_ino;
+ kernel_ulong_t st_nlink;
+ unsigned int st_mode;
+ unsigned int st_uid;
+ unsigned int st_gid;
+ unsigned int pad0__;
+ kernel_ulong_t st_rdev;
+ kernel_long_t st_size;
+ kernel_long_t st_blksize;
+ kernel_long_t st_blocks;
+ kernel_ulong_t st_atime;
+ kernel_ulong_t st_atime_nsec;
+ kernel_ulong_t st_mtime;
+ kernel_ulong_t st_mtime_nsec;
+ kernel_ulong_t st_ctime;
+ kernel_ulong_t st_ctime_nsec;
+ kernel_long_t pad1__[3];
+};
+
+struct __old_kernel_stat {
+ unsigned short st_dev;
+ unsigned short st_ino;
+ unsigned short st_mode;
+ unsigned short st_nlink;
+ unsigned short st_uid;
+ unsigned short st_gid;
+ unsigned short st_rdev;
+ unsigned int st_size;
+ unsigned int st_atime;
+ unsigned int st_mtime;
+ unsigned int st_ctime;
+};
+
+#endif /* !STRACE_ASM_STAT_H */
diff --git a/linux/x32/print_pc.c b/linux/x32/print_pc.c
deleted file mode 100644
index 13ccdc2e0..000000000
--- a/linux/x32/print_pc.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "x86_64/print_pc.c"
diff --git a/linux/x32/syscallent.h b/linux/x32/syscallent.h
index 7171b138b..ecd2ccee8 100644
--- a/linux/x32/syscallent.h
+++ b/linux/x32/syscallent.h
@@ -15,8 +15,8 @@
[ 14] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
[ 15] = { 0, TS, SEN(printargs), "64:rt_sigreturn" },
[ 16] = { 3, TD, SEN(printargs), "64:ioctl" },
-[ 17] = { 4, TD, SEN(pread), "pread" },
-[ 18] = { 4, TD, SEN(pwrite), "pwrite" },
+[ 17] = { 4, TD, SEN(pread), "pread64" },
+[ 18] = { 4, TD, SEN(pwrite), "pwrite64" },
[ 19] = { 3, TD, SEN(printargs), "64:readv" },
[ 20] = { 3, TD, SEN(printargs), "64:writev" },
[ 21] = { 2, TF, SEN(access), "access" },
@@ -58,7 +58,7 @@
[ 57] = { 0, TP, SEN(fork), "fork" },
[ 58] = { 0, TP, SEN(vfork), "vfork" },
[ 59] = { 3, TF|TP|SE|SI, SEN(printargs), "64:execve" },
-[ 60] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 60] = { 1, TP|SE, SEN(exit), "exit" },
[ 61] = { 4, TP, SEN(wait4), "wait4" },
[ 62] = { 2, TS, SEN(kill), "kill" },
[ 63] = { 1, 0, SEN(uname), "uname" },
@@ -179,8 +179,8 @@
[178] = { 5, 0, SEN(printargs), "64:query_module" },
[179] = { 4, TF, SEN(quotactl), "quotactl" },
[180] = { 3, 0, SEN(printargs), "64:nfsservctl" },
-[181] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[182] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[181] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[182] = { 5, TN, SEN(putpmsg), "putpmsg" },
[183] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
[184] = { 3, 0, SEN(tuxcall), "tuxcall" },
[185] = { 3, 0, SEN(security), "security" },
@@ -321,7 +321,10 @@
[320] = { 5, TD, SEN(kexec_file_load), "kexec_file_load", },
[321] = { 3, TD, SEN(bpf), "bpf", },
[322] = { 5, TD|TF|TP|SE|SI, SEN(printargs), "64:execveat", },
-[323 ... 511] = { },
+[323] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[324] = { 2, 0, SEN(membarrier), "membarrier", },
+[325] = { 3, TM, SEN(mlock2), "mlock2" },
+[326 ... 511] = { },
/*
* x32-specific system call numbers start at 512 to avoid cache impact
* for native 64-bit operation.
diff --git a/linux/x86_64/arch_regs.c b/linux/x86_64/arch_regs.c
index 1925dadbc..daee69f9e 100644
--- a/linux/x86_64/arch_regs.c
+++ b/linux/x86_64/arch_regs.c
@@ -38,3 +38,4 @@ static struct iovec x86_io = {
#define ARCH_REGS_FOR_GETREGSET x86_regs_union
#define ARCH_IOVEC_FOR_GETREGSET x86_io
+#define ARCH_PC_REG (x86_io.iov_len == sizeof(i386_regs) ? i386_regs.eip : x86_64_regs.rip)
diff --git a/linux/x86_64/arch_sigreturn.c b/linux/x86_64/arch_sigreturn.c
index af49778b3..1de0a0ad2 100644
--- a/linux/x86_64/arch_sigreturn.c
+++ b/linux/x86_64/arch_sigreturn.c
@@ -1,10 +1,32 @@
-if (current_personality != 1) {
- const unsigned long addr =
- (unsigned long) *x86_64_rsp_ptr +
- offsetof(struct ucontext, uc_sigmask);
+#define arch_sigreturn i386_arch_sigreturn
+#include "i386/arch_sigreturn.c"
+#undef arch_sigreturn
+
+static void
+arch_sigreturn(struct tcb *tcp)
+{
+ if (current_personality == 1) {
+ i386_arch_sigreturn(tcp);
+ return;
+ }
+
+ typedef struct {
+ uint32_t flags, link, stack[3], pad;
+ struct sigcontext mcontext;
+ } ucontext_x32_header;
+
+#define X86_64_SIGMASK_OFFSET offsetof(struct ucontext, uc_sigmask)
+#define X32_SIGMASK_OFFSET sizeof(ucontext_x32_header)
+
+ const unsigned long offset =
+#ifdef X32
+ X32_SIGMASK_OFFSET;
+#else
+ current_personality == 2 ? X32_SIGMASK_OFFSET :
+ X86_64_SIGMASK_OFFSET;
+#endif
+ const unsigned long addr = (unsigned long) *x86_64_rsp_ptr + offset;
tprints("{mask=");
print_sigset_addr_len(tcp, addr, NSIG / 8);
tprints("}");
- return;
}
-#include "i386/arch_sigreturn.c"
diff --git a/linux/x86_64/get_error.c b/linux/x86_64/get_error.c
index 29b78163e..ddf78b7ca 100644
--- a/linux/x86_64/get_error.c
+++ b/linux/x86_64/get_error.c
@@ -1,23 +1,27 @@
-/*
- * In X32, return value is 64-bit (llseek uses one).
- * Using merely "long rax" would not work.
- */
-long long rax;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ /*
+ * In X32, return value is 64-bit (llseek uses one).
+ * Using merely "long rax" would not work.
+ */
+ long long rax;
-if (x86_io.iov_len == sizeof(i386_regs)) {
- /* Sign extend from 32 bits */
- rax = (int32_t) i386_regs.eax;
-} else {
- rax = x86_64_regs.rax;
-}
+ if (x86_io.iov_len == sizeof(i386_regs)) {
+ /* Sign extend from 32 bits */
+ rax = (int32_t) i386_regs.eax;
+ } else {
+ rax = x86_64_regs.rax;
+ }
-if (check_errno && is_negated_errno(rax)) {
- tcp->u_rval = -1;
- tcp->u_error = -rax;
-} else {
- tcp->u_rval = rax;
-# ifdef X32
- /* tcp->u_rval contains a truncated value */
- tcp->u_lrval = rax;
-# endif
+ if (check_errno && is_negated_errno(rax)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -rax;
+ } else {
+ tcp->u_rval = rax;
+#ifdef X32
+ /* tcp->u_rval contains a truncated value */
+ tcp->u_lrval = rax;
+#endif
+ }
}
diff --git a/linux/x86_64/get_scno.c b/linux/x86_64/get_scno.c
index 02ff0a734..8b163de59 100644
--- a/linux/x86_64/get_scno.c
+++ b/linux/x86_64/get_scno.c
@@ -1,104 +1,116 @@
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ long scno = 0;
+ unsigned int currpers;
+
#ifndef __X32_SYSCALL_BIT
# define __X32_SYSCALL_BIT 0x40000000
#endif
-unsigned int currpers;
-
#if 1
-/* GETREGSET of NT_PRSTATUS tells us regset size,
- * which unambiguously detects i386.
- *
- * Linux kernel distinguishes x86-64 and x32 processes
- * solely by looking at __X32_SYSCALL_BIT:
- * arch/x86/include/asm/compat.h::is_x32_task():
- * if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
- * return true;
- */
-if (x86_io.iov_len == sizeof(i386_regs)) {
- scno = i386_regs.orig_eax;
- currpers = 1;
-} else {
- scno = x86_64_regs.orig_rax;
- currpers = 0;
- if (scno & __X32_SYSCALL_BIT) {
- /*
- * Syscall number -1 requires special treatment:
- * it might be a side effect of SECCOMP_RET_ERRNO
- * filtering that sets orig_rax to -1
- * in some versions of linux kernel.
- * If that is the case, then
- * __X32_SYSCALL_BIT logic does not apply.
- */
- if ((long long) x86_64_regs.orig_rax != -1) {
- scno -= __X32_SYSCALL_BIT;
- currpers = 2;
- } else {
+ /*
+ * GETREGSET of NT_PRSTATUS tells us regset size,
+ * which unambiguously detects i386.
+ *
+ * Linux kernel distinguishes x86-64 and x32 processes
+ * solely by looking at __X32_SYSCALL_BIT:
+ * arch/x86/include/asm/compat.h::is_x32_task():
+ * if (task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)
+ * return true;
+ */
+ if (x86_io.iov_len == sizeof(i386_regs)) {
+ scno = i386_regs.orig_eax;
+ currpers = 1;
+ } else {
+ scno = x86_64_regs.orig_rax;
+ currpers = 0;
+ if (scno & __X32_SYSCALL_BIT) {
+ /*
+ * Syscall number -1 requires special treatment:
+ * it might be a side effect of SECCOMP_RET_ERRNO
+ * filtering that sets orig_rax to -1
+ * in some versions of linux kernel.
+ * If that is the case, then
+ * __X32_SYSCALL_BIT logic does not apply.
+ */
+ if ((long long) x86_64_regs.orig_rax != -1) {
+ scno -= __X32_SYSCALL_BIT;
+ currpers = 2;
+ } else {
# ifdef X32
- currpers = 2;
+ currpers = 2;
# endif
+ }
}
}
-}
#elif 0
-/* cs = 0x33 for long mode (native 64 bit and x32)
- * cs = 0x23 for compatibility mode (32 bit)
- * ds = 0x2b for x32 mode (x86-64 in 32 bit)
- */
-scno = x86_64_regs.orig_rax;
-switch (x86_64_regs.cs) {
- case 0x23: currpers = 1; break;
- case 0x33:
- if (x86_64_regs.ds == 0x2b) {
- currpers = 2;
- scno &= ~__X32_SYSCALL_BIT;
- } else
- currpers = 0;
- break;
- default:
- error_msg("Unknown value CS=0x%08X while "
- "detecting personality of process PID=%d",
- (int)x86_64_regs.cs, tcp->pid);
- currpers = current_personality;
- break;
-}
+ /*
+ * cs = 0x33 for long mode (native 64 bit and x32)
+ * cs = 0x23 for compatibility mode (32 bit)
+ * ds = 0x2b for x32 mode (x86-64 in 32 bit)
+ */
+ scno = x86_64_regs.orig_rax;
+ switch (x86_64_regs.cs) {
+ case 0x23: currpers = 1; break;
+ case 0x33:
+ if (x86_64_regs.ds == 0x2b) {
+ currpers = 2;
+ scno &= ~__X32_SYSCALL_BIT;
+ } else
+ currpers = 0;
+ break;
+ default:
+ error_msg("Unknown value CS=0x%08X while "
+ "detecting personality of process PID=%d",
+ (int)x86_64_regs.cs, tcp->pid);
+ currpers = current_personality;
+ break;
+ }
#elif 0
-/* This version analyzes the opcode of a syscall instruction.
- * (int 0x80 on i386 vs. syscall on x86-64)
- * It works, but is too complicated, and strictly speaking, unreliable.
- */
-unsigned long call, rip = x86_64_regs.rip;
-/* sizeof(syscall) == sizeof(int 0x80) == 2 */
-rip -= 2;
-errno = 0;
-call = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)rip, (char *)0);
-if (errno)
- perror_msg("ptrace_peektext failed");
-switch (call & 0xffff) {
- /* x86-64: syscall = 0x0f 0x05 */
- case 0x050f: currpers = 0; break;
- /* i386: int 0x80 = 0xcd 0x80 */
- case 0x80cd: currpers = 1; break;
- default:
- currpers = current_personality;
- error_msg("Unknown syscall opcode (0x%04X) while "
- "detecting personality of process PID=%d",
- (int)call, tcp->pid);
- break;
-}
+ /*
+ * This version analyzes the opcode of a syscall instruction.
+ * (int 0x80 on i386 vs. syscall on x86-64)
+ * It works, but is too complicated, and strictly speaking, unreliable.
+ */
+ unsigned long call, rip = x86_64_regs.rip;
+ /* sizeof(syscall) == sizeof(int 0x80) == 2 */
+ rip -= 2;
+ errno = 0;
+ call = ptrace(PTRACE_PEEKTEXT, tcp->pid, (char *)rip, (char *)0);
+ if (errno)
+ perror_msg("ptrace_peektext failed");
+ switch (call & 0xffff) {
+ /* x86-64: syscall = 0x0f 0x05 */
+ case 0x050f: currpers = 0; break;
+ /* i386: int 0x80 = 0xcd 0x80 */
+ case 0x80cd: currpers = 1; break;
+ default:
+ currpers = current_personality;
+ error_msg("Unknown syscall opcode (0x%04X) while "
+ "detecting personality of process PID=%d",
+ (int)call, tcp->pid);
+ break;
+ }
#endif
#ifdef X32
-/* If we are built for a x32 system, then personality 0 is x32
- * (not x86_64), and stracing of x86_64 apps is not supported.
- * Stracing of i386 apps is still supported.
- */
-if (currpers == 0) {
- error_msg("syscall_%lu(...) in unsupported "
- "64-bit mode of process PID=%d", scno, tcp->pid);
- return 0;
-}
-currpers &= ~2; /* map 2,1 to 0,1 */
+ /*
+ * If we are built for a x32 system, then personality 0 is x32
+ * (not x86_64), and stracing of x86_64 apps is not supported.
+ * Stracing of i386 apps is still supported.
+ */
+ if (currpers == 0) {
+ error_msg("syscall_%lu(...) in unsupported "
+ "64-bit mode of process PID=%d", scno, tcp->pid);
+ return 0;
+ }
+ currpers &= ~2; /* map 2,1 to 0,1 */
#endif /* X32 */
-update_personality(tcp, currpers);
+ update_personality(tcp, currpers);
+ tcp->scno = scno;
+ return 1;
+}
diff --git a/linux/x86_64/get_syscall_args.c b/linux/x86_64/get_syscall_args.c
index 0ccecdf07..fa591fb63 100644
--- a/linux/x86_64/get_syscall_args.c
+++ b/linux/x86_64/get_syscall_args.c
@@ -1,29 +1,35 @@
-if (x86_io.iov_len != sizeof(i386_regs)) {
- /* x86-64 or x32 ABI */
- tcp->u_arg[0] = x86_64_regs.rdi;
- tcp->u_arg[1] = x86_64_regs.rsi;
- tcp->u_arg[2] = x86_64_regs.rdx;
- tcp->u_arg[3] = x86_64_regs.r10;
- tcp->u_arg[4] = x86_64_regs.r8;
- tcp->u_arg[5] = x86_64_regs.r9;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ if (x86_io.iov_len != sizeof(i386_regs)) {
+ /* x86-64 or x32 ABI */
+ tcp->u_arg[0] = x86_64_regs.rdi;
+ tcp->u_arg[1] = x86_64_regs.rsi;
+ tcp->u_arg[2] = x86_64_regs.rdx;
+ tcp->u_arg[3] = x86_64_regs.r10;
+ tcp->u_arg[4] = x86_64_regs.r8;
+ tcp->u_arg[5] = x86_64_regs.r9;
#ifdef X32
- tcp->ext_arg[0] = x86_64_regs.rdi;
- tcp->ext_arg[1] = x86_64_regs.rsi;
- tcp->ext_arg[2] = x86_64_regs.rdx;
- tcp->ext_arg[3] = x86_64_regs.r10;
- tcp->ext_arg[4] = x86_64_regs.r8;
- tcp->ext_arg[5] = x86_64_regs.r9;
+ tcp->ext_arg[0] = x86_64_regs.rdi;
+ tcp->ext_arg[1] = x86_64_regs.rsi;
+ tcp->ext_arg[2] = x86_64_regs.rdx;
+ tcp->ext_arg[3] = x86_64_regs.r10;
+ tcp->ext_arg[4] = x86_64_regs.r8;
+ tcp->ext_arg[5] = x86_64_regs.r9;
#endif
-} else {
- /* i386 ABI */
- /* Zero-extend from 32 bits */
- /* Use widen_to_long(tcp->u_arg[N]) in syscall handlers
- * if you need to use *sign-extended* parameter.
- */
- tcp->u_arg[0] = (long)(uint32_t)i386_regs.ebx;
- tcp->u_arg[1] = (long)(uint32_t)i386_regs.ecx;
- tcp->u_arg[2] = (long)(uint32_t)i386_regs.edx;
- tcp->u_arg[3] = (long)(uint32_t)i386_regs.esi;
- tcp->u_arg[4] = (long)(uint32_t)i386_regs.edi;
- tcp->u_arg[5] = (long)(uint32_t)i386_regs.ebp;
+ } else {
+ /* i386 ABI */
+ /* Zero-extend from 32 bits */
+ /* Use widen_to_long(tcp->u_arg[N]) in syscall handlers
+ * if you need to use *sign-extended* parameter.
+ */
+ tcp->u_arg[0] = (long)(uint32_t)i386_regs.ebx;
+ tcp->u_arg[1] = (long)(uint32_t)i386_regs.ecx;
+ tcp->u_arg[2] = (long)(uint32_t)i386_regs.edx;
+ tcp->u_arg[3] = (long)(uint32_t)i386_regs.esi;
+ tcp->u_arg[4] = (long)(uint32_t)i386_regs.edi;
+ tcp->u_arg[5] = (long)(uint32_t)i386_regs.ebp;
+ }
+ return 1;
}
diff --git a/linux/x86_64/getregs_old.c b/linux/x86_64/getregs_old.c
index 6911eeea6..0ad340fc2 100644
--- a/linux/x86_64/getregs_old.c
+++ b/linux/x86_64/getregs_old.c
@@ -2,13 +2,13 @@
* PTRACE_GETREGSET was added to the kernel in v2.6.25,
* a PTRACE_GETREGS based fallback is provided for old kernels.
*/
-static void
+static int
getregs_old(pid_t pid)
{
/* Use old method, with unreliable heuristical detection of 32-bitness. */
- get_regs_error = ptrace(PTRACE_GETREGS, pid, NULL, &x86_64_regs);
- if (get_regs_error)
- return;
+ long r = ptrace(PTRACE_GETREGS, pid, NULL, &x86_64_regs);
+ if (r)
+ return r;
if (x86_64_regs.cs == 0x23) {
x86_io.iov_len = sizeof(i386_regs);
@@ -36,4 +36,5 @@ getregs_old(pid_t pid)
} else {
x86_io.iov_len = sizeof(x86_64_regs);
}
+ return 0;
}
diff --git a/linux/x86_64/print_pc.c b/linux/x86_64/print_pc.c
deleted file mode 100644
index 71b080ad7..000000000
--- a/linux/x86_64/print_pc.c
+++ /dev/null
@@ -1,4 +0,0 @@
-if (x86_io.iov_len == sizeof(i386_regs))
- tprintf(fmt, (unsigned long) i386_regs.eip);
-else
- tprintf(fmt, (unsigned long) x86_64_regs.rip);
diff --git a/linux/x86_64/syscallent.h b/linux/x86_64/syscallent.h
index ebf135f3d..1fd47e057 100644
--- a/linux/x86_64/syscallent.h
+++ b/linux/x86_64/syscallent.h
@@ -15,8 +15,8 @@
[ 14] = { 4, TS, SEN(rt_sigprocmask), "rt_sigprocmask" },
[ 15] = { 0, TS, SEN(sigreturn), "rt_sigreturn" },
[ 16] = { 3, TD, SEN(ioctl), "ioctl" },
-[ 17] = { 4, TD, SEN(pread), "pread" },
-[ 18] = { 4, TD, SEN(pwrite), "pwrite" },
+[ 17] = { 4, TD, SEN(pread), "pread64" },
+[ 18] = { 4, TD, SEN(pwrite), "pwrite64" },
[ 19] = { 3, TD, SEN(readv), "readv" },
[ 20] = { 3, TD, SEN(writev), "writev" },
[ 21] = { 2, TF, SEN(access), "access" },
@@ -58,7 +58,7 @@
[ 57] = { 0, TP, SEN(fork), "fork" },
[ 58] = { 0, TP, SEN(vfork), "vfork" },
[ 59] = { 3, TF|TP|SE|SI, SEN(execve), "execve" },
-[ 60] = { 1, TP|SE, SEN(exit), "_exit" },
+[ 60] = { 1, TP|SE, SEN(exit), "exit" },
[ 61] = { 4, TP, SEN(wait4), "wait4" },
[ 62] = { 2, TS, SEN(kill), "kill" },
[ 63] = { 1, 0, SEN(uname), "uname" },
@@ -179,8 +179,8 @@
[178] = { 5, 0, SEN(query_module), "query_module" },
[179] = { 4, TF, SEN(quotactl), "quotactl" },
[180] = { 3, 0, SEN(nfsservctl), "nfsservctl" },
-[181] = { 5, 0, SEN(getpmsg), "getpmsg" },
-[182] = { 5, 0, SEN(putpmsg), "putpmsg" },
+[181] = { 5, TN, SEN(getpmsg), "getpmsg" },
+[182] = { 5, TN, SEN(putpmsg), "putpmsg" },
[183] = { 5, 0, SEN(afs_syscall), "afs_syscall" },
[184] = { 3, 0, SEN(tuxcall), "tuxcall" },
[185] = { 3, 0, SEN(security), "security" },
@@ -321,3 +321,6 @@
[320] = { 5, TD, SEN(kexec_file_load), "kexec_file_load", },
[321] = { 3, TD, SEN(bpf), "bpf", },
[322] = { 5, TD|TF|TP|SE|SI, SEN(execveat), "execveat", },
+[323] = { 1, TD, SEN(userfaultfd), "userfaultfd", },
+[324] = { 2, 0, SEN(membarrier), "membarrier", },
+[325] = { 3, TM, SEN(mlock2), "mlock2" },
diff --git a/linux/xtensa/arch_regs.c b/linux/xtensa/arch_regs.c
index 1114cabe2..d36f56a05 100644
--- a/linux/xtensa/arch_regs.c
+++ b/linux/xtensa/arch_regs.c
@@ -1 +1,2 @@
static long xtensa_a2;
+#define ARCH_PC_PEEK_ADDR REG_PC
diff --git a/linux/xtensa/get_error.c b/linux/xtensa/get_error.c
index 6efbb6e17..51ccd3b84 100644
--- a/linux/xtensa/get_error.c
+++ b/linux/xtensa/get_error.c
@@ -1,6 +1,10 @@
-if (check_errno && is_negated_errno(xtensa_a2)) {
- tcp->u_rval = -1;
- tcp->u_error = -xtensa_a2;
-} else {
- tcp->u_rval = xtensa_a2;
+static void
+get_error(struct tcb *tcp, const bool check_errno)
+{
+ if (check_errno && is_negated_errno(xtensa_a2)) {
+ tcp->u_rval = -1;
+ tcp->u_error = -xtensa_a2;
+ } else {
+ tcp->u_rval = xtensa_a2;
+ }
}
diff --git a/linux/xtensa/get_scno.c b/linux/xtensa/get_scno.c
index 429916305..d230f73bd 100644
--- a/linux/xtensa/get_scno.c
+++ b/linux/xtensa/get_scno.c
@@ -1,2 +1,6 @@
-if (upeek(tcp->pid, SYSCALL_NR, &scno) < 0)
- return -1;
+/* Return codes: 1 - ok, 0 - ignore, other - error. */
+static int
+arch_get_scno(struct tcb *tcp)
+{
+ return upeek(tcp->pid, SYSCALL_NR, &tcp->scno) < 0 ? -1 : 1;
+}
diff --git a/linux/xtensa/get_syscall_args.c b/linux/xtensa/get_syscall_args.c
index dca8788e9..a9c933a9f 100644
--- a/linux/xtensa/get_syscall_args.c
+++ b/linux/xtensa/get_syscall_args.c
@@ -1,7 +1,20 @@
-/* arg0: a6, arg1: a3, arg2: a4, arg3: a5, arg4: a8, arg5: a9 */
-static const int xtensaregs[MAX_ARGS] = { 6, 3, 4, 5, 8, 9 };
-unsigned int i;
+/* Return -1 on error or 1 on success (never 0!). */
+static int
+get_syscall_args(struct tcb *tcp)
+{
+ /* arg0: a6, arg1: a3, arg2: a4, arg3: a5, arg4: a8, arg5: a9 */
+ static const int xtensaregs[MAX_ARGS] = {
+ REG_A_BASE + 6,
+ REG_A_BASE + 3,
+ REG_A_BASE + 4,
+ REG_A_BASE + 5,
+ REG_A_BASE + 8,
+ REG_A_BASE + 9
+ };
+ unsigned int i;
-for (i = 0; i < tcp->s_ent->nargs; ++i)
- if (upeek(tcp->pid, REG_A_BASE + xtensaregs[i], &tcp->u_arg[i]) < 0)
- return -1;
+ for (i = 0; i < tcp->s_ent->nargs; ++i)
+ if (upeek(tcp->pid, xtensaregs[i], &tcp->u_arg[i]) < 0)
+ return -1;
+ return 1;
+}
diff --git a/linux/xtensa/get_syscall_result.c b/linux/xtensa/get_syscall_result.c
index 0d2e697cd..51ad6deab 100644
--- a/linux/xtensa/get_syscall_result.c
+++ b/linux/xtensa/get_syscall_result.c
@@ -1,2 +1,5 @@
-if (upeek(tcp->pid, REG_A_BASE + 2, &xtensa_a2) < 0)
- return -1;
+static int
+get_syscall_result_regs(struct tcb *tcp)
+{
+ return upeek(tcp->pid, REG_A_BASE + 2, &xtensa_a2) < 0 ? -1 : 0;
+}
diff --git a/linux/xtensa/print_pc.c b/linux/xtensa/print_pc.c
deleted file mode 100644
index c0232e555..000000000
--- a/linux/xtensa/print_pc.c
+++ /dev/null
@@ -1,6 +0,0 @@
-long pc;
-if (upeek(tcp->pid, REG_PC, &pc) < 0) {
- PRINTBADPC;
- return;
-}
-tprintf(fmt, pc);
diff --git a/linux/xtensa/syscallent.h b/linux/xtensa/syscallent.h
index 020c3dbfe..9f936f00a 100644
--- a/linux/xtensa/syscallent.h
+++ b/linux/xtensa/syscallent.h
@@ -54,7 +54,7 @@
[ 58] = { 1, 0, SEN(umask), "umask" },
[ 59] = { 3, TD, SEN(getdents), "getdents" },
[ 60] = { 3, TD, SEN(getdents64), "getdents64" },
-[ 61] = { 3, TD, SEN(fcntl), "fcntl64" },
+[ 61] = { 3, TD, SEN(fcntl64), "fcntl64" },
[ 62] = { 6, TD, SEN(fallocate), "fallocate" },
[ 63] = { 6, TD, SEN(fadvise64_64), "fadvise64_64" },
[ 64] = { 2, TF, SEN(utime), "utime" },
@@ -171,7 +171,7 @@
[176] = { 1, TF, SEN(umount), "umount" },
[177] = { 1, TF, SEN(swapoff), "swapoff" },
[178] = { 0, 0, SEN(sync), "sync" },
-[179] = { },
+[179] = { 1, TD, SEN(syncfs), "syncfs" },
[180] = { 1, NF, SEN(setfsuid), "setfsuid" },
[181] = { 1, NF, SEN(setfsgid), "setfsgid" },
[182] = { 3, 0, SEN(sysfs), "sysfs" },
@@ -258,13 +258,13 @@
[265] = { 3, TM, SEN(set_mempolicy), "set_mempolicy" },
[266] = { 1, TP, SEN(unshare), "unshare" },
[267] = { 6, TM, SEN(move_pages), "move_pages" },
-[268] = { 0, TD, SEN(splice), "splice" },
-[269] = { 0, TD, SEN(tee), "tee" },
-[270] = { 0, TD, SEN(vmsplice), "vmsplice" },
+[268] = { 6, TD, SEN(splice), "splice" },
+[269] = { 4, TD, SEN(tee), "tee" },
+[270] = { 4, TD, SEN(vmsplice), "vmsplice" },
[271] = { },
-[272] = { 0, TD, SEN(pselect6), "pselect6" },
-[273] = { 0, TD, SEN(ppoll), "ppoll" },
-[274] = { 0, TD, SEN(epoll_pwait), "epoll_pwait" },
+[272] = { 6, TD, SEN(pselect6), "pselect6" },
+[273] = { 5, TD, SEN(ppoll), "ppoll" },
+[274] = { 6, TD, SEN(epoll_pwait), "epoll_pwait" },
[275] = { 1, TD, SEN(epoll_create1), "epoll_create1" },
[276] = { 0, TD, SEN(inotify_init), "inotify_init" },
[277] = { 3, TD, SEN(inotify_add_watch), "inotify_add_watch" },
@@ -274,7 +274,7 @@
[281] = { 4, 0, SEN(kexec_load), "kexec_load" },
[282] = { 2, 0, SEN(ioprio_set), "ioprio_set" },
[283] = { 3, 0, SEN(ioprio_get), "ioprio_get" },
-[284] = { 3, 0, SEN(set_robust_list), "set_robust_list" },
+[284] = { 2, 0, SEN(set_robust_list), "set_robust_list" },
[285] = { 3, 0, SEN(get_robust_list), "get_robust_list" },
[286 ... 287] = { },
[288] = { 4, TD|TF, SEN(openat), "openat" },