Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2011 18:44:46 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r224374 - stable/7/sys/sparc64/sparc64
Message-ID:  <201107251844.p6PIik2H071286@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Mon Jul 25 18:44:46 2011
New Revision: 224374
URL: http://svn.freebsd.org/changeset/base/224374

Log:
  MFC: r223721
  
  UltraSPARC-IV CPUs seem to be affected by a not publicly documented
  erratum causing them to trigger stray vector interrupts accompanied by a
  state in which they even fault on locked TLB entries. Just retrying the
  instruction in that case gets the CPU back on track though. OpenSolaris
  also just ignores a certain number of stray vector interrupts.
  While at it, implement the stray vector interrupt handling for SPARC64-VI
  which use these for indicating uncorrectable errors in interrupt packets.

Modified:
  stable/7/sys/sparc64/sparc64/exception.S
  stable/7/sys/sparc64/sparc64/interrupt.S
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/sparc64/sparc64/exception.S
==============================================================================
--- stable/7/sys/sparc64/sparc64/exception.S	Mon Jul 25 18:43:25 2011	(r224373)
+++ stable/7/sys/sparc64/sparc64/exception.S	Mon Jul 25 18:44:46 2011	(r224374)
@@ -581,7 +581,8 @@ END(tl0_sfsr_trap)
 	andcc	%g1, IRSR_BUSY, %g0
 	bnz,a,pt %xcc, intr_vector
 	 nop
-	sir
+	ba,a,pt	%xcc, intr_vector_stray
+	 nop
 	.align	32
 	.endm
 

Modified: stable/7/sys/sparc64/sparc64/interrupt.S
==============================================================================
--- stable/7/sys/sparc64/sparc64/interrupt.S	Mon Jul 25 18:43:25 2011	(r224373)
+++ stable/7/sys/sparc64/sparc64/interrupt.S	Mon Jul 25 18:44:46 2011	(r224374)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/intr_machdep.h>
 #include <machine/ktr.h>
 #include <machine/pstate.h>
+#include <machine/ver.h>
 
 #include "assym.s"
 
@@ -153,6 +154,29 @@ ENTRY(intr_vector)
 	retry
 END(intr_vector)
 
+ENTRY(intr_vector_stray)
+	/*
+	 * SPARC64-VI trigger stray vector interrupts in order to indicate
+	 * uncorrectable errors in interrupt packets, which still need to be
+	 * acknowledged though.
+	 * US-IV occasionally trigger stray vector interrupts for reasons
+	 * unknown accompanied by a state in which they even fault on locked
+	 * TLB entries so we can't even log these here.  Just retrying the
+	 * instruction in that case gets the CPU back on track.
+	 */
+	rdpr	%ver, %g1
+	srlx	%g1, VER_IMPL_SHIFT, %g1
+	sll	%g1, VER_IMPL_SIZE, %g1
+	srl	%g1, VER_IMPL_SIZE, %g1
+	cmp	%g1, CPU_IMPL_SPARC64VI
+	bne,a,pn %icc, 1f
+	 nop
+	stxa	%g0, [%g0] ASI_INTR_RECEIVE
+	membar	#Sync
+
+1:	retry
+END(intr_vector_stray)
+
 ENTRY(intr_fast)
 	save	%sp, -CCFSZ, %sp
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107251844.p6PIik2H071286>