Index: sys/sys/ktrace.h =================================================================== --- sys/sys/ktrace.h +++ sys/sys/ktrace.h @@ -309,6 +309,8 @@ ktrstruct_error("stat", (s), sizeof(struct stat), error) #define ktrcpuset(s, l) \ ktrstruct("cpuset_t", (s), l) +#define ktrsigset(s, l) \ + ktrstruct("sigset_t", (s), l) extern u_int ktr_geniosize; #ifdef KTRACE extern int ktr_filesize_limit_signal; Index: usr.bin/kdump/kdump.c =================================================================== --- usr.bin/kdump/kdump.c +++ usr.bin/kdump/kdump.c @@ -60,6 +60,7 @@ #include #include #include +#include #include #include #include @@ -123,6 +124,7 @@ void ktrkevent(struct kevent *); void ktrstructarray(struct ktr_struct_array *, size_t); void ktrbitset(char *, struct bitset *, size_t); +void ktrsigset(char *, sigset_t *, size_t); void usage(void); #define TIMESTAMP_NONE 0x0 @@ -1995,6 +1997,29 @@ printf(" ]\n"); } +void +ktrsigset(char *name, sigset_t *set, size_t setlen) +{ + unsigned long i, c; + + if (SIGISEMPTY(*set)) { + printf("%s [ empty ]\n", name); + return; + } + printf("%s [ ", name); + c = 0; + for (i = 0; i < setlen * CHAR_BIT; i++) { + if (!BIT_ISSET(setlen, i, set)) + continue; + if (c == 0) + printf("%s", sysdecode_signal(i+1)); + else + printf(", %s", sysdecode_signal(i+1)); + c++; + } + printf(" ]\n"); +} + void ktrstruct(char *buf, size_t buflen) { @@ -2006,6 +2031,7 @@ struct stat sb; struct sockaddr_storage ss; struct bitset *set; + sigset_t *sigset; for (name = buf, namelen = 0; namelen < buflen && name[namelen] != '\0'; @@ -2054,6 +2080,15 @@ memcpy(set, data, datalen); ktrbitset(name, set, datalen); free(set); + } else if (strcmp(name, "sigset_t") == 0) { + if (datalen < 1) + goto invalid; + sigset = malloc(datalen); + if (sigset == NULL) + errx(1, "%s", strerror(ENOMEM)); + memcpy(sigset, data, datalen); + ktrsigset(name, sigset, datalen); + free(sigset); } else { printf("unknown structure\n"); }