]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - lib/libc/ia64/gen/setjmp.S
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / lib / libc / ia64 / gen / setjmp.S
1 /*      $NetBSD: setjmp.S,v 1.3 1997/12/05 02:06:27 thorpej Exp $       */
2
3 /*
4  * Copyright (c) 1994, 1995 Carnegie-Mellon University.
5  * All rights reserved.
6  *
7  * Author: Chris G. Demetriou
8  * 
9  * Permission to use, copy, modify and distribute this software and
10  * its documentation is hereby granted, provided that both the copyright
11  * notice and this permission notice appear in all copies of the
12  * software, derivative works or modified versions, and any portions
13  * thereof, and that both notices appear in supporting documentation.
14  * 
15  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 
16  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND 
17  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18  * 
19  * Carnegie Mellon requests users of this software to return to
20  *
21  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22  *  School of Computer Science
23  *  Carnegie Mellon University
24  *  Pittsburgh PA 15213-3890
25  *
26  * any improvements or extensions that they make and grant Carnegie the
27  * rights to redistribute these changes.
28  */
29
30 #include <machine/asm.h>
31 __FBSDID("$FreeBSD$");
32
33 #define     LOCORE
34 #include    <machine/setjmp.h>
35
36 /*
37  * C library -- setjmp, longjmp
38  *
39  *      longjmp(a,v)
40  * will generate a "return(v)" from
41  * the last call to
42  *      setjmp(a)
43  * by restoring registers from the stack,
44  * and the previous signal state.
45  */
46
47 ENTRY(setjmp, 1)
48         alloc   loc0=ar.pfs,1,2,3,0
49         mov     loc1=rp
50         ;;
51         mov     out0=1                          // how = SIG_BLOCK
52         mov     out1=0                          // set = NULL
53         add     out2=J_SIGSET,in0               // oset = &jb[J_SIGSET]
54         br.call.sptk.few rp=__sys_sigprocmask
55         ;;
56         mov     rp=loc1
57         mov     r14=loc0
58         ;;
59         alloc   r15=ar.pfs,1,0,0,0              // drop register frame
60         ;;
61         mov     ar.pfs=r14                      // restore ar.pfs
62         br.sptk.many _setjmp                    // finish saving state
63 END(setjmp)
64
65         WEAK_ALIAS(longjmp,__longjmp)
66 ENTRY(__longjmp, 2)
67         alloc   loc0=ar.pfs,2,2,3,0
68         mov     loc1=rp
69         ;; 
70         mov     out0=3                          // how = SIG_SETMASK
71         add     out1=J_SIGSET,in0               // set = &jb[J_SIGSET]
72         mov     out2=0                          // oset = NULL
73         br.call.sptk.few rp=__sys_sigprocmask
74         ;;
75         mov     rp=loc1
76         mov     r14=loc0
77         ;;
78         alloc   r15=ar.pfs,2,0,0,0              // drop register frame
79         ;;
80         mov     ar.pfs=r14                      // restore ar.pfs
81         br.sptk.many _longjmp                   // finish restoring state
82 END(__longjmp)