From nobody Tue Nov 26 11:20:06 2024 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 4XyKqV6PWTz5fKJg; Tue, 26 Nov 2024 11:20:06 +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 4XyKqV5sY6z3xNZ; Tue, 26 Nov 2024 11:20:06 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1732620006; 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=lc8Zsa4DQclvTIyS4T3u+N1ao0IV0QVzKCORUpZ4APg=; b=nN4/cRr8cOCR5spuzKPi2RUtYPEPOxz1MjJ4wXIrk4fVkuN8k37OB+aXG+BOUFZGnRX4fY Us3X45BEVLX1HBMj1eLw6Ea/bLqjAWOSDRo1kPxc1ZxNWkQM9aZazhFSOVfRM9PApTp/vd 7DwUIybhtp/t81KMFB0SEaD0w+GcbyT+utv4ZX+i0HlOhvc2G0cdzqeFLS01hCKhvWHqT3 qV2qAx/CxD1xophdHA058tk69ENyHDsGywRhutA6eYdI/orYFDkAS4MIQ0Sd3IeAOyhSgJ MoIrv+M3x6sFWCHlwkVwSXNAKa1DO0EKL/r3pBk6kiwE/kOLwnJTAUr6vC0kEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1732620006; 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=lc8Zsa4DQclvTIyS4T3u+N1ao0IV0QVzKCORUpZ4APg=; b=Lep8SQVsXQ4fZJCmSY3tl4a2ZCT6Bfst0EaD3Zph4sp2EzwUP0f8Xi6vH7gOB2RBzVWPu9 SjI8gGxgmqb/JmXcrGM5TrjInyzIOYgshMKcWZjk41/xX64yT3jc87mOuLLXUKp2FcaP5H NE4oUxSNuu6To9hvYJxDc12+6PZCeUUxgWepajsWZnfw7Y0gpMbccFg9m8roYsKZGdd/Qh XgUqFtLYpqt/Ag+bY+kU/7/lb9chTOdZDm7t4V52k1yfGw9QU5QD8WGBfRvsnevqkvmawK 1iW4N1OqeI2FMgGRq16xPbo/mjZE8LXFggflbbykB1i7Pkmpa4D9wdmGzYgewQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1732620006; a=rsa-sha256; cv=none; b=IcGJP0MvBtESHPKkhCZQ+r4BOQeoAHd+sCdpQZ6DeO6+gjoObSySpiXl3EPGESQwt5Ntk6 6kNba63hCHxQUTHtL2xBoNFI2JZKOkDXs+2rLuxuiXTh2l+GIT/QjXjA1p6z1rYyWuYLSv PuXlt2GKniI+gYS+eQ6IrACmnBnK37RX0r9LL5ZMeLUQxK0OPQrRGK3vJB2QTWay2u2PyI 54xXN4tgpbjnKKZq6Akb7JnAnep9qLNT8jaMucLyebHueVuT1kk24zIB7z03qq9OTMmHA8 QuiDlflBRL5BnNau4Vv9056ird9/7RUAsF+oBalObHWI5LQetFCD/4eqnW0gNg== 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 4XyKqV5LXBzN5B; Tue, 26 Nov 2024 11:20:06 +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 4AQBK6gb095615; Tue, 26 Nov 2024 11:20:06 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 4AQBK6EF095610; Tue, 26 Nov 2024 11:20:06 GMT (envelope-from git) Date: Tue, 26 Nov 2024 11:20:06 GMT Message-Id: <202411261120.4AQBK6EF095610@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Michal Meloun Subject: git: 3abef90c325d - main - arm: Fix VFP state corruption during signal delivery 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: mmel X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 3abef90c325dc9badc51cc0e195db3fd5548ff53 Auto-Submitted: auto-generated The branch main has been updated by mmel: URL: https://cgit.FreeBSD.org/src/commit/?id=3abef90c325dc9badc51cc0e195db3fd5548ff53 commit 3abef90c325dc9badc51cc0e195db3fd5548ff53 Author: Michal Meloun AuthorDate: 2024-11-26 11:08:21 +0000 Commit: Michal Meloun CommitDate: 2024-11-26 11:18:30 +0000 arm: Fix VFP state corruption during signal delivery D37419 corrupts VFP context store on signal delivery and D38696 corrupts PCB because it performs a binary copy between structures with different layouts. Revert the problematic parts of these commits to have signals delivery working. Unfortunately, there are more problems with these revisions and more fixes need to be developed. Fixes: 6926e2699ae55080f860488895a2a9aa6e6d9b4d Fixes: 4d2427f2c4451babe1bad600ae02c8a7c66031fe MFC after: 4 weeks --- sys/arm/arm/exec_machdep.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/sys/arm/arm/exec_machdep.c b/sys/arm/arm/exec_machdep.c index 0b9468c756a9..011085841938 100644 --- a/sys/arm/arm/exec_machdep.c +++ b/sys/arm/arm/exec_machdep.c @@ -101,14 +101,19 @@ get_vfpcontext(struct thread *td, mcontext_vfp_t *vfp) P_SHOULDSTOP(td->td_proc)); pcb = td->td_pcb; - if ((pcb->pcb_fpflags & PCB_FP_STARTED) != 0 && td == curthread) { + if (td == curthread) { critical_enter(); vfp_store(&pcb->pcb_vfpstate, false); critical_exit(); } KASSERT(pcb->pcb_vfpsaved == &pcb->pcb_vfpstate, ("Called get_vfpcontext while the kernel is using the VFP")); - memcpy(vfp, &pcb->pcb_vfpstate, sizeof(*vfp)); + + memset(vfp, 0, sizeof(*vfp)); + memcpy(vfp->mcv_reg, pcb->pcb_vfpstate.reg, + sizeof(vfp->mcv_reg)); + vfp->mcv_fpscr = pcb->pcb_vfpstate.fpscr; + } /* @@ -127,7 +132,10 @@ set_vfpcontext(struct thread *td, mcontext_vfp_t *vfp) } KASSERT(pcb->pcb_vfpsaved == &pcb->pcb_vfpstate, ("Called set_vfpcontext while the kernel is using the VFP")); - memcpy(&pcb->pcb_vfpstate, vfp, sizeof(*vfp)); + memcpy(pcb->pcb_vfpstate.reg, vfp->mcv_reg, + sizeof(pcb->pcb_vfpstate.reg)); + pcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr; + } #endif @@ -163,8 +171,6 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret) { struct trapframe *tf = td->td_frame; __greg_t *gr = mcp->__gregs; - mcontext_vfp_t mcontext_vfp; - int rv; if (clear_ret & GET_MC_CLEAR_RET) { gr[_REG_R0] = 0; @@ -189,19 +195,9 @@ get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret) gr[_REG_LR] = tf->tf_usr_lr; gr[_REG_PC] = tf->tf_pc; -#ifdef VFP - if (mcp->mc_vfp_size != sizeof(mcontext_vfp_t)) - return (EINVAL); - get_vfpcontext(td, &mcontext_vfp); -#else - bzero(&mcontext_vfp, sizeof(mcontext_vfp)); -#endif - - if (mcp->mc_vfp_ptr != NULL) { - rv = copyout(&mcontext_vfp, mcp->mc_vfp_ptr, sizeof(mcontext_vfp)); - if (rv != 0) - return (rv); - } + mcp->mc_vfp_size = 0; + mcp->mc_vfp_ptr = NULL; + memset(&mcp->mc_spare, 0, sizeof(mcp->mc_spare)); return (0); } @@ -315,6 +311,16 @@ sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask) /* Populate the siginfo frame. */ bzero(&frame, sizeof(frame)); get_mcontext(td, &frame.sf_uc.uc_mcontext, 0); + +#ifdef VFP + get_vfpcontext(td, &frame.sf_vfp); + frame.sf_uc.uc_mcontext.mc_vfp_size = sizeof(fp->sf_vfp); + frame.sf_uc.uc_mcontext.mc_vfp_ptr = &fp->sf_vfp; +#else + frame.sf_uc.uc_mcontext.mc_vfp_size = 0; + frame.sf_uc.uc_mcontext.mc_vfp_ptr = NULL; +#endif + frame.sf_si = ksi->ksi_info; frame.sf_uc.uc_sigmask = *mask; frame.sf_uc.uc_stack = td->td_sigstk;