1*14616Ssam/* setjmp.s 4.5 83/08/14 */ 213419Sroot 313419Sroot/* 413419Sroot * C library -- setjmp, longjmp 513419Sroot * 613419Sroot * longjmp(a,v) 713419Sroot * will generate a "return(v)" from 813419Sroot * the last call to 913419Sroot * setjmp(a) 1013419Sroot * by restoring registers from the stack, 1113419Sroot * previous signal mask, and doing a return. 1213419Sroot * 1313419Sroot * BUG: always restores onsigstack state to 0 1413419Sroot */ 1513419Sroot 1613419Sroot#include "DEFS.h" 1713419Sroot 1813419SrootENTRY(setjmp) 1913419Sroot pushl $0 2013419Sroot calls $1,_sigblock # get signal mask 2113419Sroot movl r0,r1 2213419Sroot movl 4(ap),r0 2313419Sroot movl 12(fp),(r0) # save frame pointer of caller 2413419Sroot movl 16(fp),4(r0) # save pc of caller 2513419Sroot movl r1,8(r0) # save signal mask 2613419Sroot clrl 12(r0) # XXX (should be onsigstack) XXX 2713419Sroot clrl r0 2813419Sroot ret 2913419Sroot 3013419SrootENTRY(longjmp) 3113419Sroot movl 8(ap),r0 # return(v) 3213419Sroot movl 4(ap),r1 # fetch buffer 3313419Sroot tstl (r1) 3413419Sroot beql botch 3513419Srootloop: 3613419Sroot bitw $1,6(fp) # r0 saved? 3713419Sroot beql 1f 3813419Sroot movl r0,20(fp) 3913419Sroot bitw $2,6(fp) # was r1 saved? 4013419Sroot beql 2f 4113419Sroot movl r1,24(fp) 4213419Sroot brb 2f 4313419Sroot1: 4413419Sroot bitw $2,6(fp) # was r1 saved? 4513419Sroot beql 2f 4613419Sroot movl r1,20(fp) 4713419Sroot2: 4813419Sroot cmpl (r1),12(fp) 4913419Sroot beql done 5013419Sroot blssu botch 5113419Sroot movl $loop,16(fp) 5213419Sroot ret # pop another frame 5313419Sroot 5413419Srootdone: 5513419Sroot cmpb *16(fp),reiins # returning to an "rei"? 5613419Sroot bneq 1f 5713419Sroot movab 3f,16(fp) # do return w/ psl-pc pop 5813419Sroot brw 2f 5913419Sroot1: 6013419Sroot movab 4f,16(fp) # do standard return 6113419Sroot2: 6213419Sroot ret # unwind stack before signals enabled 6313419Sroot3: 6413419Sroot addl2 $8,sp # compensate for PSL-PC push 6513419Sroot4: 66*14616Ssam pushl sp # old stack pointer 6713419Sroot pushl 8(r1) # old signal mask 6813419Sroot pushl 12(r1) # old onsigstack 69*14616Ssam pushl sp # pointer to sigcontext 7013419Sroot chmk $139 # restore previous signal context 7113419Sroot jmp *4(r1) # done, return.... 7213419Sroot 7313419Srootbotch: 7413500Ssam pushl $msgend-msg 7513419Sroot pushl $msg 7613419Sroot pushl $2 7713419Sroot calls $3,_write 7813419Sroot halt 7913419Sroot 8013625Ssam .data 8113500Ssammsg: .ascii "longjmp botch\n" 8213500Ssammsgend: 8313419Srootreiins: rei 84