Module Name: src Committed By: snj Date: Wed Apr 19 17:02:43 UTC 2017
Modified Files: src/sys/arch/powerpc/powerpc [netbsd-7]: locore_subr.S Log Message: Pull up following revision(s) (requested by phx in ticket #1382): sys/arch/powerpc/powerpc/locore_subr.S: revision 1.55 in cpu_switchto() and the fast-softint context switch code, put back the stwcx. instruction to clear the reservation. we used to have this in the old cpu_switch() until it was if-0'd in 2003 and removed completely in 2007. this fixes hangs I've seen where a softint thread is blocked waiting for a mutex that is not held. this should also fix PR 44387. To generate a diff of this commit: cvs rdiff -u -r1.54 -r1.54.2.1 src/sys/arch/powerpc/powerpc/locore_subr.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/powerpc/powerpc/locore_subr.S diff -u src/sys/arch/powerpc/powerpc/locore_subr.S:1.54 src/sys/arch/powerpc/powerpc/locore_subr.S:1.54.2.1 --- src/sys/arch/powerpc/powerpc/locore_subr.S:1.54 Wed Jul 30 23:27:55 2014 +++ src/sys/arch/powerpc/powerpc/locore_subr.S Wed Apr 19 17:02:43 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: locore_subr.S,v 1.54 2014/07/30 23:27:55 matt Exp $ */ +/* $NetBSD: locore_subr.S,v 1.54.2.1 2017/04/19 17:02:43 snj Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -288,6 +288,7 @@ switchto_restore: */ ldreg %r31,CFRAME_R31(%r1) /* restore saved registers */ ldreg %r30,CFRAME_R30(%r1) + stwcx. %r1,0,%r1 /* clear reservation */ #if 1 addi %r1,%r1,CALLFRAMELEN #else @@ -328,6 +329,7 @@ _ENTRY(softint_cleanup) mtmsr %r0 isync #endif + stwcx. %r1,0,%r1 /* clear reservation */ addi %r1, %r1, CALLFRAMELEN ldreg %r0, CFRAME_LR(%r1) mtlr %r0 @@ -478,6 +480,7 @@ _ENTRY(softint_fast_dispatch) ldreg %r29,SFRAME_R29(%r1) /* R29 */ ldreg %r31,SFRAMELEN+CFRAME_R31(%r1) /* restore saved registers */ ldreg %r30,SFRAMELEN+CFRAME_R30(%r1) + stwcx. %r1,0,%r1 /* clear reservation */ addi %r1,%r1,SFRAMELEN+2*CALLFRAMELEN /* remove switch & callframes */ #endif ldreg %r0,CFRAME_LR(%r1)