129698Ssam#ifdef LIBC_SCCS 2*29797Ssam .asciz "@(#)setjmp.s 1.2 (Berkeley/CCI) 08/22/86" 329698Ssam#endif LIBC_SCCS 429698Ssam 529698Ssam/* 629698Ssam * C library -- setjmp, longjmp 729698Ssam * 829698Ssam * longjmp(a,v) 929698Ssam * will generate a "return(v)" from 1029698Ssam * the last call to 1129698Ssam * setjmp(a) 1229698Ssam * by restoring registers from the stack, 1329698Ssam * previous signal mask, and doing a return. 1429698Ssam */ 1529698Ssam 1629698Ssam#include "DEFS.h" 1729698Ssam 18*29797SsamENTRY(setjmp, R6) 19*29797Ssam movl 4(fp),r6 # construct sigcontext 20*29797Ssam movab -8(sp),sp # space for current struct sigstack 21*29797Ssam pushal (sp) # get current values 22*29797Ssam pushl $0 # no new values 23*29797Ssam callf $16,_sigstack # pop args plus signal stack value 24*29797Ssam movl (sp)+,(r6) # save onsigstack status of caller 2529698Ssam pushl $0 2629698Ssam callf $8,_sigblock # get signal mask 27*29797Ssam movl r0,4(r6) # save signal mask of caller 28*29797Ssam addl3 $8,fp,8(r6) # save stack pointer of caller 29*29797Ssam movl (fp),12(r6) # save frame pointer of caller 30*29797Ssam movl -8(fp),20(r6) # save pc of caller 31*29797Ssam movpsl 24(r6) # save psl of caller 3229698Ssam clrl r0 3329698Ssam ret 3429698Ssam 3529698SsamENTRY(longjmp, 0) 3629698Ssam movl 8(fp),r0 # return(v) 3729698Ssam movl 4(fp),r1 # fetch buffer 38*29797Ssam tstl 12(r1) 3929698Ssam beql botch 4029698Ssamloop: 41*29797Ssam cmpl 12(r1),(fp) 4229698Ssam beql done 4329698Ssam blssu botch 4429698Ssam movl $loop,-8(fp) 4529698Ssam ret # pop another frame 4629698Ssam 4729698Ssamdone: 4829698Ssam cmpb *-8(fp),reiins # returning to an "rei"? 4929698Ssam bneq 1f 5029698Ssam movab 3f,-8(fp) # do return w/ psl-pc pop 5129698Ssam brw 2f 5229698Ssam1: 5329698Ssam movab 4f,-8(fp) # do standard return 5429698Ssam2: 5529698Ssam ret # unwind stack before signals enabled 5629698Ssam3: 5729698Ssam addl2 $8,sp # compensate for PSL-PC push 5829698Ssam4: 59*29797Ssam pushl r1 # pointer to sigcontext 60*29797Ssam callf $4,_sigreturn # restore previous context 61*29797Ssam # we should never return 6229698Ssam 6329698Ssambotch: 6429698Ssam callf $4,_longjmperror 6529698Ssam halt 6629698Ssam 6729698Ssam .data 6829698Ssamreiins: rei 69