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