1/*
2 * Copyright (c) 2023 HPMicro
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6ENTRY(_start)
7
8STACK_SIZE = _stack_size;
9HEAP_SIZE = _heap_size;
10
11MEMORY
12{
13    XPI0 (rx) : ORIGIN = 0x80003000, LENGTH = _flash_size - 0x3000
14    ILM (wx) : ORIGIN = 0x00000000, LENGTH = 128K
15    DLM (w) : ORIGIN = 0x00080000, LENGTH = 128K
16    AHB_SRAM (w) : ORIGIN = 0xF0400000, LENGTH = 32k
17}
18
19SECTIONS
20{
21    .start : {
22        . = ALIGN(8);
23        KEEP(*(.start))
24    } > XPI0
25
26    __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
27    .vectors ORIGIN(ILM) : AT(__vector_load_addr__) {
28        . = ALIGN(8);
29        __vector_ram_start__ = .;
30        KEEP(*(.vector_table))
31        KEEP(*(.isr_vector))
32        KEEP(*(.vector_s_table))
33        KEEP(*(.isr_s_vector))
34        . = ALIGN(8);
35        __vector_ram_end__ = .;
36    } > ILM
37
38    .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
39        . = ALIGN(8);
40        *(.text)
41        *(.text*)
42        *(.rodata)
43        *(.rodata*)
44        *(.srodata)
45        *(.srodata*)
46
47        *(.hash)
48        *(.dyn*)
49        *(.gnu*)
50        *(.pl*)
51
52        KEEP (*(.init))
53        KEEP (*(.fini))
54
55        /* section information for usbh class */
56        . = ALIGN(8);
57        __usbh_class_info_start__ = .;
58        KEEP(*(.usbh_class_info))
59        __usbh_class_info_end__ = .;
60
61        /* RT-Thread related sections - Start */
62        /* section information for finsh shell */
63        . = ALIGN(4);
64        __fsymtab_start = .;
65        KEEP(*(FSymTab))
66        __fsymtab_end = .;
67        . = ALIGN(4);
68        __vsymtab_start = .;
69        KEEP(*(VSymTab))
70        __vsymtab_end = .;
71        . = ALIGN(4);
72
73        . = ALIGN(4);
74        __rt_init_start = .;
75        KEEP(*(SORT(.rti_fn*)))
76        __rt_init_end = .;
77        . = ALIGN(4);
78
79        /* section information for modules */
80        . = ALIGN(4);
81        __rtmsymtab_start = .;
82        KEEP(*(RTMSymTab))
83        __rtmsymtab_end = .;
84
85        /* RT-Thread related sections - end */
86        . = ALIGN(8);
87    } > XPI0
88
89    .eh_frame :
90    {
91        __eh_frame_start = .;
92        KEEP(*(.eh_frame))
93        __eh_frame_end = .;
94    }  > XPI0
95
96    .eh_frame_hdr :
97    {
98        KEEP(*(.eh_frame_hdr))
99    }  > XPI0
100    __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
101    __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
102
103    .rel : {
104        KEEP(*(.rel*))
105    } > XPI0
106
107    PROVIDE (__etext = .);
108    PROVIDE (_etext = .);
109    PROVIDE (etext = .);
110
111    __data_load_addr__ = etext;
112    .data : AT(__data_load_addr__) {
113        . = ALIGN(8);
114        __data_start__ = .;
115        __global_pointer$ = . + 0x800;
116        *(.data)
117        *(.data*)
118        *(.sdata)
119        *(.sdata*)
120
121        KEEP(*(.jcr))
122        KEEP(*(.dynamic))
123        KEEP(*(.got*))
124        KEEP(*(.got))
125        KEEP(*(.gcc_except_table))
126        KEEP(*(.gcc_except_table.*))
127
128        . = ALIGN(8);
129        PROVIDE(__preinit_array_start = .);
130        KEEP(*(.preinit_array))
131        PROVIDE(__preinit_array_end = .);
132
133        . = ALIGN(8);
134        PROVIDE(__init_array_start = .);
135        KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
136        KEEP(*(.init_array))
137        PROVIDE(__init_array_end = .);
138
139        . = ALIGN(8);
140        PROVIDE(__finit_array_start = .);
141        KEEP(*(SORT_BY_INIT_PRIORITY(.finit_array.*)))
142        KEEP(*(.finit_array))
143        PROVIDE(__finit_array_end = .);
144
145        . = ALIGN(8);
146        KEEP(*crtbegin*.o(.ctors))
147        KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
148        KEEP(*(SORT(.ctors.*)))
149        KEEP(*(.ctors))
150
151        . = ALIGN(8);
152        KEEP(*crtbegin*.o(.dtors))
153        KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
154        KEEP(*(SORT(.dtors.*)))
155        KEEP(*(.dtors))
156        . = ALIGN(8);
157        __data_end__ = .;
158        PROVIDE (__edata = .);
159        PROVIDE (_edata = .);
160        PROVIDE (edata = .);
161    } > DLM
162
163    __fast_load_addr__ = etext + SIZEOF(.data);
164    .fast : AT(__fast_load_addr__) {
165        . = ALIGN(8);
166        PROVIDE(__ramfunc_start__ = .);
167        *(.fast)
168        *(.fast.*)
169        . = ALIGN(8);
170        PROVIDE(__ramfunc_end__ = .);
171    } > ILM
172
173    __tdata_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast);
174    .tdata : AT(__tdata_load_addr__) {
175        . = ALIGN(8);
176        PROVIDE(__tdata_start__ = .);
177        *(.tdata)
178        *(.tdata.*)
179        *(.gnu.linkonce.td.*)
180        . = ALIGN(8);
181        PROVIDE(__tdata_end__ = .);
182    } > DLM
183
184    .tbss (NOLOAD) : {
185        . = ALIGN(8);
186        PROVIDE(__tbss_start__ = .);
187        __thread_pointer$ = .;
188        *(.tbss)
189        *(.tbss.*)
190        *(.gnu.linkonce.tb.*)
191        *(.tcommon)
192        . = ALIGN(8);
193        PROVIDE(__tbss_end__ = .);
194    } > DLM
195
196    __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata);
197    .noncacheable.init : AT(__noncacheable_init_load_addr__) {
198        . = ALIGN(8);
199        __noncacheable_init_start__ = .;
200        KEEP(*(.noncacheable.init))
201        __noncacheable_init_end__ = .;
202        . = ALIGN(8);
203    } > DLM
204
205    __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
206    .fast_ram.init : AT(__fast_ram_init_load_addr__) {
207        . = ALIGN(8);
208        __fast_ram_init_start__ = .;
209        KEEP(*(.fast_ram.init))
210        __fast_ram_init_end__ = .;
211        . = ALIGN(8);
212    } > DLM
213
214    .ahb_sram (NOLOAD) : {
215        KEEP(*(.ahb_sram))
216    } > AHB_SRAM
217
218    .bss (NOLOAD) : {
219        . = ALIGN(8);
220        __bss_start__ = .;
221        *(.bss)
222        *(.bss*)
223        *(.sbss*)
224        *(.scommon)
225        *(.scommon*)
226        *(.dynsbss*)
227        *(COMMON)
228        . = ALIGN(8);
229        _end = .;
230        __bss_end__ = .;
231    } > DLM
232
233    .framebuffer (NOLOAD) : {
234        . = ALIGN(8);
235        KEEP(*(.framebuffer))
236        . = ALIGN(8);
237    } > DLM
238
239    .noncacheable.bss (NOLOAD) : {
240        . = ALIGN(8);
241        KEEP(*(.noncacheable))
242        __noncacheable_bss_start__ = .;
243        KEEP(*(.noncacheable.bss))
244        __noncacheable_bss_end__ = .;
245        . = ALIGN(8);
246    } > DLM
247
248    .fast_ram.bss (NOLOAD) : {
249        . = ALIGN(8);
250        KEEP(*(.fast_ram))
251        __fast_ram_bss_start__ = .;
252        KEEP(*(.fast_ram.bss))
253        __fast_ram_bss_end__ = .;
254        . = ALIGN(8);
255    } > DLM
256
257    .heap (NOLOAD) : {
258        . = ALIGN(8);
259        __heap_start__ = .;
260        . += HEAP_SIZE;
261        __heap_end__ = .;
262    } > DLM
263
264    .stack (NOLOAD) : {
265        . = ALIGN(16);
266        __stack_base__ = .;
267        . += STACK_SIZE;
268        . = ALIGN(16);
269        PROVIDE (_stack = .);
270        PROVIDE (_stack_safe = .);
271    } > DLM
272
273    __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init);
274    __last_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
275    ASSERT(((__fw_size__ <= LENGTH(XPI0)) && (__last_addr__ <= (ORIGIN(XPI0) + LENGTH(XPI0)))), "******  FAILED! XPI0 has not enough space!  ******")
276}
277