Commit | Line | Data |
---|---|---|
e196192c | 1 | /* setjmp.s 4.3 83/06/30 */ |
8ccdc4c5 BJ |
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) | |
8ccdc4c5 BJ |
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 8(r1) # old signal mask | |
67 | pushl 12(r1) # old onsigstack | |
68 | chmk $139 # restore previous signal context | |
69 | jmp *4(r1) # done, return.... | |
70 | ||
71 | botch: | |
e196192c | 72 | pushl $msgend-msg |
8ccdc4c5 BJ |
73 | pushl $msg |
74 | pushl $2 | |
75 | calls $3,_write | |
76 | halt | |
77 | ||
e196192c SL |
78 | msg: .ascii "longjmp botch\n" |
79 | msgend: | |
8ccdc4c5 | 80 | reiins: rei |