From 258f54d7675dfc59ad893a6433815f854e0467a1 Mon Sep 17 00:00:00 2001 From: nwhitehorn Date: Thu, 23 Jun 2011 16:34:41 +0000 Subject: 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. --- sys/powerpc/aim/trap_subr32.S | 2 ++ sys/powerpc/aim/trap_subr64.S | 2 ++ 2 files changed, 4 insertions(+) (limited to 'sys/powerpc') 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 -- cgit v1.1