diff options
author | Elliott Hughes <enh@google.com> | 2015-12-10 10:10:13 -0800 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2015-12-10 10:10:13 -0800 |
commit | f4b2cf666b676496f413064761d44bbd93522dbb (patch) | |
tree | a772d2f3d3796fe18f4f014f33d6bd87e25999e0 /linux | |
parent | 6967bc2e4b39e3e67a8ff4e75cf6602c34a8d039 (diff) | |
parent | bab4ef4272cd2596c7390b34ea8acc086ee8fdb2 (diff) | |
download | strace-f4b2cf666b676496f413064761d44bbd93522dbb.tar.gz |
Merge remote-tracking branch 'strace/master' into HEAD
Change-Id: I65e4a0c7b98d3a813829088e8bcb34ed7d71fa3e
Diffstat (limited to 'linux')
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, µblaze_r3) < 0) - return -1; +static int +get_syscall_result_regs(struct tcb *tcp) +{ + return upeek(tcp->pid, 3 * 4, µblaze_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" }, |