1*29698Ssam#ifdef LIBC_SCCS 2*29698Ssam .asciz "@(#)setjmp.s 1.1 (Berkeley/CCI) 08/01/86" 3*29698Ssam#endif LIBC_SCCS 4*29698Ssam 5*29698Ssam/* 6*29698Ssam * C library -- setjmp, longjmp 7*29698Ssam * 8*29698Ssam * longjmp(a,v) 9*29698Ssam * will generate a "return(v)" from 10*29698Ssam * the last call to 11*29698Ssam * setjmp(a) 12*29698Ssam * by restoring registers from the stack, 13*29698Ssam * previous signal mask, and doing a return. 14*29698Ssam * 15*29698Ssam * BUG: always restores onsigstack state to 0 16*29698Ssam */ 17*29698Ssam 18*29698Ssam#include "DEFS.h" 19*29698Ssam 20*29698SsamENTRY(setjmp, 0) 21*29698Ssam pushl $0 22*29698Ssam callf $8,_sigblock # get signal mask 23*29698Ssam movl r0,r1 24*29698Ssam movl 4(fp),r0 25*29698Ssam movl (fp),(r0) # save frame pointer of caller 26*29698Ssam movl -8(fp),4(r0) # save pc of caller 27*29698Ssam movl r1,8(r0) # save signal mask 28*29698Ssam clrl 12(r0) # XXX (should be onsigstack) XXX 29*29698Ssam clrl r0 30*29698Ssam ret 31*29698Ssam 32*29698SsamENTRY(longjmp, 0) 33*29698Ssam movl 8(fp),r0 # return(v) 34*29698Ssam movl 4(fp),r1 # fetch buffer 35*29698Ssam tstl (r1) 36*29698Ssam beql botch 37*29698Ssamloop: 38*29698Ssam cmpl (r1),(fp) 39*29698Ssam beql done 40*29698Ssam blssu botch 41*29698Ssam movl $loop,-8(fp) 42*29698Ssam ret # pop another frame 43*29698Ssam 44*29698Ssamdone: 45*29698Ssam cmpb *-8(fp),reiins # returning to an "rei"? 46*29698Ssam bneq 1f 47*29698Ssam movab 3f,-8(fp) # do return w/ psl-pc pop 48*29698Ssam brw 2f 49*29698Ssam1: 50*29698Ssam movab 4f,-8(fp) # do standard return 51*29698Ssam2: 52*29698Ssam ret # unwind stack before signals enabled 53*29698Ssam3: 54*29698Ssam addl2 $8,sp # compensate for PSL-PC push 55*29698Ssam4: 56*29698Ssam pushal (sp) # old stack pointer 57*29698Ssam pushl 8(r1) # old signal mask 58*29698Ssam pushl 12(r1) # old onsigstack 59*29698Ssam pushal (sp) # pointer to sigcontext 60*29698Ssam kcall $139 # restore previous signal context 61*29698Ssam jmp *4(r1) # done, return.... 62*29698Ssam 63*29698Ssambotch: 64*29698Ssam callf $4,_longjmperror 65*29698Ssam halt 66*29698Ssam 67*29698Ssam .data 68*29698Ssamreiins: rei 69