[OpenBIOS] [PATCH 2/9] SPARC64: make sure globals are stored in the CPU context during I/D MMU traps
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sun Oct 23 16:22:37 CEST 2016
During I/D MMU traps, the CPU switches to the alternate memory globals. Hence
we must manually switch to the original globals when saving/restoring state.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
arch/sparc64/vectors.S | 76 ++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 73 insertions(+), 3 deletions(-)
diff --git a/arch/sparc64/vectors.S b/arch/sparc64/vectors.S
index fa30546..85399df 100644
--- a/arch/sparc64/vectors.S
+++ b/arch/sparc64/vectors.S
@@ -284,6 +284,10 @@ tl1_resv1f0: BTRAPS(0x1f0) BTRAPS(0x1f8)
obp_ticks_pointer:
.xword 0
+ ! Saved context state
+debug_context:
+ .xword 0
+
.section ".text", "ax"
spill_32bit:
@@ -343,6 +347,23 @@ reload_DMMU_tlb:
RESET_CPU_WINDOW_STATE(dtlb)
+ /* Switch to ordinary globals, saving to context */
+ mov %g1, %o1
+ rdpr %pstate, %o2
+ andn %o2, PSTATE_MG, %o2
+ wrpr %o2, %pstate
+
+ stx %g1, [%o1 + 0x30]
+ stx %g2, [%o1 + 0x38]
+ stx %g3, [%o1 + 0x40]
+ stx %g4, [%o1 + 0x48]
+ stx %g5, [%o1 + 0x50]
+ stx %g6, [%o1 + 0x58]
+ stx %g7, [%o1 + 0x60]
+
+ /* Copy context back to %g1 */
+ mov %o1, %g1
+
/* Switch to 8K TLB locked OpenBIOS stack (note we add an additional 192 bytes required for
gcc to save its arguments when building with -O0) */
setx _fcstack_ptr, %g6, %g7
@@ -375,6 +396,22 @@ reload_DMMU_tlb:
add %g1, %g5, %g1
stx %g1, [%g7]
+ /* Restore ordinary globals, switch back to memory globals */
+ mov %g1, %o1
+ rdpr %pstate, %o2
+ or %o2, PSTATE_MG, %o2
+
+ ldx [%o1 + 0x30], %g1
+ ldx [%o1 + 0x38], %g2
+ ldx [%o1 + 0x40], %g3
+ ldx [%o1 + 0x48], %g4
+ ldx [%o1 + 0x50], %g5
+ ldx [%o1 + 0x58], %g6
+ ldx [%o1 + 0x60], %g7
+
+ wrpr %o2, %pstate
+ mov %o1, %g1
+
RESTORE_CPU_STATE(dtlb)
setx _fcstack_ptr, %g6, %g7
@@ -382,7 +419,7 @@ reload_DMMU_tlb:
add %g1, CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
- retry
+ retry
reload_IMMU_tlb:
@@ -396,6 +433,23 @@ reload_IMMU_tlb:
RESET_CPU_WINDOW_STATE(itlb)
+ /* Switch to ordinary globals, saving to context */
+ mov %g1, %o1
+ rdpr %pstate, %o2
+ andn %o2, PSTATE_MG, %o2
+ wrpr %o2, %pstate
+
+ stx %g1, [%o1 + 0x30]
+ stx %g2, [%o1 + 0x38]
+ stx %g3, [%o1 + 0x40]
+ stx %g4, [%o1 + 0x48]
+ stx %g5, [%o1 + 0x50]
+ stx %g6, [%o1 + 0x58]
+ stx %g7, [%o1 + 0x60]
+
+ /* Copy context back to %g1 */
+ mov %o1, %g1
+
/* Switch to 8K TLB locked OpenBIOS stack (note we add an additional 192 bytes required for
gcc to save its arguments when building with -O0) */
setx _fcstack_ptr, %g6, %g7
@@ -428,14 +482,30 @@ reload_IMMU_tlb:
add %g1, %g5, %g1
stx %g1, [%g7]
+ /* Restore ordinary globals, switch back to memory globals */
+ mov %g1, %o1
+ rdpr %pstate, %o2
+ or %o2, PSTATE_MG, %o2
+
+ ldx [%o1 + 0x30], %g1
+ ldx [%o1 + 0x38], %g2
+ ldx [%o1 + 0x40], %g3
+ ldx [%o1 + 0x48], %g4
+ ldx [%o1 + 0x50], %g5
+ ldx [%o1 + 0x58], %g6
+ ldx [%o1 + 0x60], %g7
+
+ wrpr %o2, %pstate
+ mov %o1, %g1
+
RESTORE_CPU_STATE(itlb)
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
add %g1, CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
-
- retry
+
+ retry
softint_irq_tl1:
softint_irq:
--
1.7.10.4
More information about the OpenBIOS
mailing list