*** empty log message ***
[arla.git] / lwp / process.sh.S
blob152bd4b893dd3f7c49d037e921eaced2a75dcf06
1 /*      $OpenBSD: process.sh.S,v 1.5 2006/11/17 20:54:47 deraadt Exp $  */
3 /*
4  * Copyright (c) 2006 Theo de Raadt
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  */
28 #include <config.h>
30 #undef RCSID
32 #include <machine/asm.h>
35 # savecontext(f, area1, newsp)
36 #     int (*f)(); struct savearea *area1; char *newsp;
37 #       r4             r5                      r6
40 ENTRY(savecontext)
42         mov.l   .L_PRE_Block, r0        /* PRE_Block = 1 */
43         mov     #1, r1
44         mov.l   r1, @r0
46         /* sp == r15 - automatically handled */
47         mov.l   r14, @-sp
48         mov.l   r13, @-sp
49         mov.l   r12, @-sp
50         mov.l   r11, @-sp
51         mov.l   r10, @-sp
52         mov.l   r9, @-sp
53         mov.l   r8, @-sp
54         sts.l   pr, @-sp
56 #if defined(__SH4__) && !defined(__SH4_NOFPU__)
57         /* float point registers */
58         fmov.s  fr15, @-sp
59         fmov.s  fr14, @-sp
60         fmov.s  fr13, @-sp
61         fmov.s  fr12, @-sp
62 #endif
64         mov.l   sp,@r5                  /* store top of stack */
65         tst     r6,r6
66         bt      1f
68         mov     r6,sp                   /* swap to new sp */
69         mov     sp, r14                 /* frame pointer */
71         jmp     @r4
72          nop
74         .align  2
75 .L_PRE_Block:   .long _C_LABEL(PRE_Block)
76         SET_ENTRY_SIZE(savecontext)
79  * returnto(struct savearea *r4)
81 ENTRY(returnto)
82         mov.l   @r4, sp
84 #if defined(__SH4__) && !defined(__SH4_NOFPU__)
85         /* float point registers */
86         fmov.s  @sp+, fr12
87         fmov.s  @sp+, fr13
88         fmov.s  @sp+, fr14
89         fmov.s  @sp+, fr15
90 #endif
92         lds.l   @sp+, pr
93         mov.l   @sp+, r8
94         mov.l   @sp+, r9
95         mov.l   @sp+, r10
96         mov.l   @sp+, r11
97         mov.l   @sp+, r12
98         mov.l   @sp+, r13
99         mov.l   @sp+, r14
100         /* sp == r15 - automatically handled */
102         mov.l   .L_PRE_Block2, r0       /* PRE_Block = 0 */
103         mov     #0, r4
104         mov.l   r4, @r0
106         rts
107          nop
109         .align  2
110 .L_PRE_Block2:  .long _C_LABEL(PRE_Block)
111         SET_ENTRY_SIZE(returnto)