[OpenBIOS] [commit] r1301 - trunk/openbios-devel/arch/sparc64
repository service
svn at openbios.org
Fri May 23 14:01:43 CEST 2014
Author: mcayland
Date: Fri May 23 14:01:43 2014
New Revision: 1301
URL: http://tracker.coreboot.org/trac/openbios/changeset/1301
Log:
SPARC64: defer set_trap_table effect until CIF exit
Since OpenBIOS invokes window fill/spill traps during normal operation, make
sure that we defer setting the client trap table until we return control
back to the client.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
Modified:
trunk/openbios-devel/arch/sparc64/call-client.S
trunk/openbios-devel/arch/sparc64/openbios.c
Modified: trunk/openbios-devel/arch/sparc64/call-client.S
==============================================================================
--- trunk/openbios-devel/arch/sparc64/call-client.S Fri May 23 14:01:40 2014 (r1300)
+++ trunk/openbios-devel/arch/sparc64/call-client.S Fri May 23 14:01:43 2014 (r1301)
@@ -1,4 +1,4 @@
- .globl sparc64_of_client_interface
+ .globl sparc64_of_client_interface, client_tba
.data
.align 8
@@ -8,6 +8,8 @@
client_stack:
.xword 0
+client_tba:
+ .xword 0
.text
.align 4
@@ -35,6 +37,11 @@
stx %g6, [%sp + 2047 + 40]
stx %g7, [%sp + 2047 + 48]
+ /* Save client trap table */
+ setx client_tba, %g6, %g7
+ rdpr %tba, %g6
+ stx %g6, [%g7]
+
/* Save existing stack and move to openbios stack */
setx client_stack, %g6, %g7
stx %sp, [%g7]
@@ -54,6 +61,11 @@
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 + 0], %g1
ldx [%sp + 2047 + 8], %g2
Modified: trunk/openbios-devel/arch/sparc64/openbios.c
==============================================================================
--- trunk/openbios-devel/arch/sparc64/openbios.c Fri May 23 14:01:40 2014 (r1300)
+++ trunk/openbios-devel/arch/sparc64/openbios.c Fri May 23 14:01:43 2014 (r1301)
@@ -91,14 +91,18 @@
/*
( addr -- ? )
*/
+
+extern volatile uint64_t client_tba;
+
static void
set_trap_table(void)
{
unsigned long addr;
addr = POP();
- asm("wrpr %0, %%tba\n"
- : : "r" (addr));
+
+ /* Update client_tba to be updated on CIF exit */
+ client_tba = addr;
}
/* Reset control register is defined in 17.2.7.3 of US IIi User Manual */
More information about the OpenBIOS
mailing list