_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