From nobody Mon Apr 7 01:29:07 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZWBSh3tTZz5sNYG; Mon, 07 Apr 2025 01:29:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZWBSh0pQcz3wj6; Mon, 07 Apr 2025 01:29:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743989348; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=prbV1CCOGtwtfgTVAXT5cZRnGXxOeaIn9SZIOSxoc1w=; b=ZNC81DBvMsN+IKeDHlSvDqtlE/BpLcDGCtqUzCAjs7ZSEYYeTg24rOtsOlpguC6MOQayHU 4pY8t4mJcF7ageI+iJzwoGLlaZzeN6IRDc0kRbCRTMkPfZ4AcCm5ON5fXdQohZ6M52swWO Jrue74ZnQCBXJfUa4H0Bl/KU4hI5PBN4onMkx04CcX/uiSmspIlo283u4vDjLRiR+1trI2 n/29jVNg2F/AkejHMYr9+Z0g49MiPjcAIV0R6PpXE5eYiRpcUPjqvGd7MUwfS09YSEN8gc AGYE9Zza01WVXsAgSkI7zI8QTPW5ruK8e5MjXJois6h/NzVCNLpBf+jaEsyQhA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1743989348; a=rsa-sha256; cv=none; b=x79rG1xRe0Vdbzb2/gwBeSmk5VgIwfVNGzMRZm4Jxcufr5WgGhcU3eOB5G5OHhIFMRyPId GmUPFHGENXye5pdF/nFNxaRlinXtaDrPkZDuL47qaNEsnzyObs2fxx6HIZvPUm2wJh+rl8 9B6Ni8cUNvEMmoDbUXYnEScucD3rqRRhvebOrCYqqEWOhDidpQ6erVZxZfw2YYvN5RutPK /oqhQBm+tVN7MVFmg+kjrqDVlMggKzwLemgVKKsgiX5q7BCJmoa0KkBPmg2Na3SNfhaZim uOM38Y1pAr589mQTP0801QdL5BjgwHoEkCX81BxSakrJBbMmpF7I9ph4wJ/riw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1743989348; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=prbV1CCOGtwtfgTVAXT5cZRnGXxOeaIn9SZIOSxoc1w=; b=J2yzJ1A4v+skJgHBFnjZU36k7mspNpnoNStzHBFZKQrQyoNLbZXCe8hlVCBuXbuX227hHc YYGYNUMjJGcNZbeyvGj+6jGkpOM4AXzy/RqEirVrBslwXPdDW7HAz0kd9jA0FzSH4Wl4o2 KmBYwclcCS3nPGCVrnmOaK2c8acGjiwK8y/O0D/T1xRZE9yMJe31gySMhOvDgSgBI0Q7Pd MXgc5r0LOQ0J7wn0b6tbL920VmQBJP375Xc8X8OHsXT3znkIbXPWTFhf9Z8mVHQ6llTSj6 3etrI2fjy85CSvi2rLBuG7tlpPD+aduUHq/ZXBbh1twFcKudjB6/RQS8SSZgAg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZWBSg6qjWz92c; Mon, 07 Apr 2025 01:29:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 5371T7R5063164; Mon, 7 Apr 2025 01:29:07 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 5371T7M6063161; Mon, 7 Apr 2025 01:29:07 GMT (envelope-from git) Date: Mon, 7 Apr 2025 01:29:07 GMT Message-Id: <202504070129.5371T7M6063161@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: f4ea3580d6c2 - stable/14 - sysctl KERN_PROC_KQUEUE: implement compat32 List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: f4ea3580d6c2f734d2f9d18e711cc92160463348 Auto-Submitted: auto-generated The branch stable/14 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=f4ea3580d6c2f734d2f9d18e711cc92160463348 commit f4ea3580d6c2f734d2f9d18e711cc92160463348 Author: Konstantin Belousov AuthorDate: 2025-03-13 23:05:21 +0000 Commit: Konstantin Belousov CommitDate: 2025-04-07 01:28:21 +0000 sysctl KERN_PROC_KQUEUE: implement compat32 (cherry picked from commit fa8fdd80dff94dc848b449282080a5d85a3e6012) --- sys/compat/freebsd32/freebsd32.h | 18 +++++++++++++ sys/compat/freebsd32/freebsd32_misc.c | 50 +++++++++++++++++++++++++++++++++++ sys/compat/freebsd32/freebsd32_util.h | 5 ++++ sys/kern/kern_event.c | 38 +++++++++++++++++--------- 4 files changed, 98 insertions(+), 13 deletions(-) diff --git a/sys/compat/freebsd32/freebsd32.h b/sys/compat/freebsd32/freebsd32.h index 3dbf1b5a876d..2db154a8155c 100644 --- a/sys/compat/freebsd32/freebsd32.h +++ b/sys/compat/freebsd32/freebsd32.h @@ -446,6 +446,24 @@ struct kinfo_vm_layout32 { uint32_t kvm_spare[12]; }; +struct kinfo_knote32 { + int knt_kq_fd; + struct kevent32 knt_event; + int knt_status; + int knt_extdata; + union { + struct { + int knt_vnode_type; + uint32_t knt_vnode_fsid[2]; + uint32_t knt_vnode_fileid[2]; + char knt_vnode_fullpath[PATH_MAX]; + } knt_vnode; + struct { + uint32_t knt_pipe_ino[2]; + } knt_pipe; + }; +}; + struct kld_file_stat_1_32 { int version; /* set to sizeof(struct kld_file_stat_1) */ char name[MAXPATHLEN]; diff --git a/sys/compat/freebsd32/freebsd32_misc.c b/sys/compat/freebsd32/freebsd32_misc.c index bf5b9cdfba18..6fcb4f9a9582 100644 --- a/sys/compat/freebsd32/freebsd32_misc.c +++ b/sys/compat/freebsd32/freebsd32_misc.c @@ -709,6 +709,56 @@ freebsd32_kevent_to_kevent32(const struct kevent *kevp, struct kevent32 *ks32) } } +void +freebsd32_kinfo_knote_to_32(const struct kinfo_knote *kin, + struct kinfo_knote32 *kin32) +{ + memset(kin32, 0, sizeof(*kin32)); + CP(*kin, *kin32, knt_kq_fd); + freebsd32_kevent_to_kevent32(&kin->knt_event, &kin32->knt_event); + CP(*kin, *kin32, knt_status); + CP(*kin, *kin32, knt_extdata); + switch (kin->knt_extdata) { + case KNOTE_EXTDATA_NONE: + break; + case KNOTE_EXTDATA_VNODE: + CP(*kin, *kin32, knt_vnode.knt_vnode_type); +#if BYTE_ORDER == LITTLE_ENDIAN + kin32->knt_vnode.knt_vnode_fsid[0] = kin->knt_vnode. + knt_vnode_fsid; + kin32->knt_vnode.knt_vnode_fsid[1] = kin->knt_vnode. + knt_vnode_fsid >> 32; + kin32->knt_vnode.knt_vnode_fileid[0] = kin->knt_vnode. + knt_vnode_fileid; + kin32->knt_vnode.knt_vnode_fileid[1] = kin->knt_vnode. + knt_vnode_fileid >> 32; +#else + kin32->knt_vnode.knt_vnode_fsid[1] = kin->knt_vnode. + knt_vnode_fsid; + kin32->knt_vnode.knt_vnode_fsid[0] = kin->knt_vnode. + knt_vnode_fsid >> 32; + kin32->knt_vnode.knt_vnode_fileid[1] = kin->knt_vnode. + knt_vnode_fileid; + kin32->knt_vnode.knt_vnode_fileid[0] = kin->knt_vnode. + knt_vnode_fileid >> 32; +#endif + memcpy(kin32->knt_vnode.knt_vnode_fullpath, + kin->knt_vnode.knt_vnode_fullpath, PATH_MAX); + break; + case KNOTE_EXTDATA_PIPE: +#if BYTE_ORDER == LITTLE_ENDIAN + kin32->knt_pipe.knt_pipe_ino[0] = kin->knt_pipe.knt_pipe_ino; + kin32->knt_pipe.knt_pipe_ino[1] = kin->knt_pipe. + knt_pipe_ino >> 32; +#else + kin32->knt_pipe.knt_pipe_ino[1] = kin->knt_pipe.knt_pipe_ino; + kin32->knt_pipe.knt_pipe_ino[0] = kin->knt_pipe. + knt_pipe_ino >> 32; +#endif + break; + } +} + /* * Copy 'count' items into the destination list pointed to by uap->eventlist. */ diff --git a/sys/compat/freebsd32/freebsd32_util.h b/sys/compat/freebsd32/freebsd32_util.h index c32c7a2ef4c1..93b574ec9422 100644 --- a/sys/compat/freebsd32/freebsd32_util.h +++ b/sys/compat/freebsd32/freebsd32_util.h @@ -122,6 +122,11 @@ struct image_args; int freebsd32_exec_copyin_args(struct image_args *args, const char *fname, enum uio_seg segflg, uint32_t *argv, uint32_t *envv); +struct kinfo_knote; +struct kinfo_knote32; +void freebsd32_kinfo_knote_to_32(const struct kinfo_knote *kin, + struct kinfo_knote32 *kin32); + extern int compat_freebsd_32bit; #endif /* !_COMPAT_FREEBSD32_FREEBSD32_UTIL_H_ */ diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c index e9808e3c6e19..c7260f6bb267 100644 --- a/sys/kern/kern_event.c +++ b/sys/kern/kern_event.c @@ -75,6 +75,10 @@ #include #endif #include +#ifdef COMPAT_FREEBSD32 +#include +#include +#endif #include @@ -2873,9 +2877,12 @@ knote_status_export(int kn_status) static int kern_proc_kqueue_report_one(struct sbuf *s, struct proc *p, - int kq_fd, struct kqueue *kq, struct knote *kn) + int kq_fd, struct kqueue *kq, struct knote *kn, bool compat32 __unused) { struct kinfo_knote kin; +#ifdef COMPAT_FREEBSD32 + struct kinfo_knote32 kin32; +#endif int error; if (kn->kn_status == KN_MARKER) @@ -2889,7 +2896,13 @@ kern_proc_kqueue_report_one(struct sbuf *s, struct proc *p, KQ_UNLOCK_FLUX(kq); if (kn->kn_fop->f_userdump != NULL) (void)kn->kn_fop->f_userdump(p, kn, &kin); - error = sbuf_bcat(s, &kin, sizeof(kin)); +#ifdef COMPAT_FREEBSD32 + if (compat32) { + freebsd32_kinfo_knote_to_32(&kin, &kin32); + error = sbuf_bcat(s, &kin32, sizeof(kin32)); + } else +#endif + error = sbuf_bcat(s, &kin, sizeof(kin)); KQ_LOCK(kq); kn_leave_flux(kn); return (error); @@ -2897,7 +2910,7 @@ kern_proc_kqueue_report_one(struct sbuf *s, struct proc *p, static int kern_proc_kqueue_report(struct sbuf *s, struct proc *p, int kq_fd, - struct kqueue *kq) + struct kqueue *kq, bool compat32) { struct knote *kn; int error, i; @@ -2907,7 +2920,7 @@ kern_proc_kqueue_report(struct sbuf *s, struct proc *p, int kq_fd, for (i = 0; i < kq->kq_knlistsize; i++) { SLIST_FOREACH(kn, &kq->kq_knlist[i], kn_link) { error = kern_proc_kqueue_report_one(s, p, kq_fd, - kq, kn); + kq, kn, compat32); if (error != 0) goto out; } @@ -2917,7 +2930,7 @@ kern_proc_kqueue_report(struct sbuf *s, struct proc *p, int kq_fd, for (i = 0; i <= kq->kq_knhashmask; i++) { SLIST_FOREACH(kn, &kq->kq_knhash[i], kn_link) { error = kern_proc_kqueue_report_one(s, p, kq_fd, - kq, kn); + kq, kn, compat32); if (error != 0) goto out; } @@ -2936,6 +2949,7 @@ sysctl_kern_proc_kqueue(SYSCTL_HANDLER_ARGS) struct kqueue *kq; struct sbuf *s, sm; int error, error1, kq_fd, *name; + bool compat32; name = (int *)arg1; if ((u_int)arg2 != 2) @@ -2944,13 +2958,6 @@ sysctl_kern_proc_kqueue(SYSCTL_HANDLER_ARGS) error = pget((pid_t)name[0], PGET_HOLD | PGET_CANDEBUG, &p); if (error != 0) return (error); -#ifdef COMPAT_FREEBSD32 - if (SV_CURPROC_FLAG(SV_ILP32)) { - /* XXXKIB */ - error = EOPNOTSUPP; - goto out1; - } -#endif td = curthread; kq_fd = name[1]; @@ -2968,9 +2975,14 @@ sysctl_kern_proc_kqueue(SYSCTL_HANDLER_ARGS) goto out2; } sbuf_clear_flags(s, SBUF_INCLUDENUL); +#ifdef FREEBSD_COMPAT32 + compat32 = SV_CURPROC_FLAG(SV_ILP32); +#else + compat32 = false; +#endif kq = fp->f_data; - error = kern_proc_kqueue_report(s, p, kq_fd, kq); + error = kern_proc_kqueue_report(s, p, kq_fd, kq, compat32); error1 = sbuf_finish(s); if (error == 0) error = error1;