From nobody Mon Oct 21 15:05:11 2024 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 4XXJWr0NyGz5ZNrb; Mon, 21 Oct 2024 15:05:12 +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 "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4XXJWq1kh7z4fHs; Mon, 21 Oct 2024 15:05:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1729523111; 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=0vToR4MQ4/Gd6lpBO19j8jhbNOm5gd+wMlf5O2WhnzQ=; b=PyW9iW1heZrzdJXg7dJ8r9NGIAy8j+SpHHfFiSYhRfdr4+oDyDbwRMHVP1RT2GastSJhEa mOm+BT2Bod7yIat8SywDFvqU7cE2aSh7AJeWn5PGoMVYFuSu6iLW8TchExkTPbiUgXY4VC FPjSQ1CyT26blLkIy3X+nlkUwvxlfDebOHe9yRtO4rdu/5UvJzmMjkMqfGXsFpKCpU2YgX H8v5QoH0hRoiNMrDlLDyxmxmvWaMUaDmo2f4+p4Akkv4CpCoxsEoARAbnZsvSeNiDkiDOw N5VSB4F79Az7EnrbyO6fGURAueXXGwAqU2F3OCIf+kRr3EC4blqgbckdVwoWEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1729523111; 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=0vToR4MQ4/Gd6lpBO19j8jhbNOm5gd+wMlf5O2WhnzQ=; b=Jk7p4dkASpcR6ry7iPpKBG8j7g65e526oL1N5PWqEnwpOUOxWQiEuhALKPLgBGrsjRL5yG 7uR5HrlurpsFC/y2eUMEU7PAc7zRfH+TBdMZaaD6ypktxfHiofCsTOX3O7LLsQBV61ACwh HbP59w/K4rUcWlOvk4r7D8ixAKP7gYmJwSufLtP/kYIy8y4eWIJfMQpWf1gxiR8ZruYa4O X6Z5+UmUU1p/BHuF+qaXBlKzrZBCODo8X/JEsKQJqS1s1X47YLO6WTUf8tXm7+/85V81Mj FvJ6uR6AsZJp+dLWlPu8aRcjH1eX9+oVT6oDv94+jsD6vOa4pfpmcOm70ojpSw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1729523111; a=rsa-sha256; cv=none; b=fsVYD7bsX8zKY0K7LtXRtUlK25BzNaPhoLfnpV7TDKugV7mFA4QwKHmX7q0vm5zepCuUMB 84fe7nnCGCI8vKcrH80O0yC5F+fwOwvTGn4A6xtRgqaghFC7nMouTM3q9onWX3HPoEio+r Prr/Gr3zJofEhsXg0FDAt+WuRlbLib0RejDEC1qLVYSLdbNxfuk4dxo5kOs7oGGmUeaEXz TLNMpL3897iwq9CDrIA8HcNo+KIWQOPhWqZ5Irq3frUa/3M3dZ150ZgcJEg2i7Fh5DrjZJ fj2MbCraVHcG/+N/ricoBw/Zi0IRE0gBuGm/K/njdlwq2MJTZTOjv0oD7lzUVQ== 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 4XXJWq1LzkzZfy; Mon, 21 Oct 2024 15:05:11 +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 49LF5B5S046989; Mon, 21 Oct 2024 15:05:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 49LF5Bok046986; Mon, 21 Oct 2024 15:05:11 GMT (envelope-from git) Date: Mon, 21 Oct 2024 15:05:11 GMT Message-Id: <202410211505.49LF5Bok046986@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Andrew Turner Subject: git: 7588c7024ed9 - stable/14 - arm64: Add the SVE registers to the signal frame 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 7588c7024ed9b3d9845529edd56e46b675430a02 Auto-Submitted: auto-generated The branch stable/14 has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=7588c7024ed9b3d9845529edd56e46b675430a02 commit 7588c7024ed9b3d9845529edd56e46b675430a02 Author: Andrew Turner AuthorDate: 2024-09-27 13:37:03 +0000 Commit: Andrew Turner CommitDate: 2024-10-21 15:03:26 +0000 arm64: Add the SVE registers to the signal frame Use the new extended register support in the arm64 signal frame to handle the SVE registers. As these registers alias the VFP registers we use the floating point register values to restore the lower bits of the SVE registers. This is to support software that doesn't understand SVE to continue working. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D43307 (cherry picked from commit e45132e978030f0aa964d975a9fbad5614f260bd) --- sys/arm64/arm64/exec_machdep.c | 88 +++++++++++++++++++++++++++++++++++++++++- sys/arm64/include/ucontext.h | 8 ++++ 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/sys/arm64/arm64/exec_machdep.c b/sys/arm64/arm64/exec_machdep.c index 31191ec21602..67760850c56a 100644 --- a/sys/arm64/arm64/exec_machdep.c +++ b/sys/arm64/arm64/exec_machdep.c @@ -464,9 +464,10 @@ set_mcontext(struct thread *td, mcontext_t *mcp) #define PSR_13_MASK 0xfffffffful struct arm64_reg_context ctx; struct trapframe *tf = td->td_frame; + struct pcb *pcb; uint64_t spsr; vm_offset_t addr; - int error; + int error, seen_types; bool done; spsr = mcp->mc_gpregs.gp_spsr; @@ -512,7 +513,11 @@ set_mcontext(struct thread *td, mcontext_t *mcp) /* Read any register contexts we find */ if (mcp->mc_ptr != 0) { addr = mcp->mc_ptr; + pcb = td->td_pcb; + +#define CTX_TYPE_FLAG_SVE (1 << 0) + seen_types = 0; done = false; do { if (!__is_aligned(addr, @@ -524,6 +529,38 @@ set_mcontext(struct thread *td, mcontext_t *mcp) return (error); switch (ctx.ctx_id) { +#ifdef VFP + case ARM64_CTX_SVE: { + struct sve_context sve_ctx; + size_t buf_size; + + if ((seen_types & CTX_TYPE_FLAG_SVE) != 0) + return (EINVAL); + seen_types |= CTX_TYPE_FLAG_SVE; + + if (pcb->pcb_svesaved == NULL) + return (EINVAL); + + /* XXX: Check pcb_svesaved is valid */ + + buf_size = sve_buf_size(td); + /* Check the size is valid */ + if (ctx.ctx_size != + (sizeof(sve_ctx) + buf_size)) + return (EINVAL); + + memset(pcb->pcb_svesaved, 0, + sve_max_buf_size()); + + /* Copy the SVE registers from userspace */ + if (copyin((void *)(addr + sizeof(sve_ctx)), + pcb->pcb_svesaved, buf_size) != 0) + return (EINVAL); + + pcb->pcb_fpflags |= PCB_FP_SVEVALID; + break; + } +#endif case ARM64_CTX_END: done = true; break; @@ -533,6 +570,8 @@ set_mcontext(struct thread *td, mcontext_t *mcp) addr += ctx.ctx_size; } while (!done); + +#undef CTX_TYPE_FLAG_SVE } return (0); @@ -593,7 +632,7 @@ set_fpcontext(struct thread *td, mcontext_t *mcp) sizeof(mcp->mc_fpregs.fp_q)); curpcb->pcb_fpustate.vfp_fpcr = mcp->mc_fpregs.fp_cr; curpcb->pcb_fpustate.vfp_fpsr = mcp->mc_fpregs.fp_sr; - curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags & PCB_FP_USERMASK; + curpcb->pcb_fpflags = mcp->mc_fpregs.fp_flags & PCB_FP_STARTED; } #endif } @@ -613,6 +652,13 @@ sys_sigreturn(struct thread *td, struct sigreturn_args *uap) if (error != 0) return (error); + /* + * Sync the VFP and SVE registers. To be backwards compatible we + * use the VFP registers to restore the lower bits of the SVE + * register it aliases. + */ + vfp_to_sve_sync(td); + /* Restore signal mask. */ kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0); @@ -638,9 +684,47 @@ sendsig_ctx_end(struct thread *td, vm_offset_t *addrp) return (true); } +static bool +sendsig_ctx_sve(struct thread *td, vm_offset_t *addrp) +{ + struct sve_context ctx; + struct pcb *pcb; + size_t buf_size; + vm_offset_t ctx_addr; + + pcb = td->td_pcb; + /* Do nothing if sve hasn't started */ + if (pcb->pcb_svesaved == NULL) + return (true); + + MPASS(pcb->pcb_svesaved != NULL); + + buf_size = sve_buf_size(td); + + /* Address for the full context */ + *addrp -= sizeof(ctx) + buf_size; + ctx_addr = *addrp; + + memset(&ctx, 0, sizeof(ctx)); + ctx.sve_ctx.ctx_id = ARM64_CTX_SVE; + ctx.sve_ctx.ctx_size = sizeof(ctx) + buf_size; + ctx.sve_vector_len = pcb->pcb_sve_len; + ctx.sve_flags = 0; + + /* Copy out the header and data */ + if (copyout(&ctx, (void *)ctx_addr, sizeof(ctx)) != 0) + return (false); + if (copyout(pcb->pcb_svesaved, (void *)(ctx_addr + sizeof(ctx)), + buf_size) != 0) + return (false); + + return (true); +} + typedef bool(*ctx_func)(struct thread *, vm_offset_t *); static const ctx_func ctx_funcs[] = { sendsig_ctx_end, /* Must be first to end the linked list */ + sendsig_ctx_sve, NULL, }; diff --git a/sys/arm64/include/ucontext.h b/sys/arm64/include/ucontext.h index dedbd061ec6b..a4f0ee243b3a 100644 --- a/sys/arm64/include/ucontext.h +++ b/sys/arm64/include/ucontext.h @@ -62,6 +62,14 @@ struct arm64_reg_context { }; #define ARM64_CTX_END 0xa5a5a5a5 +#define ARM64_CTX_SVE 0x00657673 + +struct sve_context { + struct arm64_reg_context sve_ctx; + __uint16_t sve_vector_len; + __uint16_t sve_flags; + __uint16_t sve_reserved[2]; +}; struct __mcontext { struct gpregs mc_gpregs;