_setjmp.S revision 67117
167117Sdfr/*	$NetBSD: _setjmp.S,v 1.2 1996/10/17 03:08:03 cgd Exp $	*/
267117Sdfr/* $FreeBSD: head/lib/libc/ia64/gen/_setjmp.S 67117 2000-10-14 17:01:12Z dfr $ */
367117Sdfr
467117Sdfr/*
567117Sdfr * Copyright (c) 1994, 1995 Carnegie-Mellon University.
667117Sdfr * All rights reserved.
767117Sdfr *
867117Sdfr * Author: Chris G. Demetriou
967117Sdfr *
1067117Sdfr * Permission to use, copy, modify and distribute this software and
1167117Sdfr * its documentation is hereby granted, provided that both the copyright
1267117Sdfr * notice and this permission notice appear in all copies of the
1367117Sdfr * software, derivative works or modified versions, and any portions
1467117Sdfr * thereof, and that both notices appear in supporting documentation.
1567117Sdfr *
1667117Sdfr * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
1767117Sdfr * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
1867117Sdfr * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
1967117Sdfr *
2067117Sdfr * Carnegie Mellon requests users of this software to return to
2167117Sdfr *
2267117Sdfr *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
2367117Sdfr *  School of Computer Science
2467117Sdfr *  Carnegie Mellon University
2567117Sdfr *  Pittsburgh PA 15213-3890
2667117Sdfr *
2767117Sdfr * any improvements or extensions that they make and grant Carnegie the
2867117Sdfr * rights to redistribute these changes.
2967117Sdfr *
3067117Sdfr * $FreeBSD: head/lib/libc/ia64/gen/_setjmp.S 67117 2000-10-14 17:01:12Z dfr $
3167117Sdfr */
3267117Sdfr
3367117Sdfr#include <machine/asm.h>
3467117Sdfr
3567117Sdfr/*
3667117Sdfr * C library -- _setjmp, _longjmp
3767117Sdfr *
3867117Sdfr *	_longjmp(a,v)
3967117Sdfr * will generate a "return(v)" from
4067117Sdfr * the last call to
4167117Sdfr *	_setjmp(a)
4267117Sdfr * by restoring registers from the stack,
4367117Sdfr * The previous signal state is NOT restored.
4467117Sdfr */
4567117Sdfr
4667117SdfrENTRY(_setjmp, 1)
4767117Sdfr#if 0
4867117Sdfr	LDGP(pv)
4967117Sdfr	stq	ra, (2 * 8)(a0)			/* sc_pc = return address */
5067117Sdfr	stq	s0, (( 9 + 4) * 8)(a0)		/* saved bits of sc_regs */
5167117Sdfr	stq	s1, ((10 + 4) * 8)(a0)
5267117Sdfr	stq	s2, ((11 + 4) * 8)(a0)
5367117Sdfr	stq	s3, ((12 + 4) * 8)(a0)
5467117Sdfr	stq	s4, ((13 + 4) * 8)(a0)
5567117Sdfr	stq	s5, ((14 + 4) * 8)(a0)
5667117Sdfr	stq	s6, ((15 + 4) * 8)(a0)
5767117Sdfr	stq	ra, ((26 + 4) * 8)(a0)
5867117Sdfr	stq	sp, ((30 + 4) * 8)(a0)
5967117Sdfr	ldiq	t0, 0xacedbadd			/* sigcontext magic number */
6067117Sdfr	stq	t0, ((31 + 4) * 8)(a0)		/* magic in sc_regs[31] */
6167117Sdfr	/* Too bad we can't check if we actually used FP */
6267117Sdfr	ldiq	t0, 1
6367117Sdfr	stq	t0, (36 * 8)(a0)		/* say we've used FP.  */
6467117Sdfr	stt	fs0, ((2 + 37) * 8)(a0)		/* saved bits of sc_fpregs */
6567117Sdfr	stt	fs1, ((3 + 37) * 8)(a0)
6667117Sdfr	stt	fs2, ((4 + 37) * 8)(a0)
6767117Sdfr	stt	fs3, ((5 + 37) * 8)(a0)
6867117Sdfr	stt	fs4, ((6 + 37) * 8)(a0)
6967117Sdfr	stt	fs5, ((7 + 37) * 8)(a0)
7067117Sdfr	stt	fs6, ((8 + 37) * 8)(a0)
7167117Sdfr	stt	fs7, ((9 + 37) * 8)(a0)
7267117Sdfr	mf_fpcr ft0				/* get FP control reg */
7367117Sdfr	stt	ft0, (69 * 8)(a0)		/* and store it in sc_fpcr */
7467117Sdfr	stq	zero, (70 * 8)(a0)		/* FP software control XXX */
7567117Sdfr	stq	zero, (71 * 8)(a0)		/* sc_reserved[0] */
7667117Sdfr	stq	zero, (72 * 8)(a0)		/* sc_reserved[1] */
7767117Sdfr	stq	zero, (73 * 8)(a0)		/* sc_xxx[0] */
7867117Sdfr	stq	zero, (74 * 8)(a0)		/* sc_xxx[1] */
7967117Sdfr	stq	zero, (75 * 8)(a0)		/* sc_xxx[2] */
8067117Sdfr	stq	zero, (76 * 8)(a0)		/* sc_xxx[3] */
8167117Sdfr	stq	zero, (77 * 8)(a0)		/* sc_xxx[4] */
8267117Sdfr	stq	zero, (78 * 8)(a0)		/* sc_xxx[5] */
8367117Sdfr	stq	zero, (79 * 8)(a0)		/* sc_xxx[6] */
8467117Sdfr	stq	zero, (80 * 8)(a0)		/* sc_xxx[7] */
8567117Sdfr
8667117Sdfr	mov	zero, v0			/* return zero */
8767117Sdfr	RET
8867117Sdfr#endif
8967117SdfrEND(_setjmp)
9067117Sdfr
9167117Sdfr#ifdef _THREAD_SAFE
9267117SdfrENTRY(___longjmp, 2)
9367117Sdfr#else
9467117SdfrXENTRY(___longjmp)
9567117SdfrENTRY(_longjmp, 2)
9667117Sdfr#endif
9767117Sdfr#if 0
9867117Sdfr	LDGP(pv)
9967117Sdfr	ldq	t0, ((31 + 4) * 8)(a0)		/* magic in sc_regs[31] */
10067117Sdfr	ldiq	t1, 0xacedbadd
10167117Sdfr	cmpeq	t0, t1, t0
10267117Sdfr	beq	t0, botch			/* If the magic was bad, punt */
10367117Sdfr
10467117Sdfr	ldq	ra, (2 * 8)(a0)			/* sc_pc = return address */
10567117Sdfr	ldq	s0, (( 9 + 4) * 8)(a0)		/* saved bits of sc_regs */
10667117Sdfr	ldq	s1, ((10 + 4) * 8)(a0)
10767117Sdfr	ldq	s2, ((11 + 4) * 8)(a0)
10867117Sdfr	ldq	s3, ((12 + 4) * 8)(a0)
10967117Sdfr	ldq	s4, ((13 + 4) * 8)(a0)
11067117Sdfr	ldq	s5, ((14 + 4) * 8)(a0)
11167117Sdfr	ldq	s6, ((15 + 4) * 8)(a0)
11267117Sdfr	/* ldq	ra, ((26 + 4) * 8)(a0)		set above */
11367117Sdfr	ldq	sp, ((30 + 4) * 8)(a0)
11467117Sdfr	ldt	fs0, ((2 + 37) * 8)(a0)		/* saved bits of sc_fpregs */
11567117Sdfr	ldt	fs1, ((3 + 37) * 8)(a0)
11667117Sdfr	ldt	fs2, ((4 + 37) * 8)(a0)
11767117Sdfr	ldt	fs3, ((5 + 37) * 8)(a0)
11867117Sdfr	ldt	fs4, ((6 + 37) * 8)(a0)
11967117Sdfr	ldt	fs5, ((7 + 37) * 8)(a0)
12067117Sdfr	ldt	fs6, ((8 + 37) * 8)(a0)
12167117Sdfr	ldt	fs7, ((9 + 37) * 8)(a0)
12267117Sdfr	ldt	ft0, (69 * 8)(a0)		/* get sc_fpcr */
12367117Sdfr	mt_fpcr	ft0				/* and restore it. */
12467117Sdfr
12567117Sdfr	mov	a1, v0				/* return second arg */
12667117Sdfr	RET
12767117Sdfr
12867117Sdfrbotch:
12967117Sdfr	CALL(longjmperror)
13067117Sdfr	CALL(abort)
13167117Sdfr	RET					/* "can't" get here... */
13267117Sdfr#endif
13367117Sdfr#ifdef _THREAD_SAFE
13467117SdfrEND(___longjmp)
13567117Sdfr#else
13667117SdfrEND(_longjmp)
13767117Sdfr#endif
138