diff options
author | 2012-07-09 17:51:08 +0000 | |
---|---|---|
committer | 2012-07-09 17:51:08 +0000 | |
commit | 9c5059441b6effd85c8d916ef33d8a26c168d6df (patch) | |
tree | 8c2fb7f6d0b95919e34ab7dd542146115354d8d7 | |
parent | Remove generated files. (diff) | |
download | wireguard-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.c | 16 | ||||
-rw-r--r-- | sys/sys/ktrace.h | 4 | ||||
-rw-r--r-- | usr.bin/kdump/kdump.c | 36 |
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); } |