release.sh: restore -jJAILDIR option
[minix.git] / lib / libc / arch / vax / gen / _setjmp.S
blob932ee13710a340ec27e676a08d4f5d6aa14af129
1 /*
2  * Copyright (c) 1980, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
30 #include "DEFS.h"
32 #if defined(LIBC_SCCS) && !defined(lint)
33         /* .asciz "@(#)_setjmp.s        8.1 (Berkeley) 6/4/93" */
34 RCSID("$NetBSD: _setjmp.S,v 1.10 2011/01/25 02:38:15 matt Exp $")
35 #endif /* LIBC_SCCS and not lint */
38  * C library -- _setjmp, _longjmp
39  *
40  *      _longjmp(a,v)
41  * will generate a "return(v)" from
42  * the last call to
43  *      _setjmp(a)
44  * by restoring registers from the stack,
45  * The previous signal state is NOT restored.
46  *
47  * Even though we don't use sigreturn14, we still store things in a sigcontext
48  * in order to be consistent.
49  */
51 ENTRY(_setjmp, R6)
52         movl    4(%ap),%r0
53         movl    12(%fp),12(%r0)         # save frame pointer of caller
54         movl    16(%fp),20(%r0)         # save pc of caller
55         movl    8(%fp),16(%r0)          # save ap of caller
56         clrl    %r1                     # clear arg count
57         bbc     $13,6(%fp),1f           # was this a callg?
58         addl3   $1,(%ap),%r1            # get real arg count+1 for calls
59 1:      moval   24(%fp)[%r1],8(%r0)     # save sp of caller
60         movpsl  24(%r0)                 # save current psl
61         movw    4(%fp),24(%r0)          # save psw of caller
62         movq    %r6,44(%r0)             # save r6/r7
63         movq    %r8,52(%r0)             # save r8/r9
64         movq    %r10,60(%r0)            # save r10/r11
65         clrl    %r0
66         ret
67 END(_setjmp)
69 ENTRY(_longjmp, 0)
70         movl    8(%ap),%r0              # return(v)
71         movl    4(%ap),%r1              # fetch buffer
72         tstl    12(%r1)                 # is fp null
73         beql    botch
74         movq    44(%r1),%r6             # restore r6/r7
75         movq    52(%r1),%r8             # restore r8/r9
76         movq    60(%r1),%r10            # restore r10/r11
77         movl    16(%r1),%ap             # restore ap
78         movl    8(%r1),%sp              # restore sp
79         movl    12(%r1),%fp             # restore fp
80         movq    20(%r1),-(%sp)          # save pc/psl to new stack
81         rei                             # and go back to saved pc/psl
83 botch:
84         calls   $0,_C_LABEL(longjmperror)
85         halt
86 END(_longjmp)