The following diff cleans up the parameters of pselregister(), making its parameter use similar to that of pselcollect(). In addition, this removes from pselregister() the assumption that all the fd_set kinds are in one continuous array.
OK? Index: kern/sys_generic.c =================================================================== RCS file: src/sys/kern/sys_generic.c,v retrieving revision 1.133 diff -u -p -r1.133 sys_generic.c --- kern/sys_generic.c 22 Dec 2020 13:24:45 -0000 1.133 +++ kern/sys_generic.c 25 Dec 2020 15:10:05 -0000 @@ -79,7 +79,7 @@ int kqpoll_debug = 0; printf(x); \ } -int pselregister(struct proc *, fd_set *, int, int, int *); +int pselregister(struct proc *, fd_set *[], int, int *); int pselcollect(struct proc *, struct kevent *, fd_set *[]); int pollout(struct pollfd *, struct pollfd *, u_int); @@ -652,7 +652,7 @@ dopselect(struct proc *p, int nd, fd_set dosigsuspend(p, *sigmask &~ sigcantmask); /* Register kqueue events */ - error = pselregister(p, pibits[0], nd, ni, &nevents); + error = pselregister(p, pibits, nd, &nevents); if (error != 0) goto done; @@ -738,20 +738,17 @@ dopselect(struct proc *p, int nd, fd_set * per-thread queue. */ int -pselregister(struct proc *p, fd_set *ibits, int nfd, int ni, int *nregistered) +pselregister(struct proc *p, fd_set *pibits[3], int nfd, int *nregistered) { static const int evf[] = { EVFILT_READ, EVFILT_WRITE, EVFILT_EXCEPT }; static const int evff[] = { 0, 0, NOTE_OOB }; - caddr_t cibits = (caddr_t)ibits; int msk, i, j, fd, nevents = 0, error = 0; struct kevent kev; fd_mask bits; for (msk = 0; msk < 3; msk++) { - fd_set *pibits = (fd_set *)&cibits[msk*ni]; - for (i = 0; i < nfd; i += NFDBITS) { - bits = pibits->fds_bits[i/NFDBITS]; + bits = pibits[msk]->fds_bits[i / NFDBITS]; while ((j = ffs(bits)) && (fd = i + --j) < nfd) { bits &= ~(1 << j);