? sys/kern/o ? sys/kern/x ? usr.bin/ktrace/ktrace.out Index: sys/kern/kern_ktrace.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_ktrace.c,v retrieving revision 1.187 diff -u -p -u -r1.187 kern_ktrace.c --- sys/kern/kern_ktrace.c 4 Jan 2026 01:35:33 -0000 1.187 +++ sys/kern/kern_ktrace.c 26 Jan 2026 21:52:01 -0000 @@ -669,6 +669,33 @@ ktr_execfd(int fd, u_int dtype) ktraddentry(l, kte, KTA_WAITOK); } +void +ktr_sigmask(int how, const sigset_t *nset, const sigset_t *oset, + const sigset_t *rset) +{ + struct ktrace_entry *kte; + struct ktr_sigmask* ktp; + + lwp_t *l = curlwp; + + if (!KTRPOINT(l->l_proc, KTR_SIGMASK)) + return; + + if (ktealloc(&kte, (void *)&ktp, l, KTR_SIGMASK, sizeof(*ktp))) + return; + + ktp->ktr_how = how; + ktp->ktr_nset = *nset; + + if (oset) + ktp->ktr_oset = *oset; + else + memset(&ktp->ktr_oset, 0, sizeof(ktp->ktr_oset)); + + ktp->ktr_rset = *rset; + ktraddentry(l, kte, KTA_WAITOK); +} + static void ktr_kmem(lwp_t *l, int type, const void *bf, size_t len) { Index: sys/kern/kern_stub.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_stub.c,v retrieving revision 1.52 diff -u -p -u -r1.52 kern_stub.c --- sys/kern/kern_stub.c 4 Jan 2026 01:41:59 -0000 1.52 +++ sys/kern/kern_stub.c 26 Jan 2026 21:52:01 -0000 @@ -124,6 +124,7 @@ __strong_alias(ktr_mib,nullop); __strong_alias(ktr_execarg,nullop); __strong_alias(ktr_execenv,nullop); __strong_alias(ktr_execfd,nullop); +__strong_alias(ktr_sigmask,nullop); __strong_alias(sys_fktrace,sys_nosys); /* Syscalls */ __strong_alias(sys_ktrace,sys_nosys); Index: sys/kern/sys_sig.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_sig.c,v retrieving revision 1.61 diff -u -p -u -r1.61 sys_sig.c --- sys/kern/sys_sig.c 19 Dec 2025 04:43:16 -0000 1.61 +++ sys/kern/sys_sig.c 26 Jan 2026 21:52:01 -0000 @@ -80,6 +80,7 @@ __KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v #include #include #include +#include #include #include @@ -614,6 +615,7 @@ sigprocmask1(struct lwp *l, int how, con return EINVAL; } sigminusset(&sigcantmask, mask); + ktrsigmask(how, nss, oss, mask); if (more && sigispending(l, 0)) { /* * Check for pending signals on return to user. Index: sys/sys/ktrace.h =================================================================== RCS file: /cvsroot/src/sys/sys/ktrace.h,v retrieving revision 1.71 diff -u -p -u -r1.71 ktrace.h --- sys/sys/ktrace.h 6 Apr 2025 19:13:06 -0000 1.71 +++ sys/sys/ktrace.h 26 Jan 2026 21:52:01 -0000 @@ -235,6 +235,16 @@ struct ktr_execfd { }; /* + * KTR_SIGMASK - Signal mask change + */ +#define KTR_SIGMASK 16 +struct ktr_sigmask { + int ktr_how; + sigset_t ktr_nset; + sigset_t ktr_oset; + sigset_t ktr_rset; +}; +/* * kernel trace points (in p_traceflag) */ #define KTRFAC_MASK 0x00ffffff @@ -250,6 +260,7 @@ struct ktr_execfd { #define KTRFAC_EXEC_ENV (1< #include #include +#include #include #include #include @@ -132,6 +133,7 @@ static void ktrcsw(struct ktr_csw *); static void ktruser(struct ktr_user *, int); static void ktrmib(int *, int); static void ktrexecfd(struct ktr_execfd *); +static void ktrsigmask(struct ktr_sigmask *); static void usage(void) __dead; static void eprint(int); static void rprint(register_t); @@ -346,6 +348,9 @@ main(int argc, char **argv) case KTR_MIB: ktrmib(m, ktrlen); break; + case KTR_SIGMASK: + ktrsigmask(m); + break; default: putchar('\n'); hexdump_buf(m, ktrlen, word_size ? word_size : 1); @@ -477,6 +482,10 @@ dumpheader(struct ktr_header *kth) case KTR_MIB: type = "MIB"; break; + case KTR_SIGMASK: + type = "MASK"; + break; + break; default: (void)snprintf(unknown, sizeof(unknown), "UNKNOWN(%d)", kth->ktr_type); @@ -1080,6 +1089,64 @@ ktrexecfd(struct ktr_execfd *ktr) printf("UNKNOWN(%u) %d\n", ktr->ktr_dtype, ktr->ktr_fd); } +static int +psigset(char *buf, size_t size, const sigset_t *set) +{ + size_t pos = 0; + bool first = true; + bool in_range = false; + int range_start = 0; + int ret; + + for (int sig = 1; sig <= NSIG; sig++) { + bool isset = sigismember(set, sig) == 1; + if (!isset) { + in_range = false; + continue; + } + + if (!in_range) { + ret = snprintf(buf + pos, size - pos, "%s%d", + first ? "" : ",", sig); + if (ret < 0) + return -1; + pos += ret; + range_start = sig; + in_range = true; + first = false; + } + + bool isnextset = sig < NSIG && sigismember(set, sig + 1) == 1; + if (!isnextset && sig > range_start) { + ret = snprintf(buf + pos, size - pos, "-%d", sig); + if (ret < 0) + return -1; + pos += ret; + in_range = false; + } + } + + if (first && size > 0) + buf[0] = '\0'; + + return (pos < size) ? (int)pos : -1; +} + +static void +ktrsigmask(struct ktr_sigmask *ktr) +{ + static const char *how[] = { + "*SIG_ZERO*", "SIG_BLOCK", "SIG_UNBLOCK", "SIG_SETMASK" + }; + char new[512], old[512], res[512]; + + psigset(new, sizeof(new), &ktr->ktr_nset); + psigset(old, sizeof(old), &ktr->ktr_oset); + psigset(res, sizeof(res), &ktr->ktr_rset); + printf("sigprocmask(%s, new=[%s], old=[%s]) = [%s]\n", + how[ktr->ktr_how & 3], new, old, res); +} + static void rprint(register_t ret) { Index: usr.bin/ktrace/ktrace.h =================================================================== RCS file: /cvsroot/src/usr.bin/ktrace/ktrace.h,v retrieving revision 1.21 diff -u -p -u -r1.21 ktrace.h --- usr.bin/ktrace/ktrace.h 2 Apr 2020 17:41:33 -0000 1.21 +++ usr.bin/ktrace/ktrace.h 26 Jan 2026 21:52:01 -0000 @@ -32,7 +32,7 @@ */ #define DEF_POINTS (KTRFAC_SYSCALL | KTRFAC_SYSRET | KTRFAC_NAMEI | \ - KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_EMUL | KTRFAC_USER) + KTRFAC_GENIO | KTRFAC_PSIG | KTRFAC_EMUL | KTRFAC_USER | KTRFAC_SIGMASK) #define ALL_POINTS KTRFAC_MASK