summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/sparc64/sys/__sparc_utrap_gen.S13
-rw-r--r--lib/libc/sparc64/sys/__sparc_utrap_private.h2
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/libc/sparc64/sys/__sparc_utrap_gen.S b/lib/libc/sparc64/sys/__sparc_utrap_gen.S
index 592db56..3a96248 100644
--- a/lib/libc/sparc64/sys/__sparc_utrap_gen.S
+++ b/lib/libc/sparc64/sys/__sparc_utrap_gen.S
@@ -35,18 +35,21 @@
.register %g7, #ignore
#include <machine/asm.h>
+#include <machine/tstate.h>
#include <machine/utrap.h>
#include "assym.s"
ENTRY(__sparc_utrap_gen)
- sub %fp, CCFSZ + UF_SIZEOF, %sp
+ sub %sp, UF_SIZEOF, %sp
stx %o0, [%sp + SPOFF + CCFSZ + UF_TYPE]
stx %o3, [%sp + SPOFF + CCFSZ + UF_TAR]
stx %o4, [%sp + SPOFF + CCFSZ + UF_SFAR]
stx %o5, [%sp + SPOFF + CCFSZ + UF_SFSR]
+ stx %l4, [%sp + SPOFF + CCFSZ + UF_FSR]
+ stx %l5, [%sp + SPOFF + CCFSZ + UF_STATE]
stx %l6, [%sp + SPOFF + CCFSZ + UF_PC]
stx %l7, [%sp + SPOFF + CCFSZ + UF_NPC]
@@ -87,6 +90,14 @@ ENTRY(__sparc_utrap_gen)
ldx [%sp + SPOFF + CCFSZ + UF_O6], %i6
ldx [%sp + SPOFF + CCFSZ + UF_O7], %i7
+ ldx [%sp + SPOFF + CCFSZ + UF_STATE], %l5
+ ! Restore %asi and %ccr from the passed tstate
+ srlx %l5, TSTATE_CCR_SHIFT, %l4
+ and %l4, CCR_MASK, %l4
+ wr %l4, 0, %ccr
+ srlx %l5, TSTATE_ASI_SHIFT, %l4
+ and %l4, ASI_MASK, %l4
+ wr %l4, 0, %asi
ldx [%sp + SPOFF + CCFSZ + UF_PC], %l6
ldx [%sp + SPOFF + CCFSZ + UF_NPC], %l7
diff --git a/lib/libc/sparc64/sys/__sparc_utrap_private.h b/lib/libc/sparc64/sys/__sparc_utrap_private.h
index 5946134..cd11ccd 100644
--- a/lib/libc/sparc64/sys/__sparc_utrap_private.h
+++ b/lib/libc/sparc64/sys/__sparc_utrap_private.h
@@ -43,6 +43,8 @@ struct utrapframe {
u_long uf_sfsr;
u_long uf_tar;
u_long uf_type;
+ u_long uf_state;
+ u_long uf_fsr;
};
extern char __sparc_utrap_fp_disabled[];
OpenPOWER on IntegriCloud