1/* 2 * Copyright (c) 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Computer Consoles Inc. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11#if defined(LIBC_SCCS) && !defined(lint) 12 .asciz "@(#)_setjmp.s 8.1 (Berkeley) 06/04/93" 13#endif /* LIBC_SCCS and not lint */ 14 15/* 16 * C library -- _setjmp, _longjmp 17 * 18 * _longjmp(a,v) 19 * will generate a "return(v)" from 20 * the last call to 21 * _setjmp(a) 22 * by restoring registers from the stack, 23 * The previous signal state is NOT restored. 24 */ 25 26#include "DEFS.h" 27 28ENTRY(_setjmp, 0) 29 movl 4(fp),r0 30 movl (fp),(r0) # save frame pointer of caller 31 movl -8(fp),4(r0) # save pc of caller 32 clrl r0 33 ret 34 35ENTRY(_longjmp, 0) 36 movl 8(fp),r0 # return(v) 37 movl 4(fp),r1 # fetch buffer 38 tstl (r1) 39 beql botch 40loop: 41 cmpl (r1),(fp) 42 beql done 43 blssu botch 44 movl $loop,-8(fp) 45 ret # pop another frame 46 47done: 48 cmpb *-8(fp),reiins # returning to an "rei"? 49 bneq 1f 50 movab 3f,-8(fp) # do return w/ psl-pc pop 51 brw 2f 521: 53 movab 4f,-8(fp) # do standard return 542: 55 ret # unwind stack before signals enabled 563: 57 addl2 $8,sp # compensate for PSL-PC push 584: 59 jmp *4(r1) # done, return.... 60 61botch: 62 callf $4,_longjmperror 63 halt 64 65 .data 66reiins: rei 67