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