302 is also a valid redirect. Also keep the original query when redirecting.
[Rockbox.git] / firmware / boot.lds
blob0896e86fca4d9559addffa2fd943d5d6fd3a185a
1 #include "config.h"
3 ENTRY(start)
4 #ifdef CPU_COLDFIRE
5 OUTPUT_FORMAT(elf32-m68k)
6 INPUT(target/coldfire/crt0.o)
7 #elif defined (CPU_ARM)
8 OUTPUT_FORMAT(elf32-littlearm)
9 OUTPUT_ARCH(arm)
10 #ifdef CPU_PP
11 INPUT(target/arm/crt0-pp-bl.o)
12 #else
13 INPUT(target/arm/crt0.o)
14 #endif
15 #else
16 OUTPUT_FORMAT(elf32-sh)
17 INPUT(target/sh/crt0.o)
18 #endif
20 #define DRAMSIZE (MEMORYSIZE * 0x100000)
22 #ifdef IRIVER_H100_SERIES
23 #define DRAMORIG 0x31000000
24 #define IRAMORIG 0x10000000
25 #define IRAMSIZE 0x18000
26 #define FLASHORIG 0x001f0000
27 #define FLASHSIZE 2M
28 #elif defined(IRIVER_H300_SERIES)
29 #define DRAMORIG 0x31000000
30 #define IRAMORIG 0x10000000
31 #define IRAMSIZE 0x18000
32 #define FLASHORIG 0x003f0000
33 #define FLASHSIZE 4M
34 #elif defined(IAUDIO_X5) || defined(IAUDIO_M5)
35 #define DRAMORIG 0x31000000
36 #define IRAMORIG 0x10000000
37 #define IRAMSIZE 0x20000
38 #define FLASHORIG 0x00010000
39 #define FLASHSIZE 4M
40 #elif CONFIG_CPU == PP5020
41 #define DRAMORIG 0x10000000
42 #define IRAMORIG 0x40000000
43 #define IRAMSIZE 0x18000
44 #define FLASHORIG 0x001f0000
45 #define FLASHSIZE 2M
46 #elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024)
47 #define DRAMORIG 0x10000000
48 #define IRAMORIG 0x40000000
49 #define IRAMSIZE 0x20000
50 #define FLASHORIG 0x001f0000
51 #define FLASHSIZE 2M
52 #elif CONFIG_CPU == S3C2440
53 #define DRAMORIG 0x30000000
54 #define IRAMORIG 0x40000000
55 #define IRAMSIZE 4K
56 #define FLASHORIG 0x0000000
57 #define FLASHSIZE 1M
58 #elif CONFIG_CPU == PP5002
59 #define DRAMORIG 0x28000000
60 #define IRAMORIG 0x40000000
61 #define IRAMSIZE 0x18000
62 #define FLASHORIG 0x001f0000
63 #define FLASHSIZE 2M
64 #else
65 #define DRAMORIG 0x09000000
66 #define IRAMORIG 0x0f000000
67 #define IRAMSIZE 0x1000
68 #define FLASHORIG 0x02000000 + ROM_START
69 #define FLASHSIZE 256K - ROM_START
70 #endif
72 #if !defined(CPU_PP) && (CONFIG_CPU!=S3C2440)
73 MEMORY
75    DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
76    IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
77    FLASH : ORIGIN = FLASHORIG, LENGTH = FLASHSIZE
79 #endif
81 SECTIONS
82 #ifdef CPU_PP
84   . = IRAMORIG;
86   .text : { 
87     *(.init.text)
88     *(.text*)
89   }
91   .data : { 
92     *(.icode)
93     *(.irodata)
94     *(.idata)
95     *(.data*)
96     _dataend = . ;
97    }
99   .stack :
100   {
101      *(.stack)
102      _stackbegin = .;
103      stackbegin = .;
104      . += 0x2000;
105      _stackend = .;
106      stackend = .;
107   }
109   /* The bss section is too large for IRAM - we just move it 16MB into the
110      DRAM */
112   . = (DRAMORIG+16*1024*1024);
113   .bss : {
114      _edata = .;
115      *(.bss*);
116      *(.ibss);
117      _end = .;
118    }
120 #elif (CONFIG_CPU==S3C2440)
122   . = DRAMORIG + 0x1000000;
123   .text : {
124     *(.init.text)
125     *(.text*)
126   }
127   .data : {
128     *(.icode)
129     *(.irodata)
130     *(.idata)
131     *(.data*)
132     _dataend = . ;
133    }
134   .stack :
135   {
136      *(.stack)
137      _stackbegin = .;
138      stackbegin = .;
139      . += 0x2000;
140      _stackend = .;
141      stackend = .;
142   }
143   .bss : {
144      _edata = .;
145      *(.bss*);
146      *(.ibss);
147      _end = .;
148    }
150 #else
152     .vectors :
153     {
154 #if defined(IAUDIO_X5) || defined(IAUDIO_M5)
155         *(.init.text)
156 #endif
157         _datacopy = .;
158     } > FLASH
160     .data : AT ( _datacopy )
161     {
162         _datastart = .;
163         KEEP(*(.resetvectors));
164         *(.resetvectors);
165         KEEP(*(.vectors));
166         *(.vectors);
167         . = ALIGN(0x200);
168         *(.icode)
169         *(.irodata)
170         *(.idata)
171         *(.data*)
172         . = ALIGN(0x4);
173         _dataend = .;         
174         . = ALIGN(0x10);  /* Maintain proper alignment for .text section */
175     } > IRAM
176     
177     /* TRICK ALERT! Newer versions of the linker don't allow output sections
178        to overlap even if one of them is empty, so advance the location pointer
179        "by hand" */
180     .text LOADADDR(.data) + SIZEOF(.data) :
181     {
182         *(.init.text)
183         *(.text*)
184         . = ALIGN(0x4);
185     } > FLASH
187     .rodata :
188     {
189         *(.rodata*)
190         . = ALIGN(0x4);
191         _iramcopy = .;
192     } > FLASH
194     .stack :
195     {
196        *(.stack)
197        _stackbegin = .;
198        stackbegin = .;
199        . += 0x2000;
200        _stackend = .;
201        stackend = .;
202     } > IRAM
204 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) \
205  || defined(IAUDIO_X5) || defined(IAUDIO_M5)
206     .bss DRAMORIG+0x800000:
207 #else
208     .bss :
209 #endif
210     {
211        _edata = .;
212         *(.ibss)
213         *(.bss*)
214         *(COMMON)
215        _end = .;
216 #if defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) \
217  || defined(IAUDIO_X5) || defined(IAUDIO_M5)
218     } > DRAM
219 #else
220     } > IRAM
221 #endif
224 #endif