Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64/sparc64 sun4v: handle spill trap properly w...
details: https://anonhg.NetBSD.org/src/rev/750d0e7de0a1
branches: trunk
changeset: 954170:750d0e7de0a1
user: palle <palle%NetBSD.org@localhost>
date: Tue Mar 30 20:03:14 2021 +0000
description:
sun4v: handle spill trap properly when trap level is 1 and otherwin is non-zero - ensure that all windows are spilled to the pcb like the sun4u winfixsave code path
diffstat:
sys/arch/sparc64/sparc64/locore.s | 75 +++++++++++++++++++++++++++++++++++++-
1 files changed, 73 insertions(+), 2 deletions(-)
diffs (96 lines):
diff -r 33e3f114d811 -r 750d0e7de0a1 sys/arch/sparc64/sparc64/locore.s
--- a/sys/arch/sparc64/sparc64/locore.s Tue Mar 30 19:45:04 2021 +0000
+++ b/sys/arch/sparc64/sparc64/locore.s Tue Mar 30 20:03:14 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.425 2021/02/22 09:56:42 palle Exp $ */
+/* $NetBSD: locore.s,v 1.426 2021/03/30 20:03:14 palle Exp $ */
/*
* Copyright (c) 2006-2010 Matthew R. Green
@@ -234,7 +234,7 @@
.endm
.macro sun4v_tl1_uspill_other
- ba,a,pt %xcc, pcbspill_others
+ ba,a,pt %xcc, pcbspill_other
nop
.align 128
.endm
@@ -3485,6 +3485,77 @@
Debugger()
NOTREACHED
+
+pcbspill_other:
+
+ set CPUINFO_VA, %g6
+ ldx [%g6 + CI_CPCB], %g6
+
+ GET_CTXBUSY %g1
+
+ ldx [%g1], %g1 ! kernel pmap is ctx 0
+
+ srlx %g6, STSHIFT, %g7
+ and %g7, STMASK, %g7
+ sll %g7, 3, %g7 ! byte offset into ctxbusy
+ add %g7, %g1, %g1
+ ldxa [%g1] ASI_PHYS_CACHED, %g1 ! Load pointer to directory
+
+ srlx %g6, PDSHIFT, %g7 ! Do page directory
+ and %g7, PDMASK, %g7
+ sll %g7, 3, %g7
+ brz,pn %g1, pcbspill_other_fail
+ add %g7, %g1, %g1
+ ldxa [%g1] ASI_PHYS_CACHED, %g1
+ srlx %g6, PTSHIFT, %g7 ! Convert to ptab offset
+ and %g7, PTMASK, %g7
+ brz %g1, pcbspill_other_fail
+ sll %g7, 3, %g7
+ add %g1, %g7, %g7
+ ldxa [%g7] ASI_PHYS_CACHED, %g7 ! This one is not
+ brgez %g7, pcbspill_other_fail
+ srlx %g7, PGSHIFT, %g7 ! Isolate PA part
+ sll %g6, 32-PGSHIFT, %g6 ! And offset
+ sllx %g7, PGSHIFT+8, %g7 ! There are 8 bits to the left of the PA in the TTE
+ srl %g6, 32-PGSHIFT, %g6
+ srax %g7, 8, %g7
+ or %g7, %g6, %g6 ! Then combine them to form PA
+
+ wr %g0, ASI_PHYS_CACHED, %asi ! Use ASI_PHYS_CACHED to prevent possible page faults
+
+ lduba [%g6 + PCB_NSAVED] %asi, %g7 ! Fetch current nsaved from the pcb
+ sllx %g7, 7, %g5 ! 8+8 registers each 8 bytes = 128 bytes (2^7)
+ add %g6, %g5, %g5 ! Offset into pcb_rw
+1:
+ SPILL stxa, %g5 + PCB_RW, 8, %asi ! Store the locals and ins
+
+ add %g5, 16*8, %g5 ! Next location for saved register windows
+
+ stxa %o6, [%g5 + PCB_RW + (14*8)] %asi ! Save %sp so we can write these all out
+
+ saved ! Increments %cansave and decrements %otherwin
+
+ rdpr %cwp, %g1 ! shift register window forward
+ inc %g1
+ wrpr %g1, %cwp
+
+
+ inc %g7 ! increment number of saved register windows
+
+ rdpr %otherwin, %g1 ! Check to see if done spill'ing otherwin
+ brnz,pt %g1, 1b
+ nop
+
+ stba %g7, [%g6 + PCB_NSAVED] %asi
+
+ retry
+ NOTREACHED
+
+pcbspill_other_fail:
+ Debugger()
+ NOTREACHED
+
+
spill_normal_to_user_stack:
mov %sp, %g6 ! calculate virtual address of destination stack
add %g6, BIAS, %g6
Home |
Main Index |
Thread Index |
Old Index