1#ifdef LIBC_SCCS 2 .asciz "@(#)setjmp.s 1.2 (Berkeley/CCI) 08/22/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 16#include "DEFS.h" 17 18ENTRY(setjmp, R6) 19 movl 4(fp),r6 # construct sigcontext 20 movab -8(sp),sp # space for current struct sigstack 21 pushal (sp) # get current values 22 pushl $0 # no new values 23 callf $16,_sigstack # pop args plus signal stack value 24 movl (sp)+,(r6) # save onsigstack status of caller 25 pushl $0 26 callf $8,_sigblock # get signal mask 27 movl r0,4(r6) # save signal mask of caller 28 addl3 $8,fp,8(r6) # save stack pointer of caller 29 movl (fp),12(r6) # save frame pointer of caller 30 movl -8(fp),20(r6) # save pc of caller 31 movpsl 24(r6) # save psl 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 12(r1) 39 beql botch 40loop: 41 cmpl 12(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 pushl r1 # pointer to sigcontext 60 callf $4,_sigreturn # restore previous context 61 # we should never return 62 63botch: 64 callf $4,_longjmperror 65 halt 66 67 .data 68reiins: rei 69