[OpenBIOS] [commit] r1365 - trunk/openbios-devel/arch/sparc64
repository service
svn at openbios.org
Tue Dec 29 16:50:42 CET 2015
Author: mcayland
Date: Tue Dec 29 16:50:41 2015
New Revision: 1365
URL: http://tracker.coreboot.org/trac/openbios/changeset/1365
Log:
SPARC64: reorganise IMMU/DMMU trap context structure
Here the trap context is reorganised to share the same prologue as the CIF
context so that they can be subsequently unified.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
Added:
trunk/openbios-devel/arch/sparc64/cpustate.h
- copied, changed from r1364, trunk/openbios-devel/arch/sparc64/call-client.S
Modified:
trunk/openbios-devel/arch/sparc64/call-client.S
trunk/openbios-devel/arch/sparc64/vectors.S
Modified: trunk/openbios-devel/arch/sparc64/call-client.S
==============================================================================
--- trunk/openbios-devel/arch/sparc64/call-client.S Tue Dec 29 16:50:39 2015 (r1364)
+++ trunk/openbios-devel/arch/sparc64/call-client.S Tue Dec 29 16:50:41 2015 (r1365)
@@ -1,3 +1,5 @@
+#include "cpustate.h"
+
.globl sparc64_of_client_interface, client_tba
@@ -9,142 +11,6 @@
* behaviour of OBP.
*/
-#define SAVE_WINDOW_STATE(type) \
- rdpr %cwp, %g7; \
- stx %g7, [%g1]; \
- rdpr %cansave, %g7; \
- stx %g7, [%g1 + 0x8]; \
- rdpr %canrestore, %g7; \
- stx %g7, [%g1 + 0x10]; \
- rdpr %otherwin, %g7; \
- stx %g7, [%g1 + 0x18]; \
- rdpr %wstate, %g7; \
- stx %g7, [%g1 + 0x20]; \
- rdpr %cleanwin, %g7; \
- stx %g7, [%g1 + 0x28]; \
- \
- stx %o0, [%g1 + 0x30]; \
- stx %o1, [%g1 + 0x38]; \
- stx %o2, [%g1 + 0x40]; \
- stx %o3, [%g1 + 0x48]; \
- stx %o4, [%g1 + 0x50]; \
- stx %o5, [%g1 + 0x58]; \
- stx %o6, [%g1 + 0x60]; \
- stx %o7, [%g1 + 0x68]; \
- \
- rdpr %pstate, %g7; \
- stx %g7, [%g1 + 0x70]; \
- rd %y, %g7; \
- stx %g7, [%g1 + 0x78]; \
- rd %fprs, %g7; \
- stx %g7, [%g1 + 0x80]; \
- \
- /* Now iterate through all of the windows saving all l and i registers */ \
- add %g1, 0x90, %g5; \
- \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- inc %g6; \
- \
-save_cpu_window_##type: \
- deccc %g6; \
- wrpr %g6, %cwp; \
- stx %l0, [%g5]; \
- stx %l1, [%g5 + 0x8]; \
- stx %l2, [%g5 + 0x10]; \
- stx %l3, [%g5 + 0x18]; \
- stx %l4, [%g5 + 0x20]; \
- stx %l5, [%g5 + 0x28]; \
- stx %l6, [%g5 + 0x30]; \
- stx %l7, [%g5 + 0x38]; \
- stx %i0, [%g5 + 0x40]; \
- stx %i1, [%g5 + 0x48]; \
- stx %i2, [%g5 + 0x50]; \
- stx %i3, [%g5 + 0x58]; \
- stx %i4, [%g5 + 0x60]; \
- stx %i5, [%g5 + 0x68]; \
- stx %i6, [%g5 + 0x70]; \
- stx %i7, [%g5 + 0x78]; \
- bne save_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* For 8 windows with 16 registers to save in the window, memory required \
- is 16*8*8 = 0x400 bytes */ \
- \
- /* Now we should be in window 0 so update the other window registers */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- dec %g6; \
- wrpr %g6, %cansave; \
- \
- wrpr %g0, %cleanwin; \
- wrpr %g0, %canrestore; \
- wrpr %g0, %otherwin;
-
-
-#define RESTORE_WINDOW_STATE(type) \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- inc %g6; \
- \
- /* Now iterate through all of the windows restoring all l and i registers */ \
- add %g1, 0x90, %g5; \
- \
-restore_cpu_window_##type: \
- deccc %g6; \
- wrpr %g6, %cwp; \
- ldx [%g5], %l0; \
- ldx [%g5 + 0x8], %l1; \
- ldx [%g5 + 0x10], %l2; \
- ldx [%g5 + 0x18], %l3; \
- ldx [%g5 + 0x20], %l4; \
- ldx [%g5 + 0x28], %l5; \
- ldx [%g5 + 0x30], %l6; \
- ldx [%g5 + 0x38], %l7; \
- ldx [%g5 + 0x40], %i0; \
- ldx [%g5 + 0x48], %i1; \
- ldx [%g5 + 0x50], %i2; \
- ldx [%g5 + 0x58], %i3; \
- ldx [%g5 + 0x60], %i4; \
- ldx [%g5 + 0x68], %i5; \
- ldx [%g5 + 0x70], %i6; \
- ldx [%g5 + 0x78], %i7; \
- bne restore_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* Restore the window registers to their original value */ \
- ldx [%g1], %g7; \
- wrpr %g7, %cwp; \
- ldx [%g1 + 0x8], %g7; \
- wrpr %g7, %cansave; \
- ldx [%g1 + 0x10], %g7; \
- wrpr %g7, %canrestore; \
- ldx [%g1 + 0x18], %g7; \
- wrpr %g7, %otherwin; \
- ldx [%g1 + 0x20], %g7; \
- wrpr %g7, %wstate; \
- ldx [%g1 + 0x28], %g7; \
- wrpr %g7, %cleanwin; \
- \
- ldx [%g1 + 0x30], %o0; \
- ldx [%g1 + 0x38], %o1; \
- ldx [%g1 + 0x40], %o2; \
- ldx [%g1 + 0x48], %o3; \
- ldx [%g1 + 0x50], %o4; \
- ldx [%g1 + 0x58], %o5; \
- ldx [%g1 + 0x60], %o6; \
- ldx [%g1 + 0x68], %o7; \
- \
- ldx [%g1 + 0x70], %g7; \
- wrpr %g7, %pstate; \
- ldx [%g1 + 0x78], %g7; \
- wr %g7, 0, %y; \
- ldx [%g1 + 0x80], %g7; \
- wr %g7, 0, %fprs
-
-
.data
.align 8
@@ -192,15 +58,15 @@
/* Save windows */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- add %g1, -0x510, %g1
+ add %g1, -CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
- SAVE_WINDOW_STATE(cif)
+ SAVE_CPU_WINDOW_STATE(cif)
/* Move to OpenBIOS context stack */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g6
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
sub %g6, %g5, %g6
stx %g6, [%g7]
@@ -215,16 +81,16 @@
/* Restore windows */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
add %g1, %g5, %g1
stx %g1, [%g7]
/* Return value */
stx %o0, [%g1 + 0x30]
- RESTORE_WINDOW_STATE(cif)
+ RESTORE_CPU_WINDOW_STATE(cif)
- add %g1, 0x510, %g1
+ add %g1, CONTEXT_STATE_SIZE, %g1
setx _fcstack_ptr, %g6, %g7
stx %g1, [%g7]
Copied and modified: trunk/openbios-devel/arch/sparc64/cpustate.h (from r1364, trunk/openbios-devel/arch/sparc64/call-client.S)
==============================================================================
--- trunk/openbios-devel/arch/sparc64/call-client.S Tue Dec 29 16:50:39 2015 (r1364, copy source)
+++ trunk/openbios-devel/arch/sparc64/cpustate.h Tue Dec 29 16:50:41 2015 (r1365)
@@ -1,15 +1,40 @@
- .globl sparc64_of_client_interface, client_tba
+/*
+ * Save/restore CPU state macros
+ *
+ * Copyright (C) 2015 Mark Cave-Ayland (mark.cave-ayland at ilande.co.uk>)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2
+ *
+ */
+
+/* State size for context (see below) */
+#define CONTEXT_STATE_SIZE 0x510
+/* Stack size for context (allocated inline of the context stack) */
+#define CONTEXT_STACK_SIZE 0x2000
/*
- * SAVE_WINDOW_STATE and RESTORE_WINDOW_STATE are used to ensure
- * that the CPU window state is preserved across CIF calls. This is
- * to workaround a *BSD restriction that window fill/spill traps must
- * be minimised during trap table takeover, and likely emulates the
- * behaviour of OBP.
+ * SAVE_CPU_STATE and RESTORE_CPU_STATE are macros used to enable a context switch
+ * to C to occur within the MMU I/D TLB miss handlers.
+ *
+ * Because these handlers are called on a TLB miss, we cannot use flushw to store
+ * processor window state on the stack, as the memory areas used by each window's
+ * stack pointer may not be in the TLB, causing recursive TLB miss traps.
+ *
+ * For this reason, we save window state by manually rotating the window registers
+ * and saving their contents (along with other vital registers) into a special
+ * tlb_handler_stack defined above which is guaranteed to be locked in the TLB, and
+ * so won't cause issues with trap recursion.
+ *
+ * Once this process is complete, we remain in a TL=0, CWP=0 state (with IE=1 to allow
+ * window fill/spill traps if required), switch to our safe tlb_handler_stack and
+ * invoke the miss handler.
*/
-#define SAVE_WINDOW_STATE(type) \
+#define SAVE_CPU_WINDOW_STATE(type) \
+ /* Save window state into context at %g1 */ \
rdpr %cwp, %g7; \
stx %g7, [%g1]; \
rdpr %cansave, %g7; \
@@ -38,6 +63,8 @@
stx %g7, [%g1 + 0x78]; \
rd %fprs, %g7; \
stx %g7, [%g1 + 0x80]; \
+ rdpr %tl, %g7; \
+ stx %g7, [%g1 + 0x88]; \
\
/* Now iterate through all of the windows saving all l and i registers */ \
add %g1, 0x90, %g5; \
@@ -80,10 +107,40 @@
\
wrpr %g0, %cleanwin; \
wrpr %g0, %canrestore; \
- wrpr %g0, %otherwin;
+ wrpr %g0, %otherwin; \
+
+#define SAVE_CPU_TRAP_STATE(type) \
+ /* Save trap state into context at %g1 */ \
+ add %g1, 0x490, %g5; \
+ mov 4, %g6; \
+ \
+save_trap_state_##type: \
+ deccc %g6; \
+ wrpr %g6, %tl; \
+ rdpr %tpc, %g7; \
+ stx %g7, [%g5]; \
+ rdpr %tnpc, %g7; \
+ stx %g7, [%g5 + 0x8]; \
+ rdpr %tstate, %g7; \
+ stx %g7, [%g5 + 0x10]; \
+ rdpr %tt, %g7; \
+ stx %g7, [%g5 + 0x18]; \
+ bne save_trap_state_##type; \
+ add %g5, 0x20, %g5; \
+ \
+ /* For 4 trap levels with 4 registers, memory required is \
+ 4*8*4 = 0x80 bytes */
+
+/* Save all state into context at %g1 */
+#define SAVE_CPU_STATE(type) \
+ SAVE_CPU_WINDOW_STATE(type); \
+ SAVE_CPU_TRAP_STATE(type);
-#define RESTORE_WINDOW_STATE(type) \
+
+#define RESTORE_CPU_WINDOW_STATE(type) \
+ /* Restore window state from context at %g1 */ \
+ \
/* Get the number of windows in %g6 */ \
rdpr %ver, %g6; \
and %g6, 0xf, %g6; \
@@ -142,111 +199,32 @@
ldx [%g1 + 0x78], %g7; \
wr %g7, 0, %y; \
ldx [%g1 + 0x80], %g7; \
- wr %g7, 0, %fprs
-
+ wr %g7, 0, %fprs; \
- .data
- .align 8
-client_stack:
- .xword 0
-client_tba:
- .xword 0
-client_window:
- .skip 2048
-
-
- .text
- .align 4
- .register %g2, #scratch
- .register %g3, #scratch
- .register %g6, #scratch
- .register %g7, #scratch
-/*
- make some more space on stack since linux kernel only provides 128 bytes
- without memory to spill registers (used by gcc in -O0 mode)
-*/
-
-sparc64_of_client_interface:
-
- /* Save globals on callers stack */
- add %sp, -248, %sp
-
- stx %g1, [%sp + 2047 + 192]
- stx %g2, [%sp + 2047 + 200]
- stx %g3, [%sp + 2047 + 208]
- stx %g4, [%sp + 2047 + 216]
- stx %g5, [%sp + 2047 + 224]
- stx %g6, [%sp + 2047 + 232]
- stx %g7, [%sp + 2047 + 240]
-
- /* Save client trap table */
- setx client_tba, %g6, %g7
- rdpr %tba, %g6
- stx %g6, [%g7]
-
- /* Save existing stack */
- setx client_stack, %g6, %g7
- stx %sp, [%g7]
-
- /* Save windows */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- add %g1, -0x510, %g1
- stx %g1, [%g7]
-
- SAVE_WINDOW_STATE(cif)
-
- /* Move to OpenBIOS context stack */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g6
- setx 0x2000, %g4, %g5
- sub %g6, %g5, %g6
- stx %g6, [%g7]
-
- setx - 2047 - 192, %g6, %g7
- add %g1, %g7, %g7
- mov %g7, %sp
-
- /* Call client inteface */
- call of_client_interface
- ldx [%g1 + 0x30], %o0
-
- /* Restore windows */
- setx _fcstack_ptr, %g6, %g7
- ldx [%g7], %g1
- setx 0x2000, %g4, %g5
- add %g1, %g5, %g1
- stx %g1, [%g7]
-
- /* Return value */
- stx %o0, [%g1 + 0x30]
-
- RESTORE_WINDOW_STATE(cif)
-
- add %g1, 0x510, %g1
- setx _fcstack_ptr, %g6, %g7
- stx %g1, [%g7]
-
- /* Restore stack */
- setx client_stack, %g6, %g7
- ldx [%g7], %sp
-
- /* Restore client trap table */
- setx client_tba, %g6, %g7
- ldx [%g7], %g6
- wrpr %g6, %tba
-
- /* Restore globals */
- ldx [%sp + 2047 + 192], %g1
- ldx [%sp + 2047 + 200], %g2
- ldx [%sp + 2047 + 208], %g3
- ldx [%sp + 2047 + 216], %g4
- ldx [%sp + 2047 + 224], %g5
- ldx [%sp + 2047 + 232], %g6
- ldx [%sp + 2047 + 240], %g7
-
- add %sp, 248, %sp
-
- jmp %o7+8
- nop
+#define RESTORE_CPU_TRAP_STATE(type) \
+ /* Restore trap state from context at %g1 */ \
+ add %g1, 0x490, %g5; \
+ mov 4, %g6; \
+ \
+restore_trap_state_##type: \
+ deccc %g6; \
+ wrpr %g6, %tl; \
+ ldx [%g5], %g7; \
+ wrpr %g7, %tpc; \
+ ldx [%g5 + 0x8], %g7; \
+ wrpr %g7, %tnpc; \
+ ldx [%g5 + 0x10], %g7; \
+ wrpr %g7, %tstate; \
+ ldx [%g5 + 0x18], %g7; \
+ wrpr %g7, %tt; \
+ bne restore_trap_state_##type; \
+ add %g5, 0x20, %g5; \
+ \
+ ldx [%g1 + 0x88], %g7; \
+ wrpr %g7, %tl
+
+/* Restore all state from context at %g1 */
+#define RESTORE_CPU_STATE(type) \
+ RESTORE_CPU_WINDOW_STATE(type); \
+ RESTORE_CPU_TRAP_STATE(type);
Modified: trunk/openbios-devel/arch/sparc64/vectors.S
==============================================================================
--- trunk/openbios-devel/arch/sparc64/vectors.S Tue Dec 29 16:50:39 2015 (r1364)
+++ trunk/openbios-devel/arch/sparc64/vectors.S Tue Dec 29 16:50:41 2015 (r1365)
@@ -24,6 +24,7 @@
*/
#define __ASSEMBLY__
+#include "cpustate.h"
#include "pstate.h"
#include <asm/asi.h>
#define ASI_BP ASI_PHYS_BYPASS_EC_E
@@ -327,206 +328,6 @@
restored
retry
-/*
- * SAVE_CPU_STATE and RESTORE_CPU_STATE are macros used to enable a context switch
- * to C to occur within the MMU I/D TLB miss handlers.
- *
- * Because these handlers are called on a TLB miss, we cannot use flushw to store
- * processor window state on the stack, as the memory areas used by each window's
- * stack pointer may not be in the TLB, causing recursive TLB miss traps.
- *
- * For this reason, we save window state by manually rotating the window registers
- * and saving their contents (along with other vital registers) into a special
- * tlb_handler_stack defined above which is guaranteed to be locked in the TLB, and
- * so won't cause issues with trap recursion.
- *
- * Once this process is complete, we remain in a TL=0, CWP=0 state (with IE=1 to allow
- * window fill/spill traps if required), switch to our safe tlb_handler_stack and
- * invoke the miss handler.
- */
-
-#define SAVE_CPU_STATE(type) \
- /* First save the various state registers */ \
- rdpr %cwp, %g7; \
- stx %g7, [%g1]; \
- rdpr %cansave, %g7; \
- stx %g7, [%g1 + 0x8]; \
- rdpr %canrestore, %g7; \
- stx %g7, [%g1 + 0x10]; \
- rdpr %otherwin, %g7; \
- stx %g7, [%g1 + 0x18]; \
- rdpr %wstate, %g7; \
- stx %g7, [%g1 + 0x20]; \
- rdpr %cleanwin, %g7; \
- stx %g7, [%g1 + 0x28]; \
- rdpr %pstate, %g7; \
- stx %g7, [%g1 + 0x30]; \
- \
- rd %y, %g7; \
- stx %g7, [%g1 + 0x38]; \
- rd %fprs, %g7; \
- stx %g7, [%g1 + 0x40]; \
- \
- rdpr %tl, %g7; \
- stx %g7, [%g1 + 0x48]; \
- \
- /* Trap state */ \
- add %g1, 0x50, %g5; \
- mov 4, %g6; \
- \
-save_trap_state_##type: \
- deccc %g6; \
- wrpr %g6, %tl; \
- rdpr %tpc, %g7; \
- stx %g7, [%g5]; \
- rdpr %tnpc, %g7; \
- stx %g7, [%g5 + 0x8]; \
- rdpr %tstate, %g7; \
- stx %g7, [%g5 + 0x10]; \
- rdpr %tt, %g7; \
- stx %g7, [%g5 + 0x18]; \
- bne save_trap_state_##type; \
- add %g5, 0x20, %g5; \
- \
- /* For 4 trap levels with 4 registers, memory required is
- 4*8*4 = 0x80 bytes */ \
- \
- /* Save the o registers */ \
- stx %o0, [%g1 + 0xd0]; \
- stx %o1, [%g1 + 0xd8]; \
- stx %o2, [%g1 + 0xe0]; \
- stx %o3, [%g1 + 0xe8]; \
- stx %o4, [%g1 + 0xf0]; \
- stx %o5, [%g1 + 0xf8]; \
- stx %o6, [%g1 + 0x100]; \
- stx %o7, [%g1 + 0x108]; \
- \
- /* Now iterate through all of the windows saving all l and i registers */ \
- add %g1, 0x110, %g5; \
- \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- inc %g6; \
- \
-save_cpu_window_##type: \
- deccc %g6; \
- wrpr %g6, %cwp; \
- stx %l0, [%g5]; \
- stx %l1, [%g5 + 0x8]; \
- stx %l2, [%g5 + 0x10]; \
- stx %l3, [%g5 + 0x18]; \
- stx %l4, [%g5 + 0x20]; \
- stx %l5, [%g5 + 0x28]; \
- stx %l6, [%g5 + 0x30]; \
- stx %l7, [%g5 + 0x38]; \
- stx %i0, [%g5 + 0x40]; \
- stx %i1, [%g5 + 0x48]; \
- stx %i2, [%g5 + 0x50]; \
- stx %i3, [%g5 + 0x58]; \
- stx %i4, [%g5 + 0x60]; \
- stx %i5, [%g5 + 0x68]; \
- stx %i6, [%g5 + 0x70]; \
- stx %i7, [%g5 + 0x78]; \
- bne save_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* For 8 windows with 16 registers to save in the window, memory required
- is 16*8*8 = 0x400 bytes */ \
- \
- /* Now we should be in window 0 so update the other window registers */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- dec %g6; \
- wrpr %g6, %cansave; \
- \
- wrpr %g0, %cleanwin; \
- wrpr %g0, %canrestore; \
- wrpr %g0, %otherwin
-
-
-#define RESTORE_CPU_STATE(type) \
- /* Get the number of windows in %g6 */ \
- rdpr %ver, %g6; \
- and %g6, 0xf, %g6; \
- inc %g6; \
- \
- /* Now iterate through all of the windows restoring all l and i registers */ \
- add %g1, 0x110, %g5; \
- \
-restore_cpu_window_##type: \
- deccc %g6; \
- wrpr %g6, %cwp; \
- ldx [%g5], %l0; \
- ldx [%g5 + 0x8], %l1; \
- ldx [%g5 + 0x10], %l2; \
- ldx [%g5 + 0x18], %l3; \
- ldx [%g5 + 0x20], %l4; \
- ldx [%g5 + 0x28], %l5; \
- ldx [%g5 + 0x30], %l6; \
- ldx [%g5 + 0x38], %l7; \
- ldx [%g5 + 0x40], %i0; \
- ldx [%g5 + 0x48], %i1; \
- ldx [%g5 + 0x50], %i2; \
- ldx [%g5 + 0x58], %i3; \
- ldx [%g5 + 0x60], %i4; \
- ldx [%g5 + 0x68], %i5; \
- ldx [%g5 + 0x70], %i6; \
- ldx [%g5 + 0x78], %i7; \
- bne restore_cpu_window_##type; \
- add %g5, 0x80, %g5; \
- \
- /* Restore the window registers to their original value */ \
- ldx [%g1], %g7; \
- wrpr %g7, %cwp; \
- ldx [%g1 + 0x8], %g7; \
- wrpr %g7, %cansave; \
- ldx [%g1 + 0x10], %g7; \
- wrpr %g7, %canrestore; \
- ldx [%g1 + 0x18], %g7; \
- wrpr %g7, %otherwin; \
- ldx [%g1 + 0x20], %g7; \
- wrpr %g7, %wstate; \
- ldx [%g1 + 0x28], %g7; \
- wrpr %g7, %cleanwin; \
- ldx [%g1 + 0x30], %g7; \
- wrpr %g7, %pstate; \
- \
- /* Restore the o registers */ \
- ldx [%g1 + 0xd0], %o0; \
- ldx [%g1 + 0xd8], %o1; \
- ldx [%g1 + 0xe0], %o2; \
- ldx [%g1 + 0xe8], %o3; \
- ldx [%g1 + 0xf0], %o4; \
- ldx [%g1 + 0xf8], %o5; \
- ldx [%g1 + 0x100], %o6; \
- ldx [%g1 + 0x108], %o7; \
- \
- /* Restore the trap state */ \
- add %g1, 0x50, %g5; \
- mov 4, %g6; \
- \
-restore_trap_state_##type: \
- deccc %g6; \
- wrpr %g6, %tl; \
- ldx [%g5], %g7; \
- wrpr %g7, %tpc; \
- ldx [%g5 + 0x8], %g7; \
- wrpr %g7, %tnpc; \
- ldx [%g5 + 0x10], %g7; \
- wrpr %g7, %tstate; \
- ldx [%g5 + 0x18], %g7; \
- wrpr %g7, %tt; \
- bne restore_trap_state_##type; \
- add %g5, 0x20, %g5; \
- \
- ldx [%g1 + 0x38], %g7; \
- wr %g7, 0, %y; \
- ldx [%g1 + 0x40], %g7; \
- wr %g7, 0, %fprs; \
- ldx [%g1 + 0x48], %g7; \
- wrpr %g7, %tl
-
.globl reload_DMMU_tlb, reload_IMMU_tlb, bug
@@ -535,7 +336,7 @@
/* Save CPU state to stack */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- add %g1, -0x510, %g1
+ add %g1, -CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
SAVE_CPU_STATE(dtlb)
@@ -544,7 +345,7 @@
gcc to save its arguments when building with -O0) */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g6
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
sub %g6, %g5, %g6
stx %g6, [%g7]
@@ -568,7 +369,7 @@
/* Restore CPU state from stack */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
add %g1, %g5, %g1
stx %g1, [%g7]
@@ -576,7 +377,7 @@
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- add %g1, 0x510, %g1
+ add %g1, CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
retry
@@ -586,7 +387,7 @@
/* Save CPU state to stack */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- add %g1, -0x510, %g1
+ add %g1, -CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
SAVE_CPU_STATE(itlb)
@@ -595,7 +396,7 @@
gcc to save its arguments when building with -O0) */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g6
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
sub %g6, %g5, %g6
stx %g6, [%g7]
@@ -619,7 +420,7 @@
/* Restore CPU state from stack */
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- setx 0x2000, %g4, %g5
+ setx CONTEXT_STACK_SIZE, %g4, %g5
add %g1, %g5, %g1
stx %g1, [%g7]
@@ -627,7 +428,7 @@
setx _fcstack_ptr, %g6, %g7
ldx [%g7], %g1
- add %g1, 0x510, %g1
+ add %g1, CONTEXT_STATE_SIZE, %g1
stx %g1, [%g7]
retry
More information about the OpenBIOS
mailing list