1/* 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) 35 /* .asciz "@(#)_setjmp.s 8.1 (Berkeley) 6/4/93" */ 36 .asciz "$NetBSD: _setjmp.S,v 1.3 2000/06/28 19:20:17 matt Exp $" 37#endif /* LIBC_SCCS and not lint */ 38 39/* 40 * C library -- _setjmp, _longjmp 41 * 42 * _longjmp(a,v) 43 * will generate a "return(v)" from 44 * the last call to 45 * _setjmp(a) 46 * by restoring registers from the stack, 47 * The previous signal state is NOT restored. 48 */ 49 50#include "DEFS.h" 51 52ENTRY(_setjmp, 0) 53 movl 4(ap),r0 54 movl 12(fp),(r0) # save frame pointer of caller 55 movl 16(fp),4(r0) # save pc of caller 56 clrl r0 57 ret 58 59ENTRY(_longjmp, 0) 60 movl 8(ap),r0 # return(v) 61 movl 4(ap),r1 # fetch buffer 62 tstl (r1) 63 beql botch 64loop: 65 bitw $1,6(fp) # r0 saved? 66 beql 1f 67 movl r0,20(fp) 68 bitw $2,6(fp) # was r1 saved? 69 beql 2f 70 movl r1,24(fp) 71 brb 2f 721: 73 bitw $2,6(fp) # was r1 saved? 74 beql 2f 75 movl r1,20(fp) 762: 77 cmpl (r1),12(fp) 78 beql done 79 blssu botch 80 movab loop,16(fp) 81 ret # pop another frame 82 83done: 84 cmpb *16(fp),$2 # returning to an "rei"? 85 bneq 1f 86 movab 3f,16(fp) # do return w/ psl-pc pop 87 brw 2f 881: 89 movab 4f,16(fp) # do standard return 902: 91 ret # unwind stack before signals enabled 923: 93 addl2 $8,sp # compensate for PSL-PC push 944: 95 jmp *4(r1) # done, return.... 96 97botch: 98 calls $0,_C_LABEL(longjmperror) 99 halt 100