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 /sys/powerpc/aim/trap_subr32.S | |
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.
Diffstat (limited to 'sys/powerpc/aim/trap_subr32.S')
-rw-r--r-- | sys/powerpc/aim/trap_subr32.S | 2 |
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): |