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