|
|
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.