vm: fix a null dereference on out-of-memory
[minix.git] / lib / libc / arch / sh3 / gen / swapcontext.S
blob841a842e248eee934cea1c112bf67b7e49314c92
1 /*      $NetBSD: swapcontext.S,v 1.9 2008/04/28 20:22:57 martin Exp $   */
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Klaus Klein.
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 #if defined(SYSLIBC_SCCS) && !defined(lint)
34         RCSID("$NetBSD: swapcontext.S,v 1.9 2008/04/28 20:22:57 martin Exp $")
35 #endif /* SYSLIBC_SCCS and not lint */
38  * int
39  * swapcontext(ucontext_t * restrict oucp, ucontext_t * restrict ucp);
40  */
41 ENTRY(swapcontext)
42         PIC_PROLOGUE(.L_got)
43         mov.l   r5, @-sp
44         sts.l   pr, @-sp
46         mov.l   .L__getcontext, r0
47 1:      CALL    r0                      /* _getcontext(oucp) */
48          mov.l  r4, @-sp
49         mov.l   @sp+, r1
50         tst     r0, r0
51         bf      3f                      /* return error from getcontext */
53         /* Note: getcontext does _UC_MACHINE_INTRV(oucp) = 0 for us */
54         mov.l   @sp, r0
55         mov.l   r0, @(36 + 1 * 4, r1)   /* _UC_MACHINE_SET_PC(oucp, pr) */
56         mov.l   .L_setcontext, r2
57 2:      CALL    r2                      /* setcontext(ucp) */
58          mov.l  @(4, sp), r4
59         /* if we get here, return error from setcontext */
61         lds.l   @sp+, pr
62 #ifdef PIC
63         add     #4, sp
64         rts
65          PIC_EPILOGUE
66 #else
67         rts
68          add    #4, sp
69 #endif
71         .align  2
72 .L_got:                 PIC_GOT_DATUM
73 .L__getcontext:         CALL_DATUM(_C_LABEL(_getcontext), 1b)
74 .L_setcontext:          CALL_DATUM(_C_LABEL(setcontext), 2b)
75         SET_ENTRY_SIZE(swapcontext)