git: d6a53211a716 - main - Discard the arm64 VFP state before resetting it
Andrew Turner
andrew at FreeBSD.org
Thu Apr 8 10:18:05 UTC 2021
The branch main has been updated by andrew:
URL: https://cgit.FreeBSD.org/src/commit/?id=d6a53211a716c987de76294cff32b652fe38bb09
commit d6a53211a716c987de76294cff32b652fe38bb09
Author: Andrew Turner <andrew at FreeBSD.org>
AuthorDate: 2021-03-23 18:23:47 +0000
Commit: Andrew Turner <andrew at FreeBSD.org>
CommitDate: 2021-04-08 07:51:26 +0000
Discard the arm64 VFP state before resetting it
When resetting the VFP state we need to discard any old state so we don't
try to save it on a context switch. Move this first so resetting the pcb
is safe to perform outside a critical section.
Reviewed by: arichardson
Sponsored by: Innovate UK
Differential Revision: https://reviews.freebsd.org/D29401
---
sys/arm64/arm64/vfp.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/sys/arm64/arm64/vfp.c b/sys/arm64/arm64/vfp.c
index 4935946d2430..9de27349fb8d 100644
--- a/sys/arm64/arm64/vfp.c
+++ b/sys/arm64/arm64/vfp.c
@@ -208,7 +208,15 @@ vfp_save_state(struct thread *td, struct pcb *pcb)
void
vfp_reset_state(struct thread *td, struct pcb *pcb)
{
+ /* Discard the threads VFP state before resetting it */
critical_enter();
+ vfp_discard(td);
+ critical_exit();
+
+ /*
+ * Clear the thread state. The VFP is disabled and is not the current
+ * VFP thread so we won't change any of these on context switch.
+ */
bzero(&pcb->pcb_fpustate.vfp_regs, sizeof(pcb->pcb_fpustate.vfp_regs));
KASSERT(pcb->pcb_fpusaved == &pcb->pcb_fpustate,
("pcb_fpusaved should point to pcb_fpustate."));
@@ -216,8 +224,6 @@ vfp_reset_state(struct thread *td, struct pcb *pcb)
pcb->pcb_fpustate.vfp_fpsr = 0;
pcb->pcb_vfpcpu = UINT_MAX;
pcb->pcb_fpflags = 0;
- vfp_discard(td);
- critical_exit();
}
void
More information about the dev-commits-src-main
mailing list