summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2017-01-12 22:06:57 +0000
committerjhb <jhb@FreeBSD.org>2017-01-12 22:06:57 +0000
commit65f84aaebfb3df38a7948ac57826dbd6b808e89b (patch)
treed9e0b816032f83539272997754cc4f9efe7e250c /usr.bin
parent4c2fab27f3a472481497ec0b20d6e2d2f4279116 (diff)
downloadFreeBSD-src-65f84aaebfb3df38a7948ac57826dbd6b808e89b.zip
FreeBSD-src-65f84aaebfb3df38a7948ac57826dbd6b808e89b.tar.gz
MFC 307538,307948,308602,308603,311151: Move kdump's mksubr into libsysdecode.
307538: Move mksubr from kdump into libsysdecode. Restructure this script so that it generates a header of tables instead of a source file. The tables are included in a flags.c source file which provides functions to decode various system call arguments. For functions that decode an enumeration, the function returns a pointer to a string for known values and NULL for unknown values. For functions that do more complex decoding (typically of a bitmask), the function accepts a pointer to a FILE object (open_memstream() can be used as a string builder) to which decoded values are written. If the function operates on a bitmask, the function returns true if any bits were decoded or false if the entire value was valid. Additionally, the third argument accepts a pointer to a value to which any undecoded bits are stored. This pointer can be NULL if the caller doesn't care about remaining bits. Convert kdump over to using decoder functions from libsysdecode instead of mksubr. truss also uses decoders from libsysdecode instead of private lookup tables, though lookup tables for objects not decoded by kdump remain in truss for now. Eventually most of these tables should move into libsysdecode as the automated table generation approach from mksubr is less stale than the static tables in truss. Some changes have been made to truss and kdump output: - The flags passed to open() are now properly decoded in that one of O_RDONLY, O_RDWR, O_WRONLY, or O_EXEC is always included in a decoded mask. - Optional arguments to open(), openat(), and fcntl() are only printed in kdump if they exist (e.g. the mode is only printed for open() if O_CREAT is set in the flags). - Print argument to F_GETLK/SETLK/SETLKW in kdump as a pointer, not int. - Include all procctl() commands. - Correctly decode pipe2() flags in truss by not assuming full open()-like flags with O_RDONLY, etc. - Decode file flags passed to *chflags() as file flags (UF_* and SF_*) rather than as a file mode. - Fix decoding of quotactl() commands by splitting out the two command components instead of assuming the raw command value matches the primary command component. In addition, truss and kdump now build without triggering any warnings. All of the sysdecode manpages now include the required headers in the synopsis. 307948: Use binary and (&) instead of logical to extract the mask of a capability. 308602: Generate and use a proper .depend file for tables.h. 308603: Move libsysdecode-specific hack out of buildworld. This should fix the lib32 build since it was not removing the generated ioctl.c. This file is generated by a find(1) call, so cannot use normal dependency tracking methods. 311151: Update libsysdecode for getfsstat() 'flags' argument changing to 'mode'. As a followup to r310638, update libsysdecode (and kdump) to decode the 'mode' argument to getfsstat(). sysdecode_getfsstat_flags() has been renamed to sysdecode_getfsstat_mode() and now treats the argument as an enumerated value rather than a mask of flags.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/kdump/Makefile15
-rw-r--r--usr.bin/kdump/kdump.c414
-rw-r--r--usr.bin/kdump/mksubr759
-rw-r--r--usr.bin/truss/Makefile5
-rw-r--r--usr.bin/truss/aarch64-cloudabi64.c1
-rw-r--r--usr.bin/truss/aarch64-freebsd.c1
-rw-r--r--usr.bin/truss/amd64-cloudabi64.c1
-rw-r--r--usr.bin/truss/amd64-freebsd.c1
-rw-r--r--usr.bin/truss/amd64-freebsd32.c1
-rw-r--r--usr.bin/truss/amd64-linux.c1
-rw-r--r--usr.bin/truss/amd64-linux32.c1
-rw-r--r--usr.bin/truss/arm-freebsd.c1
-rw-r--r--usr.bin/truss/extern.h1
-rw-r--r--usr.bin/truss/i386-freebsd.c1
-rw-r--r--usr.bin/truss/i386-linux.c1
-rw-r--r--usr.bin/truss/main.c13
-rw-r--r--usr.bin/truss/mips-freebsd.c1
-rw-r--r--usr.bin/truss/powerpc-freebsd.c1
-rw-r--r--usr.bin/truss/powerpc64-freebsd.c1
-rw-r--r--usr.bin/truss/powerpc64-freebsd32.c1
-rw-r--r--usr.bin/truss/setup.c10
-rw-r--r--usr.bin/truss/sparc64-freebsd.c1
-rw-r--r--usr.bin/truss/syscall.h2
-rw-r--r--usr.bin/truss/syscalls.c266
24 files changed, 380 insertions, 1120 deletions
diff --git a/usr.bin/kdump/Makefile b/usr.bin/kdump/Makefile
index f80f668..e77e241 100644
--- a/usr.bin/kdump/Makefile
+++ b/usr.bin/kdump/Makefile
@@ -6,8 +6,8 @@
.PATH: ${.CURDIR}/../ktrace
PROG= kdump
-SRCS= kdump_subr.c kdump_subr.h kdump.c subr.c
-CFLAGS+= -I${.CURDIR}/../ktrace -I${.CURDIR} -I${.CURDIR}/../.. -I.
+SRCS= kdump.c subr.c
+CFLAGS+= -I${.CURDIR}/../ktrace #-I${.CURDIR}/../...
LIBADD= sysdecode
.if ${MK_CASPER} != "no"
@@ -17,15 +17,6 @@ LIBADD+= cap_pwd
CFLAGS+=-DHAVE_LIBCASPER
.endif
-NO_WERROR?= YES
-
-CLEANFILES= kdump_subr.c kdump_subr.h
-
-kdump_subr.h: mksubr
- sh ${.CURDIR}/mksubr ${DESTDIR}${INCLUDEDIR} | \
- sed -n 's/^\([a-z].*)\)$$/void \1;/p' >${.TARGET}
-
-kdump_subr.c: mksubr kdump_subr.h
- sh ${.CURDIR}/mksubr ${DESTDIR}${INCLUDEDIR} >${.TARGET}
+#NO_WERROR?= YES
.include <bsd.prog.mk>
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 35daf28..8b32653 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -79,7 +79,6 @@ __FBSDID("$FreeBSD$");
#include <unistd.h>
#include <vis.h>
#include "ktrace.h"
-#include "kdump_subr.h"
#ifdef HAVE_LIBCASPER
#include <libcasper.h>
@@ -118,8 +117,6 @@ void usage(void);
#define TIMESTAMP_ELAPSED 0x2
#define TIMESTAMP_RELATIVE 0x4
-extern const char *signames[];
-
static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
resolv = 0, abiflag = 0, syscallno = 0;
static const char *tracefile = DEF_TRACEFILE;
@@ -241,6 +238,133 @@ cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
}
#endif /* HAVE_LIBCASPER */
+static void
+print_integer_arg(const char *(*decoder)(int), int value)
+{
+ const char *str;
+
+ str = decoder(value);
+ if (str != NULL)
+ printf("%s", str);
+ else {
+ if (decimal)
+ printf("<invalid=%d>", value);
+ else
+ printf("<invalid=%#x>", value);
+ }
+}
+
+/* Like print_integer_arg but unknown values are treated as valid. */
+static void
+print_integer_arg_valid(const char *(*decoder)(int), int value)
+{
+ const char *str;
+
+ str = decoder(value);
+ if (str != NULL)
+ printf("%s", str);
+ else {
+ if (decimal)
+ printf("%d", value);
+ else
+ printf("%#x", value);
+ }
+}
+
+static void
+print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
+{
+ bool invalid;
+ int rem;
+
+ printf("%#x<", value);
+ invalid = !decoder(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%u", rem);
+}
+
+static void
+print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
+{
+ bool invalid;
+ int rem;
+
+ if (value == 0) {
+ printf("0");
+ return;
+ }
+ printf("%#x<", value);
+ invalid = !decoder(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%u", rem);
+}
+
+static void
+decode_fileflags(fflags_t value)
+{
+ bool invalid;
+ fflags_t rem;
+
+ if (value == 0) {
+ printf("0");
+ return;
+ }
+ printf("%#x<", value);
+ invalid = !sysdecode_fileflags(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%u", rem);
+}
+
+static void
+decode_filemode(int value)
+{
+ bool invalid;
+ int rem;
+
+ if (value == 0) {
+ printf("0");
+ return;
+ }
+ printf("%#o<", value);
+ invalid = !sysdecode_filemode(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%u", rem);
+}
+
+static void
+print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
+{
+ bool invalid;
+ uint32_t rem;
+
+ printf("%#x<", value);
+ invalid = !decoder(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%u", rem);
+}
+
+static void
+print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
+{
+ bool invalid;
+ u_long rem;
+
+ if (value == 0) {
+ printf("0");
+ return;
+ }
+ printf("%#lx<", value);
+ invalid = !decoder(stdout, value, &rem);
+ printf(">");
+ if (invalid)
+ printf("<invalid>%lu", rem);
+}
+
int
main(int argc, char *argv[])
{
@@ -715,6 +839,18 @@ syscallname(u_int code, u_int sv_flags)
}
}
+static void
+print_signal(int signo)
+{
+ const char *signame;
+
+ signame = sysdecode_signal(signo);
+ if (signame != NULL)
+ printf("%s", signame);
+ else
+ printf("SIG %d", signo);
+}
+
void
ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
{
@@ -756,7 +892,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_unlinkat:
case SYS_utimensat:
putchar('(');
- atfdname(*ip, decimal);
+ print_integer_arg_valid(sysdecode_atfd, *ip);
c = ',';
ip++;
narg--;
@@ -774,7 +910,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
}
case SYS_ptrace:
putchar('(');
- ptraceopname(*ip);
+ print_integer_arg(sysdecode_ptrace_request, *ip);
c = ',';
ip++;
narg--;
@@ -784,7 +920,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_faccessat:
print_number(ip, narg, c);
putchar(',');
- accessmodename(*ip);
+ print_mask_arg(sysdecode_access_mode, *ip);
ip++;
narg--;
break;
@@ -792,37 +928,32 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_openat:
print_number(ip, narg, c);
putchar(',');
- flagsandmodename(ip[0], ip[1], decimal);
+ print_mask_arg(sysdecode_open_flags, ip[0]);
+ if ((ip[0] & O_CREAT) == O_CREAT) {
+ putchar(',');
+ decode_filemode(ip[1]);
+ }
ip += 2;
narg -= 2;
break;
case SYS_wait4:
print_number(ip, narg, c);
print_number(ip, narg, c);
- /*
- * A flags value of zero is valid for
- * wait4() but not for wait6(), so
- * handle zero special here.
- */
- if (*ip == 0) {
- print_number(ip, narg, c);
- } else {
- putchar(',');
- wait6optname(*ip);
- ip++;
- narg--;
- }
+ putchar(',');
+ print_mask_arg0(sysdecode_wait4_options, *ip);
+ ip++;
+ narg--;
break;
case SYS_wait6:
putchar('(');
- idtypename(*ip, decimal);
+ print_integer_arg(sysdecode_idtype, *ip);
c = ',';
ip++;
narg--;
print_number64(first, ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- wait6optname(*ip);
+ print_mask_arg(sysdecode_wait6_options, *ip);
ip++;
narg--;
break;
@@ -832,7 +963,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_fchmodat:
print_number(ip, narg, c);
putchar(',');
- modename(*ip);
+ decode_filemode(*ip);
ip++;
narg--;
break;
@@ -840,7 +971,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_mknodat:
print_number(ip, narg, c);
putchar(',');
- modename(*ip);
+ decode_filemode(*ip);
ip++;
narg--;
break;
@@ -848,7 +979,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- getfsstatflagsname(*ip);
+ print_integer_arg(sysdecode_getfsstat_mode, *ip);
ip++;
narg--;
break;
@@ -856,14 +987,14 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- mountflagsname(*ip);
+ print_mask_arg(sysdecode_mount_flags, *ip);
ip++;
narg--;
break;
case SYS_unmount:
print_number(ip, narg, c);
putchar(',');
- mountflagsname(*ip);
+ print_mask_arg(sysdecode_mount_flags, *ip);
ip++;
narg--;
break;
@@ -872,7 +1003,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- sendrecvflagsname(*ip);
+ print_mask_arg0(sysdecode_msg_flags, *ip);
ip++;
narg--;
break;
@@ -882,7 +1013,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- sendrecvflagsname(*ip);
+ print_mask_arg0(sysdecode_msg_flags, *ip);
ip++;
narg--;
break;
@@ -891,26 +1022,26 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_lchflags:
print_number(ip, narg, c);
putchar(',');
- modename(*ip);
+ decode_fileflags(*ip);
ip++;
narg--;
break;
case SYS_kill:
print_number(ip, narg, c);
putchar(',');
- signame(*ip);
+ print_signal(*ip);
ip++;
narg--;
break;
case SYS_reboot:
putchar('(');
- rebootoptname(*ip);
+ print_mask_arg(sysdecode_reboot_howto, *ip);
ip++;
narg--;
break;
case SYS_umask:
putchar('(');
- modename(*ip);
+ decode_filemode(*ip);
ip++;
narg--;
break;
@@ -918,7 +1049,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- msyncflagsname(*ip);
+ print_mask_arg(sysdecode_msync_flags, *ip);
ip++;
narg--;
break;
@@ -927,11 +1058,11 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- mmapprotname(*ip);
+ print_mask_arg(sysdecode_mmap_prot, *ip);
putchar(',');
ip++;
narg--;
- mmapflagsname(*ip);
+ print_mask_arg(sysdecode_mmap_flags, *ip);
ip++;
narg--;
break;
@@ -940,11 +1071,11 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- mmapprotname(*ip);
+ print_mask_arg(sysdecode_mmap_prot, *ip);
putchar(',');
ip++;
narg--;
- mmapflagsname(*ip);
+ print_mask_arg(sysdecode_mmap_flags, *ip);
ip++;
narg--;
break;
@@ -952,7 +1083,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- mmapprotname(*ip);
+ print_mask_arg(sysdecode_mmap_prot, *ip);
ip++;
narg--;
break;
@@ -960,7 +1091,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- madvisebehavname(*ip);
+ print_integer_arg(sysdecode_madvice, *ip);
ip++;
narg--;
break;
@@ -968,14 +1099,25 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- prioname(*ip);
+ print_integer_arg(sysdecode_prio_which, *ip);
ip++;
narg--;
break;
case SYS_fcntl:
print_number(ip, narg, c);
putchar(',');
- fcntlcmdname(ip[0], ip[1], decimal);
+ print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
+ if (sysdecode_fcntl_arg_p(ip[0])) {
+ putchar(',');
+ if (ip[0] == F_SETFL)
+ print_mask_arg(
+ sysdecode_fcntl_fileflags,
+ ip[1]);
+ else
+ sysdecode_fcntl_arg(stdout,
+ ip[0], ip[1],
+ decimal ? 10 : 16);
+ }
ip += 2;
narg -= 2;
break;
@@ -983,17 +1125,19 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
int sockdomain;
putchar('(');
sockdomain = *ip;
- sockdomainname(sockdomain);
+ print_integer_arg(sysdecode_socketdomain,
+ sockdomain);
ip++;
narg--;
putchar(',');
- socktypenamewithflags(*ip);
+ print_mask_arg(sysdecode_socket_type, *ip);
ip++;
narg--;
if (sockdomain == PF_INET ||
sockdomain == PF_INET6) {
putchar(',');
- sockipprotoname(*ip);
+ print_integer_arg(sysdecode_ipproto,
+ *ip);
ip++;
narg--;
}
@@ -1001,19 +1145,23 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
break;
}
case SYS_setsockopt:
- case SYS_getsockopt:
+ case SYS_getsockopt: {
+ const char *str;
+
print_number(ip, narg, c);
putchar(',');
- sockoptlevelname(*ip, decimal);
- if (*ip == SOL_SOCKET) {
+ print_integer_arg_valid(sysdecode_sockopt_level,
+ *ip);
+ str = sysdecode_sockopt_name(ip[0], ip[1]);
+ if (str != NULL) {
+ printf(",%s", str);
ip++;
narg--;
- putchar(',');
- sockoptname(*ip);
}
ip++;
narg--;
break;
+ }
#ifdef SYS_freebsd6_lseek
case SYS_freebsd6_lseek:
print_number(ip, narg, c);
@@ -1021,7 +1169,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number64(first, ip, narg, c);
putchar(',');
- whencename(*ip);
+ print_integer_arg(sysdecode_whence, *ip);
ip++;
narg--;
break;
@@ -1030,14 +1178,14 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number64(first, ip, narg, c);
putchar(',');
- whencename(*ip);
+ print_integer_arg(sysdecode_whence, *ip);
ip++;
narg--;
break;
case SYS_flock:
print_number(ip, narg, c);
putchar(',');
- flockname(*ip);
+ print_mask_arg(sysdecode_flock_operation, *ip);
ip++;
narg--;
break;
@@ -1047,24 +1195,24 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_mkdirat:
print_number(ip, narg, c);
putchar(',');
- modename(*ip);
+ decode_filemode(*ip);
ip++;
narg--;
break;
case SYS_shutdown:
print_number(ip, narg, c);
putchar(',');
- shutdownhowname(*ip);
+ print_integer_arg(sysdecode_shutdown_how, *ip);
ip++;
narg--;
break;
case SYS_socketpair:
putchar('(');
- sockdomainname(*ip);
+ print_integer_arg(sysdecode_socketdomain, *ip);
ip++;
narg--;
putchar(',');
- socktypenamewithflags(*ip);
+ print_mask_arg(sysdecode_socket_type, *ip);
ip++;
narg--;
c = ',';
@@ -1072,7 +1220,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_getrlimit:
case SYS_setrlimit:
putchar('(');
- rlimitname(*ip);
+ print_integer_arg(sysdecode_rlimit, *ip);
ip++;
narg--;
c = ',';
@@ -1080,21 +1228,28 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_quotactl:
print_number(ip, narg, c);
putchar(',');
- quotactlname(*ip);
+ if (!sysdecode_quotactl_cmd(stdout, *ip)) {
+ if (decimal)
+ printf("<invalid=%d>", (int)*ip);
+ else
+ printf("<invalid=%#x>",
+ (int)*ip);
+ }
ip++;
narg--;
c = ',';
break;
case SYS_nfssvc:
putchar('(');
- nfssvcname(*ip);
+ print_integer_arg(sysdecode_nfssvc_flags, *ip);
ip++;
narg--;
c = ',';
break;
case SYS_rtprio:
putchar('(');
- rtprioname(*ip);
+ print_integer_arg(sysdecode_rtprio_function,
+ *ip);
ip++;
narg--;
c = ',';
@@ -1103,7 +1258,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- semctlname(*ip);
+ print_integer_arg(sysdecode_semctl_cmd, *ip);
ip++;
narg--;
break;
@@ -1111,14 +1266,14 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- semgetname(*ip);
+ print_mask_arg(sysdecode_semget_flags, *ip);
ip++;
narg--;
break;
case SYS_msgctl:
print_number(ip, narg, c);
putchar(',');
- shmctlname(*ip);
+ print_integer_arg(sysdecode_msgctl_cmd, *ip);
ip++;
narg--;
break;
@@ -1126,64 +1281,69 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- shmatname(*ip);
+ print_mask_arg(sysdecode_shmat_flags, *ip);
ip++;
narg--;
break;
case SYS_shmctl:
print_number(ip, narg, c);
putchar(',');
- shmctlname(*ip);
+ print_integer_arg(sysdecode_shmctl_cmd, *ip);
ip++;
narg--;
break;
case SYS_shm_open:
print_number(ip, narg, c);
putchar(',');
- flagsname(ip[0]);
- printf(",0%o", (unsigned int)ip[1]);
- ip += 3;
- narg -= 3;
+ print_mask_arg(sysdecode_open_flags, ip[0]);
+ putchar(',');
+ decode_filemode(ip[1]);
+ ip += 2;
+ narg -= 2;
break;
case SYS_minherit:
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- minheritname(*ip);
+ print_integer_arg(sysdecode_minherit_inherit,
+ *ip);
ip++;
narg--;
break;
case SYS_rfork:
putchar('(');
- rforkname(*ip);
+ print_mask_arg(sysdecode_rfork_flags, *ip);
ip++;
narg--;
c = ',';
break;
case SYS_lio_listio:
putchar('(');
- lio_listioname(*ip);
+ print_integer_arg(sysdecode_lio_listio_mode,
+ *ip);
ip++;
narg--;
c = ',';
break;
case SYS_mlockall:
putchar('(');
- mlockallname(*ip);
+ print_mask_arg(sysdecode_mlockall_flags, *ip);
ip++;
narg--;
break;
case SYS_sched_setscheduler:
print_number(ip, narg, c);
putchar(',');
- schedpolicyname(*ip);
+ print_integer_arg(sysdecode_scheduler_policy,
+ *ip);
ip++;
narg--;
break;
case SYS_sched_get_priority_max:
case SYS_sched_get_priority_min:
putchar('(');
- schedpolicyname(*ip);
+ print_integer_arg(sysdecode_scheduler_policy,
+ *ip);
ip++;
narg--;
break;
@@ -1195,20 +1355,21 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- sendfileflagsname(*(int *)ip);
+ print_mask_arg(sysdecode_sendfile_flags, *ip);
ip++;
narg--;
break;
case SYS_kldsym:
print_number(ip, narg, c);
putchar(',');
- kldsymcmdname(*ip);
+ print_integer_arg(sysdecode_kldsym_cmd, *ip);
ip++;
narg--;
break;
case SYS_sigprocmask:
putchar('(');
- sigprocmaskhowname(*ip);
+ print_integer_arg(sysdecode_sigprocmask_how,
+ *ip);
ip++;
narg--;
c = ',';
@@ -1227,13 +1388,13 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS___acl_aclcheck_link:
print_number(ip, narg, c);
putchar(',');
- acltypename(*ip);
+ print_integer_arg(sysdecode_acltype, *ip);
ip++;
narg--;
break;
case SYS_sigaction:
putchar('(');
- signame(*ip);
+ print_signal(*ip);
ip++;
narg--;
c = ',';
@@ -1241,7 +1402,8 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_extattrctl:
print_number(ip, narg, c);
putchar(',');
- extattrctlname(*ip);
+ print_integer_arg(sysdecode_extattrnamespace,
+ *ip);
ip++;
narg--;
break;
@@ -1249,7 +1411,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- mountflagsname(*ip);
+ print_mask_arg(sysdecode_mount_flags, *ip);
ip++;
narg--;
break;
@@ -1257,21 +1419,22 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
print_number(ip, narg, c);
print_number(ip, narg, c);
putchar(',');
- thrcreateflagsname(*ip);
+ print_mask_arg(sysdecode_thr_create_flags, *ip);
ip++;
narg--;
break;
case SYS_thr_kill:
print_number(ip, narg, c);
putchar(',');
- signame(*ip);
+ print_signal(*ip);
ip++;
narg--;
break;
case SYS_kldunloadf:
print_number(ip, narg, c);
putchar(',');
- kldunloadfflagsname(*ip);
+ print_integer_arg(sysdecode_kldunload_flags,
+ *ip);
ip++;
narg--;
break;
@@ -1280,7 +1443,7 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
case SYS_symlinkat:
print_number(ip, narg, c);
putchar(',');
- atfdname(*ip, decimal);
+ print_integer_arg_valid(sysdecode_atfd, *ip);
ip++;
narg--;
break;
@@ -1290,45 +1453,47 @@ ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
arg = *ip;
ip++;
narg--;
- capfcntlname(arg);
+ print_mask_arg32(sysdecode_cap_fcntlrights, arg);
break;
case SYS_posix_fadvise:
print_number(ip, narg, c);
print_number(ip, narg, c);
print_number(ip, narg, c);
(void)putchar(',');
- fadvisebehavname((int)*ip);
+ print_integer_arg(sysdecode_fadvice, *ip);
ip++;
narg--;
break;
case SYS_procctl:
putchar('(');
- idtypename(*ip, decimal);
+ print_integer_arg(sysdecode_idtype, *ip);
c = ',';
ip++;
narg--;
print_number64(first, ip, narg, c);
putchar(',');
- procctlcmdname(*ip);
+ print_integer_arg(sysdecode_procctl_cmd, *ip);
ip++;
narg--;
break;
case SYS__umtx_op:
print_number(ip, narg, c);
putchar(',');
- umtxopname(*ip);
+ print_integer_arg(sysdecode_umtx_op, *ip);
switch (*ip) {
case UMTX_OP_CV_WAIT:
ip++;
narg--;
putchar(',');
- umtxcvwaitflags(*ip);
+ print_mask_argul(
+ sysdecode_umtx_cvwait_flags, *ip);
break;
case UMTX_OP_RW_RDLOCK:
ip++;
narg--;
putchar(',');
- umtxrwlockflags(*ip);
+ print_mask_argul(
+ sysdecode_umtx_rwlock_flags, *ip);
break;
}
ip++;
@@ -1518,32 +1683,25 @@ ktrgenio(struct ktr_genio *ktr, int len)
visdump(dp, datalen, screenwidth);
}
-const char *signames[] = {
- "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */
- "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */
- "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */
- "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */
- "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */
- "USR2", NULL, /* 31 - 32 */
-};
-
void
ktrpsig(struct ktr_psig *psig)
{
- if (psig->signo > 0 && psig->signo < NSIG)
- printf("SIG%s ", signames[psig->signo]);
- else
- printf("SIG %d ", psig->signo);
+ const char *str;
+
+ print_signal(psig->signo);
if (psig->action == SIG_DFL) {
- printf("SIG_DFL code=");
- sigcodename(psig->signo, psig->code);
- putchar('\n');
+ printf(" SIG_DFL");
} else {
- printf("caught handler=0x%lx mask=0x%x code=",
+ printf(" caught handler=0x%lx mask=0x%x",
(u_long)psig->action, psig->mask.__bits[0]);
- sigcodename(psig->signo, psig->code);
- putchar('\n');
}
+ printf(" code=");
+ str = sysdecode_sigcode(psig->signo, psig->code);
+ if (str != NULL)
+ printf("%s", str);
+ else
+ printf("<invalid=%#x>", psig->code);
+ putchar('\n');
}
void
@@ -1585,7 +1743,7 @@ ktrcaprights(cap_rights_t *rightsp)
{
printf("cap_rights_t ");
- capname(rightsp);
+ sysdecode_cap_rights(stdout, rightsp);
printf("\n");
}
@@ -1617,6 +1775,7 @@ ktrsockaddr(struct sockaddr *sa)
#include <netsmb/netbios.h>
struct sockaddr_nb *nb;
*/
+ const char *str;
char addr[64];
/*
@@ -1625,7 +1784,11 @@ ktrsockaddr(struct sockaddr *sa)
* sa->sa_len bytes long.
*/
printf("struct sockaddr { ");
- sockfamilyname(sa->sa_family);
+ str = sysdecode_sockaddr_family(sa->sa_family);
+ if (str != NULL)
+ printf("%s", str);
+ else
+ printf("<invalid=%d>", sa->sa_family);
printf(", ");
#define check_sockaddr_len(n) \
@@ -1839,16 +2002,16 @@ ktrcapfail(struct ktr_cap_fail *ktr)
case CAPFAIL_NOTCAPABLE:
/* operation on fd with insufficient capabilities */
printf("operation requires ");
- capname(&ktr->cap_needed);
+ sysdecode_cap_rights(stdout, &ktr->cap_needed);
printf(", descriptor holds ");
- capname(&ktr->cap_held);
+ sysdecode_cap_rights(stdout, &ktr->cap_held);
break;
case CAPFAIL_INCREASE:
/* requested more capabilities than fd already has */
printf("attempt to increase capabilities from ");
- capname(&ktr->cap_held);
+ sysdecode_cap_rights(stdout, &ktr->cap_held);
printf(" to ");
- capname(&ktr->cap_needed);
+ sysdecode_cap_rights(stdout, &ktr->cap_needed);
break;
case CAPFAIL_SYSCALL:
/* called restricted syscall */
@@ -1860,9 +2023,9 @@ ktrcapfail(struct ktr_cap_fail *ktr)
break;
default:
printf("unknown capability failure: ");
- capname(&ktr->cap_needed);
+ sysdecode_cap_rights(stdout, &ktr->cap_needed);
printf(" ");
- capname(&ktr->cap_held);
+ sysdecode_cap_rights(stdout, &ktr->cap_held);
break;
}
printf("\n");
@@ -1873,15 +2036,20 @@ ktrfault(struct ktr_fault *ktr)
{
printf("0x%jx ", (uintmax_t)ktr->vaddr);
- vmprotname(ktr->type);
+ print_mask_arg(sysdecode_vmprot, ktr->type);
printf("\n");
}
void
ktrfaultend(struct ktr_faultend *ktr)
{
+ const char *str;
- vmresultname(ktr->result);
+ str = sysdecode_vmresult(ktr->result);
+ if (str != NULL)
+ printf("%s", str);
+ else
+ printf("<invalid=%d>", ktr->result);
printf("\n");
}
diff --git a/usr.bin/kdump/mksubr b/usr.bin/kdump/mksubr
deleted file mode 100644
index aa001f8..0000000
--- a/usr.bin/kdump/mksubr
+++ /dev/null
@@ -1,759 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2006 "David Kirchner" <dpk@dpk.net>. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD$
-#
-# Generates kdump_subr.c
-# mkioctls is a special-purpose script, and works fine as it is
-# now, so it remains independent. The idea behind how it generates
-# its list was heavily borrowed here.
-#
-# Some functions here are automatically generated. This can mean
-# the user will see unusual kdump output or errors while building
-# if the underlying .h files are changed significantly.
-#
-# Key:
-# AUTO: Completely auto-generated with either the "or" or the "switch"
-# method.
-# AUTO - Special: Generated automatically, but with some extra commands
-# that the auto_*_type() functions are inappropriate for.
-# MANUAL: Manually entered and must therefore be manually updated.
-
-set -e
-
-LC_ALL=C; export LC_ALL
-
-if [ -z "$1" ]
-then
- echo "usage: sh $0 include-dir"
- exit 1
-fi
-include_dir=$1
-
-#
-# Automatically generates a C function that will print out the
-# numeric input as a pipe-delimited string of the appropriate
-# #define keys. ex:
-# S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH
-# The XOR is necessary to prevent including the "0"-value in every
-# line.
-#
-auto_or_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name(intmax_t arg)
-{
- int or = 0;
- printf("%#jx<", (uintmax_t)arg);
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- 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_
-}
-
-#
-# Automatically generates a C function used when the argument
-# maps to a single, specific #definition
-#
-auto_switch_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name(intmax_t arg)
-{
- switch (arg) {
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }'
-cat <<_EOF_
- default: /* Should not reach */
- printf("<invalid=%jd>", arg);
- }
-}
-
-_EOF_
-}
-
-#
-# Automatically generates a C function used when the argument
-# maps to a #definition
-#
-auto_if_type () {
- local name grep file
- name=$1
- grep=$2
- file=$3
-
- cat <<_EOF_
-/* AUTO */
-void
-$name(intmax_t arg)
-{
-_EOF_
- egrep "^#[[:space:]]*define[[:space:]]+"${grep}"[[:space:]]*" \
- $include_dir/$file | \
- awk '{ printf "\t"; \
- if (NR > 1) \
- printf "else " ; \
- printf "if (arg == %s) \n\t\tprintf(\"%s\");\n", $2, $2 }'
-cat <<_EOF_
- else /* Should not reach */
- printf("<invalid=%jd>", arg);
-}
-
-_EOF_
-}
-
-# C start
-
-cat <<_EOF_
-#include <stdint.h>
-#include <stdio.h>
-#include <sys/fcntl.h>
-#include <sys/stat.h>
-#include <sys/unistd.h>
-#include <sys/mman.h>
-#include <sys/wait.h>
-#define _KERNEL
-#include <sys/socket.h>
-#undef _KERNEL
-#include <netinet/in.h>
-#include <sys/param.h>
-#include <sys/mount.h>
-#include <sys/procctl.h>
-#include <sys/ptrace.h>
-#include <sys/resource.h>
-#include <sys/reboot.h>
-#include <sched.h>
-#include <sys/linker.h>
-#define _KERNEL
-#include <sys/thr.h>
-#undef _KERNEL
-#include <sys/extattr.h>
-#include <sys/acl.h>
-#include <aio.h>
-#include <sys/sem.h>
-#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>
-#include <vm/vm.h>
-#include <vm/vm_param.h>
-
-#include "kdump_subr.h"
-
-/*
- * These are simple support macros. print_or utilizes a variable
- * defined in the calling function to track whether or not it should
- * print a logical-OR character ('|') before a string. if_print_or
- * simply handles the necessary "if" statement used in many lines
- * of this file.
- */
-#define print_or(str,orflag) do { \\
- if (orflag) putchar('|'); else orflag = 1; \\
- printf (str); } \\
- while (0)
-#define if_print_or(i,flag,orflag) do { \\
- if ((i & flag) == flag) \\
- print_or(#flag,orflag); } \\
- while (0)
-
-/* MANUAL */
-void
-atfdname(int fd, int decimal)
-{
- if (fd == AT_FDCWD)
- printf("AT_FDCWD");
- else if (decimal)
- printf("%d", fd);
- else
- printf("%#x", fd);
-}
-
-/* MANUAL */
-extern char *signames[]; /* from kdump.c */
-void
-signame(int sig)
-{
- if (sig > 0 && sig < NSIG)
- printf("SIG%s",signames[sig]);
- else
- printf("SIG %d", sig);
-}
-
-/* MANUAL */
-void
-semctlname(int cmd)
-{
- switch (cmd) {
- case GETNCNT:
- printf("GETNCNT");
- break;
- case GETPID:
- printf("GETPID");
- break;
- case GETVAL:
- printf("GETVAL");
- break;
- case GETALL:
- printf("GETALL");
- break;
- case GETZCNT:
- printf("GETZCNT");
- break;
- case SETVAL:
- printf("SETVAL");
- break;
- case SETALL:
- printf("SETALL");
- break;
- case IPC_RMID:
- printf("IPC_RMID");
- break;
- case IPC_SET:
- printf("IPC_SET");
- break;
- case IPC_STAT:
- printf("IPC_STAT");
- break;
- default: /* Should not reach */
- printf("<invalid=%d>", cmd);
- }
-}
-
-/* MANUAL */
-void
-shmctlname(int cmd)
-{
- switch (cmd) {
- case IPC_RMID:
- printf("IPC_RMID");
- break;
- case IPC_SET:
- printf("IPC_SET");
- break;
- case IPC_STAT:
- printf("IPC_STAT");
- break;
- default: /* Should not reach */
- printf("<invalid=%d>", cmd);
- }
-}
-
-/* MANUAL */
-void
-semgetname(int flag)
-{
- int or = 0;
- if_print_or(flag, IPC_CREAT, or);
- if_print_or(flag, IPC_EXCL, or);
- if_print_or(flag, SEM_R, or);
- if_print_or(flag, SEM_A, or);
- if_print_or(flag, (SEM_R>>3), or);
- if_print_or(flag, (SEM_A>>3), or);
- if_print_or(flag, (SEM_R>>6), or);
- if_print_or(flag, (SEM_A>>6), or);
-}
-
-/*
- * MANUAL
- *
- * Only used by SYS_open. Unless O_CREAT is set in flags, the
- * mode argument is unused (and often bogus and misleading).
- */
-void
-flagsandmodename(int flags, int mode, int decimal)
-{
- flagsname(flags);
- putchar(',');
- if ((flags & O_CREAT) == O_CREAT) {
- modename (mode);
- } else {
- if (decimal) {
- printf("<unused>%d", mode);
- } else {
- printf("<unused>%#x", (unsigned int)mode);
- }
- }
-}
-
-/* MANUAL */
-void
-idtypename(idtype_t idtype, int decimal)
-{
- switch(idtype) {
- case P_PID:
- printf("P_PID");
- break;
- case P_PPID:
- printf("P_PPID");
- break;
- case P_PGID:
- printf("P_PGID");
- break;
- case P_SID:
- printf("P_SID");
- break;
- case P_CID:
- printf("P_CID");
- break;
- case P_UID:
- printf("P_UID");
- break;
- case P_GID:
- printf("P_GID");
- break;
- case P_ALL:
- printf("P_ALL");
- break;
- case P_LWPID:
- printf("P_LWPID");
- break;
- case P_TASKID:
- printf("P_TASKID");
- break;
- case P_PROJID:
- printf("P_PROJID");
- break;
- case P_POOLID:
- printf("P_POOLID");
- break;
- case P_JAILID:
- printf("P_JAILID");
- break;
- case P_CTID:
- printf("P_CTID");
- break;
- case P_CPUID:
- printf("P_CPUID");
- break;
- case P_PSETID:
- printf("P_PSETID");
- break;
- default:
- if (decimal) {
- printf("%d", idtype);
- } else {
- printf("%#x", idtype);
- }
- }
-}
-
-/*
- * MANUAL
- *
- * [g|s]etsockopt's level argument can either be SOL_SOCKET or a value
- * referring to a line in /etc/protocols . It might be appropriate
- * to use getprotoent(3) here.
- */
-void
-sockoptlevelname(int level, int decimal)
-{
- if (level == SOL_SOCKET) {
- printf("SOL_SOCKET");
- } else {
- if (decimal) {
- printf("%d", level);
- } else {
- printf("%#x", (unsigned int)level);
- }
- }
-}
-
-/*
- * MANUAL
- *
- * Used for page fault type. Cannot use auto_or_type since the macro
- * values contain a cast. Also, VM_PROT_NONE has to be handled specially.
- */
-void
-vmprotname (int type)
-{
- int or = 0;
-
- if (type == VM_PROT_NONE) {
- (void)printf("VM_PROT_NONE");
- return;
- }
- if_print_or(type, VM_PROT_READ, or);
- if_print_or(type, VM_PROT_WRITE, or);
- if_print_or(type, VM_PROT_EXECUTE, or);
- if_print_or(type, VM_PROT_COPY, or);
-}
-
-/*
- * MANUAL
- */
-void
-socktypenamewithflags(int type)
-{
- if (type & SOCK_CLOEXEC)
- printf("SOCK_CLOEXEC|"), type &= ~SOCK_CLOEXEC;
- if (type & SOCK_NONBLOCK)
- printf("SOCK_NONBLOCK|"), type &= ~SOCK_NONBLOCK;
- socktypename(type);
-}
-_EOF_
-
-auto_or_type "accessmodename" "[A-Z]_OK[[:space:]]+0?x?[0-9A-Fa-f]+" "sys/unistd.h"
-auto_switch_type "acltypename" "ACL_TYPE_[A-Z4_]+[[:space:]]+0x[0-9]+" "sys/acl.h"
-auto_or_type "capfcntlname" "CAP_FCNTL_[A-Z]+[[:space:]]+\(1" "sys/capsicum.h"
-auto_switch_type "extattrctlname" "EXTATTR_NAMESPACE_[A-Z]+[[:space:]]+0x[0-9]+" "sys/extattr.h"
-auto_switch_type "fadvisebehavname" "POSIX_FADV_[A-Z]+[[:space:]]+[0-9]+" "sys/fcntl.h"
-auto_or_type "flagsname" "O_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/fcntl.h"
-auto_or_type "flockname" "LOCK_[A-Z]+[[:space:]]+0x[0-9]+" "sys/fcntl.h"
-auto_or_type "getfsstatflagsname" "MNT_[A-Z]+[[:space:]]+[1-9][0-9]*" "sys/mount.h"
-auto_switch_type "kldsymcmdname" "KLDSYM_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
-auto_switch_type "kldunloadfflagsname" "LINKER_UNLOAD_[A-Z]+[[:space:]]+[0-9]+" "sys/linker.h"
-auto_switch_type "lio_listioname" "LIO_(NO)?WAIT[[:space:]]+[0-9]+" "aio.h"
-auto_switch_type "madvisebehavname" "_?MADV_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
-auto_switch_type "minheritname" "INHERIT_[A-Z]+[[:space:]]+[0-9]+" "sys/mman.h"
-auto_or_type "mlockallname" "MCL_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
-auto_or_type "mmapprotname" "PROT_[A-Z]+[[:space:]]+0x[0-9A-Fa-f]+" "sys/mman.h"
-auto_or_type "modename" "S_[A-Z]+[[:space:]]+[0-6]{7}" "sys/stat.h"
-auto_or_type "mountflagsname" "MNT_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mount.h"
-auto_switch_type "msyncflagsname" "MS_[A-Z]+[[:space:]]+0x[0-9]+" "sys/mman.h"
-auto_or_type "nfssvcname" "NFSSVC_[A-Z0-9]+[[:space:]]+0x[0-9]+" "nfs/nfssvc.h"
-auto_switch_type "prioname" "PRIO_[A-Z]+[[:space:]]+[0-9]" "sys/resource.h"
-auto_switch_type "procctlcmdname" "PROC_[A-Z]+[[:space:]]+[0-9]" "sys/procctl.h"
-auto_switch_type "ptraceopname" "PT_[[:alnum:]_]+[[:space:]]+[0-9]+" "sys/ptrace.h"
-auto_switch_type "quotactlname" "Q_[A-Z]+[[:space:]]+0x[0-9]+" "ufs/ufs/quota.h"
-auto_or_type "rebootoptname" "RB_[A-Z]+[[:space:]]+0x[0-9]+" "sys/reboot.h"
-auto_or_type "rforkname" "RF[A-Z]+[[:space:]]+\([0-9]+<<[0-9]+\)" "sys/unistd.h"
-auto_switch_type "rlimitname" "RLIMIT_[A-Z]+[[:space:]]+[0-9]+" "sys/resource.h"
-auto_switch_type "schedpolicyname" "SCHED_[A-Z]+[[:space:]]+[0-9]+" "sched.h"
-auto_switch_type "sendfileflagsname" "SF_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
-auto_or_type "shmatname" "SHM_[A-Z]+[[:space:]]+[0-9]{6}+" "sys/shm.h"
-auto_switch_type "shutdownhowname" "SHUT_[A-Z]+[[:space:]]+[0-9]+" "sys/socket.h"
-auto_switch_type "sigbuscodename" "BUS_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigchldcodename" "CLD_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigfpecodename" "FPE_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigprocmaskhowname" "SIG_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigillcodename" "ILL_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigsegvcodename" "SEGV_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_switch_type "sigtrapcodename" "TRAP_[A-Z]+[[:space:]]+[0-9]+" "sys/signal.h"
-auto_if_type "sockdomainname" "PF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
-auto_if_type "sockfamilyname" "AF_[[:alnum:]]+[[:space:]]+" "sys/socket.h"
-auto_if_type "sockipprotoname" "IPPROTO_[[:alnum:]]+[[:space:]]+" "netinet/in.h"
-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"
-
-cat <<_EOF_
-/*
- * AUTO - Special
- * F_ is used to specify fcntl commands as well as arguments. Both sets are
- * grouped in fcntl.h, and this awk script grabs the first group.
- */
-void
-fcntlcmdname(int cmd, int arg, int decimal)
-{
- switch (cmd) {
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+F_[A-Z0-9_]+[[:space:]]+[0-9]+[[:space:]]*" \
- $include_dir/sys/fcntl.h | \
- awk 'BEGIN { o=0 } { for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- if (o <= $(i+1)) \
- printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i; \
- else \
- exit; \
- o = $(i+1) }'
-cat <<_EOF_
- default: /* Should not reach */
- printf("<invalid=%d>", cmd);
- }
- putchar(',');
- if (cmd == F_GETFD || cmd == F_SETFD) {
- if (arg == FD_CLOEXEC)
- printf("FD_CLOEXEC");
- else if (arg == 0)
- printf("0");
- else {
- if (decimal)
- printf("<invalid>%d", arg);
- else
- printf("<invalid>%#x", (unsigned int)arg);
- }
- } else if (cmd == F_SETFL) {
- flagsname(arg);
- } else {
- if (decimal)
- printf("%d", arg);
- else
- printf("%#x", (unsigned int)arg);
- }
-}
-
-/*
- * AUTO - Special
- *
- * The MAP_ALIGNED flag requires special handling.
- */
-void
-mmapflagsname(int flags)
-{
- int align;
- int or = 0;
- printf("%#x<", flags);
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+MAP_[A-Z_]+[[:space:]]+0x[0-9A-Fa-f]+[[:space:]]*" \
- $include_dir/sys/mman.h | grep -v MAP_ALIGNED | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tif (!((flags > 0) ^ ((%s) > 0)))\n\t\tif_print_or(flags, %s, or);\n", $i, $i }'
-cat <<_EOF_
-#ifdef MAP_32BIT
- if (!((flags > 0) ^ ((MAP_32BIT) > 0)))
- if_print_or(flags, MAP_32BIT, or);
-#endif
- align = flags & MAP_ALIGNMENT_MASK;
- if (align != 0) {
- if (align == MAP_ALIGNED_SUPER)
- print_or("MAP_ALIGNED_SUPER", or);
- else {
- print_or("MAP_ALIGNED", or);
- printf("(%d)", align >> MAP_ALIGNMENT_SHIFT);
- }
- }
- printf(">");
- if (or == 0)
- printf("<invalid>%d", flags);
-}
-
-/*
- * AUTO - Special
- *
- * The only reason this is not fully automated is due to the
- * grep -v RTP_PRIO statement. A better egrep line should
- * make this capable of being a auto_switch_type() function.
- */
-void
-rtprioname(int func)
-{
- switch (func) {
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+RTP_[A-Z]+[[:space:]]+0x[0-9]+[[:space:]]*" \
- $include_dir/sys/rtprio.h | grep -v RTP_PRIO | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }'
-cat <<_EOF_
- default: /* Should not reach */
- printf("<invalid=%d>", func);
- }
-}
-
-/*
- * AUTO - Special
- *
- * The send and recv functions have a flags argument which can be
- * set to 0. There is no corresponding #define. The auto_ functions
- * detect this as "invalid", which is incorrect here.
- */
-void
-sendrecvflagsname(int flags)
-{
- int or = 0;
-
- if (flags == 0) {
- printf("0");
- return;
- }
-
- printf("%#x<", flags);
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+MSG_[A-Z]+[[:space:]]+0x[0-9]+[[:space:]]*" $include_dir/sys/socket.h | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tif(!((flags>0)^((%s)>0)))\n\t\tif_print_or(flags, %s, or);\n", $i, $i }'
-cat <<_EOF_
- printf(">");
-}
-
-/*
- * AUTO - Special
- *
- * Check general codes first, then defer to signal-specific codes.
- */
-void
-sigcodename(int sig, int code)
-{
- switch (code) {
-_EOF_
-egrep "^#[[:space:]]*define[[:space:]]+SI_[A-Z]+[[:space:]]+0(x[0-9abcdef]+)?[[:space:]]*" \
- $include_dir/sys/signal.h | grep -v SI_UNDEFINED | \
- awk '{ for (i = 1; i <= NF; i++) \
- if ($i ~ /define/) \
- break; \
- ++i; \
- printf "\tcase %s:\n\t\tprintf(\"%s\");\n\t\tbreak;\n", $i, $i }'
-cat <<_EOF_
- default:
- switch (sig) {
- case SIGILL:
- sigillcodename(code);
- break;
- case SIGBUS:
- sigbuscodename(code);
- break;
- case SIGSEGV:
- sigsegvcodename(code);
- break;
- case SIGFPE:
- sigfpecodename(code);
- break;
- case SIGTRAP:
- sigtrapcodename(code);
- break;
- case SIGCHLD:
- sigchldcodename(code);
- break;
- default:
- printf("<invalid=%#x>", code);
- }
- }
-}
-
-/*
- * 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 | \
- sed -E 's/[ ]+/ /g' | \
- awk -F '[ \(,\)]' '
- BEGIN {
- printf "void\n"
- printf "capname(const cap_rights_t *rightsp)\n"
- printf "{\n"
- printf "\tint comma = 0;\n\n"
- printf "\tprintf(\"<\");\n"
- }
- {
- printf "\tif ((rightsp->cr_rights[%s] & %s) == %s) {\n", $4, $2, $2
- printf "\t\tif (comma) printf(\",\"); else comma = 1;\n"
- printf "\t\tprintf(\"%s\");\n", $2
- printf "\t}\n"
- }
- END {
- printf "\tprintf(\">\");\n"
- printf "}\n"
- }'
diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile
index 480dab0..d077eda 100644
--- a/usr.bin/truss/Makefile
+++ b/usr.bin/truss/Makefile
@@ -1,12 +1,13 @@
# $FreeBSD$
-NO_WERROR=
+#NO_WERROR=
PROG= truss
SRCS= main.c setup.c syscalls.c
LIBADD= sysdecode
-CFLAGS+= -I${.CURDIR} -I. -I${.CURDIR}/../../sys
+#CFLAGS+= -I${.CURDIR} -I. -I${.CURDIR}/../../sys
+CFLAGS+= -I${.CURDIR}/../../sys
ABIS+= freebsd
# Each ABI is expected to have an ABI.c, MACHINE_ARCH-ABI.c or
diff --git a/usr.bin/truss/aarch64-cloudabi64.c b/usr.bin/truss/aarch64-cloudabi64.c
index 27906ea..6a1694a 100644
--- a/usr.bin/truss/aarch64-cloudabi64.c
+++ b/usr.bin/truss/aarch64-cloudabi64.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include <machine/armreg.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/aarch64-freebsd.c b/usr.bin/truss/aarch64-freebsd.c
index 534441c..a9944f5 100644
--- a/usr.bin/truss/aarch64-freebsd.c
+++ b/usr.bin/truss/aarch64-freebsd.c
@@ -38,6 +38,7 @@ __FBSDID("$FreeBSD$");
#include <machine/armreg.h>
#include <machine/ucontext.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/amd64-cloudabi64.c b/usr.bin/truss/amd64-cloudabi64.c
index f7d7c1a..06de944 100644
--- a/usr.bin/truss/amd64-cloudabi64.c
+++ b/usr.bin/truss/amd64-cloudabi64.c
@@ -31,6 +31,7 @@ __FBSDID("$FreeBSD$");
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/amd64-freebsd.c b/usr.bin/truss/amd64-freebsd.c
index a2f378c..fa844fa 100644
--- a/usr.bin/truss/amd64-freebsd.c
+++ b/usr.bin/truss/amd64-freebsd.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/amd64-freebsd32.c b/usr.bin/truss/amd64-freebsd32.c
index cfcead2..adbc3e7 100644
--- a/usr.bin/truss/amd64-freebsd32.c
+++ b/usr.bin/truss/amd64-freebsd32.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/amd64-linux.c b/usr.bin/truss/amd64-linux.c
index 4397804..94a3d6a 100644
--- a/usr.bin/truss/amd64-linux.c
+++ b/usr.bin/truss/amd64-linux.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/amd64-linux32.c b/usr.bin/truss/amd64-linux32.c
index 279d228..3f32c84 100644
--- a/usr.bin/truss/amd64-linux32.c
+++ b/usr.bin/truss/amd64-linux32.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/arm-freebsd.c b/usr.bin/truss/arm-freebsd.c
index a1b2b21..826a8d8 100644
--- a/usr.bin/truss/arm-freebsd.c
+++ b/usr.bin/truss/arm-freebsd.c
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <machine/armreg.h>
#include <machine/ucontext.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/extern.h b/usr.bin/truss/extern.h
index 5ce3d3b..2cdd9c5 100644
--- a/usr.bin/truss/extern.h
+++ b/usr.bin/truss/extern.h
@@ -37,4 +37,3 @@ extern void start_tracing(struct trussinfo *, pid_t);
extern void restore_proc(int);
extern void eventloop(struct trussinfo *);
extern const char *ioctlname(unsigned long val);
-extern char *strsig(int sig);
diff --git a/usr.bin/truss/i386-freebsd.c b/usr.bin/truss/i386-freebsd.c
index bf35af2..469ab7d 100644
--- a/usr.bin/truss/i386-freebsd.c
+++ b/usr.bin/truss/i386-freebsd.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/i386-linux.c b/usr.bin/truss/i386-linux.c
index 52232b4..56fab65 100644
--- a/usr.bin/truss/i386-linux.c
+++ b/usr.bin/truss/i386-linux.c
@@ -39,6 +39,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/psl.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/main.c b/usr.bin/truss/main.c
index 38626fd..84fd37e 100644
--- a/usr.bin/truss/main.c
+++ b/usr.bin/truss/main.c
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <signal.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sysdecode.h>
@@ -61,18 +62,6 @@ usage(void)
exit(1);
}
-char *
-strsig(int sig)
-{
- static char tmp[64];
-
- if (sig > 0 && sig < NSIG) {
- snprintf(tmp, sizeof(tmp), "SIG%s", sys_signame[sig]);
- return (tmp);
- }
- return (NULL);
-}
-
int
main(int ac, char **av)
{
diff --git a/usr.bin/truss/mips-freebsd.c b/usr.bin/truss/mips-freebsd.c
index 3a42a59..ac803b9 100644
--- a/usr.bin/truss/mips-freebsd.c
+++ b/usr.bin/truss/mips-freebsd.c
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/frame.h>
#include <machine/reg.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/powerpc-freebsd.c b/usr.bin/truss/powerpc-freebsd.c
index ee78d03..dbeba2b 100644
--- a/usr.bin/truss/powerpc-freebsd.c
+++ b/usr.bin/truss/powerpc-freebsd.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/frame.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/powerpc64-freebsd.c b/usr.bin/truss/powerpc64-freebsd.c
index cc64cd6..a8927bb 100644
--- a/usr.bin/truss/powerpc64-freebsd.c
+++ b/usr.bin/truss/powerpc64-freebsd.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/frame.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/powerpc64-freebsd32.c b/usr.bin/truss/powerpc64-freebsd32.c
index c6f3b10..bc8d2fc 100644
--- a/usr.bin/truss/powerpc64-freebsd32.c
+++ b/usr.bin/truss/powerpc64-freebsd32.c
@@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/frame.h>
+#include <stdbool.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/setup.c b/usr.bin/truss/setup.c
index a14c016..036cb8f 100644
--- a/usr.bin/truss/setup.c
+++ b/usr.bin/truss/setup.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <errno.h>
#include <signal.h>
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -591,14 +592,15 @@ static void
report_signal(struct trussinfo *info, siginfo_t *si)
{
struct threadinfo *t;
- char *signame;
+ const char *signame;
t = info->curthread;
clock_gettime(CLOCK_REALTIME, &t->after);
print_line_prefix(info);
- signame = strsig(si->si_status);
- fprintf(info->outfile, "SIGNAL %u (%s)\n", si->si_status,
- signame == NULL ? "?" : signame);
+ signame = sysdecode_signal(si->si_status);
+ if (signame == NULL)
+ signame = "?";
+ fprintf(info->outfile, "SIGNAL %u (%s)\n", si->si_status, signame);
}
/*
diff --git a/usr.bin/truss/sparc64-freebsd.c b/usr.bin/truss/sparc64-freebsd.c
index a8569c0..3cbad50 100644
--- a/usr.bin/truss/sparc64-freebsd.c
+++ b/usr.bin/truss/sparc64-freebsd.c
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <machine/reg.h>
#include <machine/tstate.h>
+#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <sysdecode.h>
diff --git a/usr.bin/truss/syscall.h b/usr.bin/truss/syscall.h
index 906f799..0cd752d 100644
--- a/usr.bin/truss/syscall.h
+++ b/usr.bin/truss/syscall.h
@@ -44,7 +44,7 @@ enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHex, Name, Ptr, Stat, Ioctl,
Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
Pathconf, Rforkflags, ExitStatus, Waitoptions, Idtype, Procctl,
LinuxSockArgs, Umtxop, Atfd, Atflags, Timespec2, Accessmode, Long,
- Sysarch, ExecArgs, ExecEnv, PipeFds, QuadHex, Utrace, IntArray,
+ Sysarch, ExecArgs, ExecEnv, PipeFds, QuadHex, Utrace, IntArray, Pipe2,
CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
CloudABIFDStat, CloudABIFileStat, CloudABIFileType,
diff --git a/usr.bin/truss/syscalls.c b/usr.bin/truss/syscalls.c
index 855f5d3..46bc87f 100644
--- a/usr.bin/truss/syscalls.c
+++ b/usr.bin/truss/syscalls.c
@@ -40,14 +40,11 @@ __FBSDID("$FreeBSD$");
#include <sys/types.h>
#include <sys/event.h>
#include <sys/ioccom.h>
-#include <sys/mman.h>
#include <sys/mount.h>
-#include <sys/procctl.h>
#include <sys/ptrace.h>
#include <sys/resource.h>
#include <sys/socket.h>
#include <sys/stat.h>
-#include <sys/umtx.h>
#include <sys/un.h>
#include <sys/wait.h>
#include <machine/sysarch.h>
@@ -60,13 +57,10 @@ __FBSDID("$FreeBSD$");
#include <poll.h>
#include <signal.h>
#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysdecode.h>
-#include <time.h>
#include <unistd.h>
#include <vis.h>
@@ -256,7 +250,7 @@ static struct syscall decoded_syscalls[] = {
{ .name = "pipe", .ret_type = 1, .nargs = 1,
.args = { { PipeFds | OUT, 0 } } },
{ .name = "pipe2", .ret_type = 1, .nargs = 2,
- .args = { { Ptr, 0 }, { Open, 1 } } },
+ .args = { { Ptr, 0 }, { Pipe2, 1 } } },
{ .name = "poll", .ret_type = 1, .nargs = 3,
.args = { { Pollfd, 0 }, { Int, 1 }, { Int, 2 } } },
{ .name = "posix_openpt", .ret_type = 1, .nargs = 1,
@@ -553,83 +547,11 @@ static struct xlat poll_flags[] = {
X(POLLWRBAND) X(POLLINIGNEOF) XEND
};
-static struct xlat mmap_flags[] = {
- X(MAP_SHARED) X(MAP_PRIVATE) X(MAP_FIXED) X(MAP_RESERVED0020)
- X(MAP_RESERVED0040) X(MAP_RESERVED0080) X(MAP_RESERVED0100)
- X(MAP_HASSEMAPHORE) X(MAP_STACK) X(MAP_NOSYNC) X(MAP_ANON)
- X(MAP_EXCL) X(MAP_NOCORE) X(MAP_PREFAULT_READ)
-#ifdef MAP_32BIT
- X(MAP_32BIT)
-#endif
- XEND
-};
-
-static struct xlat mprot_flags[] = {
- X(PROT_NONE) X(PROT_READ) X(PROT_WRITE) X(PROT_EXEC) XEND
-};
-
-static struct xlat whence_arg[] = {
- X(SEEK_SET) X(SEEK_CUR) X(SEEK_END) X(SEEK_DATA) X(SEEK_HOLE) XEND
-};
-
static struct xlat sigaction_flags[] = {
X(SA_ONSTACK) X(SA_RESTART) X(SA_RESETHAND) X(SA_NOCLDSTOP)
X(SA_NODEFER) X(SA_NOCLDWAIT) X(SA_SIGINFO) XEND
};
-static struct xlat fcntl_arg[] = {
- X(F_DUPFD) X(F_GETFD) X(F_SETFD) X(F_GETFL) X(F_SETFL)
- X(F_GETOWN) X(F_SETOWN) X(F_OGETLK) X(F_OSETLK) X(F_OSETLKW)
- X(F_DUP2FD) X(F_GETLK) X(F_SETLK) X(F_SETLKW) X(F_SETLK_REMOTE)
- X(F_READAHEAD) X(F_RDAHEAD) X(F_DUPFD_CLOEXEC) X(F_DUP2FD_CLOEXEC)
- XEND
-};
-
-static struct xlat fcntlfd_arg[] = {
- X(FD_CLOEXEC) XEND
-};
-
-static struct xlat fcntlfl_arg[] = {
- X(O_APPEND) X(O_ASYNC) X(O_FSYNC) X(O_NONBLOCK) X(O_NOFOLLOW)
- X(FRDAHEAD) X(O_DIRECT) XEND
-};
-
-static struct xlat sockdomain_arg[] = {
- X(PF_UNSPEC) X(PF_LOCAL) X(PF_UNIX) X(PF_INET) X(PF_IMPLINK)
- X(PF_PUP) X(PF_CHAOS) X(PF_NETBIOS) X(PF_ISO) X(PF_OSI)
- X(PF_ECMA) X(PF_DATAKIT) X(PF_CCITT) X(PF_SNA) X(PF_DECnet)
- X(PF_DLI) X(PF_LAT) X(PF_HYLINK) X(PF_APPLETALK) X(PF_ROUTE)
- X(PF_LINK) X(PF_XTP) X(PF_COIP) X(PF_CNT) X(PF_SIP) X(PF_IPX)
- X(PF_RTIP) X(PF_PIP) X(PF_ISDN) X(PF_KEY) X(PF_INET6)
- X(PF_NATM) X(PF_ATM) X(PF_NETGRAPH) X(PF_SLOW) X(PF_SCLUSTER)
- X(PF_ARP) X(PF_BLUETOOTH) X(PF_IEEE80211) X(PF_INET_SDP)
- X(PF_INET6_SDP) XEND
-};
-
-static struct xlat socktype_arg[] = {
- X(SOCK_STREAM) X(SOCK_DGRAM) X(SOCK_RAW) X(SOCK_RDM)
- X(SOCK_SEQPACKET) XEND
-};
-
-static struct xlat open_flags[] = {
- X(O_RDONLY) X(O_WRONLY) X(O_RDWR) X(O_ACCMODE) X(O_NONBLOCK)
- X(O_APPEND) X(O_SHLOCK) X(O_EXLOCK) X(O_ASYNC) X(O_FSYNC)
- X(O_NOFOLLOW) X(O_CREAT) X(O_TRUNC) X(O_EXCL) X(O_NOCTTY)
- X(O_DIRECT) X(O_DIRECTORY) X(O_EXEC) X(O_TTY_INIT) X(O_CLOEXEC)
- X(O_VERIFY) XEND
-};
-
-static struct xlat shutdown_arg[] = {
- X(SHUT_RD) X(SHUT_WR) X(SHUT_RDWR) XEND
-};
-
-static struct xlat resource_arg[] = {
- X(RLIMIT_CPU) X(RLIMIT_FSIZE) X(RLIMIT_DATA) X(RLIMIT_STACK)
- X(RLIMIT_CORE) X(RLIMIT_RSS) X(RLIMIT_MEMLOCK) X(RLIMIT_NPROC)
- X(RLIMIT_NOFILE) X(RLIMIT_SBSIZE) X(RLIMIT_VMEM) X(RLIMIT_NPTS)
- X(RLIMIT_SWAP) X(RLIMIT_KQUEUES) XEND
-};
-
static struct xlat pathconf_arg[] = {
X(_PC_LINK_MAX) X(_PC_MAX_CANON) X(_PC_MAX_INPUT)
X(_PC_NAME_MAX) X(_PC_PATH_MAX) X(_PC_PIPE_BUF)
@@ -643,50 +565,11 @@ static struct xlat pathconf_arg[] = {
X(_PC_ACL_NFS4) X(_PC_MIN_HOLE_SIZE) XEND
};
-static struct xlat rfork_flags[] = {
- X(RFFDG) X(RFPROC) X(RFMEM) X(RFNOWAIT) X(RFCFDG) X(RFTHREAD)
- X(RFSIGSHARE) X(RFLINUXTHPN) X(RFTSIGZMB) X(RFPPWAIT) XEND
-};
-
-static struct xlat wait_options[] = {
- X(WNOHANG) X(WUNTRACED) X(WCONTINUED) X(WNOWAIT) X(WEXITED)
- X(WTRAPPED) XEND
-};
-
-static struct xlat idtype_arg[] = {
- X(P_PID) X(P_PPID) X(P_PGID) X(P_SID) X(P_CID) X(P_UID) X(P_GID)
- X(P_ALL) X(P_LWPID) X(P_TASKID) X(P_PROJID) X(P_POOLID) X(P_JAILID)
- X(P_CTID) X(P_CPUID) X(P_PSETID) XEND
-};
-
-static struct xlat procctl_arg[] = {
- X(PROC_SPROTECT) X(PROC_REAP_ACQUIRE) X(PROC_REAP_RELEASE)
- X(PROC_REAP_STATUS) X(PROC_REAP_GETPIDS) X(PROC_REAP_KILL)
- X(PROC_TRACE_CTL) X(PROC_TRACE_STATUS) 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)
- X(UMTX_OP_SEM2_WAIT) X(UMTX_OP_SEM2_WAKE)
- XEND
-};
-
static struct xlat at_flags[] = {
X(AT_EACCESS) X(AT_SYMLINK_NOFOLLOW) X(AT_SYMLINK_FOLLOW)
X(AT_REMOVEDIR) XEND
};
-static struct xlat access_modes[] = {
- X(R_OK) X(W_OK) X(X_OK) XEND
-};
-
static struct xlat sysarch_ops[] = {
#if defined(__i386__) || defined(__amd64__)
X(I386_GET_LDT) X(I386_SET_LDT) X(I386_GET_IOPERM) X(I386_SET_IOPERM)
@@ -707,11 +590,6 @@ static struct xlat linux_socketcall_ops[] = {
XEND
};
-static struct xlat sigprocmask_ops[] = {
- X(SIG_BLOCK) X(SIG_UNBLOCK) X(SIG_SETMASK)
- XEND
-};
-
#undef X
#define X(a) { CLOUDABI_##a, #a },
@@ -909,6 +787,29 @@ xlookup_bits(struct xlat *xlat, int val)
return (str);
}
+static void
+print_integer_arg(const char *(*decoder)(int), FILE *fp, int value)
+{
+ const char *str;
+
+ str = decoder(value);
+ if (str != NULL)
+ fputs(str, fp);
+ else
+ fprintf(fp, "%d", value);
+}
+
+static void
+print_mask_arg(bool (*decoder)(FILE *, int, int *), FILE *fp, int value)
+{
+ int rem;
+
+ if (!decoder(fp, value, &rem))
+ fprintf(fp, "0x%x", rem);
+ else if (rem != 0)
+ fprintf(fp, "|0x%x", rem);
+}
+
void
init_syscalls(void)
{
@@ -1028,18 +929,18 @@ get_string(pid_t pid, void *addr, int max)
}
}
-static char *
+static const char *
strsig2(int sig)
{
- static char tmp[sizeof(int) * 3 + 1];
- char *ret;
+ static char tmp[32];
+ const char *signame;
- ret = strsig(sig);
- if (ret == NULL) {
+ signame = sysdecode_signal(sig);
+ if (signame == NULL) {
snprintf(tmp, sizeof(tmp), "%d", sig);
- ret = tmp;
+ signame = tmp;
}
- return (ret);
+ return (signame);
}
static void
@@ -1493,7 +1394,7 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
for (i = 1; i < sys_nsig; i++) {
if (sigismember(&ss, i)) {
fprintf(fp, "%s%s", !first ? "|" : "",
- strsig(i));
+ strsig2(i));
first = 0;
}
}
@@ -1502,92 +1403,48 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
fputc('}', fp);
break;
}
- case Sigprocmask: {
- fputs(xlookup(sigprocmask_ops, args[sc->offset]), fp);
+ case Sigprocmask:
+ print_integer_arg(sysdecode_sigprocmask_how, fp,
+ args[sc->offset]);
break;
- }
- case Fcntlflag: {
+ case Fcntlflag:
/* XXX: Output depends on the value of the previous argument. */
- switch (args[sc->offset - 1]) {
- case F_SETFD:
- fputs(xlookup_bits(fcntlfd_arg, args[sc->offset]), fp);
- break;
- case F_SETFL:
- fputs(xlookup_bits(fcntlfl_arg, args[sc->offset]), fp);
- break;
- case F_GETFD:
- case F_GETFL:
- case F_GETOWN:
- break;
- default:
- fprintf(fp, "0x%lx", args[sc->offset]);
- break;
- }
+ if (sysdecode_fcntl_arg_p(args[sc->offset - 1]))
+ sysdecode_fcntl_arg(fp, args[sc->offset - 1],
+ args[sc->offset], 16);
break;
- }
case Open:
- fputs(xlookup_bits(open_flags, args[sc->offset]), fp);
+ print_mask_arg(sysdecode_open_flags, fp, args[sc->offset]);
break;
case Fcntl:
- fputs(xlookup(fcntl_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_fcntl_cmd, fp, args[sc->offset]);
break;
case Mprot:
- fputs(xlookup_bits(mprot_flags, args[sc->offset]), fp);
+ print_mask_arg(sysdecode_mmap_prot, fp, args[sc->offset]);
break;
- case Mmapflags: {
- int align, flags;
-
- /*
- * MAP_ALIGNED can't be handled by xlookup_bits(), so
- * generate that string manually and prepend it to the
- * string from xlookup_bits(). Have to be careful to
- * avoid outputting MAP_ALIGNED|0 if MAP_ALIGNED is
- * the only flag.
- */
- flags = args[sc->offset] & ~MAP_ALIGNMENT_MASK;
- align = args[sc->offset] & MAP_ALIGNMENT_MASK;
- if (align != 0) {
- if (align == MAP_ALIGNED_SUPER)
- fputs("MAP_ALIGNED_SUPER", fp);
- else
- fprintf(fp, "MAP_ALIGNED(%d)",
- align >> MAP_ALIGNMENT_SHIFT);
- if (flags == 0)
- break;
- fputc('|', fp);
- }
- fputs(xlookup_bits(mmap_flags, flags), fp);
+ case Mmapflags:
+ print_mask_arg(sysdecode_mmap_flags, fp, args[sc->offset]);
break;
- }
case Whence:
- fputs(xlookup(whence_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_whence, fp, args[sc->offset]);
break;
case Sockdomain:
- fputs(xlookup(sockdomain_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_socketdomain, fp, args[sc->offset]);
break;
- case Socktype: {
- int type, flags;
-
- flags = args[sc->offset] & (SOCK_CLOEXEC | SOCK_NONBLOCK);
- type = args[sc->offset] & ~flags;
- fputs(xlookup(socktype_arg, type), fp);
- if (flags & SOCK_CLOEXEC)
- fprintf(fp, "|SOCK_CLOEXEC");
- if (flags & SOCK_NONBLOCK)
- fprintf(fp, "|SOCK_NONBLOCK");
+ case Socktype:
+ print_mask_arg(sysdecode_socket_type, fp, args[sc->offset]);
break;
- }
case Shutdown:
- fputs(xlookup(shutdown_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_shutdown_how, fp, args[sc->offset]);
break;
case Resource:
- fputs(xlookup(resource_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_rlimit, fp, args[sc->offset]);
break;
case Pathconf:
fputs(xlookup(pathconf_arg, args[sc->offset]), fp);
break;
case Rforkflags:
- fputs(xlookup_bits(rfork_flags, args[sc->offset]), fp);
+ print_mask_arg(sysdecode_rfork_flags, fp, args[sc->offset]);
break;
case Sockaddr: {
char addr[64];
@@ -1818,31 +1675,25 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
break;
}
case Waitoptions:
- fputs(xlookup_bits(wait_options, args[sc->offset]), fp);
+ print_mask_arg(sysdecode_wait6_options, fp, args[sc->offset]);
break;
case Idtype:
- fputs(xlookup(idtype_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_idtype, fp, args[sc->offset]);
break;
case Procctl:
- fputs(xlookup(procctl_arg, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_procctl_cmd, fp, args[sc->offset]);
break;
case Umtxop:
- fputs(xlookup(umtx_ops, args[sc->offset]), fp);
+ print_integer_arg(sysdecode_umtx_op, fp, args[sc->offset]);
break;
case Atfd:
- if ((int)args[sc->offset] == AT_FDCWD)
- fputs("AT_FDCWD", fp);
- else
- fprintf(fp, "%d", (int)args[sc->offset]);
+ print_integer_arg(sysdecode_atfd, fp, args[sc->offset]);
break;
case Atflags:
fputs(xlookup_bits(at_flags, args[sc->offset]), fp);
break;
case Accessmode:
- if (args[sc->offset] == F_OK)
- fputs("F_OK", fp);
- else
- fputs(xlookup_bits(access_modes, args[sc->offset]), fp);
+ print_mask_arg(sysdecode_access_mode, fp, args[sc->offset]);
break;
case Sysarch:
fputs(xlookup(sysarch_ops, args[sc->offset]), fp);
@@ -1898,6 +1749,9 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
+ case Pipe2:
+ print_mask_arg(sysdecode_pipe2_flags, fp, args[sc->offset]);
+ break;
case CloudABIAdvice:
fputs(xlookup(cloudabi_advice, args[sc->offset]), fp);
OpenPOWER on IntegriCloud