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