*** empty log message ***
[arla.git] / lwp / process.arm.S
blob7fc50480b1df098a2afc115784aa9401b6012a9e
1 /* $OpenBSD: process.arm.S,v 1.1 2004/02/11 21:52:49 drahn Exp $ */
2 /* $Id$ */
4 /*
5  * Copyright (c) 2004 Dale Rahn. All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */  
28 #include <config.h>
30 #define FRAME_OFFSET    8       /* XXX */
31 #define FRAME_SIZE      (52 +(11*4)+FRAME_OFFSET)       /* FP + r4-r14 */
33 #define TOP_OF_STACK    (0*4)
34 #define RETURN          (1*4)
38  * savecontext(int (*f)(), struct savearea *save, char *newsp)
39  */
40         .globl  savecontext
41         .type   savecontext%function
42 savecontext:
43         str     r2, [r1]
44         ldr     r3, .LPRE_Block
45         mov     r2, #1
46         str     r2, [r3]
47         ldr     r2, [r1]
49         sub     sp, sp, #FRAME_SIZE
50         add     r3, sp, #FRAME_OFFSET
51 #if __SOFTFP__
52         add     r3, r3, #52
53 #else
54         /* Store fp registers */
55         sfm     f4, 4, [r3], #48
56         /* Store fpsr */
57         rfs     r3
58         str     r3, [r3], #0x0004
59 #endif  /*__SOFTFP__*/
60         /* Store integer registers */
61         stmia   r3, {r4-r13}
63         /* SAVE SP */
64         str     sp, [r1, #TOP_OF_STACK]
65         str     r14, [r1, #RETURN]
66         cmp     r2, #0
67         movne   sp, r2
68         mov     r15, r0
70 .LPRE_Block:
71         .word   PRE_Block
74  * returnto(struct savearea *area)
75  */
76         .globl  returnto
77         .type   returnto%function
78 returnto:
79         ldr     sp, [r0, #TOP_OF_STACK]
80         ldr     r14, [r0, #RETURN]
81         add     r3, sp, #FRAME_OFFSET
82         mov     r1, r3
83 #if __SOFTFP__
84         add     r3, r3, #52
85 #else
86         /* Restore fp registers */
87         lfm     f4, 4, [r3], #48
88         /* Restore FPSR */
89         ldr     r4, [r3], #0x0004
90         wfs     r4
91 #endif  /* __SOFTFP__ */
92         /* Restore integer registers */
93         ldmia   r3, {r4-r13}
95         ldr     r3, .LPRE_Block
96         mov     r2, #0
97         str     r2, [r3]
99         add     sp, sp, #FRAME_SIZE
100 #ifdef __ARM_26__
101         mov     r15, r14
102 #else
103         mov     r15, r14
104 #endif