summaryrefslogtreecommitdiffstats
path: root/sys/powerpc
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2011-06-23 16:34:41 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2011-06-23 16:34:41 +0000
commit258f54d7675dfc59ad893a6433815f854e0467a1 (patch)
tree75c64d7c6b32ea3012fa6b08984ae92bc4acfeac /sys/powerpc
parent594e41652df1d0b6c71e43141f9f25d0dfca2a21 (diff)
downloadFreeBSD-src-258f54d7675dfc59ad893a6433815f854e0467a1.zip
FreeBSD-src-258f54d7675dfc59ad893a6433815f854e0467a1.tar.gz
Clear any outstanding atomic reservations when traps are taken. This fixes
some interesting bugs (mostly on SMP systems) with atomic operations silently failing in interrupt heavy situations, especially when using overflow pages.
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/aim/trap_subr32.S2
-rw-r--r--sys/powerpc/aim/trap_subr64.S2
2 files changed, 4 insertions, 0 deletions
diff --git a/sys/powerpc/aim/trap_subr32.S b/sys/powerpc/aim/trap_subr32.S
index 7c154a8..80329cd 100644
--- a/sys/powerpc/aim/trap_subr32.S
+++ b/sys/powerpc/aim/trap_subr32.S
@@ -748,6 +748,8 @@ k_trap:
/* Call C interrupt dispatcher: */
trapagain:
addi %r3,%r1,8
+ addi %r4,%r1,-4 /* Clear any existing reservations */
+ stwcx. %r3,0,%r4
bl CNAME(powerpc_interrupt)
.globl CNAME(trapexit) /* backtrace code sentinel */
CNAME(trapexit):
diff --git a/sys/powerpc/aim/trap_subr64.S b/sys/powerpc/aim/trap_subr64.S
index 5d4148a..66c543f 100644
--- a/sys/powerpc/aim/trap_subr64.S
+++ b/sys/powerpc/aim/trap_subr64.S
@@ -508,6 +508,8 @@ trapagain:
lis %r3,tocbase@ha
ld %r2,tocbase@l(%r3)
addi %r3,%r1,48
+ addi %r4,%r1,-8 /* Clear any existing reservations */
+ stdcx. %r3,0,%r4
bl CNAME(powerpc_interrupt)
nop
OpenPOWER on IntegriCloud