|
|
1.1 root 1: # C library -- setjmp, longjmp
2:
3: # longjmp(a,v)
4: # will generate a "return(v)" from
5: # the last call to
6: # setjmp(a)
7: # by restoring registers from the stack
8: # and doing a return.
9: #
10:
11: .globl _setjmp
12: .globl _longjmp
13:
14: .align 1
15: _setjmp:
16: .word 0x0000
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: .align 1
24: _longjmp:
25: .word 0x0000
26: movl 8(ap),r0 # return(v)
27: bneq L1
28: movzbl $1,r0
29: L1:
30: movl 4(ap),r1 # fetch buffer
31: tstl (r1)
32: beql botch
33: loop:
34: bitw $1,6(fp) # r0 saved?
35: beql L10
36: movl r0,20(fp)
37: bitw $2,6(fp) #was r1 saved?
38: beql L11
39: movl r1,24(fp)
40: brb L11
41: L10:
42: bitw $2,6(fp) #was r1 saved?
43: beql L11
44: movl r1,20(fp)
45: L11:
46: cmpl (r1),12(fp)
47: beql done
48: blssu botch
49: movl $loop,16(fp)
50: ret # pop another frame
51:
52: done:
53: cmpb *16(fp),reiins # returning to an "rei"?
54: bneq L20
55: movab L21,16(fp)
56: ret
57: L21: addl2 $8,sp # compensate for PSL-PC push
58: jmp *4(r1)
59: L20:
60: movl 4(r1),16(fp)
61: ret
62:
63: botch:
64: pushl $14
65: pushl $msg
66: pushl $2
67: calls $3,_write
68: halt
69:
70: msg: .byte 'l, 'o, 'n, 'g, 'j, 'm, 'p, ' , 'b, 'o, 't, 'c, 'h, 012
71: reiins: rei
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.