summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2011-09-29 14:19:34 +0000
committermav <mav@FreeBSD.org>2011-09-29 14:19:34 +0000
commitc38f43958ddfa4218041dc7c2e9a34683f97ec08 (patch)
tree15c79ce071896ecc45cf6eb7a8f92945fe8e15b6 /sys/powerpc
parent4789992ad40faaebb49417cbf78d9973cfcb8929 (diff)
downloadFreeBSD-src-c38f43958ddfa4218041dc7c2e9a34683f97ec08.zip
FreeBSD-src-c38f43958ddfa4218041dc7c2e9a34683f97ec08.tar.gz
Handle the race in cpu_idle() when due to the critical section CPU could get
into sleep after receiving interrupt, delaying interrupt thread execution indefinitely until the next interrupt arrive. Reviewed by: nwhitehorn MFC after: 3 days
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/powerpc/cpu.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/sys/powerpc/powerpc/cpu.c b/sys/powerpc/powerpc/cpu.c
index 9701156..5d24eb1 100644
--- a/sys/powerpc/powerpc/cpu.c
+++ b/sys/powerpc/powerpc/cpu.c
@@ -553,6 +553,11 @@ cpu_idle_60x(void)
vers = mfpvr() >> 16;
#ifdef AIM
+ mtmsr(msr & ~PSL_EE);
+ if (sched_runnable()) {
+ mtmsr(msr);
+ return;
+ }
switch (vers) {
case IBM970:
case IBM970FX:
@@ -583,6 +588,11 @@ cpu_idle_e500(void)
msr = mfmsr();
#ifdef E500
+ mtmsr(msr & ~PSL_EE);
+ if (sched_runnable()) {
+ mtmsr(msr);
+ return;
+ }
/* Freescale E500 core RM section 6.4.1. */
__asm __volatile("msync; mtmsr %0; isync" ::
"r" (msr | PSL_WE));
OpenPOWER on IntegriCloud