From nobody Wed Jul 13 16:47:48 2022 X-Original-To: dev-commits-src-all@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 3DB2C17FD310; Wed, 13 Jul 2022 16:47:49 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Ljk7m71TZz3Wvb; Wed, 13 Jul 2022 16:47:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657730869; 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=jNRMy2R3vqntrtslhcQXIfEaFOp+PxLXsZ6t867A6gU=; b=WliWXCjmSVVeiqN6HesXO6CsbKC3+2eRiI8aYgxaIKjHK+JzkS7HQ+lXv5b7SDv5jmoSe5 WmP6Myxg5Eashn3EmAEAwvZlCbq1Q6kHu7kCcq4Ai8vfvZ7OGxb4hlrYZld7HnIQM/DDzg lvxmoxgIod/CVALPw+wFIQ89sFrAQ26TKJAxj9cIA7Y0yhLwvVC/E+gio1dv5EzEoHtUaY i2b0AdRd6ooW9qGDCD6cU/SeK65GncozK6tjbEV9h6mLl8C5CBdmxkKBXvifSRSqFZGi2o W4trAvGEy51BnWX4F5+HjRqSiEfac0P0c7BZPgNhsogx1GdTyBpa4TmdfH/Seg== 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 4Ljk7m676FzWC3; Wed, 13 Jul 2022 16:47:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 26DGlm2R052431; Wed, 13 Jul 2022 16:47:48 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 26DGlmmi052430; Wed, 13 Jul 2022 16:47:48 GMT (envelope-from git) Date: Wed, 13 Jul 2022 16:47:48 GMT Message-Id: <202207131647.26DGlmmi052430@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: John Baldwin Subject: git: 89d070d03c60 - stable/13 - Add register sets for NT_THRMISC and NT_PTLWPINFO. List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhb X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 89d070d03c60747b87ff6ef19022c81ed1e13901 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1657730869; 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=jNRMy2R3vqntrtslhcQXIfEaFOp+PxLXsZ6t867A6gU=; b=uQSxw6MfdzAtBE3qcxV0HMZ1+Tnb1Y9Ha89y1e4/u/IgomzV41R5t1GZ7hw9k/c4KiCpkA vwXrijBGESLkwxbNU/v+F2gqgib7d9ZGybbhpQOqhTgSSuZ7gNCi8H2TuKBarcrUb/P5pc pcgzt8MxYUokCjGXm9e/FLIlpzFrsFXS799/qkwY2QIEGiq5CbyaK1SfgZUmiDGzSurxnR fKiHYRZXgzt7BdtCPvLqm4lL60VgClmEZGZewSH4vlDcdcN/lkoZFV6+8KPeF+xkwQQsMd 4dZcgsUX6wYKmIavNToiQy7g0o4a6jCB2/QWrI8QoWtzB6XqJ3xHK/OSzMJ8xw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1657730869; a=rsa-sha256; cv=none; b=mqhkJ1yI+nOSvenvYXksX0BmOCSn6XWJe9pBY+ruQ/3BhD9HXzNJDIMMTK08kAYyNsOrCU 3OCBdA91xyOq28FdjFJg4JKpHAs/MU24zQT53AYwFnYzmFhhSo27pv0igsvniodguZzydt kknzvCRmL3I7m4yjLlo6B6QQebrk6fQO7ZgLd7tgvZ/i60ulBpnL/LQ7Qe4fNzzdUi/3XG hSoMvIlPZOJbGx6HH/DQhxKgSYWwsufpxdA5Ug8bLnvE7Ez3n284wc05eUDq5LHHMUQAef YC9yxmwQM8T9b1NHbUFw3yLAGvpKnRnwZsegT7NZAn/FrMco//Wx6Xmk2BjNEg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by jhb: URL: https://cgit.FreeBSD.org/src/commit/?id=89d070d03c60747b87ff6ef19022c81ed1e13901 commit 89d070d03c60747b87ff6ef19022c81ed1e13901 Author: John Baldwin AuthorDate: 2022-06-30 17:04:02 +0000 Commit: John Baldwin CommitDate: 2022-07-13 16:24:54 +0000 Add register sets for NT_THRMISC and NT_PTLWPINFO. For the kernel this is mostly a non-functional change. However, this will be useful for simplifying gcore(1). Reviewed by: markj MFC after: 2 weeks Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D35666 (cherry picked from commit 0288d4277faf77c37d23efce73883eb3ef1a353c) --- sys/kern/imgact_elf.c | 129 ++++++++++++++++++++++++++------------------------ 1 file changed, 68 insertions(+), 61 deletions(-) diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index b57065a28a99..3723b3faebbb 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -1529,8 +1529,6 @@ static void __elfN(putnote)(struct thread *td, struct note_info *, struct sbuf * static void __elfN(note_prpsinfo)(void *, struct sbuf *, size_t *); static void __elfN(note_threadmd)(void *, struct sbuf *, size_t *); -static void __elfN(note_thrmisc)(void *, struct sbuf *, size_t *); -static void __elfN(note_ptlwpinfo)(void *, struct sbuf *, size_t *); static void __elfN(note_procstat_auxv)(void *, struct sbuf *, size_t *); static void __elfN(note_procstat_proc)(void *, struct sbuf *, size_t *); static void __elfN(note_procstat_psstrings)(void *, struct sbuf *, size_t *); @@ -1832,10 +1830,6 @@ __elfN(prepare_notes)(struct thread *td, struct note_info_list *list, thr = td; while (thr != NULL) { size += __elfN(prepare_register_notes)(td, list, thr); - size += __elfN(register_note)(td, list, NT_THRMISC, - __elfN(note_thrmisc), thr); - size += __elfN(register_note)(td, list, NT_PTLWPINFO, - __elfN(note_ptlwpinfo), thr); size += __elfN(register_note)(td, list, -1, __elfN(note_threadmd), thr); @@ -2132,6 +2126,7 @@ typedef struct fpreg32 elf_prfpregset_t; typedef struct fpreg32 elf_fpregset_t; typedef struct reg32 elf_gregset_t; typedef struct thrmisc32 elf_thrmisc_t; +typedef struct ptrace_lwpinfo32 elf_lwpinfo_t; #define ELF_KERN_PROC_MASK KERN_PROC_MASK32 typedef struct kinfo_proc32 elf_kinfo_proc_t; typedef uint32_t elf_ps_strings_t; @@ -2142,6 +2137,7 @@ typedef prfpregset_t elf_prfpregset_t; typedef prfpregset_t elf_fpregset_t; typedef gregset_t elf_gregset_t; typedef thrmisc_t elf_thrmisc_t; +typedef struct ptrace_lwpinfo elf_lwpinfo_t; #define ELF_KERN_PROC_MASK 0 typedef struct kinfo_proc elf_kinfo_proc_t; typedef vm_offset_t elf_ps_strings_t; @@ -2304,6 +2300,72 @@ static struct regset __elfN(regset_fpregset) = { }; ELF_REGSET(__elfN(regset_fpregset)); +static bool +__elfN(get_thrmisc)(struct regset *rs, struct thread *td, void *buf, + size_t *sizep) +{ + elf_thrmisc_t *thrmisc; + + if (buf != NULL) { + KASSERT(*sizep == sizeof(*thrmisc), + ("%s: invalid size", __func__)); + thrmisc = buf; + bzero(thrmisc, sizeof(*thrmisc)); + strcpy(thrmisc->pr_tname, td->td_name); + } + *sizep = sizeof(*thrmisc); + return (true); +} + +static struct regset __elfN(regset_thrmisc) = { + .note = NT_THRMISC, + .size = sizeof(elf_thrmisc_t), + .get = __elfN(get_thrmisc), +}; +ELF_REGSET(__elfN(regset_thrmisc)); + +static bool +__elfN(get_lwpinfo)(struct regset *rs, struct thread *td, void *buf, + size_t *sizep) +{ + elf_lwpinfo_t pl; + size_t size; + int structsize; + + size = sizeof(structsize) + sizeof(pl); + if (buf != NULL) { + KASSERT(*sizep == size, ("%s: invalid size", __func__)); + structsize = sizeof(pl); + memcpy(buf, &structsize, sizeof(structsize)); + bzero(&pl, sizeof(pl)); + pl.pl_lwpid = td->td_tid; + pl.pl_event = PL_EVENT_NONE; + pl.pl_sigmask = td->td_sigmask; + pl.pl_siglist = td->td_siglist; + if (td->td_si.si_signo != 0) { + pl.pl_event = PL_EVENT_SIGNAL; + pl.pl_flags |= PL_FLAG_SI; +#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 + siginfo_to_siginfo32(&td->td_si, &pl.pl_siginfo); +#else + pl.pl_siginfo = td->td_si; +#endif + } + strcpy(pl.pl_tdname, td->td_name); + /* XXX TODO: supply more information in struct ptrace_lwpinfo*/ + memcpy((int *)buf + 1, &pl, sizeof(pl)); + } + *sizep = size; + return (true); +} + +static struct regset __elfN(regset_lwpinfo) = { + .note = NT_PTLWPINFO, + .size = sizeof(int) + sizeof(elf_lwpinfo_t), + .get = __elfN(get_lwpinfo), +}; +ELF_REGSET(__elfN(regset_lwpinfo)); + static size_t __elfN(prepare_register_notes)(struct thread *td, struct note_info_list *list, struct thread *target_td) @@ -2337,61 +2399,6 @@ __elfN(prepare_register_notes)(struct thread *td, struct note_info_list *list, return (size); } -static void -__elfN(note_thrmisc)(void *arg, struct sbuf *sb, size_t *sizep) -{ - struct thread *td; - elf_thrmisc_t thrmisc; - - td = arg; - if (sb != NULL) { - KASSERT(*sizep == sizeof(thrmisc), ("invalid size")); - bzero(&thrmisc, sizeof(thrmisc)); - strcpy(thrmisc.pr_tname, td->td_name); - sbuf_bcat(sb, &thrmisc, sizeof(thrmisc)); - } - *sizep = sizeof(thrmisc); -} - -static void -__elfN(note_ptlwpinfo)(void *arg, struct sbuf *sb, size_t *sizep) -{ - struct thread *td; - size_t size; - int structsize; -#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 - struct ptrace_lwpinfo32 pl; -#else - struct ptrace_lwpinfo pl; -#endif - - td = arg; - size = sizeof(structsize) + sizeof(pl); - if (sb != NULL) { - KASSERT(*sizep == size, ("invalid size")); - structsize = sizeof(pl); - sbuf_bcat(sb, &structsize, sizeof(structsize)); - bzero(&pl, sizeof(pl)); - pl.pl_lwpid = td->td_tid; - pl.pl_event = PL_EVENT_NONE; - pl.pl_sigmask = td->td_sigmask; - pl.pl_siglist = td->td_siglist; - if (td->td_si.si_signo != 0) { - pl.pl_event = PL_EVENT_SIGNAL; - pl.pl_flags |= PL_FLAG_SI; -#if defined(COMPAT_FREEBSD32) && __ELF_WORD_SIZE == 32 - siginfo_to_siginfo32(&td->td_si, &pl.pl_siginfo); -#else - pl.pl_siginfo = td->td_si; -#endif - } - strcpy(pl.pl_tdname, td->td_name); - /* XXX TODO: supply more information in struct ptrace_lwpinfo*/ - sbuf_bcat(sb, &pl, sizeof(pl)); - } - *sizep = size; -} - /* * Allow for MD specific notes, as well as any MD * specific preparations for writing MI notes.