|
|
1.1 root 1:
2: /*
3: * non-local goto's
4: */
5:
6: /*
7: * the microvax constantly updates the ksp in the pcb block so
8: * we can't trust a ldpctx to get the right sp for longjmps
9: */
10: .text
11:
12: .set PCLOC,16 # location of pc in calls frame
13: .set APLOC,8 # location of ap,fp in calls frame
14:
15: .globl _Longjmp
16: _Longjmp:
17: movl (r0)+,newfp # must save parameters in memory as all
18: movl (r0),newpc # registers may be clobbered.
19: 1:
20: cmpl fp,newfp # are we there yet?
21: bgequ 2f # yes
22: moval 1b,PCLOC(fp) # redirect return pc to us!
23: ret # pop next frame
24: 2:
25: beql 3f # did we miss our frame?
26: pushab 4f # yep ?!?
27: calls $1,_panic
28: 3:
29: movl newpc,r0 # all done, just return to the `setjmp'
30: jmp (r0) # ``rsb''
31:
32: .data
33: newpc: .space 4
34: newfp: .space 4
35: 4: .asciz "longjmp"
36: .text
37: /*
38: * setjmp that saves all registers as the call frame may not
39: * be available to recover them in the usual mannor by longjmp.
40: * Called before swapping out the u. area, restored by resume()
41: * below.
42: */
43:
44: .globl _savectx
45: .align 1
46: _savectx:
47: .word 0
48: movl 4(ap),r0
49: movq r6,(r0)+
50: movq r8,(r0)+
51: movq r10,(r0)+
52: movq APLOC(fp),(r0)+ # save ap, fp
53: addl3 $8,ap,(r0)+ # save sp
54: movl PCLOC(fp),(r0) # save pc
55: clrl r0
56: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.