1/* setjmp.s 4.1 83/06/27 */ 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 .word 0x0000 32 movl 8(ap),r0 # return(v) 33 movl 4(ap),r1 # fetch buffer 34 tstl (r1) 35 beql botch 36loop: 37 bitw $1,6(fp) # r0 saved? 38 beql 1f 39 movl r0,20(fp) 40 bitw $2,6(fp) # was r1 saved? 41 beql 2f 42 movl r1,24(fp) 43 brb 2f 441: 45 bitw $2,6(fp) # was r1 saved? 46 beql 2f 47 movl r1,20(fp) 482: 49 cmpl (r1),12(fp) 50 beql done 51 blssu botch 52 movl $loop,16(fp) 53 ret # pop another frame 54 55done: 56 cmpb *16(fp),reiins # returning to an "rei"? 57 bneq 1f 58 movab 3f,16(fp) # do return w/ psl-pc pop 59 brw 2f 601: 61 movab 4f,16(fp) # do standard return 622: 63 ret # unwind stack before signals enabled 643: 65 addl2 $8,sp # compensate for PSL-PC push 664: 67 pushl 8(r1) # old signal mask 68 pushl 12(r1) # old onsigstack 69 chmk $139 # restore previous signal context 70 jmp *4(r1) # done, return.... 71 72botch: 73 pushl $14 74 pushl $msg 75 pushl $2 76 calls $3,_write 77 halt 78 79msg: .byte 'l, 'o, 'n, 'g, 'j, 'm, 'p, ' , 'b, 'o, 't, 'c, 'h, 012 80reiins: rei 81