From nobody Mon Mar 24 02:24:50 2025 X-Original-To: dev-commits-src-main@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 4ZLcMR2K6Yz5r9ln; Mon, 24 Mar 2025 02:24:51 +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 4ZLcMQ3VCyz49RM; Mon, 24 Mar 2025 02:24:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1742783090; 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=DA2PDS3vSYSfQCEavgVzUROPPxLX9xF/bWBxGK8g48c=; b=jVTEsymjmcqMfkwGVS1JxbZfXfFOwbdzmYgLJ2g95A+O+UxpHy4eHcngaLeSv4Ve20RWhP EhMSfJScul20Qs21M4+myk76Ga+CkiVD8/AGsJJkt4aphS83L11b9mGBSw7BJISH/SipPN o+hPg69u9H9C59K3yWt2Ln7qDqE8shRYD8BUGuvGbBsUXsweng727FJzXdeM51E6xDngqm 6kKZe7b7lJPl0HFrRAaoy5cPEcNGZYZ2pFJFYz8NAfFiSdyM325hsAe9LKSmcA98uD/bh6 qrAvx5TK3XzKT2SiVYL0duav2sXRSLKLes6RZpFnPBGw+l6eaaGTrcYaCL7X1w== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1742783090; a=rsa-sha256; cv=none; b=QZXTmxyZS2xwykn2377bhIqKe4Sq2M1FdFU4St6VVhvUvX75u9MPRYz/EPhdM1yHpDrHXy M8O74IU9U//t1Ff9D5gnygEzips0khGHtT2lAvfCpjKxHeCHTs0y1TqWZtbfmz3UMlxQTx fEgad7RHnCmZRYyBnNfUrIoC3jz/WNf/mrlGhJFWRldzYQzaVYnFrRIqn5N5bH3zNjivDk L3itTgKpMRIs31JGDNZpEKCBPZRjPPJRsBuRXTHJqV4nE0MTrVaR7QKC4pleA5HmSKZJOD WJuHYmmMR5o2TjjRKKf0WGJ1Gl3ahPnl+MRREVEAXjNKpr1kRcmPEv4yeQvLhQ== 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=1742783090; 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=DA2PDS3vSYSfQCEavgVzUROPPxLX9xF/bWBxGK8g48c=; b=YqnJr0Cr1oQWSpmpoKEWZ+x696QigFfGw9RBXTO6ADQ2aGnyMRMm7l66qQJR9E+alF1TQI m1Isslzw3Il5bZAl0TqYC33cTl2T9uuLX7LtruhJnUMKHUxKJntrz4nwU6/aFBr4rQ/E4j QLhQj3xvVOc12C8hb02catL9Y/7PRRhJ/7W0T0uz1UJnZGjau8aDfKJCEHxClPbWd4skRV ZVEUo8YzKBqJWEr+3BdSy6D3jViBTs27VFSXbVJmFy/00+hiOTkOwHG3bzdOjXDZFUALvK l1REml2uhHeouOtqErjbKC1hJCVUs+apebCbCHmCQ5l0js6afBJ3IBYpz2+Pfg== 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 4ZLcMQ1DjwzbH3; Mon, 24 Mar 2025 02:24:50 +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 52O2Ooos069767; Mon, 24 Mar 2025 02:24:50 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 52O2OogU069764; Mon, 24 Mar 2025 02:24:50 GMT (envelope-from git) Date: Mon, 24 Mar 2025 02:24:50 GMT Message-Id: <202503240224.52O2OogU069764@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: fa8fdd80dff9 - main - sysctl KERN_PROC_KQUEUE: implement compat32 List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: fa8fdd80dff94dc848b449282080a5d85a3e6012 Auto-Submitted: auto-generated The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=fa8fdd80dff94dc848b449282080a5d85a3e6012 commit fa8fdd80dff94dc848b449282080a5d85a3e6012 Author: Konstantin Belousov AuthorDate: 2025-03-13 23:05:21 +0000 Commit: Konstantin Belousov CommitDate: 2025-03-24 02:24:14 +0000 sysctl KERN_PROC_KQUEUE: implement compat32 Reviewed by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D49372 --- 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 d54e268f0930..e10f5782c10f 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 dca61da714f0..4ac314f4391e 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;