diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c --- a/usr.bin/truss/syscalls.c +++ b/usr.bin/truss/syscalls.c @@ -83,559 +83,8 @@ #include "extern.h" #include "syscall.h" -/* - * This should probably be in its own file, sorted alphabetically. - * - * Note: We only scan this table on the initial syscall number to calling - * convention lookup, i.e. once each time a new syscall is encountered. This - * is unlikely to be a performance issue, but if it is we could sort this array - * and use a binary search instead. - */ -static const struct syscall_decode decoded_syscalls[] = { - /* Native ABI */ - { .name = "__acl_aclcheck_fd", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_aclcheck_file", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_aclcheck_link", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_delete_fd", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Acltype, 1 } } }, - { .name = "__acl_delete_file", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Acltype, 1 } } }, - { .name = "__acl_delete_link", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Acltype, 1 } } }, - { .name = "__acl_get_fd", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_get_file", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_get_link", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_set_fd", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_set_file", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__acl_set_link", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, - { .name = "__cap_rights_get", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Int, 1 }, { CapRights | OUT, 2 } } }, - { .name = "__getcwd", .ret_type = 1, .nargs = 2, - .args = { { Name | OUT, 0 }, { Int, 1 } } }, - { .name = "__realpathat", .ret_type = 1, .nargs = 5, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Name | OUT, 2 }, - { Sizet, 3 }, { Int, 4} } }, - { .name = "_umtx_op", .ret_type = 1, .nargs = 5, - .args = { { Ptr, 0 }, { Umtxop, 1 }, { LongHex, 2 }, { Ptr, 3 }, - { Ptr, 4 } } }, - { .name = "accept", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, - { .name = "access", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Accessmode, 1 } } }, - { .name = "aio_cancel", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Aiocb, 1 } } }, - { .name = "aio_error", .ret_type = 1, .nargs = 1, - .args = { { Aiocb, 0 } } }, - { .name = "aio_fsync", .ret_type = 1, .nargs = 2, - .args = { { AiofsyncOp, 0 }, { Aiocb, 1 } } }, - { .name = "aio_mlock", .ret_type = 1, .nargs = 1, - .args = { { Aiocb, 0 } } }, - { .name = "aio_read", .ret_type = 1, .nargs = 1, - .args = { { Aiocb, 0 } } }, - { .name = "aio_return", .ret_type = 1, .nargs = 1, - .args = { { Aiocb, 0 } } }, - { .name = "aio_suspend", .ret_type = 1, .nargs = 3, - .args = { { AiocbArray, 0 }, { Int, 1 }, { Timespec, 2 } } }, - { .name = "aio_waitcomplete", .ret_type = 1, .nargs = 2, - .args = { { AiocbPointer | OUT, 0 }, { Timespec, 1 } } }, - { .name = "aio_write", .ret_type = 1, .nargs = 1, - .args = { { Aiocb, 0 } } }, - { .name = "bind", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } }, - { .name = "bindat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 }, - { Int, 3 } } }, - { .name = "break", .ret_type = 1, .nargs = 1, - .args = { { Ptr, 0 } } }, - { .name = "cap_fcntls_get", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { CapFcntlRights | OUT, 1 } } }, - { .name = "cap_fcntls_limit", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { CapFcntlRights, 1 } } }, - { .name = "cap_getmode", .ret_type = 1, .nargs = 1, - .args = { { PUInt | OUT, 0 } } }, - { .name = "cap_rights_limit", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { CapRights, 1 } } }, - { .name = "chdir", .ret_type = 1, .nargs = 1, - .args = { { Name, 0 } } }, - { .name = "chflags", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { FileFlags, 1 } } }, - { .name = "chflagsat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { FileFlags, 2 }, - { Atflags, 3 } } }, - { .name = "chmod", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Octal, 1 } } }, - { .name = "chown", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Int, 1 }, { Int, 2 } } }, - { .name = "chroot", .ret_type = 1, .nargs = 1, - .args = { { Name, 0 } } }, - { .name = "clock_gettime", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Timespec | OUT, 1 } } }, - { .name = "close", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "closefrom", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "close_range", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Int, 1 }, { Closerangeflags, 2 } } }, - { .name = "compat11.fstat", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Stat11 | OUT, 1 } } }, - { .name = "compat11.fstatat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Stat11 | OUT, 2 }, - { Atflags, 3 } } }, - { .name = "compat11.kevent", .ret_type = 1, .nargs = 6, - .args = { { Int, 0 }, { Kevent11, 1 }, { Int, 2 }, - { Kevent11 | OUT, 3 }, { Int, 4 }, { Timespec, 5 } } }, - { .name = "compat11.lstat", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Stat11 | OUT, 1 } } }, - { .name = "compat11.mknod", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Octal, 1 }, { Int, 2 } } }, - { .name = "compat11.mknodat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Int, 3 } } }, - { .name = "compat11.stat", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Stat11 | OUT, 1 } } }, - { .name = "connect", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } }, - { .name = "connectat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 }, - { Int, 3 } } }, - { .name = "dup", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "dup2", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Int, 1 } } }, - { .name = "eaccess", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Accessmode, 1 } } }, - { .name = "execve", .ret_type = 1, .nargs = 3, - .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 }, - { ExecEnv | IN, 2 } } }, - { .name = "exit", .ret_type = 0, .nargs = 1, - .args = { { Hex, 0 } } }, - { .name = "extattr_delete_fd", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, - { .name = "extattr_delete_file", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, - { .name = "extattr_delete_link", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, - { .name = "extattr_get_fd", .ret_type = 1, .nargs = 5, - .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | OUT, 3 }, { Sizet, 4 } } }, - { .name = "extattr_get_file", .ret_type = 1, .nargs = 5, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | OUT, 3 }, { Sizet, 4 } } }, - { .name = "extattr_get_link", .ret_type = 1, .nargs = 5, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | OUT, 3 }, { Sizet, 4 } } }, - { .name = "extattr_list_fd", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, - { Sizet, 3 } } }, - { .name = "extattr_list_file", .ret_type = 1, .nargs = 4, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, - { Sizet, 3 } } }, - { .name = "extattr_list_link", .ret_type = 1, .nargs = 4, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, - { Sizet, 3 } } }, - { .name = "extattr_set_fd", .ret_type = 1, .nargs = 5, - .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | IN, 3 }, { Sizet, 4 } } }, - { .name = "extattr_set_file", .ret_type = 1, .nargs = 5, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | IN, 3 }, { Sizet, 4 } } }, - { .name = "extattr_set_link", .ret_type = 1, .nargs = 5, - .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, - { BinString | IN, 3 }, { Sizet, 4 } } }, - { .name = "extattrctl", .ret_type = 1, .nargs = 5, - .args = { { Name, 0 }, { Hex, 1 }, { Name, 2 }, - { Extattrnamespace, 3 }, { Name, 4 } } }, - { .name = "faccessat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Accessmode, 2 }, - { Atflags, 3 } } }, - { .name = "fchflags", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { FileFlags, 1 } } }, - { .name = "fchmod", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Octal, 1 } } }, - { .name = "fchmodat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Atflags, 3 } } }, - { .name = "fchown", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Int, 1 }, { Int, 2 } } }, - { .name = "fchownat", .ret_type = 1, .nargs = 5, - .args = { { Atfd, 0 }, { Name, 1 }, { Int, 2 }, { Int, 3 }, - { Atflags, 4 } } }, - { .name = "fcntl", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Fcntl, 1 }, { Fcntlflag, 2 } } }, - { .name = "fdatasync", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "flock", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Flockop, 1 } } }, - { .name = "fstat", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Stat | OUT, 1 } } }, - { .name = "fstatat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Stat | OUT, 2 }, - { Atflags, 3 } } }, - { .name = "fstatfs", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { StatFs | OUT, 1 } } }, - { .name = "fsync", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "ftruncate", .ret_type = 1, .nargs = 2, - .args = { { Int | IN, 0 }, { QuadHex | IN, 1 } } }, - { .name = "futimens", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Timespec2 | IN, 1 } } }, - { .name = "futimes", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Timeval2 | IN, 1 } } }, - { .name = "futimesat", .ret_type = 1, .nargs = 3, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Timeval2 | IN, 2 } } }, - { .name = "getdirentries", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 }, - { PQuadHex | OUT, 3 } } }, - { .name = "getfsstat", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { Long, 1 }, { Getfsstatmode, 2 } } }, - { .name = "getitimer", .ret_type = 1, .nargs = 2, - .args = { { Itimerwhich, 0 }, { Itimerval | OUT, 2 } } }, - { .name = "getpeername", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, - { .name = "getpgid", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "getpriority", .ret_type = 1, .nargs = 2, - .args = { { Priowhich, 0 }, { Int, 1 } } }, - { .name = "getrandom", .ret_type = 1, .nargs = 3, - .args = { { BinString | OUT, 0 }, { Sizet, 1 }, { UInt, 2 } } }, - { .name = "getrlimit", .ret_type = 1, .nargs = 2, - .args = { { Resource, 0 }, { Rlimit | OUT, 1 } } }, - { .name = "getrusage", .ret_type = 1, .nargs = 2, - .args = { { RusageWho, 0 }, { Rusage | OUT, 1 } } }, - { .name = "getsid", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "getsockname", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, - { .name = "getsockopt", .ret_type = 1, .nargs = 5, - .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 }, - { Ptr | OUT, 3 }, { Ptr | OUT, 4 } } }, - { .name = "gettimeofday", .ret_type = 1, .nargs = 2, - .args = { { Timeval | OUT, 0 }, { Ptr, 1 } } }, - { .name = "ioctl", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Ioctl, 1 }, { Ptr, 2 } } }, - { .name = "kevent", .ret_type = 1, .nargs = 6, - .args = { { Int, 0 }, { Kevent, 1 }, { Int, 2 }, { Kevent | OUT, 3 }, - { Int, 4 }, { Timespec, 5 } } }, - { .name = "kill", .ret_type = 1, .nargs = 2, - .args = { { Int | IN, 0 }, { Signal | IN, 1 } } }, - { .name = "kldfind", .ret_type = 1, .nargs = 1, - .args = { { Name | IN, 0 } } }, - { .name = "kldfirstmod", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "kldload", .ret_type = 1, .nargs = 1, - .args = { { Name | IN, 0 } } }, - { .name = "kldnext", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "kldstat", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Ptr, 1 } } }, - { .name = "kldsym", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Kldsymcmd, 1 }, { Ptr, 2 } } }, - { .name = "kldunload", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "kldunloadf", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Kldunloadflags, 1 } } }, - { .name = "kse_release", .ret_type = 0, .nargs = 1, - .args = { { Timespec, 0 } } }, - { .name = "lchflags", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { FileFlags, 1 } } }, - { .name = "lchmod", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Octal, 1 } } }, - { .name = "lchown", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Int, 1 }, { Int, 2 } } }, - { .name = "link", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Name, 1 } } }, - { .name = "linkat", .ret_type = 1, .nargs = 5, - .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 }, - { Atflags, 4 } } }, - { .name = "lio_listio", .ret_type = 1, .nargs = 4, - .args = { { LioMode, 0 }, { AiocbArray, 1 }, { Int, 2 }, - { Sigevent, 3 } } }, - { .name = "listen", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Int, 1 } } }, - { .name = "lseek", .ret_type = 2, .nargs = 3, - .args = { { Int, 0 }, { QuadHex, 1 }, { Whence, 2 } } }, - { .name = "lstat", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } }, - { .name = "lutimes", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Timeval2 | IN, 1 } } }, - { .name = "madvise", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { Sizet, 1 }, { Madvice, 2 } } }, - { .name = "minherit", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { Sizet, 1 }, { Minherit, 2 } } }, - { .name = "mkdir", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Octal, 1 } } }, - { .name = "mkdirat", .ret_type = 1, .nargs = 3, - .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 } } }, - { .name = "mkfifo", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Octal, 1 } } }, - { .name = "mkfifoat", .ret_type = 1, .nargs = 3, - .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 } } }, - { .name = "mknod", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Octal, 1 }, { Quad, 2 } } }, - { .name = "mknodat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Quad, 3 } } }, - { .name = "mlock", .ret_type = 1, .nargs = 2, - .args = { { Ptr, 0 }, { Sizet, 1 } } }, - { .name = "mlockall", .ret_type = 1, .nargs = 1, - .args = { { Mlockall, 0 } } }, - { .name = "mmap", .ret_type = 1, .nargs = 6, - .args = { { Ptr, 0 }, { Sizet, 1 }, { Mprot, 2 }, { Mmapflags, 3 }, - { Int, 4 }, { QuadHex, 5 } } }, - { .name = "modfind", .ret_type = 1, .nargs = 1, - .args = { { Name | IN, 0 } } }, - { .name = "mount", .ret_type = 1, .nargs = 4, - .args = { { Name, 0 }, { Name, 1 }, { Mountflags, 2 }, { Ptr, 3 } } }, - { .name = "mprotect", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { Sizet, 1 }, { Mprot, 2 } } }, - { .name = "msync", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { Sizet, 1 }, { Msync, 2 } } }, - { .name = "munlock", .ret_type = 1, .nargs = 2, - .args = { { Ptr, 0 }, { Sizet, 1 } } }, - { .name = "munmap", .ret_type = 1, .nargs = 2, - .args = { { Ptr, 0 }, { Sizet, 1 } } }, - { .name = "nanosleep", .ret_type = 1, .nargs = 1, - .args = { { Timespec, 0 } } }, - { .name = "nmount", .ret_type = 1, .nargs = 3, - .args = { { Ptr, 0 }, { UInt, 1 }, { Mountflags, 2 } } }, - { .name = "open", .ret_type = 1, .nargs = 3, - .args = { { Name | IN, 0 }, { Open, 1 }, { Octal, 2 } } }, - { .name = "openat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Open, 2 }, - { Octal, 3 } } }, - { .name = "pathconf", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Pathconf, 1 } } }, - { .name = "pipe", .ret_type = 1, .nargs = 1, - .args = { { PipeFds | OUT, 0 } } }, - { .name = "pipe2", .ret_type = 1, .nargs = 2, - .args = { { Ptr, 0 }, { Pipe2, 1 } } }, - { .name = "poll", .ret_type = 1, .nargs = 3, - .args = { { Pollfd, 0 }, { Int, 1 }, { Int, 2 } } }, - { .name = "posix_fadvise", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { QuadHex, 1 }, { QuadHex, 2 }, - { Fadvice, 3 } } }, - { .name = "posix_openpt", .ret_type = 1, .nargs = 1, - .args = { { Open, 0 } } }, - { .name = "ppoll", .ret_type = 1, .nargs = 4, - .args = { { Pollfd, 0 }, { Int, 1 }, { Timespec | IN, 2 }, - { Sigset | IN, 3 } } }, - { .name = "pread", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, - { QuadHex, 3 } } }, - { .name = "preadv", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 }, - { QuadHex, 3 } } }, - { .name = "procctl", .ret_type = 1, .nargs = 4, - .args = { { Idtype, 0 }, { Quad, 1 }, { Procctl, 2 }, { Ptr, 3 } } }, - { .name = "ptrace", .ret_type = 1, .nargs = 4, - .args = { { Ptraceop, 0 }, { Int, 1 }, { Ptr, 2 }, { Int, 3 } } }, - { .name = "pwrite", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, - { QuadHex, 3 } } }, - { .name = "pwritev", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 }, - { QuadHex, 3 } } }, - { .name = "quotactl", .ret_type = 1, .nargs = 4, - .args = { { Name, 0 }, { Quotactlcmd, 1 }, { Int, 2 }, { Ptr, 3 } } }, - { .name = "read", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 } } }, - { .name = "readlink", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Readlinkres | OUT, 1 }, { Sizet, 2 } } }, - { .name = "readlinkat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name, 1 }, { Readlinkres | OUT, 2 }, - { Sizet, 3 } } }, - { .name = "readv", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 } } }, - { .name = "reboot", .ret_type = 1, .nargs = 1, - .args = { { Reboothowto, 0 } } }, - { .name = "recvfrom", .ret_type = 1, .nargs = 6, - .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, - { Msgflags, 3 }, { Sockaddr | OUT, 4 }, - { Ptr | OUT, 5 } } }, - { .name = "recvmsg", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Msghdr | OUT, 1 }, { Msgflags, 2 } } }, - { .name = "rename", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Name, 1 } } }, - { .name = "renameat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 } } }, - { .name = "rfork", .ret_type = 1, .nargs = 1, - .args = { { Rforkflags, 0 } } }, - { .name = "rmdir", .ret_type = 1, .nargs = 1, - .args = { { Name, 0 } } }, - { .name = "rtprio", .ret_type = 1, .nargs = 3, - .args = { { Rtpriofunc, 0 }, { Int, 1 }, { Ptr, 2 } } }, - { .name = "rtprio_thread", .ret_type = 1, .nargs = 3, - .args = { { Rtpriofunc, 0 }, { Int, 1 }, { Ptr, 2 } } }, - { .name = "sched_get_priority_max", .ret_type = 1, .nargs = 1, - .args = { { Schedpolicy, 0 } } }, - { .name = "sched_get_priority_min", .ret_type = 1, .nargs = 1, - .args = { { Schedpolicy, 0 } } }, - { .name = "sched_getparam", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Schedparam | OUT, 1 } } }, - { .name = "sched_getscheduler", .ret_type = 1, .nargs = 1, - .args = { { Int, 0 } } }, - { .name = "sched_rr_get_interval", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Timespec | OUT, 1 } } }, - { .name = "sched_setparam", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Schedparam, 1 } } }, - { .name = "sched_setscheduler", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Schedpolicy, 1 }, { Schedparam, 2 } } }, - { .name = "sctp_generic_recvmsg", .ret_type = 1, .nargs = 7, - .args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 }, - { Sockaddr | OUT, 3 }, { Ptr | OUT, 4 }, - { Sctpsndrcvinfo | OUT, 5 }, { Ptr | OUT, 6 } } }, - { .name = "sctp_generic_sendmsg", .ret_type = 1, .nargs = 7, - .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, - { Sockaddr | IN, 3 }, { Socklent, 4 }, - { Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } }, - { .name = "sctp_generic_sendmsg_iov", .ret_type = 1, .nargs = 7, - .args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 }, - { Sockaddr | IN, 3 }, { Socklent, 4 }, - { Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } }, - { .name = "sendfile", .ret_type = 1, .nargs = 7, - .args = { { Int, 0 }, { Int, 1 }, { QuadHex, 2 }, { Sizet, 3 }, - { Sendfilehdtr, 4 }, { QuadHex | OUT, 5 }, - { Sendfileflags, 6 } } }, - { .name = "select", .ret_type = 1, .nargs = 5, - .args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 }, - { Timeval, 4 } } }, - { .name = "sendmsg", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Msghdr | IN, 1 }, { Msgflags, 2 } } }, - { .name = "sendto", .ret_type = 1, .nargs = 6, - .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, - { Msgflags, 3 }, { Sockaddr | IN, 4 }, - { Socklent | IN, 5 } } }, - { .name = "setitimer", .ret_type = 1, .nargs = 3, - .args = { { Itimerwhich, 0 }, { Itimerval, 1 }, - { Itimerval | OUT, 2 } } }, - { .name = "setpriority", .ret_type = 1, .nargs = 3, - .args = { { Priowhich, 0 }, { Int, 1 }, { Int, 2 } } }, - { .name = "setrlimit", .ret_type = 1, .nargs = 2, - .args = { { Resource, 0 }, { Rlimit | IN, 1 } } }, - { .name = "setsockopt", .ret_type = 1, .nargs = 5, - .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 }, - { Ptr | IN, 3 }, { Socklent, 4 } } }, - { .name = "shm_open", .ret_type = 1, .nargs = 3, - .args = { { ShmName | IN, 0 }, { Open, 1 }, { Octal, 2 } } }, - { .name = "shm_open2", .ret_type = 1, .nargs = 5, - .args = { { ShmName | IN, 0 }, { Open, 1 }, { Octal, 2 }, - { ShmFlags, 3 }, { Name | IN, 4 } } }, - { .name = "shm_rename", .ret_type = 1, .nargs = 3, - .args = { { Name | IN, 0 }, { Name | IN, 1 }, { Hex, 2 } } }, - { .name = "shm_unlink", .ret_type = 1, .nargs = 1, - .args = { { Name | IN, 0 } } }, - { .name = "shutdown", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Shutdown, 1 } } }, - { .name = "sigaction", .ret_type = 1, .nargs = 3, - .args = { { Signal, 0 }, { Sigaction | IN, 1 }, - { Sigaction | OUT, 2 } } }, - { .name = "sigpending", .ret_type = 1, .nargs = 1, - .args = { { Sigset | OUT, 0 } } }, - { .name = "sigprocmask", .ret_type = 1, .nargs = 3, - .args = { { Sigprocmask, 0 }, { Sigset, 1 }, { Sigset | OUT, 2 } } }, - { .name = "sigqueue", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Signal, 1 }, { LongHex, 2 } } }, - { .name = "sigreturn", .ret_type = 1, .nargs = 1, - .args = { { Ptr, 0 } } }, - { .name = "sigsuspend", .ret_type = 1, .nargs = 1, - .args = { { Sigset | IN, 0 } } }, - { .name = "sigtimedwait", .ret_type = 1, .nargs = 3, - .args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 }, - { Timespec | IN, 2 } } }, - { .name = "sigwait", .ret_type = 1, .nargs = 2, - .args = { { Sigset | IN, 0 }, { PSig | OUT, 1 } } }, - { .name = "sigwaitinfo", .ret_type = 1, .nargs = 2, - .args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 } } }, - { .name = "socket", .ret_type = 1, .nargs = 3, - .args = { { Sockdomain, 0 }, { Socktype, 1 }, { Sockprotocol, 2 } } }, - { .name = "stat", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } }, - { .name = "statfs", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { StatFs | OUT, 1 } } }, - { .name = "symlink", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Name, 1 } } }, - { .name = "symlinkat", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Atfd, 1 }, { Name, 2 } } }, - { .name = "sysarch", .ret_type = 1, .nargs = 2, - .args = { { Sysarch, 0 }, { Ptr, 1 } } }, - { .name = "__sysctl", .ret_type = 1, .nargs = 6, - .args = { { Sysctl, 0 }, { Sizet, 1 }, { Ptr, 2 }, { Ptr, 3 }, - { Ptr, 4 }, { Sizet, 5 } } }, - { .name = "__sysctlbyname", .ret_type = 1, .nargs = 6, - .args = { { Name, 0 }, { Sizet, 1 }, { Ptr, 2 }, { Ptr, 3 }, - { Ptr, 4}, { Sizet, 5 } } }, - { .name = "thr_kill", .ret_type = 1, .nargs = 2, - .args = { { Long, 0 }, { Signal, 1 } } }, - { .name = "thr_self", .ret_type = 1, .nargs = 1, - .args = { { Ptr, 0 } } }, - { .name = "thr_set_name", .ret_type = 1, .nargs = 2, - .args = { { Long, 0 }, { Name, 1 } } }, - { .name = "truncate", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { QuadHex | IN, 1 } } }, -#if 0 - /* Does not exist */ - { .name = "umount", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Int, 2 } } }, -#endif - { .name = "unlink", .ret_type = 1, .nargs = 1, - .args = { { Name, 0 } } }, - { .name = "unlinkat", .ret_type = 1, .nargs = 3, - .args = { { Atfd, 0 }, { Name, 1 }, { Atflags, 2 } } }, - { .name = "unmount", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Mountflags, 1 } } }, - { .name = "utimensat", .ret_type = 1, .nargs = 4, - .args = { { Atfd, 0 }, { Name | IN, 1 }, { Timespec2 | IN, 2 }, - { Atflags, 3 } } }, - { .name = "utimes", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Timeval2 | IN, 1 } } }, - { .name = "utrace", .ret_type = 1, .nargs = 1, - .args = { { Utrace, 0 } } }, - { .name = "wait4", .ret_type = 1, .nargs = 4, - .args = { { Int, 0 }, { ExitStatus | OUT, 1 }, { Waitoptions, 2 }, - { Rusage | OUT, 3 } } }, - { .name = "wait6", .ret_type = 1, .nargs = 6, - .args = { { Idtype, 0 }, { Quad, 1 }, { ExitStatus | OUT, 2 }, - { Waitoptions, 3 }, { Rusage | OUT, 4 }, - { Siginfo | OUT, 5 } } }, - { .name = "write", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 } } }, - { .name = "writev", .ret_type = 1, .nargs = 3, - .args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 } } }, - - /* Linux ABI */ - { .name = "linux_access", .ret_type = 1, .nargs = 2, - .args = { { Name, 0 }, { Accessmode, 1 } } }, - { .name = "linux_execve", .ret_type = 1, .nargs = 3, - .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 }, - { ExecEnv | IN, 2 } } }, - { .name = "linux_getitimer", .ret_type = 1, .nargs = 2, - .args = { { Itimerwhich, 0 }, { Itimerval | OUT, 2 } } }, - { .name = "linux_lseek", .ret_type = 2, .nargs = 3, - .args = { { Int, 0 }, { Int, 1 }, { Whence, 2 } } }, - { .name = "linux_mkdir", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Int, 1 } } }, - { .name = "linux_newfstat", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { Ptr | OUT, 1 } } }, - { .name = "linux_newstat", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } }, - { .name = "linux_open", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Hex, 1 }, { Octal, 2 } } }, - { .name = "linux_readlink", .ret_type = 1, .nargs = 3, - .args = { { Name, 0 }, { Name | OUT, 1 }, { Sizet, 2 } } }, - { .name = "linux_setitimer", .ret_type = 1, .nargs = 3, - .args = { { Itimerwhich, 0 }, { Itimerval, 1 }, - { Itimerval | OUT, 2 } } }, - { .name = "linux_socketcall", .ret_type = 1, .nargs = 2, - .args = { { Int, 0 }, { LinuxSockArgs, 1 } } }, - { .name = "linux_stat64", .ret_type = 1, .nargs = 2, - .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } }, -}; +#include +#include "../../sys/sys/systruss.h" static STAILQ_HEAD(, syscall) seen_syscalls; /* Xlat idea taken from strace */ @@ -922,6 +371,8 @@ lookup_name += strlen(procabi->compat_prefix); for (i = 0; i < nitems(decoded_syscalls); i++) { + if (decoded_syscalls[i].name == NULL) + continue; if (strcmp(lookup_name, decoded_syscalls[i].name) == 0) { sc->decode = decoded_syscalls[i]; add_syscall(t->proc->abi, number, sc);