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)