kernel: scheduling fix for ARM
[minix.git] / lib / libc / arch / sparc / gen / _setjmp.S
blobf2a31418f72b160e3126bafb0995b79ad3225138
1 /*      $NetBSD: _setjmp.S,v 1.9 2011/04/30 23:41:12 martin Exp $       */
3 /*-
4  * Copyright (c) 1999 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Paul Kranenburg.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
32 #include <machine/asm.h>
33 #include <machine/trap.h>
35 #if defined(LIBC_SCCS) && !defined(lint)
36 RCSID("$NetBSD: _setjmp.S,v 1.9 2011/04/30 23:41:12 martin Exp $")
37 #endif /* LIBC_SCCS and not lint */
40  * C library -- _setjmp, _longjmp
41  *
42  *      _longjmp(a,v)
43  * will generate a "return(v?v:1)" from
44  * the last call to
45  *      _setjmp(a)
46  * The previous signal state is NOT restored.
47  */
49 ENTRY(_setjmp)
50         /* store important globals, sigsetjmp compatible */
51         st      %g3, [%o0 + 16]
52         st      %g2, [%o0 + 24]
53         st      %g4, [%o0 + 48]
54         st      %g7, [%o0 + 52]
56         st      %sp, [%o0+0]    /* store caller's stack pointer */
57         st      %o7, [%o0+4]    /* and the return pc */
58         retl
59          clr    %o0             ! return 0
61 ENTRY(_longjmp)
62         sub     %sp, 64, %sp    ! set up a local stack frame
63         tst     %o1             ! compute v ? v : 1
64         be,a    0f
65          mov    1, %o1
67         t       ST_FLUSHWIN     ! flush register windows out to the stack
69         /* restore globals */
70         ld      [%o0 + 16], %g3
71         ld      [%o0 + 24], %g2
72         ld      [%o0 + 48], %g4
73         ld      [%o0 + 52], %g7
75         /*
76          * We restore the saved stack pointer to %fp, then issue
77          * a `restore' instruction which will reload the register
78          * window from the stack.
79          */
80         ld      [%o0+4], %o7    /* restore return pc */
81         ld      [%o0+0], %fp    /* and stack pointer */
83         retl                    ! success, return %o1
84          restore        %o1, 0, %o0