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