1#ifdef LIBC_SCCS 2 .asciz "@(#)_setjmp.s 1.1 (Berkeley/CCI) 08/01/86" 3#endif LIBC_SCCS 4 5/* 6 * C library -- _setjmp, _longjmp 7 * 8 * _longjmp(a,v) 9 * will generate a "return(v)" from 10 * the last call to 11 * _setjmp(a) 12 * by restoring registers from the stack, 13 * The previous signal state is NOT restored. 14 */ 15 16#include "DEFS.h" 17 18ENTRY(_setjmp, 0) 19 movl 4(fp),r0 20 movl (fp),(r0) # save frame pointer of caller 21 movl -8(fp),4(r0) # save pc of caller 22 clrl r0 23 ret 24 25ENTRY(_longjmp, 0) 26 movl 8(fp),r0 # return(v) 27 movl 4(fp),r1 # fetch buffer 28 tstl (r1) 29 beql botch 30loop: 31 cmpl (r1),(fp) 32 beql done 33 blssu botch 34 movl $loop,-8(fp) 35 ret # pop another frame 36 37done: 38 cmpb *-8(fp),reiins # returning to an "rei"? 39 bneq 1f 40 movab 3f,-8(fp) # do return w/ psl-pc pop 41 brw 2f 421: 43 movab 4f,-8(fp) # do standard return 442: 45 ret # unwind stack before signals enabled 463: 47 addl2 $8,sp # compensate for PSL-PC push 484: 49 jmp *4(r1) # done, return.... 50 51botch: 52 callf $4,_longjmperror 53 halt 54 55 .data 56reiins: rei 57