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);
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to