Commit | Line | Data |
---|---|---|
df02a9f3 | 1 | /* _setjmp.s 4.2 83/07/02 */ |
a768153c SL |
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 | ||
df02a9f3 | 68 | .data |
a768153c SL |
69 | msg: .ascii "_longjmp botch\n" |
70 | msgend: | |
71 | reiins: rei |