1*13498Ssam/* _setjmp.s 4.1 83/06/30 */ 2*13498Ssam 3*13498Ssam/* 4*13498Ssam * C library -- _setjmp, _longjmp 5*13498Ssam * 6*13498Ssam * _longjmp(a,v) 7*13498Ssam * will generate a "return(v)" from 8*13498Ssam * the last call to 9*13498Ssam * _setjmp(a) 10*13498Ssam * by restoring registers from the stack, 11*13498Ssam * The previous signal state is NOT restored. 12*13498Ssam */ 13*13498Ssam 14*13498Ssam#include "DEFS.h" 15*13498Ssam 16*13498SsamENTRY(_setjmp) 17*13498Ssam movl 4(ap),r0 18*13498Ssam movl 12(fp),(r0) # save frame pointer of caller 19*13498Ssam movl 16(fp),4(r0) # save pc of caller 20*13498Ssam clrl r0 21*13498Ssam ret 22*13498Ssam 23*13498SsamENTRY(_longjmp) 24*13498Ssam movl 8(ap),r0 # return(v) 25*13498Ssam movl 4(ap),r1 # fetch buffer 26*13498Ssam tstl (r1) 27*13498Ssam beql botch 28*13498Ssamloop: 29*13498Ssam bitw $1,6(fp) # r0 saved? 30*13498Ssam beql 1f 31*13498Ssam movl r0,20(fp) 32*13498Ssam bitw $2,6(fp) # was r1 saved? 33*13498Ssam beql 2f 34*13498Ssam movl r1,24(fp) 35*13498Ssam brb 2f 36*13498Ssam1: 37*13498Ssam bitw $2,6(fp) # was r1 saved? 38*13498Ssam beql 2f 39*13498Ssam movl r1,20(fp) 40*13498Ssam2: 41*13498Ssam cmpl (r1),12(fp) 42*13498Ssam beql done 43*13498Ssam blssu botch 44*13498Ssam movl $loop,16(fp) 45*13498Ssam ret # pop another frame 46*13498Ssam 47*13498Ssamdone: 48*13498Ssam cmpb *16(fp),reiins # returning to an "rei"? 49*13498Ssam bneq 1f 50*13498Ssam movab 3f,16(fp) # do return w/ psl-pc pop 51*13498Ssam brw 2f 52*13498Ssam1: 53*13498Ssam movab 4f,16(fp) # do standard return 54*13498Ssam2: 55*13498Ssam ret # unwind stack before signals enabled 56*13498Ssam3: 57*13498Ssam addl2 $8,sp # compensate for PSL-PC push 58*13498Ssam4: 59*13498Ssam jmp *4(r1) # done, return.... 60*13498Ssam 61*13498Ssambotch: 62*13498Ssam pushl $msgend-msg 63*13498Ssam pushl $msg 64*13498Ssam pushl $2 65*13498Ssam calls $3,_write 66*13498Ssam halt 67*13498Ssam 68*13498Ssammsg: .ascii "_longjmp botch\n" 69*13498Ssammsgend: 70*13498Ssamreiins: rei 71