Remove building with NOCRYPTO option
[minix3.git] / lib / libc / arch / sh3 / gen / swapcontext.S
blob69eb8281502eb4261b48ba91c9503245a0ad0ec0
1 /*      $NetBSD: swapcontext.S,v 1.12 2015/04/06 01:50:46 uwe 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.12 2015/04/06 01:50:46 uwe 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         sts.l   pr, @-sp
45         mov.l   .L__getcontext, r0
46         mov.l   r5, @-sp
47 1:      CALL    r0                      ! _getcontext(oucp)
48          mov.l  r4, @-sp
49         !! getcontext captures oucp resuming here with r12 (when PIC),
50         !! pr, r5 and r4 pushed onto the stack
52         tst     r0, r0
53         bf.s    3f                      ! return error from getcontext
54          mov.l  @sp, r1                 ! saved oucp
56         !! adjust oucp to resume after setcontext below
57         mova    3f, r0
58         mov.l   r0, @(36 + 1 * 4, r1)   ! _UC_MACHINE_SET_PC(oucp, pr)
60         mov.l   .L_setcontext, r2
61 2:      CALL    r2                      ! setcontext(ucp)
62          mov.l  @(4, sp), r4            ! saved ucp
64         .align  2
65 3:      !! we get here on errors and when resuming oucp
66         add     #8, sp                  ! skip r4 and r5
67         lds.l   @sp+, pr
68         rts
69          PIC_EPILOGUE_SLOT
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)