1/* _setjmp.s 4.3 84/11/01 */ 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 * The previous signal state is NOT restored. 12 */ 13 14#include "DEFS.h" 15 16ENTRY(_setjmp, 0) 17 movl 4(ap),r0 18 movl 12(fp),(r0) # save frame pointer of caller 19 movl 16(fp),4(r0) # save pc of caller 20 clrl r0 21 ret 22 23ENTRY(_longjmp, 0) 24 movl 8(ap),r0 # return(v) 25 movl 4(ap),r1 # fetch buffer 26 tstl (r1) 27 beql botch 28loop: 29 bitw $1,6(fp) # r0 saved? 30 beql 1f 31 movl r0,20(fp) 32 bitw $2,6(fp) # was r1 saved? 33 beql 2f 34 movl r1,24(fp) 35 brb 2f 361: 37 bitw $2,6(fp) # was r1 saved? 38 beql 2f 39 movl r1,20(fp) 402: 41 cmpl (r1),12(fp) 42 beql done 43 blssu botch 44 movl $loop,16(fp) 45 ret # pop another frame 46 47done: 48 cmpb *16(fp),reiins # returning to an "rei"? 49 bneq 1f 50 movab 3f,16(fp) # do return w/ psl-pc pop 51 brw 2f 521: 53 movab 4f,16(fp) # do standard return 542: 55 ret # unwind stack before signals enabled 563: 57 addl2 $8,sp # compensate for PSL-PC push 584: 59 jmp *4(r1) # done, return.... 60 61botch: 62 pushl $msgend-msg 63 pushl $msg 64 pushl $2 65 calls $3,_write 66 halt 67 68 .data 69msg: .ascii "_longjmp botch\n" 70msgend: 71reiins: rei 72