summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/aim/trap_subr32.S
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/aim/trap_subr32.S
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/aim/trap_subr32.S')
-rw-r--r--sys/powerpc/aim/trap_subr32.S2
1 files changed, 2 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):
OpenPOWER on IntegriCloud