188794Sjake/*-
288794Sjake * Copyright (c) 2001 Jake Burkholder.
388794Sjake * All rights reserved.
488794Sjake *
588794Sjake * Redistribution and use in source and binary forms, with or without
688794Sjake * modification, are permitted provided that the following conditions
788794Sjake * are met:
888794Sjake * 1. Redistributions of source code must retain the above copyright
988794Sjake *    notice, this list of conditions and the following disclaimer.
1088794Sjake * 2. Redistributions in binary form must reproduce the above copyright
1188794Sjake *    notice, this list of conditions and the following disclaimer in the
1288794Sjake *    documentation and/or other materials provided with the distribution.
1388794Sjake *
1488794Sjake * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1588794Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1688794Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1788794Sjake * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1888794Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1988794Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2088794Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2188794Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2288794Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2388794Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2488794Sjake * SUCH DAMAGE.
2588794Sjake */
2688794Sjake
2799116Sobrien#include <machine/asm.h>
2899116Sobrien__FBSDID("$FreeBSD$");
2988794Sjake
3088794Sjake	.register	%g2, #ignore
3188794Sjake	.register	%g3, #ignore
3288794Sjake	.register	%g6, #ignore
3388794Sjake	.register	%g7, #ignore
3488794Sjake
3591159Sjake#include <machine/tstate.h>
3688794Sjake#include <machine/utrap.h>
3788794Sjake
3888794Sjake#include "assym.s"
3988794Sjake
4088794SjakeENTRY(__sparc_utrap_gen)
4191159Sjake	sub	%sp, UF_SIZEOF, %sp
4288794Sjake
4388794Sjake	stx	%o0, [%sp + SPOFF + CCFSZ + UF_TYPE]
4488794Sjake	stx	%o3, [%sp + SPOFF + CCFSZ + UF_TAR]
4588794Sjake	stx	%o4, [%sp + SPOFF + CCFSZ + UF_SFAR]
4688794Sjake	stx	%o5, [%sp + SPOFF + CCFSZ + UF_SFSR]
4788794Sjake
4891159Sjake	stx	%l4, [%sp + SPOFF + CCFSZ + UF_FSR]
4991159Sjake	stx	%l5, [%sp + SPOFF + CCFSZ + UF_STATE]
5088794Sjake	stx	%l6, [%sp + SPOFF + CCFSZ + UF_PC]
5188794Sjake	stx	%l7, [%sp + SPOFF + CCFSZ + UF_NPC]
5288794Sjake
5388794Sjake	stx	%g1, [%sp + SPOFF + CCFSZ + UF_G1]
5488794Sjake	stx	%g2, [%sp + SPOFF + CCFSZ + UF_G2]
5588794Sjake	stx	%g3, [%sp + SPOFF + CCFSZ + UF_G3]
5688794Sjake	stx	%g4, [%sp + SPOFF + CCFSZ + UF_G4]
5788794Sjake	stx	%g5, [%sp + SPOFF + CCFSZ + UF_G5]
5888794Sjake	stx	%g6, [%sp + SPOFF + CCFSZ + UF_G6]
5988794Sjake	stx	%g7, [%sp + SPOFF + CCFSZ + UF_G7]
6088794Sjake
6188794Sjake	stx	%i0, [%sp + SPOFF + CCFSZ + UF_O0]
6288794Sjake	stx	%i1, [%sp + SPOFF + CCFSZ + UF_O1]
6388794Sjake	stx	%i2, [%sp + SPOFF + CCFSZ + UF_O2]
6488794Sjake	stx	%i3, [%sp + SPOFF + CCFSZ + UF_O3]
6588794Sjake	stx	%i4, [%sp + SPOFF + CCFSZ + UF_O4]
6688794Sjake	stx	%i5, [%sp + SPOFF + CCFSZ + UF_O5]
6788794Sjake	stx	%i6, [%sp + SPOFF + CCFSZ + UF_O6]
6888794Sjake	stx	%i7, [%sp + SPOFF + CCFSZ + UF_O7]
6988794Sjake
7092049Stmm	rd	%y, %l6
7192049Stmm
7288794Sjake	call	__sparc_utrap
7388794Sjake	 add	%sp, SPOFF + CCFSZ, %o0
7488794Sjake
7592049Stmm	wr	%l6, 0, %y
7692049Stmm
7788794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G1], %g1
7888794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G2], %g2
7988794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G3], %g3
8088794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G4], %g4
8188794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G5], %g5
8288794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G6], %g6
8388794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_G7], %g7
8488794Sjake
8588794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O0], %i0
8688794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O1], %i1
8788794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O2], %i2
8888794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O3], %i3
8988794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O4], %i4
9088794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O5], %i5
9188794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O6], %i6
9288794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_O7], %i7
9388794Sjake
9491159Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_STATE], %l5
9591159Sjake	! Restore %asi and %ccr from the passed tstate
9691159Sjake	srlx	%l5, TSTATE_CCR_SHIFT, %l4
9791159Sjake	and	%l4, CCR_MASK, %l4
9891159Sjake	wr	%l4, 0, %ccr
9991159Sjake	srlx	%l5, TSTATE_ASI_SHIFT, %l4
10091159Sjake	and	%l4, ASI_MASK, %l4
10191159Sjake	wr	%l4, 0, %asi
10288794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_PC], %l6
10388794Sjake	ldx	[%sp + SPOFF + CCFSZ + UF_NPC], %l7
10488794Sjake
10588794Sjake	jmpl	%l6, %g0
10688794Sjake	 return	%l7
10788794SjakeEND(__sparc_utrap_gen)
108