Setting up repository
[linux-libre-firmware.git] / ath9k_htc / target_firmware / ram-magpie.ld
1
2 /* Linker script for Magpie RAM-based applications */
3
4 /*
5 Currently, ROM code reserves the first 8KB of RAM for its data/bss.
6 The next 12KB or RAM is used for RAM software's literals and read-only data.
7 After that comes 64KB reserved for RAM software's data and bss.
8 Then 92KB of RAM is reserved for text (code).
9 The last 8KB of RAM is reserved for ROM patches, customer DataSets,
10 and RAM software expansion. (There is also some additional RAM between
11 segments that can be used, if needed.)
12   ROM reserved: 0x00500000..0x00501fff
13   Literals:     0x00502000..0x00504fff
14   Data:         0x00505000..0x00514fff
15   Text:         0x00915000..0x0092bfff
16 TBD: May want to use a 2-pass link approach in order to
17 eliminate fixed boundaries.  Support for physical addressing
18 in Tensilica tools would be helpful, but it's not coming
19 any time soon.
20 */
21
22 /* dram_seg: 0x504000, see target.rom.ld */
23
24 /* ***** */
25 MEMORY
26 {
27  lit_seg :            org = 0x004E8000,   len = 0x1f600
28  iram_seg :           org = 0x00906000,   len = 0xad00
29  dram_seg :           org = 0x00510d00,   len = 0x6000
30  
31 }
32
33 PHDRS
34 {
35   lit_phdr PT_LOAD;
36   dram_phdr PT_LOAD;
37   iram_phdr PT_LOAD;
38 }
39
40 /*  Default entry point:  */
41 ENTRY(app_start)
42
43 SECTIONS
44 {
45   /*
46    * This empty section is used to convince RAM linkage
47    * to share litbase with ROM code.
48    */
49   .lit4 (NOLOAD) :
50   {
51     _rom_literal_start = ABSOLUTE(.);
52     . += 0x19000; /* Reserved virtual space for physical mem gap and ROM */
53     _lit4_start = ABSOLUTE(.);
54     _lit4_end = ABSOLUTE(.);
55     _rom_literal_end = ABSOLUTE(.);
56   } >lit_seg :NONE
57
58   .dport0.rodata :
59   {
60     _dport0_rodata_start = ABSOLUTE(.); /* 0x505000 */
61     *(.dport0.rodata)
62     *(.dport.rodata)
63     _dport0_rodata_end = ABSOLUTE(.);
64   } >lit_seg :lit_phdr
65
66   .dport0.literal :
67   {
68     _dport0_literal_start = ABSOLUTE(.);
69     *(.dport0.literal)
70     *(.dport.literal)
71     _dport0_literal_end = ABSOLUTE(.);
72   } >lit_seg :lit_phdr
73
74   .dram0.rodata :
75   {
76     _dram0_rodata_start = ABSOLUTE(.);
77     *(.dram0.rodata)
78     *(.dram.rodata)
79     _dram0_rodata_end = ABSOLUTE(.);
80   } >lit_seg :lit_phdr
81
82   .rodata :
83   {
84     _rodata_start = ABSOLUTE(.);
85     *(.rodata)
86     *(.rodata.*)
87     *(.gnu.linkonce.r.*)
88     *(.rodata1)
89     __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
90     *(.xt_except_table)
91     *(.gcc_except_table)
92     *(.gnu.linkonce.e.*)
93     *(.gnu.version_r)
94     . = ALIGN(4);               /* this table MUST be 4-byte aligned */
95     _bss_table_start = ABSOLUTE(.);
96     LONG(_dport0_bss_start)
97     LONG(_dport0_bss_end)
98     LONG(_bss_start)
99     LONG(_bss_end)
100     _bss_table_end = ABSOLUTE(.);
101     _rodata_end = ABSOLUTE(.);
102   } >lit_seg :lit_phdr
103
104   .literals :
105   {
106     _literals_start = ABSOLUTE(.);
107     *(*.lit4)
108     *(.gnu.linkonce.lit4.*)
109     _literals_end = ABSOLUTE(.);
110   } >lit_seg :lit_phdr
111
112   .dram0.literal :
113   {
114     _dram0_literal_start = ABSOLUTE(.);
115     *(.dram0.literal)
116     *(.dram.literal)
117     _dram0_literal_end = ABSOLUTE(.);
118   } >lit_seg :lit_phdr
119
120   .dport0.data :
121   {
122     _dport0_data_start = ABSOLUTE(.);
123     *(.dport0.data)
124     *(.dport.data)
125     _dport0_data_end = ABSOLUTE(.);
126   } >dram_seg :dram_phdr
127
128   .dport0.bss :
129   {
130     . = ALIGN (8);
131     _dport0_bss_start = ABSOLUTE(.);
132     *(.dport0.bss)
133     . = ALIGN (8);
134     _dport0_bss_end = ABSOLUTE(.);
135   } >dram_seg :dram_phdr
136
137   .dram0.data :
138   {
139     _dram0_data_start = ABSOLUTE(.);
140     *(.dram0.data)
141     *(.dram.data)
142     _dram0_data_end = ABSOLUTE(.);
143   } >dram_seg :dram_phdr
144
145   .data :
146   {
147     _data_start = ABSOLUTE(.);
148     *(.data)
149     *(.data.*)
150     *(.gnu.linkonce.d.*)
151     *(.data1)
152     *(.sdata)
153     *(.sdata.*)
154     *(.gnu.linkonce.s.*)
155     *(.sdata2)
156     *(.sdata2.*)
157     *(.gnu.linkonce.s2.*)
158     *(.jcr)
159     *(.eh_frame)
160     /*  C++ constructor and destructor tables, properly ordered:  */
161     KEEP (*crtbegin.o(.ctors))
162     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
163     KEEP (*(SORT(.ctors.*)))
164     KEEP (*(.ctors))
165     KEEP (*crtbegin.o(.dtors))
166     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
167     KEEP (*(SORT(.dtors.*)))
168     KEEP (*(.dtors))
169     /*  C++ exception handlers table:  */
170     __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
171     *(.xt_except_desc)
172     *(.gnu.linkonce.h.*)
173     __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
174     *(.xt_except_desc_end)
175     *(.dynamic)
176     *(.gnu.version_d)
177     _data_end = ABSOLUTE(.);
178   } >dram_seg :dram_phdr
179
180   .bss :
181   {
182     . = ALIGN (8);
183     _bss_start = ABSOLUTE(.);
184     *(.dynsbss)
185     *(.sbss)
186     *(.sbss.*)
187     *(.gnu.linkonce.sb.*)
188     *(.scommon)
189     *(.sbss2)
190     *(.sbss2.*)
191     *(.gnu.linkonce.sb2.*)
192     *(.dynbss)
193     *(.bss)
194     *(.bss.*)
195     *(.gnu.linkonce.b.*)
196     *(COMMON)
197     *(.dram0.bss)
198     . = ALIGN (8);
199     _bss_end = ABSOLUTE(.);
200     _end = ALIGN(0x8);
201     PROVIDE(end = ALIGN(0x8));
202         _fw_image_end = ABSOLUTE(.);
203     /*_stack_sentry = ALIGN(0x8);*/
204   } >dram_seg :dram_phdr
205
206   .boot :
207     { *(.boot) } > iram_seg :iram_phdr
208
209   .text :
210   {
211     _stext = .;
212     _text_start = ABSOLUTE(.);
213     *(.entry.text)
214     *(.init.literal)
215     *(.init)
216     *(.literal .text .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
217     *(.fini.literal)
218     *(.fini)
219     *(.gnu.version)
220     _text_end = ABSOLUTE(.);
221     _etext = .;
222   } >iram_seg :iram_phdr
223
224   .iram0.text :
225   {
226     _iram0_text_start = ABSOLUTE(.);
227     *(.iram0.literal .iram.literal .iram.text.literal .iram0.text .iram.text)
228     _iram0_text_end = ABSOLUTE(.);
229   } >iram_seg :iram_phdr
230
231   .debug  0 :  { *(.debug) }
232   .line  0 :  { *(.line) }
233   .debug_srcinfo  0 :  { *(.debug_srcinfo) }
234   .debug_sfnames  0 :  { *(.debug_sfnames) }
235   .debug_aranges  0 :  { *(.debug_aranges) }
236   .debug_pubnames  0 :  { *(.debug_pubnames) }
237   .debug_info  0 :  { *(.debug_info) }
238   .debug_abbrev  0 :  { *(.debug_abbrev) }
239   .debug_line  0 :  { *(.debug_line) }
240   .debug_frame  0 :  { *(.debug_frame) }
241   .debug_str  0 :  { *(.debug_str) }
242   .debug_loc  0 :  { *(.debug_loc) }
243   .debug_macinfo  0 :  { *(.debug_macinfo) }
244   .debug_weaknames  0 :  { *(.debug_weaknames) }
245   .debug_funcnames  0 :  { *(.debug_funcnames) }
246   .debug_typenames  0 :  { *(.debug_typenames) }
247   .debug_varnames  0 :  { *(.debug_varnames) }
248
249   .xt.insn 0 :
250   {
251     KEEP (*(.xt.insn))
252     KEEP (*(.gnu.linkonce.x.*))
253   }
254   .xt.prop 0 :
255   {
256     KEEP (*(.xt.prop))
257     KEEP (*(.gnu.linkonce.prop.*))
258   }
259   .xt.lit 0 :
260   {
261     KEEP (*(.xt.lit))
262     KEEP (*(.gnu.linkonce.p.*))
263   }
264 }