1*13625Ssam/* _setjmp.s 4.2 83/07/02 */ 213498Ssam 313498Ssam/* 413498Ssam * C library -- _setjmp, _longjmp 513498Ssam * 613498Ssam * _longjmp(a,v) 713498Ssam * will generate a "return(v)" from 813498Ssam * the last call to 913498Ssam * _setjmp(a) 1013498Ssam * by restoring registers from the stack, 1113498Ssam * The previous signal state is NOT restored. 1213498Ssam */ 1313498Ssam 1413498Ssam#include "DEFS.h" 1513498Ssam 1613498SsamENTRY(_setjmp) 1713498Ssam movl 4(ap),r0 1813498Ssam movl 12(fp),(r0) # save frame pointer of caller 1913498Ssam movl 16(fp),4(r0) # save pc of caller 2013498Ssam clrl r0 2113498Ssam ret 2213498Ssam 2313498SsamENTRY(_longjmp) 2413498Ssam movl 8(ap),r0 # return(v) 2513498Ssam movl 4(ap),r1 # fetch buffer 2613498Ssam tstl (r1) 2713498Ssam beql botch 2813498Ssamloop: 2913498Ssam bitw $1,6(fp) # r0 saved? 3013498Ssam beql 1f 3113498Ssam movl r0,20(fp) 3213498Ssam bitw $2,6(fp) # was r1 saved? 3313498Ssam beql 2f 3413498Ssam movl r1,24(fp) 3513498Ssam brb 2f 3613498Ssam1: 3713498Ssam bitw $2,6(fp) # was r1 saved? 3813498Ssam beql 2f 3913498Ssam movl r1,20(fp) 4013498Ssam2: 4113498Ssam cmpl (r1),12(fp) 4213498Ssam beql done 4313498Ssam blssu botch 4413498Ssam movl $loop,16(fp) 4513498Ssam ret # pop another frame 4613498Ssam 4713498Ssamdone: 4813498Ssam cmpb *16(fp),reiins # returning to an "rei"? 4913498Ssam bneq 1f 5013498Ssam movab 3f,16(fp) # do return w/ psl-pc pop 5113498Ssam brw 2f 5213498Ssam1: 5313498Ssam movab 4f,16(fp) # do standard return 5413498Ssam2: 5513498Ssam ret # unwind stack before signals enabled 5613498Ssam3: 5713498Ssam addl2 $8,sp # compensate for PSL-PC push 5813498Ssam4: 5913498Ssam jmp *4(r1) # done, return.... 6013498Ssam 6113498Ssambotch: 6213498Ssam pushl $msgend-msg 6313498Ssam pushl $msg 6413498Ssam pushl $2 6513498Ssam calls $3,_write 6613498Ssam halt 6713498Ssam 68*13625Ssam .data 6913498Ssammsg: .ascii "_longjmp botch\n" 7013498Ssammsgend: 7113498Ssamreiins: rei 72