• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2021-2023 HPMicro
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6ENTRY(_start)
7
8STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x2000;
9HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 0x40000;
10
11MEMORY
12{
13    XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = _flash_size
14    ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
15    DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
16    AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 512K    /* AXI SRAM0 */
17    NONCACHEABLE_RAM (w) : ORIGIN = 0x01100000, LENGTH = 256K    /* AXI SRAM1 */
18    SHARE_RAM (w) : ORIGIN = 0x0117C000, LENGTH = 16K
19    AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
20    APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
21}
22
23__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
24__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
25__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
26__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
27__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
28
29
30SECTIONS
31{
32    .nor_cfg_option __nor_cfg_option_load_addr__ : {
33        KEEP(*(.nor_cfg_option))
34    } > XPI0
35
36    .boot_header __boot_header_load_addr__ : {
37        __boot_header_start__ = .;
38        KEEP(*(.boot_header))
39        KEEP(*(.fw_info_table))
40        KEEP(*(.dc_info))
41        __boot_header_end__ = .;
42    } > XPI0
43
44    .start __app_load_addr__ : {
45        . = ALIGN(8);
46        KEEP(*(.start))
47    } > XPI0
48
49    __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
50    .vectors ORIGIN(ILM) : AT(__vector_load_addr__) {
51        . = ALIGN(8);
52        __vector_ram_start__ = .;
53        /* For OHOS Start */
54        KEEP(*(.interrupt.HalTrapVector.text));
55        KEEP(*(.interrupt.text))
56        /* For OHOS End */
57
58        KEEP(*(.vector_table))
59        KEEP(*(.isr_vector))
60        . = ALIGN(8);
61        __vector_ram_end__ = .;
62    } > ILM
63
64    .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
65        . = ALIGN(8);
66        *(EXCLUDE_FILE (nx*.o* *los_*.o *riscv_hal*.o *liteos_m?kal*.o *lwip*.o) .text) /* OHOS */
67        *(EXCLUDE_FILE (nx*.o* *los_*.o *riscv_hal*.o *liteos_m?kal*.o *lwip*.o) .text*)
68        *(EXCLUDE_FILE (nx*.o* *los_*.o *riscv_hal*.o *liteos_m?kal*.o *lwip*.o) .rodata)
69        *(EXCLUDE_FILE (nx*.o* *los_*.o *riscv_hal*.o *liteos_m?kal*.o *lwip*.o) .rodata*)
70        *(EXCLUDE_FILE (nx*.o*) .srodata)
71        *(EXCLUDE_FILE (nx*.o*) .srodata*)
72
73        *(.hash)
74        *(.dyn*)
75        *(.gnu*)
76        *(.pl*)
77
78        KEEP(*(.eh_frame))
79        *(.eh_frame*)
80
81        KEEP (*(.init))
82        KEEP (*(.fini))
83
84        /* section information for usbh class */
85        . = ALIGN(8);
86        __usbh_class_info_start__ = .;
87        KEEP(*(.usbh_class_info))
88        __usbh_class_info_end__ = .;
89
90        /* RT-Thread related sections - Start */
91        /* section information for finsh shell */
92        . = ALIGN(4);
93        __fsymtab_start = .;
94        KEEP(*(FSymTab))
95        __fsymtab_end = .;
96        . = ALIGN(4);
97        __vsymtab_start = .;
98        KEEP(*(VSymTab))
99        __vsymtab_end = .;
100        . = ALIGN(4);
101
102        . = ALIGN(4);
103        __rt_init_start = .;
104        KEEP(*(SORT(.rti_fn*)))
105        __rt_init_end = .;
106        . = ALIGN(4);
107
108        /* section information for modules */
109        . = ALIGN(4);
110        __rtmsymtab_start = .;
111        KEEP(*(RTMSymTab))
112        __rtmsymtab_end = .;
113
114        /* RT-Thread related sections - end */
115        . = ALIGN(8);
116
117        /* For OHOS Start */
118        _hdf_drivers_start = .;
119        KEEP(*(.hdf.driver))
120        _hdf_drivers_end = .; /* define a section for hdf driver */
121
122         __zinitcall_bsp_start = .;
123        KEEP (*(.zinitcall.bsp0.init))
124        KEEP (*(.zinitcall.bsp1.init))
125        KEEP (*(.zinitcall.bsp2.init))
126        KEEP (*(.zinitcall.bsp3.init))
127        KEEP (*(.zinitcall.bsp4.init))
128        __zinitcall_bsp_end = .;
129        . = ALIGN(4);
130        __zinitcall_device_start = .;
131        KEEP (*(.zinitcall.device0.init))
132        KEEP (*(.zinitcall.device1.init))
133        KEEP (*(.zinitcall.device2.init))
134        KEEP (*(.zinitcall.device3.init))
135        KEEP (*(.zinitcall.device4.init))
136        __zinitcall_device_end = .;
137        . = ALIGN(4);
138        __zinitcall_core_start = .;
139        KEEP (*(.zinitcall.core0.init))
140        KEEP (*(.zinitcall.core1.init))
141        KEEP (*(.zinitcall.core2.init))
142        KEEP (*(.zinitcall.core3.init))
143        KEEP (*(.zinitcall.core4.init))
144        __zinitcall_core_end = .;
145        . = ALIGN(4);
146        __zinitcall_sys_service_start = .;
147        KEEP (*(.zinitcall.sys.service0.init))
148        KEEP (*(.zinitcall.sys.service1.init))
149        KEEP (*(.zinitcall.sys.service2.init))
150        KEEP (*(.zinitcall.sys.service3.init))
151        KEEP (*(.zinitcall.sys.service4.init))
152        __zinitcall_sys_service_end = .;
153        . = ALIGN(4);
154        __zinitcall_sys_feature_start = .;
155        KEEP (*(.zinitcall.sys.feature0.init))
156        KEEP (*(.zinitcall.sys.feature1.init))
157        KEEP (*(.zinitcall.sys.feature2.init))
158        KEEP (*(.zinitcall.sys.feature3.init))
159        KEEP (*(.zinitcall.sys.feature4.init))
160        __zinitcall_sys_feature_end = .;
161        . = ALIGN(4);
162        __zinitcall_run_start = .;
163        KEEP (*(.zinitcall.run0.init))
164        KEEP (*(.zinitcall.run1.init))
165        KEEP (*(.zinitcall.run2.init))
166        KEEP (*(.zinitcall.run3.init))
167        KEEP (*(.zinitcall.run4.init))
168        __zinitcall_run_end = .;
169        . = ALIGN(4);
170        __zinitcall_app_service_start = .;
171        KEEP (*(.zinitcall.app.service0.init))
172        KEEP (*(.zinitcall.app.service1.init))
173        KEEP (*(.zinitcall.app.service2.init))
174        KEEP (*(.zinitcall.app.service3.init))
175        KEEP (*(.zinitcall.app.service4.init))
176        __zinitcall_app_service_end = .;
177        . = ALIGN(4);
178        __zinitcall_app_feature_start = .;
179        KEEP (*(.zinitcall.app.feature0.init))
180        KEEP (*(.zinitcall.app.feature1.init))
181        KEEP (*(.zinitcall.app.feature2.init))
182        KEEP (*(.zinitcall.app.feature3.init))
183        KEEP (*(.zinitcall.app.feature4.init))
184        __zinitcall_app_feature_end = .;
185        . = ALIGN(4);
186        __zinitcall_test_start = .;
187        KEEP (*(.zinitcall.test0.init))
188        KEEP (*(.zinitcall.test1.init))
189        KEEP (*(.zinitcall.test2.init))
190        KEEP (*(.zinitcall.test3.init))
191        KEEP (*(.zinitcall.test4.init))
192        __zinitcall_test_end = .;
193        . = ALIGN(4);
194        __zinitcall_exit_start = .;
195        KEEP (*(.zinitcall.exit0.init))
196        KEEP (*(.zinitcall.exit1.init))
197        KEEP (*(.zinitcall.exit2.init))
198        KEEP (*(.zinitcall.exit3.init))
199        KEEP (*(.zinitcall.exit4.init))
200        __zinitcall_exit_end = .;
201        . = ALIGN(4);
202        /* For OHOS End */
203    } > XPI0
204
205    .rel : {
206        KEEP(*(.rel*))
207    } > XPI0
208
209    PROVIDE (__etext = .);
210    PROVIDE (_etext = .);
211    PROVIDE (etext = .);
212
213    __data_load_addr__ = etext;
214    .data : AT(__data_load_addr__) {
215        . = ALIGN(8);
216        __data_start__ = .;
217        __global_pointer$ = . + 0x800;
218        *(.data)
219        *(.data*)
220        *(.sdata)
221        *(.sdata*)
222
223        KEEP(*(.jcr))
224        KEEP(*(.dynamic))
225        KEEP(*(.got*))
226        KEEP(*(.got))
227        KEEP(*(.gcc_except_table))
228        KEEP(*(.gcc_except_table.*))
229
230        . = ALIGN(8);
231        PROVIDE(__preinit_array_start = .);
232        KEEP(*(.preinit_array))
233        PROVIDE(__preinit_array_end = .);
234
235        . = ALIGN(8);
236        PROVIDE(__init_array_start = .);
237        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
238        KEEP(*(.init_array))
239        PROVIDE(__init_array_end = .);
240
241        . = ALIGN(8);
242        PROVIDE(__finit_array_start = .);
243        KEEP(*(SORT_BY_INIT_PRIORITY(.finit_array.*)))
244        KEEP(*(.finit_array))
245        PROVIDE(__finit_array_end = .);
246
247        . = ALIGN(8);
248        KEEP(*crtbegin*.o(.ctors))
249        KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
250        KEEP(*(SORT(.ctors.*)))
251        KEEP(*(.ctors))
252
253        . = ALIGN(8);
254        KEEP(*crtbegin*.o(.dtors))
255        KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
256        KEEP(*(SORT(.dtors.*)))
257        KEEP(*(.dtors))
258        . = ALIGN(8);
259        __data_end__ = .;
260        PROVIDE (__edata = .);
261        PROVIDE (_edata = .);
262        PROVIDE (edata = .);
263    } > DLM
264
265    __fast_load_addr__ = etext + SIZEOF(.data);
266    .fast : AT(__fast_load_addr__) {
267        . = ALIGN(8);
268        PROVIDE(__ramfunc_start__ = .);
269        *(.fast)
270        *(.fast.*)
271        nx*.o*(.text)
272        nx*.o*(.text*)
273        nx*.o*(.rodata)
274        nx*.o*(.rodata*)
275        nx*.o*(.srodata)
276        nx*.o*(.srodata*)
277        *riscv_hal*.o (.text* .rodata*)
278        *los_*.o (.text* .rodata*)
279        *liteos_m?kal*.o (.text* .rodata*)
280        *lwip*.o (.text* .rodata*)
281        . = ALIGN(8);
282        PROVIDE(__ramfunc_end__ = .);
283    } > ILM
284
285    .bss (NOLOAD) : {
286        . = ALIGN(8);
287        __bss_start__ = .;
288        *(.bss)
289        *(.bss*)
290        *(.sbss*)
291        *(.scommon)
292        *(.scommon*)
293        *(.dynsbss*)
294        *(COMMON)
295        . = ALIGN(8);
296        _end = .;
297        __bss_end__ = .;
298    } > DLM
299
300    .tbss (NOLOAD) : {
301        . = ALIGN(8);
302        PROVIDE(__tbss_start__ = .);
303        __thread_pointer$ = .;
304        *(.tbss)
305        *(.tbss.*)
306        *(.gnu.linkonce.tb.*)
307        *(.tcommon)
308        . = ALIGN(8);
309        PROVIDE(__tbss_end__ = .);
310    } > AXI_SRAM
311
312    __tdata_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast);
313    .tdata : AT(__tdata_load_addr__) {
314        . = ALIGN(8);
315        PROVIDE(__tdata_start__ = .);
316        *(.tdata)
317        *(.tdata.*)
318        *(.gnu.linkonce.td.*)
319        . = ALIGN(8);
320        PROVIDE(__tdata_end__ = .);
321    } > AXI_SRAM
322
323    .framebuffer (NOLOAD) : {
324        . = ALIGN(8);
325        KEEP(*(.framebuffer))
326        . = ALIGN(8);
327    } > AXI_SRAM
328
329    __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata);
330    .noncacheable.init : AT(__noncacheable_init_load_addr__) {
331        . = ALIGN(8);
332        __noncacheable_init_start__ = .;
333        KEEP(*(.noncacheable.init))
334        __noncacheable_init_end__ = .;
335        . = ALIGN(8);
336    } > NONCACHEABLE_RAM
337
338    .noncacheable.bss (NOLOAD) : {
339        . = ALIGN(8);
340        KEEP(*(.noncacheable))
341        __noncacheable_bss_start__ = .;
342        KEEP(*(.noncacheable.bss))
343        __noncacheable_bss_end__ = .;
344        . = ALIGN(8);
345    } > NONCACHEABLE_RAM
346
347    .sh_mem (NOLOAD) : {
348        KEEP(*(.sh_mem))
349    } > SHARE_RAM
350
351    .ahb_sram (NOLOAD) : {
352        KEEP(*(.ahb_sram))
353    } > AHB_SRAM
354
355    .apb_sram (NOLOAD) : {
356        KEEP(*(.backup_sram))
357    } > APB_SRAM
358
359    .fast_ram (NOLOAD) : {
360        KEEP(*(.fast_ram))
361    } > DLM
362
363    .heap (NOLOAD) : {
364        . = ALIGN(8);
365        __heap_start = .; /* Only for OHOS Start*/
366        __heap_start__ = .;
367        . += HEAP_SIZE;
368        __heap_end__ = .;
369        __heap_end = .; /* Only for OHOS  End */
370    } > AXI_SRAM
371
372    __heap_size = HEAP_SIZE;
373
374    .stack (NOLOAD) : {
375        . = ALIGN(8);
376        __stack_bootom = .; /* Only for OHOS  */
377        . += STACK_SIZE; /* Only for OHOS  */
378        __except_stack_top = .; /* Only for OHOS  */
379
380        __stack_base__ = .;
381        . += STACK_SIZE;
382        . = ALIGN(8);
383        PROVIDE (_stack = .);
384        PROVIDE (_stack_safe = .);
385        __start_and_irq_stack_top = .; /* Only for OHOS  */
386    } > DLM
387
388    __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
389    __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
390    __share_mem_start__ = ORIGIN(SHARE_RAM);
391    __share_mem_end__ = ORIGIN(SHARE_RAM) + LENGTH(SHARE_RAM);
392
393    __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
394    ASSERT(__fw_size__ <= LENGTH(XPI0), "******  FAILED! XPI0 has not enough space!  ******")
395}
396