Module Name: src Committed By: thorpej Date: Thu Apr 30 12:17:02 UTC 2020
Modified Files: src/usr.bin/kdump: kdump.c Log Message: Decode futex op codes. To generate a diff of this commit: cvs rdiff -u -r1.137 -r1.138 src/usr.bin/kdump/kdump.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/kdump/kdump.c diff -u src/usr.bin/kdump/kdump.c:1.137 src/usr.bin/kdump/kdump.c:1.138 --- src/usr.bin/kdump/kdump.c:1.137 Mon Apr 20 00:35:41 2020 +++ src/usr.bin/kdump/kdump.c Thu Apr 30 12:17:01 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: kdump.c,v 1.137 2020/04/20 00:35:41 christos Exp $ */ +/* $NetBSD: kdump.c,v 1.138 2020/04/30 12:17:01 thorpej Exp $ */ /*- * Copyright (c) 1988, 1993 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1988, 19 #if 0 static char sccsid[] = "@(#)kdump.c 8.4 (Berkeley) 4/28/95"; #else -__RCSID("$NetBSD: kdump.c,v 1.137 2020/04/20 00:35:41 christos Exp $"); +__RCSID("$NetBSD: kdump.c,v 1.138 2020/04/30 12:17:01 thorpej Exp $"); #endif #endif /* not lint */ @@ -55,6 +55,7 @@ __RCSID("$NetBSD: kdump.c,v 1.137 2020/0 #include <sys/ioctl.h> #include <sys/ptrace.h> #include <sys/socket.h> +#include <sys/futex.h> #include <ctype.h> #include <err.h> @@ -629,6 +630,59 @@ putprot(int pr) } } +static const char * +futex_op_name(u_long op) +{ +#define FUTEXCASE(a) case a: return # a + switch (op & FUTEX_CMD_MASK) { + FUTEXCASE(FUTEX_WAIT); + FUTEXCASE(FUTEX_WAKE); + FUTEXCASE(FUTEX_FD); + FUTEXCASE(FUTEX_REQUEUE); + FUTEXCASE(FUTEX_CMP_REQUEUE); + FUTEXCASE(FUTEX_WAKE_OP); + FUTEXCASE(FUTEX_LOCK_PI); + FUTEXCASE(FUTEX_UNLOCK_PI); + FUTEXCASE(FUTEX_TRYLOCK_PI); + FUTEXCASE(FUTEX_WAIT_BITSET); + FUTEXCASE(FUTEX_WAKE_BITSET); + FUTEXCASE(FUTEX_WAIT_REQUEUE_PI); + FUTEXCASE(FUTEX_CMP_REQUEUE_PI); + default: + return NULL; + } +#undef FUTEXCASE +} + +static void +futexput(u_long op) +{ + const char *opname = futex_op_name(op); + const char *s = ""; + + if (opname == NULL) { + printf("%#lx", op & FUTEX_CMD_MASK); + } else { + fputs(opname, stdout); + } + op &= ~FUTEX_CMD_MASK; + + if (op & FUTEX_PRIVATE_FLAG) { + fputs("_PRIVATE", stdout); + op &= ~FUTEX_PRIVATE_FLAG; + } + + if (op & FUTEX_CLOCK_REALTIME) { + printf("%sFUTEX_CLOCK_REALTIME", s); + op &= ~FUTEX_CLOCK_REALTIME; + s = "|"; + } + + if (op) { + printf("%s%#lx", s, op); + } +} + static void ktrsyscall(struct ktr_syscall *ktr) { @@ -699,6 +753,25 @@ ktrsyscall(struct ktr_syscall *ktr) ap++; argcount--; c = ','; + + /* + * Linux name is "futex". + * Native name is "__futex". + * Both have the same op argument. + */ + } else if ((strcmp(sys_name, "futex") == 0 || + strcmp(sys_name, "__futex") == 0) && + argcount > 2) { + (void)putchar('('); + output_long((long)*ap, 1); + (void)putchar(','); + ap++; + argcount--; + futexput(*ap); + ap++; + argcount--; + c = ','; + } else if ((strstr(sys_name, "sigaction") != NULL || strstr(sys_name, "sigvec") != NULL) && argcount >= 1) { (void)printf("(SIG%s", signame(ap[0], 1));