[OpenBIOS] [PATCH 1/9] SPARC64: add %tba to saved state context

Mark Cave-Ayland mark.cave-ayland at ilande.co.uk
Sun Oct 23 16:22:36 CEST 2016


This means we can remove the client_tba hack in the CIF prologue and
also use the full SAVE_CPU_STATE() macro for entry.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
---
 arch/sparc64/call-client.S |   12 ------------
 arch/sparc64/context.h     |    4 +++-
 arch/sparc64/cpu.fs        |    4 +++-
 arch/sparc64/cpustate.h    |   13 +++++++++----
 arch/sparc64/entry.S       |    3 +--
 arch/sparc64/openbios.c    |    9 +++++----
 6 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/arch/sparc64/call-client.S b/arch/sparc64/call-client.S
index ebab6b9..4129505 100644
--- a/arch/sparc64/call-client.S
+++ b/arch/sparc64/call-client.S
@@ -18,8 +18,6 @@ client_context:
 	.xword	0
 client_stack:
 	.xword	0
-client_tba:
-	.xword	0
 client_window:
 	.skip	2048
 
@@ -46,11 +44,6 @@ sparc64_of_client_interface:
 	stx	%g6, [%sp + 2047 - 248 + 232]
 	stx	%g7, [%sp + 2047 - 248 + 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]
@@ -133,11 +126,6 @@ sparc64_of_client_interface:
 	/* 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 %pc */
 	ldx	[%g1 + 0x4d0], %o7
diff --git a/arch/sparc64/context.h b/arch/sparc64/context.h
index a047b9c..eb189fb 100644
--- a/arch/sparc64/context.h
+++ b/arch/sparc64/context.h
@@ -11,7 +11,9 @@ struct context {
 #define REG_O0 14
 #define REG_SP 20
 #define SP_LOC(ctx) (&(ctx)->regs[REG_SP])
-    uint64_t tregs[20];
+    uint64_t tba;
+    uint64_t _pad;
+    uint64_t tregs[16];
     /* Flags */
     /* Optional stack contents */
     uint64_t return_addr;
diff --git a/arch/sparc64/cpu.fs b/arch/sparc64/cpu.fs
index b0aa611..5a8f8d6 100644
--- a/arch/sparc64/cpu.fs
+++ b/arch/sparc64/cpu.fs
@@ -3,9 +3,10 @@ include config.fs
 \ SPARC64 trap registers
 
 : %tl-c saved-context h# c8 + @ ;
+: %tba saved-context h# 4e0 + @ ;
 
 : tl-offset ( level -- offset )
-  h# 20 * h# 4e0 h# 60 +  swap - ;
+  h# 20 * h# 4f0 h# 60 +  swap - ;
 ;
 
 : %tpc ( level -- n ) tl-offset saved-context + @ ;
@@ -15,6 +16,7 @@ include config.fs
 
 : .trap-registers
   cr
+  s" %tba: " type %tba u. cr
   s" %tl-c: " type %tl-c u. cr
   s" %tpc: " type %tl-c %tpc u. cr
   s" %tnpc: " type %tl-c %tnpc u. cr
diff --git a/arch/sparc64/cpustate.h b/arch/sparc64/cpustate.h
index cff7733..b4695ad 100644
--- a/arch/sparc64/cpustate.h
+++ b/arch/sparc64/cpustate.h
@@ -12,7 +12,7 @@
 #include "autoconf.h"
 
 /* State size for context (see below) */
-#define CONTEXT_STATE_SIZE 0x560
+#define CONTEXT_STATE_SIZE 0x570
 
 /* Stack size for context (allocated inline of the context stack) */
 #define CONTEXT_STACK_SIZE 0x2000
@@ -135,7 +135,9 @@ save_cpu_window_##type: \
 
 #define SAVE_CPU_TRAP_STATE(type) \
 	/* Save trap state into context at %g1 */ \
-	add	%g1, 0x4e0, %g5; \
+	rdpr	%tba, %g5; \
+	stx	%g5, [%g1 + 0x4e0]; \
+	add	%g1, 0x4f0, %g5; \
 	mov	4, %g6; \
 	\
 	/* Save current trap level */ \
@@ -246,7 +248,7 @@ restore_cpu_window_##type: \
 
 #define RESTORE_CPU_TRAP_STATE(type) \
 	/* Restore trap state from context at %g1 */ \
-	add	%g1, 0x4e0, %g5; \
+	add	%g1, 0x4f0, %g5; \
 	mov	4, %g6; \
 	\
 restore_trap_state_##type: \
@@ -264,7 +266,10 @@ restore_trap_state_##type: \
 	 add	%g5, 0x20, %g5; \
 	\
 	ldx	[%g1 + 0xc8], %g7; \
-	wrpr	%g7, %tl
+	wrpr	%g7, %tl; \
+	ldx	[%g1 + 0x4e0], %g7; \
+	wrpr	%g7, %tba
+
 
 /* Restore all state from context at %g1 */
 #define RESTORE_CPU_STATE(type) \
diff --git a/arch/sparc64/entry.S b/arch/sparc64/entry.S
index 3a46d89..47d1139 100644
--- a/arch/sparc64/entry.S
+++ b/arch/sparc64/entry.S
@@ -269,8 +269,7 @@ lowmem:
         setx    __context, %g2, %g1
         ldx     [%g1], %g1
         
-        SAVE_CPU_GENERAL_STATE(entry)
-        SAVE_CPU_WINDOW_STATE(entry)
+        SAVE_CPU_STATE(entry)
         
         /* Set up local stack pointer */
         setx    _estack - 2047, %o2, %sp
diff --git a/arch/sparc64/openbios.c b/arch/sparc64/openbios.c
index 9a1d56c..3b7bc46 100644
--- a/arch/sparc64/openbios.c
+++ b/arch/sparc64/openbios.c
@@ -10,6 +10,8 @@
 #include "libopenbios/openbios.h"
 #include "libopenbios/bindings.h"
 #include "libopenbios/console.h"
+#include "context.h"
+#include "libopenbios/initprogram.h"
 #include "drivers/drivers.h"
 #include "dict.h"
 #include "arch/common/nvram.h"
@@ -89,17 +91,16 @@ struct cpudef {
   ( addr -- ? )
 */
 
-extern volatile uint64_t client_tba;
-
 static void
 set_trap_table(void)
 {
     unsigned long addr;
+    volatile struct context *ctx = __context;
 
     addr = POP();
 
-    /* Update client_tba to be updated on CIF exit */
-    client_tba = addr;
+    /* Update %tba to be updated on exit */
+    ctx->tba = (uint64_t)addr;
 }
 
 /* Reset control register is defined in 17.2.7.3 of US IIi User Manual */
-- 
1.7.10.4




More information about the OpenBIOS mailing list