(no message)
[unix-history] / usr / src / lib / libc / vax / gen / setjmp.s
CommitLineData
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
18ENTRY(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
30ENTRY(longjmp)
8ccdc4c5
BJ
31 movl 8(ap),r0 # return(v)
32 movl 4(ap),r1 # fetch buffer
33 tstl (r1)
34 beql botch
35loop:
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
431:
44 bitw $2,6(fp) # was r1 saved?
45 beql 2f
46 movl r1,20(fp)
472:
48 cmpl (r1),12(fp)
49 beql done
50 blssu botch
51 movl $loop,16(fp)
52 ret # pop another frame
53
54done:
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
591:
60 movab 4f,16(fp) # do standard return
612:
62 ret # unwind stack before signals enabled
633:
64 addl2 $8,sp # compensate for PSL-PC push
654:
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
71botch:
e196192c 72 pushl $msgend-msg
8ccdc4c5
BJ
73 pushl $msg
74 pushl $2
75 calls $3,_write
76 halt
77
e196192c
SL
78msg: .ascii "longjmp botch\n"
79msgend:
8ccdc4c5 80reiins: rei