svn commit: r281557 - head/sys/arm64/arm64
Andrew Turner
andrew at FreeBSD.org
Wed Apr 15 14:30:08 UTC 2015
Author: andrew
Date: Wed Apr 15 14:30:07 2015
New Revision: 281557
URL: https://svnweb.freebsd.org/changeset/base/281557
Log:
Enter a critical section when storing the vfp registers, we don't want to
be preempted here as this will enter back into this function, but the
hardware could be in an inconsistant state, and the vfp unit will be off
when switced back to this function.
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/arm64/arm64/vfp.c
Modified: head/sys/arm64/arm64/vfp.c
==============================================================================
--- head/sys/arm64/arm64/vfp.c Wed Apr 15 14:20:12 2015 (r281556)
+++ head/sys/arm64/arm64/vfp.c Wed Apr 15 14:30:07 2015 (r281557)
@@ -88,41 +88,42 @@ vfp_save_state(struct thread *td)
uint64_t fpcr, fpsr;
uint32_t cpacr;
+ critical_enter();
/*
* Only store the registers if the VFP is enabled,
* i.e. return if we are trapping on FP access.
*/
cpacr = READ_SPECIALREG(cpacr_el1);
- if ((cpacr & CPACR_FPEN_MASK) != CPACR_FPEN_TRAP_NONE)
- return;
-
- vfp_state = td->td_pcb->pcb_vfp;
- __asm __volatile(
- "mrs %0, fpcr \n"
- "mrs %1, fpsr \n"
- "stp q0, q1, [%2, #16 * 0]\n"
- "stp q2, q3, [%2, #16 * 2]\n"
- "stp q4, q5, [%2, #16 * 4]\n"
- "stp q6, q7, [%2, #16 * 6]\n"
- "stp q8, q9, [%2, #16 * 8]\n"
- "stp q10, q11, [%2, #16 * 10]\n"
- "stp q12, q13, [%2, #16 * 12]\n"
- "stp q14, q15, [%2, #16 * 14]\n"
- "stp q16, q17, [%2, #16 * 16]\n"
- "stp q18, q19, [%2, #16 * 18]\n"
- "stp q20, q21, [%2, #16 * 20]\n"
- "stp q22, q23, [%2, #16 * 22]\n"
- "stp q24, q25, [%2, #16 * 24]\n"
- "stp q26, q27, [%2, #16 * 26]\n"
- "stp q28, q29, [%2, #16 * 28]\n"
- "stp q30, q31, [%2, #16 * 30]\n"
- : "=&r"(fpcr), "=&r"(fpsr) : "r"(vfp_state));
+ if ((cpacr & CPACR_FPEN_MASK) == CPACR_FPEN_TRAP_NONE) {
+ vfp_state = td->td_pcb->pcb_vfp;
+ __asm __volatile(
+ "mrs %0, fpcr \n"
+ "mrs %1, fpsr \n"
+ "stp q0, q1, [%2, #16 * 0]\n"
+ "stp q2, q3, [%2, #16 * 2]\n"
+ "stp q4, q5, [%2, #16 * 4]\n"
+ "stp q6, q7, [%2, #16 * 6]\n"
+ "stp q8, q9, [%2, #16 * 8]\n"
+ "stp q10, q11, [%2, #16 * 10]\n"
+ "stp q12, q13, [%2, #16 * 12]\n"
+ "stp q14, q15, [%2, #16 * 14]\n"
+ "stp q16, q17, [%2, #16 * 16]\n"
+ "stp q18, q19, [%2, #16 * 18]\n"
+ "stp q20, q21, [%2, #16 * 20]\n"
+ "stp q22, q23, [%2, #16 * 22]\n"
+ "stp q24, q25, [%2, #16 * 24]\n"
+ "stp q26, q27, [%2, #16 * 26]\n"
+ "stp q28, q29, [%2, #16 * 28]\n"
+ "stp q30, q31, [%2, #16 * 30]\n"
+ : "=&r"(fpcr), "=&r"(fpsr) : "r"(vfp_state));
- td->td_pcb->pcb_fpcr = fpcr;
- td->td_pcb->pcb_fpsr = fpsr;
+ td->td_pcb->pcb_fpcr = fpcr;
+ td->td_pcb->pcb_fpsr = fpsr;
- dsb();
- vfp_disable();
+ dsb();
+ vfp_disable();
+ }
+ critical_exit();
}
void
More information about the svn-src-head
mailing list