From nobody Fri May 13 17:42:49 2022 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 69EBE1AE4E63; Fri, 13 May 2022 17:42:50 +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 4L0GFQ0yPPz4SJ6; Fri, 13 May 2022 17:42:50 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652463770; 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=ADWKvx80P/Z2/PnkvuNs2QWpvh36jqx4M6OSIkd42as=; b=NAF61gRE0X/+OeFAwNtcGYyUSs6iSKd4yPq/C7JLBEriuS6Wzw5XpKjRpvADRVcXJyjSDn OOKkbSYLUN+gGW0KNdqCKq7+aHUuWxMJfc+G14bj/BsAkCgVykmL0cfHmdpI1lKFXmSGRn UEMF5GAanasQ/QsUgvYJt/36IA2khvlEBm0pJ/EwbKVpWwOiXhHrgNQELyOpSNAu2WEJru YWbe2WtzUenvEBSpJ3DHt6MxpY9xR2f+IfBTwdimEBBvxpg7d6Ay1aVAarM/oGg8N72dSR H1eXtrJlYHIWseJT7m1TDgTp0TCcpQbhQxpHbXTC7WDD1Q7vAwLCzsuwSQyNhg== 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 E458D2738A; Fri, 13 May 2022 17:42:49 +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 24DHgneC055580; Fri, 13 May 2022 17:42:49 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24DHgnge055579; Fri, 13 May 2022 17:42:49 GMT (envelope-from git) Date: Fri, 13 May 2022 17:42:49 GMT Message-Id: <202205131742.24DHgnge055579@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: d801e93ec202 - stable/13 - Use a regset for NT_ARM_VFP. 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@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: d801e93ec202c1fc34efef0414383d031771194d Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1652463770; 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=ADWKvx80P/Z2/PnkvuNs2QWpvh36jqx4M6OSIkd42as=; b=fe0lngiS7VXNnhC6NlplE58bYgGaj6jDd2m9vWh8/m5CdK2I/LVJ55VVsCQ3KjnX8XiB8X u469YwRtfmVMqoZYR4IUXcJ02gwDiq1Vyrzq1Pp1UPDUDn0AHDeSEgDrIUIqbofcY1xdO8 hiKDJPskaHGzXl5A171tQJFFCwNgoPvy4u45Ly0pZwPZEdO0rdMdDCZYojwNzGl6XPWiIU Bb7F+aQRQDm01OWqiNYIzDE3tMuE5y06TTNRgd0iMQATTo+xrm2QtzwQtss9gLBmlDBIFb KoIJ0GOB9BIT7o81/t4KglZhZbistThJzrwHpw56eULCx3t627vjWBmktJkLag== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1652463770; a=rsa-sha256; cv=none; b=ew5qA3euQ8yOcrjf0PDBEzu8S2cTx8u0NXPfUSN5dMnTCMxtJlOTPN2vwTTuHinqCqaAQb 0bTKgj7qw0RS1wiy9MESCeKJ9J5MpP/Kp+Lwcm+nVCliODeeuAqo9aaKMswVgAgaXN9Gbp g1pLwgqROvv7N/SnCf9obd3yXHi8L0F/gtaQmgHSevEeUrnZlxfV+C4AhFP9Pfao5/QPnU qRns/ALJKFt+OMRvNwTvL4xcZ9FHZmprh89uprfVi8UW6AadP97racmIH+6I32gFrwNpI+ d9VAVi6/zCFYyPWATpDtN5R/VsZz1Ld+712JRf0W8k+Ol8cX9Y/5QMqai6X92w== 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=d801e93ec202c1fc34efef0414383d031771194d commit d801e93ec202c1fc34efef0414383d031771194d Author: John Baldwin AuthorDate: 2022-03-23 20:33:06 +0000 Commit: John Baldwin CommitDate: 2022-05-13 00:02:44 +0000 Use a regset for NT_ARM_VFP. This includes adding support for NT_ARM_VFP for 32-bit binaries running under aarch64 kernels both for ptrace(), and coredumps via the kernel and gcore. Reviewed by: andrew, markj Sponsored by: University of Cambridge, Google, Inc. Differential Revision: https://reviews.freebsd.org/D34448 (cherry picked from commit add00c381e5c9938133061c401dcba764009cafc) --- sys/arm/arm/elf_machdep.c | 14 ++------------ sys/arm/arm/ptrace_machdep.c | 33 +++++++++++++++++++++++++++++++++ sys/arm64/arm64/elf32_machdep.c | 1 - sys/arm64/arm64/freebsd32_machdep.c | 9 +++------ sys/arm64/arm64/ptrace_machdep.c | 34 ++++++++++++++++++++++++++++++++++ sys/arm64/include/vfp.h | 5 +++++ usr.bin/gcore/elfcore.c | 7 ++----- 7 files changed, 79 insertions(+), 24 deletions(-) diff --git a/sys/arm/arm/elf_machdep.c b/sys/arm/arm/elf_machdep.c index d993ba57c7d0..735c00766f9b 100644 --- a/sys/arm/arm/elf_machdep.c +++ b/sys/arm/arm/elf_machdep.c @@ -145,19 +145,9 @@ elf32_arm_abi_supported(struct image_params *imgp, int32_t *osrel __unused, } void -elf32_dump_thread(struct thread *td, void *dst, size_t *off) +elf32_dump_thread(struct thread *td __unused, void *dst __unused, + size_t *off __unused) { -#ifdef VFP - mcontext_vfp_t vfp; - - if (dst != NULL) { - get_vfpcontext(td, &vfp); - *off = elf32_populate_note(NT_ARM_VFP, &vfp, dst, sizeof(vfp), - NULL); - } else - *off = elf32_populate_note(NT_ARM_VFP, NULL, NULL, sizeof(vfp), - NULL); -#endif } bool diff --git a/sys/arm/arm/ptrace_machdep.c b/sys/arm/arm/ptrace_machdep.c index 563f962dc473..d8acc58d0fd0 100644 --- a/sys/arm/arm/ptrace_machdep.c +++ b/sys/arm/arm/ptrace_machdep.c @@ -28,12 +28,45 @@ __FBSDID("$FreeBSD$"); #include +#include #include #include +#include #ifdef VFP #include #endif +#ifdef VFP +static bool +get_arm_vfp(struct regset *rs, struct thread *td, void *buf, size_t *sizep) +{ + if (buf != NULL) { + KASSERT(*sizep == sizeof(mcontext_vfp_t), + ("%s: invalid size", __func__)); + get_vfpcontext(td, buf); + } + *sizep = sizeof(mcontext_vfp_t); + return (true); +} + +static bool +set_arm_vfp(struct regset *rs, struct thread *td, void *buf, + size_t size) +{ + KASSERT(size == sizeof(mcontext_vfp_t), ("%s: invalid size", __func__)); + set_vfpcontext(td, buf); + return (true); +} + +static struct regset regset_arm_vfp = { + .note = NT_ARM_VFP, + .size = sizeof(mcontext_vfp_t), + .get = get_arm_vfp, + .set = set_arm_vfp, +}; +ELF_REGSET(regset_arm_vfp); +#endif + int cpu_ptrace(struct thread *td, int req, void *addr, int data) { diff --git a/sys/arm64/arm64/elf32_machdep.c b/sys/arm64/arm64/elf32_machdep.c index 4322c07d6e82..4123c45e1e36 100644 --- a/sys/arm64/arm64/elf32_machdep.c +++ b/sys/arm64/arm64/elf32_machdep.c @@ -285,5 +285,4 @@ freebsd32_setregs(struct thread *td, struct image_params *imgp, void elf32_dump_thread(struct thread *td, void *dst, size_t *off) { - /* XXX: VFP */ } diff --git a/sys/arm64/arm64/freebsd32_machdep.c b/sys/arm64/arm64/freebsd32_machdep.c index f9b847d8b658..7338e2b410f9 100644 --- a/sys/arm64/arm64/freebsd32_machdep.c +++ b/sys/arm64/arm64/freebsd32_machdep.c @@ -57,10 +57,6 @@ extern void freebsd32_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask); */ #define UC32_COPY_SIZE offsetof(ucontext32_t, uc_link) -#ifdef VFP -static void get_fpcontext32(struct thread *td, mcontext32_vfp_t *); -#endif - /* * Stubs for machine dependent 32-bits system calls. */ @@ -123,7 +119,7 @@ freebsd32_sysarch(struct thread *td, struct freebsd32_sysarch_args *uap) } #ifdef VFP -static void +void get_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp) { struct pcb *pcb; @@ -155,7 +151,7 @@ get_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp) } } -static void +void set_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp) { struct pcb *pcb; @@ -172,6 +168,7 @@ set_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp) critical_exit(); } #endif + static void get_mcontext32(struct thread *td, mcontext32_t *mcp, int flags) { diff --git a/sys/arm64/arm64/ptrace_machdep.c b/sys/arm64/arm64/ptrace_machdep.c index 144ff29aff47..abf1991a51a6 100644 --- a/sys/arm64/arm64/ptrace_machdep.c +++ b/sys/arm64/arm64/ptrace_machdep.c @@ -30,6 +30,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -38,6 +39,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -47,6 +49,38 @@ __FBSDID("$FreeBSD$"); #include +#if defined(VFP) && defined(COMPAT_FREEBSD32) +static bool +get_arm_vfp(struct regset *rs, struct thread *td, void *buf, size_t *sizep) +{ + if (buf != NULL) { + KASSERT(*sizep == sizeof(mcontext32_vfp_t), + ("%s: invalid size", __func__)); + get_fpcontext32(td, buf); + } + *sizep = sizeof(mcontext32_vfp_t); + return (true); +} + +static bool +set_arm_vfp(struct regset *rs, struct thread *td, void *buf, + size_t size) +{ + KASSERT(size == sizeof(mcontext32_vfp_t), ("%s: invalid size", + __func__)); + set_fpcontext32(td, buf); + return (true); +} + +static struct regset regset_arm_vfp = { + .note = NT_ARM_VFP, + .size = sizeof(mcontext32_vfp_t), + .get = get_arm_vfp, + .set = set_arm_vfp, +}; +ELF32_REGSET(regset_arm_vfp); +#endif + int ptrace_set_pc(struct thread *td, u_long addr) { diff --git a/sys/arm64/include/vfp.h b/sys/arm64/include/vfp.h index 9808b3a8d831..650eb6938f5e 100644 --- a/sys/arm64/include/vfp.h +++ b/sys/arm64/include/vfp.h @@ -93,6 +93,11 @@ int is_fpu_kern_thread(u_int); #define VFP_FPSR_FROM_FPSCR(vpscr) ((vpscr) &~ 0x7c00000) #define VFP_FPCR_FROM_FPSCR(vpsrc) ((vpsrc) & 0x7c00000) +#ifdef COMPAT_FREEBSD32 +void get_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp); +void set_fpcontext32(struct thread *td, mcontext32_vfp_t *mcp); +#endif + #endif #endif diff --git a/usr.bin/gcore/elfcore.c b/usr.bin/gcore/elfcore.c index b93ef7ed92d6..42d90aaaf155 100644 --- a/usr.bin/gcore/elfcore.c +++ b/usr.bin/gcore/elfcore.c @@ -110,9 +110,6 @@ static void elf_detach(void); /* atexit() handler. */ static void *elf_note_prpsinfo(void *, size_t *); static void *elf_note_thrmisc(void *, size_t *); static void *elf_note_ptlwpinfo(void *, size_t *); -#if defined(__arm__) -static void *elf_note_arm_vfp(void *, size_t *); -#endif #if defined(__i386__) || defined(__amd64__) static void *elf_note_x86_xstate(void *, size_t *); #endif @@ -375,8 +372,8 @@ elf_putnotes(pid_t pid, struct sbuf *sb, size_t *sizep) elf_putregnote(NT_FPREGSET, tids[i], sb); elf_putnote(NT_THRMISC, elf_note_thrmisc, tids + i, sb); elf_putnote(NT_PTLWPINFO, elf_note_ptlwpinfo, tids + i, sb); -#if defined(__arm__) - elf_putnote(NT_ARM_VFP, elf_note_arm_vfp, tids + i, sb); +#if (defined(ELFCORE_COMPAT_32) && defined(__aarch64__)) || defined(__arm__) + elf_putregnote(NT_ARM_VFP, tids[i], sb); #endif #if defined(__i386__) || defined(__amd64__) elf_putnote(NT_X86_XSTATE, elf_note_x86_xstate, tids + i, sb);