Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[wrt350n-kernel.git] / arch / xtensa / boot / boot-redboot / bootstrap.S
blob84848123e2a8af6d147abb9e78a2b6bbfe372bb6
1 #include <asm/variant/core.h>
2 #include <asm/regs.h>
3 #include <asm/asmmacro.h>
4 #include <asm/cacheasm.h>
5         /*
6          * RB-Data: RedBoot data/bss
7          * P:       Boot-Parameters
8          * L:       Kernel-Loader
9          *
10          * The Linux-Kernel image including the loader must be loaded
11          * to a position so that the kernel and the boot parameters
12          * can fit in the space before the load address.
13          *  ______________________________________________________
14          * |_RB-Data_|_P_|__________|_L_|___Linux-Kernel___|______|
15          *                          ^
16          *                          ^ Load address
17          *  ______________________________________________________
18          * |___Linux-Kernel___|_P_|_L_|___________________________|
19          *
20          * The loader copies the parameter to the position that will
21          * be the end of the kernel and itself to the end of the
22          * parameter list.
23          */
25 /* Make sure we have enough space for the 'uncompressor' */
27 #define STACK_SIZE 32768
28 #define HEAP_SIZE (131072*4)
30         # a2: Parameter list
31         # a3: Size of parameter list
33         .section .start, "ax"
35         .globl __start
36         /* this must be the first byte of the loader! */
37 __start:
38         entry   sp, 32          # we do not intend to return
39         _call0  _start
40 __start_a0:
41         .align 4
43         .section .text, "ax"
44         .begin literal_prefix .text
46         /* put literals in here! */
48         .globl _start
49 _start:
51         /* 'reset' window registers */
53         movi    a4, 1
54         wsr     a4, PS
55         rsync
57         rsr     a5, WINDOWBASE
58         ssl     a5
59         sll     a4, a4
60         wsr     a4, WINDOWSTART
61         rsync
63         movi    a4, 0x00040000
64         wsr     a4, PS
65         rsync
67         /* copy the loader to its address
68          * Note: The loader itself is a very small piece, so we assume we
69          *       don't partially overlap. We also assume (even more important)
70          *       that the kernel image is out of the way. Usually, when the
71          *       load address of this image is not at an arbitrary address,
72          *       but aligned to some 10K's we shouldn't overlap.
73          */
75         /* Note: The assembler cannot relax "addi a0, a0, ..." to an
76            l32r, so we load to a4 first. */
78         # addi  a4, a0, __start - __start_a0
79         # mov   a0, a4
81         movi    a4, __start
82         movi    a5, __start_a0
83         add     a4, a0, a4
84         sub     a0, a4, a5
86         movi    a4, __start
87         movi    a5, __reloc_end
89         # a0: address where this code has been loaded
90         # a4: compiled address of __start
91         # a5: compiled end address
93         mov.n   a7, a0
94         mov.n   a8, a4
97         l32i    a10, a7, 0
98         l32i    a11, a7, 4
99         s32i    a10, a8, 0
100         s32i    a11, a8, 4
101         l32i    a10, a7, 8
102         l32i    a11, a7, 12
103         s32i    a10, a8, 8
104         s32i    a11, a8, 12
105         addi    a8, a8, 16
106         addi    a7, a7, 16
107         blt     a8, a5, 1b
110         /* We have to flush and invalidate the caches here before we jump. */
112 #if XCHAL_DCACHE_IS_WRITEBACK
114         ___flush_dcache_all a5 a6
116 #endif
118         ___invalidate_icache_all a5 a6
119         isync
121         movi    a11, _reloc
122         jx      a11
124         .globl _reloc
125 _reloc:
127         /* RedBoot is now at the end of the memory, so we don't have
128          * to copy the parameter list. Keep the code around; in case
129          * we need it again. */
130 #if 0
131         # a0: load address
132         # a2: start address of parameter list
133         # a3: length of parameter list
134         # a4: __start
136         /* copy the parameter list out of the way */
138         movi    a6, _param_start
139         add     a3, a2, a3
141         l32i    a8, a2, 0
142         s32i    a8, a6, 0
143         addi    a2, a2, 4
144         addi    a6, a6, 4
145         blt     a2, a3, 2b
146 #endif
148         /* clear BSS section */
149         movi    a6, __bss_start
150         movi    a7, __bss_end
151         movi.n  a5, 0
153         s32i    a5, a6, 0
154         addi    a6, a6, 4
155         blt     a6, a7, 3b
157         movi    a5, -16
158         movi    a1, _stack + STACK_SIZE
159         and     a1, a1, a5
161         /* Uncompress the kernel */
163         # a0: load address
164         # a2: boot parameter
165         # a4: __start
167         movi    a3, __image_load
168         sub     a4, a3, a4
169         add     a8, a0, a4
171         # a1  Stack
172         # a8(a4)  Load address of the image
174         movi    a6, _image_start
175         movi    a10, _image_end
176         movi    a7, 0x1000000
177         sub     a11, a10, a6
178         movi    a9, complen
179         s32i    a11, a9, 0
181         movi    a0, 0
183         # a6 destination
184         # a7 maximum size of destination
185         # a8 source
186         # a9 ptr to length
188         .extern gunzip
189         movi    a4, gunzip
190         beqz    a4, 1f
192         callx4  a4
194         j       2f
197         # a6 destination start
198         # a7 maximum size of destination
199         # a8 source start
200         # a9 ptr to length
201         # a10 destination end
204         l32i    a9, a8, 0
205         l32i    a11, a8, 4
206         s32i    a9, a6, 0
207         s32i    a11, a6, 4
208         l32i    a9, a8, 8
209         l32i    a11, a8, 12
210         s32i    a9, a6, 8
211         s32i    a11, a6, 12
212         addi    a6, a6, 16
213         addi    a8, a8, 16
214         blt     a6, a10, 1b
217         /* jump to the kernel */
219 #if XCHAL_DCACHE_IS_WRITEBACK
221         ___flush_dcache_all a5 a6
223 #endif
225         ___invalidate_icache_all a5 a6
227         isync
229         movi    a5, __start
230         movi    a3, boot_initrd_start
231         movi    a4, boot_initrd_end
232         sub     a3, a3, a5
233         sub     a4, a4, a5
234         add     a3, a0, a3
235         add     a4, a0, a4
237         # a2  Boot parameter list
238         # a3  initrd_start (virtual load address)
239         # a4  initrd_end   (virtual load address)
241         movi    a0, _image_start
242         jx      a0
244         .align 16
245         .data
246         .globl avail_ram
247 avail_ram:
248         .long   _heap
249         .globl end_avail
250 end_avail:
251         .long   _heap + HEAP_SIZE
253         .comm _stack, STACK_SIZE
254         .comm _heap, HEAP_SIZE
256         .globl end_avail
257         .comm complen, 4
259         .end    literal_prefix