Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 May 2017 17:11:27 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r318961 - stable/11/usr.bin/truss
Message-ID:  <201705261711.v4QHBRNo018145@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri May 26 17:11:27 2017
New Revision: 318961
URL: https://svnweb.freebsd.org/changeset/base/318961

Log:
  MFC 315335,315336,315496,315497,315500,315502,315504,315509,315523,315524,
  315525: Decode more system call arguments in truss.
  
  315335:
  Remove duplicate argument from linux_stat64() decoding.
  
  315336:
  Automate the handling of QUAD_ALIGN and QUAD_SLOTS.
  
  Previously, the offset in a system call description specified the
  array index of the start of a system call argument.  For most system
  call arguments this was the same as the index of the argument in the
  function signature.  64-bit arguments (off_t and id_t values) passed
  on 32-bit platforms use two slots in the array however.  This was
  handled by adding (QUAD_SLOTS - 1) to the slot indicies of any
  subsequent arguments after a 64-bit argument (though written as ("{
  Quad, 1 }, { Int, 1 + QUAD_SLOTS }" rather than "{ Quad, 1 }, { Int, 2
  + QUAD_SLOTS - 1 }").  If a system call contained multiple 64-bit
  arguments (such as posix_fadvise()), then additional arguments would
  need to use 'QUAD_SLOTS * 2' but remember to subtract 2 from the
  initial number, etc.  In addition, 32-bit powerpc requires 64-bit
  arguments to be 64-bit aligned, so if the effective index in the array
  of a 64-bit argument is odd, it needs QUAD_ALIGN added to the current
  and any subsequent slots.  However, if the effective index in the
  array of a 64-bit argument was even, QUAD_ALIGN was omitted.
  
  This approach was messy and error prone.  This commit replaces it with
  automated pre-processing of the system call table to do fixups for
  64-bit argument offsets.  The offset in a system call description now
  indicates the index of an argument in the associated function call's
  signature.  A fixup function is run against each decoded system call
  description during startup on 32-bit platforms.  The fixup function
  maintains an 'offset' value which holds an offset to be added to each
  remaining system call argument's index.  Initially offset is 0.  When
  a 64-bit system call argument is encountered, the offset is first
  aligned to a 64-bit boundary (only on powerpc) and then incremented to
  account for the second argument slot used by the argument.  This
  modified 'offset' is then applied to any remaining arguments.  This
  approach does require a few things that were not previously required:
  
  1) Each system call description must now list arguments in ascending
     order (existing ones all do) without using duplicate slots in the
     register array.  A new assert() should catch any future
     descriptions which violate this rule.
  
  2) A system call description is still permitted to omit arguments
     (though none currently do), but if the call accepts 64-bit
     arguments those cannot be omitted or incorrect results will be
     displated on 32-bit systems.
  
  315496:
  Decode the arguments passed to cap_fcntls_get() and cap_fcntls_limit().
  
  315497:
  Decode arguments passed to posix_fadvise().
  
  315500:
  Decode file flags passed to *chflags*().
  
  While here, decode arguments passed to fchflags() and chflagsat().
  
  315502:
  Decode flock() operation.
  
  315504:
  Decode arguments passed to getfsstat().
  
  Note that this does not yet decode the statfs structures returned by
  getfsstat().
  
  315509:
  Decode arguments passed to kldsym() and kldunloadf().
  
  This does not currently decode the kld_sym_lookup structure passed to
  kldsym().
  
  315523:
  Add a Sizet type for 'size_t' values and use it instead of Int.
  
  Various size_t arguments were previously decoded as Int values instead
  which would have truncated values above 2^31 on 64-bit systems.
  
  315524:
  Decode arguments to madvise().
  
  315525:
  Improve decoding of last arguments to ioctl() and sendto().
  
  Decode the last argument to ioctl() as a pointer rather than an int.
  Eventually this could use 'int' for the _IOWINT() case and pointers for
  all others.
  
  The last argument to sendto() is a socklen_t value, not a pointer.

Modified:
  stable/11/usr.bin/truss/syscall.h
  stable/11/usr.bin/truss/syscalls.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/usr.bin/truss/syscall.h
==============================================================================
--- stable/11/usr.bin/truss/syscall.h	Fri May 26 16:36:30 2017	(r318960)
+++ stable/11/usr.bin/truss/syscall.h	Fri May 26 17:11:27 2017	(r318961)
@@ -45,6 +45,8 @@ enum Argtype { None = 1, Hex, Octal, Int
 	Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype, Procctl,
 	LinuxSockArgs, Umtxop, Atfd, Atflags, Timespec2, Accessmode, Long,
 	Sysarch, ExecArgs, ExecEnv, PipeFds, QuadHex, Utrace, IntArray, Pipe2,
+	CapFcntlRights, Fadvice, FileFlags, Flockop, Getfsstatmode, Kldsymcmd,
+	Kldunloadflags, Sizet, Madvice,
 
 	CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
 	CloudABIFDStat, CloudABIFileStat, CloudABIFileType,

Modified: stable/11/usr.bin/truss/syscalls.c
==============================================================================
--- stable/11/usr.bin/truss/syscalls.c	Fri May 26 16:36:30 2017	(r318960)
+++ stable/11/usr.bin/truss/syscalls.c	Fri May 26 17:11:27 2017	(r318961)
@@ -71,20 +71,6 @@ __FBSDID("$FreeBSD$");
 #include "extern.h"
 #include "syscall.h"
 
-/* 64-bit alignment on 32-bit platforms. */
-#if !defined(__LP64__) && defined(__powerpc__)
-#define	QUAD_ALIGN	1
-#else
-#define	QUAD_ALIGN	0
-#endif
-
-/* Number of slots needed for a 64-bit argument. */
-#ifdef __LP64__
-#define	QUAD_SLOTS	1
-#else
-#define	QUAD_SLOTS	2
-#endif
-
 /*
  * This should probably be in its own file, sorted alphabetically.
  */
@@ -106,10 +92,17 @@ static struct syscall decoded_syscalls[]
 		    { 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 = "chdir", .ret_type = 1, .nargs = 1,
 	  .args = { { Name, 0 } } },
 	{ .name = "chflags", .ret_type = 1, .nargs = 2,
-	  .args = { { Name | IN, 0 }, { Hex, 1 } } },
+	  .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,
@@ -135,6 +128,8 @@ static struct syscall decoded_syscalls[]
 	{ .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,
@@ -146,6 +141,8 @@ static struct syscall decoded_syscalls[]
 		    { Atflags, 4 } } },
 	{ .name = "fcntl", .ret_type = 1, .nargs = 3,
 	  .args = { { Int, 0 }, { Fcntl, 1 }, { Fcntlflag, 2 } } },
+	{ .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,
@@ -154,13 +151,15 @@ static struct syscall decoded_syscalls[]
 	{ .name = "fstatfs", .ret_type = 1, .nargs = 2,
 	  .args = { { Int, 0 }, { StatFs | OUT, 1 } } },
 	{ .name = "ftruncate", .ret_type = 1, .nargs = 2,
-	  .args = { { Int | IN, 0 }, { QuadHex | IN, 1 + QUAD_ALIGN } } },
+	  .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 = "getfsstat", .ret_type = 1, .nargs = 3,
+	  .args = { { Ptr, 0 }, { Long, 1 }, { Getfsstatmode, 2 } } },
 	{ .name = "getitimer", .ret_type = 1, .nargs = 2,
 	  .args = { { Int, 0 }, { Itimerval | OUT, 2 } } },
 	{ .name = "getpeername", .ret_type = 1, .nargs = 3,
@@ -178,7 +177,7 @@ static struct syscall decoded_syscalls[]
 	{ .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 }, { Hex, 2 } } },
+	  .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 } } },
@@ -194,12 +193,16 @@ static struct syscall decoded_syscalls[]
 	  .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 }, { Hex, 1 } } },
+	  .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,
@@ -210,12 +213,13 @@ static struct syscall decoded_syscalls[]
 	  .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 },
 		    { Atflags, 4 } } },
 	{ .name = "lseek", .ret_type = 2, .nargs = 3,
-	  .args = { { Int, 0 }, { QuadHex, 1 + QUAD_ALIGN },
-		    { Whence, 1 + QUAD_SLOTS + QUAD_ALIGN } } },
+	  .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 = "mkdir", .ret_type = 1, .nargs = 2,
 	  .args = { { Name, 0 }, { Octal, 1 } } },
 	{ .name = "mkdirat", .ret_type = 1, .nargs = 3,
@@ -229,16 +233,16 @@ static struct syscall decoded_syscalls[]
 	{ .name = "mknodat", .ret_type = 1, .nargs = 4,
 	  .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Int, 3 } } },
 	{ .name = "mmap", .ret_type = 1, .nargs = 6,
-	  .args = { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 }, { Mmapflags, 3 },
-		    { Int, 4 }, { QuadHex, 5 + QUAD_ALIGN } } },
+	  .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 }, { Int, 2 }, { Ptr, 3 } } },
 	{ .name = "mprotect", .ret_type = 1, .nargs = 3,
-	  .args = { { Ptr, 0 }, { Int, 1 }, { Mprot, 2 } } },
+	  .args = { { Ptr, 0 }, { Sizet, 1 }, { Mprot, 2 } } },
 	{ .name = "munmap", .ret_type = 1, .nargs = 2,
-	  .args = { { Ptr, 0 }, { Int, 1 } } },
+	  .args = { { Ptr, 0 }, { Sizet, 1 } } },
 	{ .name = "nanosleep", .ret_type = 1, .nargs = 1,
 	  .args = { { Timespec, 0 } } },
 	{ .name = "open", .ret_type = 1, .nargs = 3,
@@ -254,21 +258,22 @@ static struct syscall decoded_syscalls[]
 	  .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 = "procctl", .ret_type = 1, .nargs = 4,
-	  .args = { { Idtype, 0 }, { Quad, 1 + QUAD_ALIGN },
-		    { Procctl, 1 + QUAD_ALIGN + QUAD_SLOTS },
-		    { Ptr, 2 + QUAD_ALIGN + QUAD_SLOTS } } },
+	  .args = { { Idtype, 0 }, { Quad, 1 }, { Procctl, 2 }, { Ptr, 3 } } },
 	{ .name = "read", .ret_type = 1, .nargs = 3,
-	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 } } },
+	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 } } },
 	{ .name = "readlink", .ret_type = 1, .nargs = 3,
-	  .args = { { Name, 0 }, { Readlinkres | OUT, 1 }, { Int, 2 } } },
+	  .args = { { Name, 0 }, { Readlinkres | OUT, 1 }, { Sizet, 2 } } },
 	{ .name = "readlinkat", .ret_type = 1, .nargs = 4,
 	  .args = { { Atfd, 0 }, { Name, 1 }, { Readlinkres | OUT, 2 },
-		    { Int, 3 } } },
+		    { Sizet, 3 } } },
 	{ .name = "recvfrom", .ret_type = 1, .nargs = 6,
-	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 }, { Hex, 3 },
+	  .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, { Hex, 3 },
 		    { Sockaddr | OUT, 4 }, { Ptr | OUT, 5 } } },
 	{ .name = "rename", .ret_type = 1, .nargs = 2,
 	  .args = { { Name, 0 }, { Name, 1 } } },
@@ -282,8 +287,8 @@ static struct syscall decoded_syscalls[]
 	  .args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 },
 		    { Timeval, 4 } } },
 	{ .name = "sendto", .ret_type = 1, .nargs = 6,
-	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, { Hex, 3 },
-		    { Sockaddr | IN, 4 }, { Ptr | IN, 5 } } },
+	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, { Hex, 3 },
+		    { Sockaddr | IN, 4 }, { Int | IN, 5 } } },
 	{ .name = "setitimer", .ret_type = 1, .nargs = 3,
 	  .args = { { Int, 0 }, { Itimerval, 1 }, { Itimerval | OUT, 2 } } },
 	{ .name = "setrlimit", .ret_type = 1, .nargs = 2,
@@ -326,7 +331,7 @@ static struct syscall decoded_syscalls[]
 	{ .name = "thr_self", .ret_type = 1, .nargs = 1,
 	  .args = { { Ptr, 0 } } },
 	{ .name = "truncate", .ret_type = 1, .nargs = 2,
-	  .args = { { Name | IN, 0 }, { QuadHex | IN, 1 + QUAD_ALIGN } } },
+	  .args = { { Name | IN, 0 }, { QuadHex | IN, 1 } } },
 #if 0
 	/* Does not exist */
 	{ .name = "umount", .ret_type = 1, .nargs = 2,
@@ -349,13 +354,10 @@ static struct syscall decoded_syscalls[]
 	  .args = { { Int, 0 }, { ExitStatus | OUT, 1 }, { Waitoptions, 2 },
 		    { Rusage | OUT, 3 } } },
 	{ .name = "wait6", .ret_type = 1, .nargs = 6,
-	  .args = { { Idtype, 0 }, { Quad, 1 + QUAD_ALIGN },
-		    { ExitStatus | OUT, 1 + QUAD_ALIGN + QUAD_SLOTS },
-		    { Waitoptions, 2 + QUAD_ALIGN + QUAD_SLOTS },
-		    { Rusage | OUT, 3 + QUAD_ALIGN + QUAD_SLOTS },
-		    { Ptr, 4 + QUAD_ALIGN + QUAD_SLOTS } } },
+	  .args = { { Idtype, 0 }, { Quad, 1 }, { ExitStatus | OUT, 2 },
+		    { Waitoptions, 3 }, { Rusage | OUT, 4 }, { Ptr, 5 } } },
 	{ .name = "write", .ret_type = 1, .nargs = 3,
-	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 } } },
+	  .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 } } },
 
 	/* Linux ABI */
 	{ .name = "linux_access", .ret_type = 1, .nargs = 2,
@@ -374,11 +376,11 @@ static struct syscall decoded_syscalls[]
 	{ .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 }, { Int, 2 } } },
+	  .args = { { Name, 0 }, { Name | OUT, 1 }, { Sizet, 2 } } },
 	{ .name = "linux_socketcall", .ret_type = 1, .nargs = 2,
 	  .args = { { Int, 0 }, { LinuxSockArgs, 1 } } },
-	{ .name = "linux_stat64", .ret_type = 1, .nargs = 3,
-	  .args = { { Name | IN, 0 }, { Ptr | OUT, 1 }, { Ptr | IN, 1 } } },
+	{ .name = "linux_stat64", .ret_type = 1, .nargs = 2,
+	  .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } },
 
 	/* CloudABI system calls. */
 	{ .name = "cloudabi_sys_clock_res_get", .ret_type = 1, .nargs = 1,
@@ -811,14 +813,77 @@ print_mask_arg(bool (*decoder)(FILE *, i
 		fprintf(fp, "|0x%x", rem);
 }
 
+static void
+print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), FILE *fp,
+    uint32_t value)
+{
+	uint32_t rem;
+
+	if (!decoder(fp, value, &rem))
+		fprintf(fp, "0x%x", rem);
+	else if (rem != 0)
+		fprintf(fp, "|0x%x", rem);
+}
+
+#ifndef __LP64__
+/*
+ * Add argument padding to subsequent system calls afater a Quad
+ * syscall arguments as needed.  This used to be done by hand in the
+ * decoded_syscalls table which was ugly and error prone.  It is
+ * simpler to do the fixup of offsets at initalization time than when
+ * decoding arguments.
+ */
+static void
+quad_fixup(struct syscall *sc)
+{
+	int offset, prev;
+	u_int i;
+
+	offset = 0;
+	prev = -1;
+	for (i = 0; i < sc->nargs; i++) {
+		/* This arg type is a dummy that doesn't use offset. */
+		if ((sc->args[i].type & ARG_MASK) == PipeFds)
+			continue;
+
+		assert(prev < sc->args[i].offset);
+		prev = sc->args[i].offset;
+		sc->args[i].offset += offset;
+		switch (sc->args[i].type & ARG_MASK) {
+		case Quad:
+		case QuadHex:
+#ifdef __powerpc__
+			/*
+			 * 64-bit arguments on 32-bit powerpc must be
+			 * 64-bit aligned.  If the current offset is
+			 * not aligned, the calling convention inserts
+			 * a 32-bit pad argument that should be skipped.
+			 */
+			if (sc->args[i].offset % 2 == 1) {
+				sc->args[i].offset++;
+				offset++;
+			}
+#endif
+			offset++;
+		default:
+			break;
+		}
+	}
+}
+#endif
+
 void
 init_syscalls(void)
 {
 	struct syscall *sc;
 
 	STAILQ_INIT(&syscalls);
-	for (sc = decoded_syscalls; sc->name != NULL; sc++)
+	for (sc = decoded_syscalls; sc->name != NULL; sc++) {
+#ifndef __LP64__
+		quad_fixup(sc);
+#endif
 		STAILQ_INSERT_HEAD(&syscalls, sc, entries);
+	}
 }
 
 static struct syscall *
@@ -1104,6 +1169,9 @@ print_arg(struct syscall_args *sc, unsig
 	case Long:
 		fprintf(fp, "%ld", args[sc->offset]);
 		break;
+	case Sizet:
+		fprintf(fp, "%zu", (size_t)args[sc->offset]);
+		break;
 	case Name: {
 		/* NULL-terminated string. */
 		char *tmp2;
@@ -1801,6 +1869,49 @@ print_arg(struct syscall_args *sc, unsig
 	case Pipe2:
 		print_mask_arg(sysdecode_pipe2_flags, fp, args[sc->offset]);
 		break;
+	case CapFcntlRights: {
+		uint32_t rights;
+
+		if (sc->type & OUT) {
+			if (get_struct(pid, (void *)args[sc->offset], &rights,
+			    sizeof(rights)) == -1) {
+				fprintf(fp, "0x%lx", args[sc->offset]);
+				break;
+			}
+		} else
+			rights = args[sc->offset];
+		print_mask_arg32(sysdecode_cap_fcntlrights, fp, rights);
+		break;
+	}
+	case Fadvice:
+		print_integer_arg(sysdecode_fadvice, fp, args[sc->offset]);
+		break;
+	case FileFlags: {
+		fflags_t rem;
+
+		if (!sysdecode_fileflags(fp, args[sc->offset], &rem))
+			fprintf(fp, "0x%x", rem);
+		else if (rem != 0)
+			fprintf(fp, "|0x%x", rem);
+		break;
+	}
+	case Flockop:
+		print_mask_arg(sysdecode_flock_operation, fp, args[sc->offset]);
+		break;
+	case Getfsstatmode:
+		print_integer_arg(sysdecode_getfsstat_mode, fp,
+		    args[sc->offset]);
+		break;
+	case Kldsymcmd:
+		print_integer_arg(sysdecode_kldsym_cmd, fp, args[sc->offset]);
+		break;
+	case Kldunloadflags:
+		print_integer_arg(sysdecode_kldunload_flags, fp,
+		    args[sc->offset]);
+		break;
+	case Madvice:
+		print_integer_arg(sysdecode_madvice, fp, args[sc->offset]);
+		break;
 
 	case CloudABIAdvice:
 		fputs(xlookup(cloudabi_advice, args[sc->offset]), fp);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201705261711.v4QHBRNo018145>