diff options
author | nwhitehorn <nwhitehorn@FreeBSD.org> | 2011-06-23 16:34:41 +0000 |
---|---|---|
committer | nwhitehorn <nwhitehorn@FreeBSD.org> | 2011-06-23 16:34:41 +0000 |
commit | 258f54d7675dfc59ad893a6433815f854e0467a1 (patch) | |
tree | 75c64d7c6b32ea3012fa6b08984ae92bc4acfeac | |
parent | 594e41652df1d0b6c71e43141f9f25d0dfca2a21 (diff) | |
download | FreeBSD-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.
-rw-r--r-- | sys/powerpc/aim/trap_subr32.S | 2 | ||||
-rw-r--r-- | sys/powerpc/aim/trap_subr64.S | 2 |
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 |