summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorclaudio <claudio@openbsd.org>2012-07-09 17:51:08 +0000
committerclaudio <claudio@openbsd.org>2012-07-09 17:51:08 +0000
commit9c5059441b6effd85c8d916ef33d8a26c168d6df (patch)
tree8c2fb7f6d0b95919e34ab7dd542146115354d8d7
parentRemove generated files. (diff)
downloadwireguard-openbsd-9c5059441b6effd85c8d916ef33d8a26c168d6df.tar.xz
wireguard-openbsd-9c5059441b6effd85c8d916ef33d8a26c168d6df.zip
Print the fd_set used by select in kdump.
OK guenther@ and deraadt@
-rw-r--r--sys/kern/sys_generic.c16
-rw-r--r--sys/sys/ktrace.h4
-rw-r--r--usr.bin/kdump/kdump.c36
3 files changed, 53 insertions, 3 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index c975e9622e1..8c9a8acc204 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sys_generic.c,v 1.77 2012/07/09 10:47:29 claudio Exp $ */
+/* $OpenBSD: sys_generic.c,v 1.78 2012/07/09 17:51:08 claudio Exp $ */
/* $NetBSD: sys_generic.c,v 1.24 1996/03/29 00:25:32 cgd Exp $ */
/*
@@ -574,6 +574,13 @@ sys_select(struct proc *p, void *v, register_t *retval)
getbits(ou, 1);
getbits(ex, 2);
#undef getbits
+#ifdef KTRACE
+ if (ni > 0 && KTRPOINT(p, KTR_STRUCT)) {
+ if (SCARG(uap, in)) ktrfdset(p, pibits[0], ni);
+ if (SCARG(uap, ou)) ktrfdset(p, pibits[1], ni);
+ if (SCARG(uap, ex)) ktrfdset(p, pibits[2], ni);
+ }
+#endif
if (SCARG(uap, tv)) {
error = copyin(SCARG(uap, tv), &atv, sizeof (atv));
@@ -638,6 +645,13 @@ done:
putbits(ou, 1);
putbits(ex, 2);
#undef putbits
+#ifdef KTRACE
+ if (ni > 0 && KTRPOINT(p, KTR_STRUCT)) {
+ if (SCARG(uap, in)) ktrfdset(p, pobits[0], ni);
+ if (SCARG(uap, ou)) ktrfdset(p, pobits[1], ni);
+ if (SCARG(uap, ex)) ktrfdset(p, pobits[2], ni);
+ }
+#endif
}
if (pibits[0] != (fd_set *)&bits[0])
diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h
index ceb453a802c..0e7c96fb13c 100644
--- a/sys/sys/ktrace.h
+++ b/sys/sys/ktrace.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ktrace.h,v 1.14 2012/04/10 20:39:37 mikeb Exp $ */
+/* $OpenBSD: ktrace.h,v 1.15 2012/07/09 17:51:08 claudio Exp $ */
/* $NetBSD: ktrace.h,v 1.12 1996/02/04 02:12:29 christos Exp $ */
/*
@@ -207,5 +207,7 @@ void ktrstruct(struct proc *, const char *, const void *, size_t);
ktrstruct((p), "sigaction", (s), sizeof(struct sigaction))
#define ktrrlimit(p, s) \
ktrstruct((p), "rlimit", (s), sizeof(struct rlimit))
+#define ktrfdset(p, s, l) \
+ ktrstruct((p), "fdset", (s), l)
#endif /* !_KERNEL */
diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c
index 28af4bf0ccd..fa0ec4554cf 100644
--- a/usr.bin/kdump/kdump.c
+++ b/usr.bin/kdump/kdump.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kdump.c,v 1.73 2012/06/29 05:09:58 guenther Exp $ */
+/* $OpenBSD: kdump.c,v 1.74 2012/07/09 17:51:08 claudio Exp $ */
/*-
* Copyright (c) 1988, 1993
@@ -1442,6 +1442,33 @@ ktrtfork(const struct __tfork *tf)
}
static void
+ktrfdset(const struct fd_set *fds, int len)
+{
+ int nfds, i, start = -1;
+ char sep = ' ';
+
+ nfds = len * NBBY;
+ printf("struct fd_set {");
+ for (i = 0; i <= nfds; i++)
+ if (i != nfds && FD_ISSET(i, fds)) {
+ if (start == -1)
+ start = i;
+ } else if (start != -1) {
+ putchar(sep);
+ if (start == i - 1)
+ printf("%d", start);
+ else if (start == i - 2)
+ printf("%d,%d", start, i - 1);
+ else
+ printf("%d-%d", start, i - 1);
+ sep = ',';
+ start = -1;
+ }
+
+ printf(" }\n");
+}
+
+static void
ktrstruct(char *buf, size_t buflen)
{
char *name, *data;
@@ -1517,6 +1544,13 @@ ktrstruct(char *buf, size_t buflen)
goto invalid;
memcpy(&tf, data, datalen);
ktrtfork(&tf);
+ } else if (strcmp(name, "fdset") == 0) {
+ struct fd_set *fds;
+ if ((fds = malloc(datalen)) == NULL)
+ err(1, "malloc");
+ memcpy(fds, data, datalen);
+ ktrfdset(fds, datalen);
+ free(fds);
} else {
printf("unknown structure %s\n", name);
}