No empty .Rs/.Re
[netbsd-mini2440.git] / sys / arch / evbarm / stand / gzboot / srtbegin.S
blob9191b293a7205688e53c24afecd68559d3eb90b2
1 /*      $NetBSD: srtbegin.S,v 1.5.6.3 2004/09/21 13:14:53 skrll Exp $   */
3 /*
4  * Copyright (c) 2002 Wasabi Systems, Inc.
5  * All rights reserved.
6  *
7  * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *      This product includes software developed for the NetBSD Project by
20  *      Wasabi Systems, Inc.
21  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22  *    or promote products derived from this software without specific prior
23  *    written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35  * POSSIBILITY OF SUCH DAMAGE.
36  */
38 #include <machine/asm.h>
39 #include <arm/armreg.h>
41 #define STACKSIZE       1024
43 ENTRY(start)
44         /*
45          * We assume we've been loaded VA==PA, or that the MMU
46          * is disabled.  Make sure the MMU is disabled so that
47          * we don't have to care about the caches.
48          */
49         mrc     p15, 0, r2, c1, c0, 0
50         bic     r2, r2, #CPU_CONTROL_MMU_ENABLE
51         mcr     p15, 0, r2, c1, c0, 0
53         nop
54         nop
55         nop
57         /*
58          * Check to see if __text_store == &start.  If not, we're most
59          * likely running from flash.  Flash is slow, and we'd
60          * really like to run the code from RAM.  Copy it out.
61          */
62         adr     r1, Ltext
63         ldmia   r1, {r1-r3}
64         cmp     r1, r2                  /* __text_store == &start? */
65         beq     relocated               /* yes, in RAM */
67         /* Copy text segment from ROM to RAM */
68 1:      ldrb    r0, [r1], #0x01
69         strb    r0, [r2], #0x01
70         cmp     r2, r3                  /* copy done? */
71         bne     1b
73         /*
74          * Okay, we are finished relocating the text segment.  Now
75          * we need to leap to the next instruction.
76          */
77         adr     r1, Lrelocated
78         ldr     pc, [r1]
80 relocated:
81         /*
82          * Check to see if __data_store == __data_start.  If not,
83          * we're most likely built for running from flash,
84          * and must copy the data segment out to RAM.
85          */
86         adr     r1, Ldata
87         ldmia   r1, {r1-r3}
88         cmp     r1, r2                  /* __data_store == __data_start? */
89         beq     2f                      /* yes, in RAM */
91         cmp     r2, r3                  /* __data_store == _edata? */
92         beq     2f                      /* yes, skip copy */
94         /* Copy data segment from ROM to RAM */
95 1:      ldrb    r0, [r1], #0x01
96         strb    r0, [r2], #0x01
97         cmp     r2, r3                  /* copy done? */
98         bne     1b
101         /* Clear the BSS. */
102         adr     r1, Lbss
103         ldmia   r1, {r1, r2}
104         sub     r2, r2, r1
105         mov     r3, #0
107 1:      strb    r3, [r1], #0x01
108         subs    r2, r2, #0x01
109         bgt     1b
111         /* Set the stack pointer */
112         adr     r1, Lstack
113         ldr     r1, [r1]
114         add     sp, r1, #STACKSIZE
116         b       _C_LABEL(main)
118 Lrelocated:
119         .word   relocated
121 Ltext:
122         .word   _C_LABEL(__text_store)
123         .word   _C_LABEL(start)
124         .word   _C_LABEL(_etext)
126 Ldata:
127         .word   _C_LABEL(__data_store)
128         .word   _C_LABEL(__data_start)
130 Lbss:
131         .word   _C_LABEL(_edata)
132         .word   _C_LABEL(_end)
134 Lstack:
135         .word   Lstackspace
137         .comm   Lstackspace, STACKSIZE