diff options
Diffstat (limited to 'lib')
| -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 592db56febe6..3a962486c15c 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 59461348a6d4..cd11ccd8f39e 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[];  | 
