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