diff options
author | jake <jake@FreeBSD.org> | 2002-02-23 19:00:30 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2002-02-23 19:00:30 +0000 |
commit | a349eff875dedac834d6e1c94ca0f5a19589855b (patch) | |
tree | 68c462f51b9cbe37c5de4819c14b5f13ea16235d /lib/libc/sparc64 | |
parent | 3ed9f58376b0b0def37c9ab340dfc39dc4b186ab (diff) | |
download | FreeBSD-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.S | 13 | ||||
-rw-r--r-- | lib/libc/sparc64/sys/__sparc_utrap_private.h | 2 |
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[]; |