Module Name:    src
Committed By:   palle
Date:           Thu Mar  3 20:45:45 UTC 2016

Modified Files:
        src/sys/arch/sparc64/sparc64: locore.s

Log Message:
sun4v: rft_kernel should pay attention to the number of register windows that 
can be restored. We cannot rely on fill traps to occur, since sun4v only has 
two trap levels available in privileged mode. Based on code from OpenBSD. ok 
martin@


To generate a diff of this commit:
cvs rdiff -u -r1.388 -r1.389 src/sys/arch/sparc64/sparc64/locore.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/sparc64/sparc64/locore.s
diff -u src/sys/arch/sparc64/sparc64/locore.s:1.388 src/sys/arch/sparc64/sparc64/locore.s:1.389
--- src/sys/arch/sparc64/sparc64/locore.s:1.388	Sun Feb 14 21:13:33 2016
+++ src/sys/arch/sparc64/sparc64/locore.s	Thu Mar  3 20:45:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.388 2016/02/14 21:13:33 palle Exp $	*/
+/*	$NetBSD: locore.s,v 1.389 2016/03/03 20:45:45 palle Exp $	*/
 
 /*
  * Copyright (c) 2006-2010 Matthew R. Green
@@ -355,6 +355,35 @@ cputyp:	.word	CPU_SUN4U ! Default to sun
 #define CLRTT
 #endif
 
+
+/*
+ * Some macros to load and store a register window
+ */
+
+	.macro	SPILL storer,base,size,asi
+
+	.irpc n,01234567
+		\storer %l\n, [\base + (\n * \size)] \asi
+	.endr
+	.irpc n,01234567
+		\storer %i\n, [\base + ((8+\n) * \size)] \asi
+	.endr
+
+	.endm
+
+	
+	.macro FILL loader, base, size, asi
+	
+	.irpc n,01234567
+		\loader [\base + (\n * \size)] \asi, %l\n
+	.endr
+
+	.irpc n,01234567
+		\loader [\base + ((8+\n) * \size)] \asi, %i\n
+	.endr
+	
+	.endm
+	
 /*
  * Here are some oft repeated traps as macros.
  */
@@ -4079,12 +4108,26 @@ return_from_trap:
  *
  */
 rft_kernel:
-	rdpr	%tl, %g4				! Grab a set of trap registers
+	rdpr	%tl, %g4			! Grab a set of trap registers
 	inc	%g4
 	wrpr	%g4, %g0, %tl
 	wrpr	%g3, 0, %tnpc
 	wrpr	%g2, 0, %tpc
 	wrpr	%g1, 0, %tstate
+
+	rdpr	%canrestore, %g2
+	brnz	%g2, 1f
+	 nop
+
+	wr	%g0, ASI_NUCLEUS, %asi
+	rdpr	%cwp, %g1
+	dec	%g1
+	wrpr	%g1, %cwp
+	FILL	ldxa, %sp+BIAS, 8, %asi
+	restored
+	inc	%g1
+	wrpr	%g1, %cwp
+1:
 	restore
 	rdpr	%tstate, %g1			! Since we may have trapped our regs may be toast
 	rdpr	%cwp, %g2

Reply via email to