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 * previous signal mask, and doing a return. 14 * 15 * BUG: always restores onsigstack state to 0 16 */ 17 18#include "DEFS.h" 19 20ENTRY(setjmp, 0) 21 pushl $0 22 callf $8,_sigblock # get signal mask 23 movl r0,r1 24 movl 4(fp),r0 25 movl (fp),(r0) # save frame pointer of caller 26 movl -8(fp),4(r0) # save pc of caller 27 movl r1,8(r0) # save signal mask 28 clrl 12(r0) # XXX (should be onsigstack) XXX 29 clrl r0 30 ret 31 32ENTRY(longjmp, 0) 33 movl 8(fp),r0 # return(v) 34 movl 4(fp),r1 # fetch buffer 35 tstl (r1) 36 beql botch 37loop: 38 cmpl (r1),(fp) 39 beql done 40 blssu botch 41 movl $loop,-8(fp) 42 ret # pop another frame 43 44done: 45 cmpb *-8(fp),reiins # returning to an "rei"? 46 bneq 1f 47 movab 3f,-8(fp) # do return w/ psl-pc pop 48 brw 2f 491: 50 movab 4f,-8(fp) # do standard return 512: 52 ret # unwind stack before signals enabled 533: 54 addl2 $8,sp # compensate for PSL-PC push 554: 56 pushal (sp) # old stack pointer 57 pushl 8(r1) # old signal mask 58 pushl 12(r1) # old onsigstack 59 pushal (sp) # pointer to sigcontext 60 kcall $139 # restore previous signal context 61 jmp *4(r1) # done, return.... 62 63botch: 64 callf $4,_longjmperror 65 halt 66 67 .data 68reiins: rei 69