1/* setjmp.s 4.5 83/08/14 */ 2 3/* 4 * C library -- setjmp, longjmp 5 * 6 * longjmp(a,v) 7 * will generate a "return(v)" from 8 * the last call to 9 * setjmp(a) 10 * by restoring registers from the stack, 11 * previous signal mask, and doing a return. 12 * 13 * BUG: always restores onsigstack state to 0 14 */ 15 16#include "DEFS.h" 17 18ENTRY(setjmp) 19 pushl $0 20 calls $1,_sigblock # get signal mask 21 movl r0,r1 22 movl 4(ap),r0 23 movl 12(fp),(r0) # save frame pointer of caller 24 movl 16(fp),4(r0) # save pc of caller 25 movl r1,8(r0) # save signal mask 26 clrl 12(r0) # XXX (should be onsigstack) XXX 27 clrl r0 28 ret 29 30ENTRY(longjmp) 31 movl 8(ap),r0 # return(v) 32 movl 4(ap),r1 # fetch buffer 33 tstl (r1) 34 beql botch 35loop: 36 bitw $1,6(fp) # r0 saved? 37 beql 1f 38 movl r0,20(fp) 39 bitw $2,6(fp) # was r1 saved? 40 beql 2f 41 movl r1,24(fp) 42 brb 2f 431: 44 bitw $2,6(fp) # was r1 saved? 45 beql 2f 46 movl r1,20(fp) 472: 48 cmpl (r1),12(fp) 49 beql done 50 blssu botch 51 movl $loop,16(fp) 52 ret # pop another frame 53 54done: 55 cmpb *16(fp),reiins # returning to an "rei"? 56 bneq 1f 57 movab 3f,16(fp) # do return w/ psl-pc pop 58 brw 2f 591: 60 movab 4f,16(fp) # do standard return 612: 62 ret # unwind stack before signals enabled 633: 64 addl2 $8,sp # compensate for PSL-PC push 654: 66 pushl sp # old stack pointer 67 pushl 8(r1) # old signal mask 68 pushl 12(r1) # old onsigstack 69 pushl sp # pointer to sigcontext 70 chmk $139 # restore previous signal context 71 jmp *4(r1) # done, return.... 72 73botch: 74 pushl $msgend-msg 75 pushl $msg 76 pushl $2 77 calls $3,_write 78 halt 79 80 .data 81msg: .ascii "longjmp botch\n" 82msgend: 83reiins: rei 84