/* setjmp.s 4.4 83/07/02 */
* C library -- setjmp, longjmp
* will generate a "return(v)" from
* by restoring registers from the stack,
* previous signal mask, and doing a return.
* BUG: always restores onsigstack state to 0
calls $1,_sigblock # get signal mask
movl 12(fp),(r0) # save frame pointer of caller
movl 16(fp),4(r0) # save pc of caller
movl r1,8(r0) # save signal mask
clrl 12(r0) # XXX (should be onsigstack) XXX
movl 8(ap),r0 # return(v)
movl 4(ap),r1 # fetch buffer
bitw $1,6(fp) # r0 saved?
bitw $2,6(fp) # was r1 saved?
bitw $2,6(fp) # was r1 saved?
cmpb *16(fp),reiins # returning to an "rei"?
movab 3f,16(fp) # do return w/ psl-pc pop
movab 4f,16(fp) # do standard return
ret # unwind stack before signals enabled
addl2 $8,sp # compensate for PSL-PC push
pushl 8(r1) # old signal mask
pushl 12(r1) # old onsigstack
chmk $139 # restore previous signal context
jmp *4(r1) # done, return....
msg: .ascii "longjmp botch\n"