summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandrew <andrew@FreeBSD.org>2015-05-23 22:28:59 +0000
committerandrew <andrew@FreeBSD.org>2015-05-23 22:28:59 +0000
commit0926af4e2a44b22e2538a698379dc29593568f82 (patch)
tree97b9b91fe551daef37eb4c2a8c23c01889c548f7
parentb51d622ba8bdda20dd5d25f755d4fcf303478339 (diff)
downloadFreeBSD-src-0926af4e2a44b22e2538a698379dc29593568f82.zip
FreeBSD-src-0926af4e2a44b22e2538a698379dc29593568f82.tar.gz
Use the wait-for-event instruction to put the core we have just enabled
to sleep while it waits to start scheduling. The boot core can then use the send-event instruction to wake the cores when they should enter the scheduler. MFC after: 1 week
-rw-r--r--sys/arm/arm/mp_machdep.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/arm/arm/mp_machdep.c b/sys/arm/arm/mp_machdep.c
index c0f723c..88104f0 100644
--- a/sys/arm/arm/mp_machdep.c
+++ b/sys/arm/arm/mp_machdep.c
@@ -185,8 +185,11 @@ init_secondary(int cpu)
atomic_add_rel_32(&mp_naps, 1);
/* Spin until the BSP releases the APs */
- while (!aps_ready)
- ;
+ while (!atomic_load_acq_int(&aps_ready)) {
+#if __ARM_ARCH >= 7
+ __asm __volatile("wfe");
+#endif
+ }
/* Initialize curthread */
KASSERT(PCPU_GET(idlethread) != NULL, ("no idle thread"));
@@ -353,6 +356,10 @@ release_aps(void *dummy __unused)
arm_unmask_irq(i);
}
atomic_store_rel_int(&aps_ready, 1);
+ /* Wake the other threads up */
+#if __ARM_ARCH >= 7
+ armv7_sev();
+#endif
printf("Release APs\n");
OpenPOWER on IntegriCloud