svn commit: r273053 - in head/usr.bin: kdump truss

John Baldwin jhb at FreeBSD.org
Mon Oct 13 16:37:08 UTC 2014


Author: jhb
Date: Mon Oct 13 16:37:06 2014
New Revision: 273053
URL: https://svnweb.freebsd.org/changeset/base/273053

Log:
  Decode the arguments passed to _umtx_op().  In particular, decode the
  opcode.
  
  MFC after:	1 week
  Sponsored by:	Norse

Modified:
  head/usr.bin/kdump/kdump.c
  head/usr.bin/kdump/mksubr
  head/usr.bin/truss/syscall.h
  head/usr.bin/truss/syscalls.c

Modified: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c	Mon Oct 13 16:33:08 2014	(r273052)
+++ head/usr.bin/kdump/kdump.c	Mon Oct 13 16:37:06 2014	(r273053)
@@ -57,6 +57,7 @@ extern int errno;
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <sys/sysent.h>
+#include <sys/umtx.h>
 #include <sys/un.h>
 #include <sys/queue.h>
 #include <sys/wait.h>
@@ -1268,6 +1269,26 @@ ktrsyscall(struct ktr_syscall *ktr, u_in
 				ip++;
 				narg--;
 				break;
+			case SYS__umtx_op:
+				print_number(ip, narg, c);
+				putchar(',');
+				umtxopname(*ip);
+				switch (*ip) {
+				case UMTX_OP_CV_WAIT:
+					ip++;
+					narg--;
+					putchar(',');
+					umtxcvwaitflags(*ip);
+					break;
+				case UMTX_OP_RW_RDLOCK:
+					ip++;
+					narg--;
+					putchar(',');
+					umtxrwlockflags(*ip);
+					break;
+				}
+				ip++;
+				narg--;
 			}
 		}
 		while (narg > 0) {

Modified: head/usr.bin/kdump/mksubr
==============================================================================
--- head/usr.bin/kdump/mksubr	Mon Oct 13 16:33:08 2014	(r273052)
+++ head/usr.bin/kdump/mksubr	Mon Oct 13 16:37:06 2014	(r273053)
@@ -185,6 +185,7 @@ cat <<_EOF_
 #include <sys/ipc.h>
 #include <sys/rtprio.h>
 #include <sys/shm.h>
+#include <sys/umtx.h>
 #include <nfsserver/nfs.h>
 #include <ufs/ufs/quota.h>
 #include <sys/capsicum.h>
@@ -489,6 +490,7 @@ auto_if_type     "sockipprotoname"     "
 auto_switch_type "sockoptname"         "SO_[A-Z]+[[:space:]]+0x[0-9]+"                "sys/socket.h"
 auto_switch_type "socktypename"        "SOCK_[A-Z]+[[:space:]]+[1-9]+[0-9]*"          "sys/socket.h"
 auto_or_type     "thrcreateflagsname"  "THR_[A-Z]+[[:space:]]+0x[0-9]+"               "sys/thr.h"
+auto_switch_type "umtxopname"          "UMTX_OP_[[:alnum:]_]+[[:space:]]+[0-9]+"            "sys/umtx.h"
 auto_switch_type "vmresultname"        "KERN_[A-Z]+[[:space:]]+[0-9]+"                "vm/vm_param.h"
 auto_or_type     "wait6optname"        "W[A-Z]+[[:space:]]+[0-9]+"                    "sys/wait.h"
 auto_switch_type "whencename"          "SEEK_[A-Z]+[[:space:]]+[0-9]+"                "sys/unistd.h"
@@ -677,6 +679,62 @@ cat <<_EOF_
 	}
 }
 
+/*
+ * AUTO - Special
+ *
+ * Just print 0 as 0.
+ */
+void
+umtxcvwaitflags(intmax_t arg)
+{
+	int or = 0;
+	if (arg == 0) {
+		printf("0");
+		return;
+	}
+	printf("%#jx<", (uintmax_t)arg);
+_EOF_
+	egrep "^#[[:space:]]*define[[:space:]]+CVWAIT_[A-Z_]+[[:space:]]+0x[0-9]+[[:space:]]*" \
+		$include_dir/sys/umtx.h | \
+	awk '{ for (i = 1; i <= NF; i++) \
+		if ($i ~ /define/) \
+			break; \
+		++i; \
+		printf "\tif (!((arg > 0) ^ ((%s) > 0)))\n\t\tif_print_or(arg, %s, or);\n", $i, $i }'
+cat <<_EOF_
+	printf(">");
+	if (or == 0)
+		printf("<invalid>%jd", arg);
+}
+
+
+/*
+ * AUTO - Special
+ *
+ * Just print 0 as 0.
+ */
+void
+umtxrwlockflags(intmax_t arg)
+{
+	int or = 0;
+	if (arg == 0) {
+		printf("0");
+		return;
+	}
+	printf("%#jx<", (uintmax_t)arg);
+_EOF_
+	egrep "^#[[:space:]]*define[[:space:]]+URWLOCK_PREFER_READER[[:space:]]+0x[0-9]+[[:space:]]*" \
+		$include_dir/sys/umtx.h | \
+	awk '{ for (i = 1; i <= NF; i++) \
+		if ($i ~ /define/) \
+			break; \
+		++i; \
+		printf "\tif (!((arg > 0) ^ ((%s) > 0)))\n\t\tif_print_or(arg, %s, or);\n", $i, $i }'
+cat <<_EOF_
+	printf(">");
+	if (or == 0)
+		printf("<invalid>%jd", arg);
+}
 _EOF_
 egrep '#define[[:space:]]+CAP_[A-Z_]+[[:space:]]+CAPRIGHT\([0-9],[[:space:]]+0x[0-9]{16}ULL\)' \
 	$include_dir/sys/capsicum.h | \

Modified: head/usr.bin/truss/syscall.h
==============================================================================
--- head/usr.bin/truss/syscall.h	Mon Oct 13 16:33:08 2014	(r273052)
+++ head/usr.bin/truss/syscall.h	Mon Oct 13 16:37:06 2014	(r273053)
@@ -5,6 +5,7 @@
  * Hex -- values that should be printed in hex (addresses)
  * Octal -- Same as above, but octal
  * Int -- normal integer values (file descriptors, for example)
+ * LongHex -- long value that should be printed in hex
  * Name -- pointer to a NULL-terminated string.
  * BinString -- pointer to an array of chars, printed via strvisx().
  * Ptr -- pointer to some unspecified structure.  Just print as hex for now.
@@ -34,13 +35,13 @@
  * $FreeBSD$
  */
 
-enum Argtype { None = 1, Hex, Octal, Int, Name, Ptr, Stat, Ioctl, Quad,
+enum Argtype { None = 1, Hex, Octal, Int, LongHex, Name, Ptr, Stat, Ioctl, Quad,
 	Signal, Sockaddr, StringArray, Timespec, Timeval, Itimerval, Pollfd,
 	Fd_set, Sigaction, Fcntl, Mprot, Mmapflags, Whence, Readlinkres,
 	Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
 	Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
 	Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype, Procctl,
-	LinuxSockArgs };
+	LinuxSockArgs, Umtxop };
 
 #define	ARG_MASK	0xff
 #define	OUT	0x100

Modified: head/usr.bin/truss/syscalls.c
==============================================================================
--- head/usr.bin/truss/syscalls.c	Mon Oct 13 16:33:08 2014	(r273052)
+++ head/usr.bin/truss/syscalls.c	Mon Oct 13 16:37:06 2014	(r273053)
@@ -279,6 +279,9 @@ static struct syscall syscalls[] = {
 		    { Waitoptions, 3 }, { Rusage | OUT, 4 }, { Ptr, 5 } } },
 	{ .name = "procctl", .ret_type = 1, .nargs = 4,
 	  .args = { { Idtype, 0 }, { Int, 1 }, { Procctl, 2 }, { Ptr, 3 } } },
+	{ .name = "_umtx_op", .ret_type = 1, .nargs = 5,
+	  .args = { { Ptr, 0 }, { Umtxop, 1 }, { LongHex, 2 }, { Ptr, 3 },
+		    { Ptr, 4 } } },
 	{ .name = 0 },
 };
 
@@ -412,6 +415,18 @@ static struct xlat procctl_arg[] = {
 	X(PROC_SPROTECT) XEND
 };
 
+static struct xlat umtx_ops[] = {
+	X(UMTX_OP_RESERVED0) X(UMTX_OP_RESERVED1) X(UMTX_OP_WAIT)
+	X(UMTX_OP_WAKE) X(UMTX_OP_MUTEX_TRYLOCK) X(UMTX_OP_MUTEX_LOCK)
+	X(UMTX_OP_MUTEX_UNLOCK) X(UMTX_OP_SET_CEILING) X(UMTX_OP_CV_WAIT)
+	X(UMTX_OP_CV_SIGNAL) X(UMTX_OP_CV_BROADCAST) X(UMTX_OP_WAIT_UINT)
+	X(UMTX_OP_RW_RDLOCK) X(UMTX_OP_RW_WRLOCK) X(UMTX_OP_RW_UNLOCK)
+	X(UMTX_OP_WAIT_UINT_PRIVATE) X(UMTX_OP_WAKE_PRIVATE)
+	X(UMTX_OP_MUTEX_WAIT) X(UMTX_OP_MUTEX_WAKE) X(UMTX_OP_SEM_WAIT)
+	X(UMTX_OP_SEM_WAKE) X(UMTX_OP_NWAKE_PRIVATE) X(UMTX_OP_MUTEX_WAKE2)
+	XEND
+};
+
 #undef X
 #undef XEND
 
@@ -608,6 +623,9 @@ print_arg(struct syscall_args *sc, unsig
 	case Int:
 		asprintf(&tmp, "%d", (int)args[sc->offset]);
 		break;
+	case LongHex:
+		asprintf(&tmp, "0x%lx", args[sc->offset]);
+		break;		
 	case Name: {
 		/* NULL-terminated string. */
 		char *tmp2;
@@ -1275,6 +1293,9 @@ print_arg(struct syscall_args *sc, unsig
 	case Procctl:
 		tmp = strdup(xlookup(procctl_arg, args[sc->offset]));
 		break;
+	case Umtxop:
+		tmp = strdup(xlookup(umtx_ops, args[sc->offset]));
+		break;
 	default:
 		errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK);
 	}


More information about the svn-src-all mailing list