git: 8547f0b80909 - stable/14 - FREEBSD_COMPAT32: add freebsd32_kevent_to_kevent32() helper
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 07 Apr 2025 01:29:06 UTC
The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=8547f0b80909e48710d6cf08fb61ada7e9fe2e1d commit 8547f0b80909e48710d6cf08fb61ada7e9fe2e1d Author: Konstantin Belousov <kib@FreeBSD.org> AuthorDate: 2025-03-13 23:03:59 +0000 Commit: Konstantin Belousov <kib@FreeBSD.org> CommitDate: 2025-04-07 01:28:21 +0000 FREEBSD_COMPAT32: add freebsd32_kevent_to_kevent32() helper (cherry picked from commit 6534c17326b27af9d85dd7f4ed5758df0385a57f) --- sys/compat/freebsd32/freebsd32_misc.c | 59 ++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index 7d945cfb6de5..bf5b9cdfba18 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -679,6 +679,36 @@ freebsd32_pselect(struct thread *td, struct freebsd32_pselect_args *uap) return (error); } +static void +freebsd32_kevent_to_kevent32(const struct kevent *kevp, struct kevent32 *ks32) +{ + uint64_t e; + int j; + + CP(*kevp, *ks32, ident); + CP(*kevp, *ks32, filter); + CP(*kevp, *ks32, flags); + CP(*kevp, *ks32, fflags); +#if BYTE_ORDER == LITTLE_ENDIAN + ks32->data1 = kevp->data; + ks32->data2 = kevp->data >> 32; +#else + ks32->data1 = kevp->data >> 32; + ks32->data2 = kevp->data; +#endif + PTROUT_CP(*kevp, *ks32, udata); + for (j = 0; j < nitems(kevp->ext); j++) { + e = kevp->ext[j]; +#if BYTE_ORDER == LITTLE_ENDIAN + ks32->ext64[2 * j] = e; + ks32->ext64[2 * j + 1] = e >> 32; +#else + ks32->ext64[2 * j] = e >> 32; + ks32->ext64[2 * j + 1] = e; +#endif + } +} + /* * Copy 'count' items into the destination list pointed to by uap->eventlist. */ @@ -687,36 +717,13 @@ freebsd32_kevent_copyout(void *arg, struct kevent *kevp, int count) { struct freebsd32_kevent_args *uap; struct kevent32 ks32[KQ_NEVENTS]; - uint64_t e; - int i, j, error; + int i, error; KASSERT(count <= KQ_NEVENTS, ("count (%d) > KQ_NEVENTS", count)); uap = (struct freebsd32_kevent_args *)arg; - for (i = 0; i < count; i++) { - CP(kevp[i], ks32[i], ident); - CP(kevp[i], ks32[i], filter); - CP(kevp[i], ks32[i], flags); - CP(kevp[i], ks32[i], fflags); -#if BYTE_ORDER == LITTLE_ENDIAN - ks32[i].data1 = kevp[i].data; - ks32[i].data2 = kevp[i].data >> 32; -#else - ks32[i].data1 = kevp[i].data >> 32; - ks32[i].data2 = kevp[i].data; -#endif - PTROUT_CP(kevp[i], ks32[i], udata); - for (j = 0; j < nitems(kevp->ext); j++) { - e = kevp[i].ext[j]; -#if BYTE_ORDER == LITTLE_ENDIAN - ks32[i].ext64[2 * j] = e; - ks32[i].ext64[2 * j + 1] = e >> 32; -#else - ks32[i].ext64[2 * j] = e >> 32; - ks32[i].ext64[2 * j + 1] = e; -#endif - } - } + for (i = 0; i < count; i++) + freebsd32_kevent_to_kevent32(&kevp[i], &ks32[i]); error = copyout(ks32, uap->eventlist, count * sizeof *ks32); if (error == 0) uap->eventlist += count;