date and time created 84/11/01 23:19:48 by sam
[unix-history] / usr / src / lib / libc / vax / gen / _setjmp.s
CommitLineData
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
16ENTRY(_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
23ENTRY(_longjmp)
24 movl 8(ap),r0 # return(v)
25 movl 4(ap),r1 # fetch buffer
26 tstl (r1)
27 beql botch
28loop:
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
361:
37 bitw $2,6(fp) # was r1 saved?
38 beql 2f
39 movl r1,20(fp)
402:
41 cmpl (r1),12(fp)
42 beql done
43 blssu botch
44 movl $loop,16(fp)
45 ret # pop another frame
46
47done:
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
521:
53 movab 4f,16(fp) # do standard return
542:
55 ret # unwind stack before signals enabled
563:
57 addl2 $8,sp # compensate for PSL-PC push
584:
59 jmp *4(r1) # done, return....
60
61botch:
62 pushl $msgend-msg
63 pushl $msg
64 pushl $2
65 calls $3,_write
66 halt
67
df02a9f3 68 .data
a768153c
SL
69msg: .ascii "_longjmp botch\n"
70msgend:
71reiins: rei