summaryrefslogtreecommitdiffstats
path: root/lib/libc/sparc64
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2002-02-23 19:00:30 +0000
committerjake <jake@FreeBSD.org>2002-02-23 19:00:30 +0000
commita349eff875dedac834d6e1c94ca0f5a19589855b (patch)
tree68c462f51b9cbe37c5de4819c14b5f13ea16235d /lib/libc/sparc64
parent3ed9f58376b0b0def37c9ab340dfc39dc4b186ab (diff)
downloadFreeBSD-src-a349eff875dedac834d6e1c94ca0f5a19589855b.zip
FreeBSD-src-a349eff875dedac834d6e1c94ca0f5a19589855b.tar.gz
Add space for %fsr and %tstate to utrapframe. Save them in the generic
user trap entry code. Restore %asi and %ccr from the saved %tstate before returning to the trapping user code. Submitted by: tmm
Diffstat (limited to 'lib/libc/sparc64')
-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