|
|
1.1 ! root 1: /* _setjmp.s 4.2 83/07/02 */ ! 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: * The previous signal state is NOT restored. ! 12: */ ! 13: ! 14: #include "DEFS.h" ! 15: ! 16: ENTRY(_setjmp) ! 17: movl 4(ap),r0 ! 18: movl 12(fp),(r0) # save frame pointer of caller ! 19: movl 16(fp),4(r0) # save pc of caller ! 20: clrl r0 ! 21: ret ! 22: ! 23: ENTRY(_longjmp) ! 24: movl 8(ap),r0 # return(v) ! 25: movl 4(ap),r1 # fetch buffer ! 26: tstl (r1) ! 27: beql botch ! 28: loop: ! 29: bitw $1,6(fp) # r0 saved? ! 30: beql 1f ! 31: movl r0,20(fp) ! 32: bitw $2,6(fp) # was r1 saved? ! 33: beql 2f ! 34: movl r1,24(fp) ! 35: brb 2f ! 36: 1: ! 37: bitw $2,6(fp) # was r1 saved? ! 38: beql 2f ! 39: movl r1,20(fp) ! 40: 2: ! 41: cmpl (r1),12(fp) ! 42: beql done ! 43: blssu botch ! 44: movl $loop,16(fp) ! 45: ret # pop another frame ! 46: ! 47: done: ! 48: cmpb *16(fp),reiins # returning to an "rei"? ! 49: bneq 1f ! 50: movab 3f,16(fp) # do return w/ psl-pc pop ! 51: brw 2f ! 52: 1: ! 53: movab 4f,16(fp) # do standard return ! 54: 2: ! 55: ret # unwind stack before signals enabled ! 56: 3: ! 57: addl2 $8,sp # compensate for PSL-PC push ! 58: 4: ! 59: jmp *4(r1) # done, return.... ! 60: ! 61: botch: ! 62: pushl $msgend-msg ! 63: pushl $msg ! 64: pushl $2 ! 65: calls $3,_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.