|
|
1.1 ! root 1: /* setjmp.s 4.5 83/08/14 */ ! 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: ! 18: ENTRY(setjmp) ! 19: pushl $0 ! 20: callf $8,_sigblock # get signal mask ! 21: movl r0,r1 ! 22: movl 4(fp),r0 ! 23: movl (fp),(r0) # save frame pointer of caller ! 24: movl -8(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: ! 30: ENTRY(longjmp) ! 31: movl 8(fp),r0 # return(v) ! 32: movl 4(fp),r1 # fetch buffer ! 33: tstl (r1) ! 34: beql botch ! 35: loop: ! 36: cmpl (r1),(fp) ! 37: beql done ! 38: blssu botch ! 39: movl $loop,-8(fp) ! 40: ret # pop another frame ! 41: ! 42: done: ! 43: cmpb *-8(fp),reiins # returning to an "rei"? ! 44: bneq 1f ! 45: movab 3f,-8(fp) # do return w/ psl-pc pop ! 46: brw 2f ! 47: 1: ! 48: movab 4f,-8(fp) # do standard return ! 49: 2: ! 50: ret # unwind stack before signals enabled ! 51: 3: ! 52: addl2 $8,sp # compensate for PSL-PC push ! 53: 4: ! 54: pushal (sp) # old stack pointer ! 55: pushl 8(r1) # old signal mask ! 56: pushl 12(r1) # old onsigstack ! 57: pushal (sp) # pointer to sigcontext ! 58: kcall $139 # restore previous signal context ! 59: jmp *4(r1) # done, return.... ! 60: ! 61: botch: ! 62: pushl $msgend-msg ! 63: pushl $msg ! 64: pushl $2 ! 65: callf $16,_write ! 66: halt ! 67: ! 68: .data ! 69: msg: .ascii "longjmp botch\n" ! 70: msgend: ! 71: reiins: rei
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.