summaryrefslogtreecommitdiff
path: root/fw/fe310/bsp/default.lds
diff options
context:
space:
mode:
Diffstat (limited to 'fw/fe310/bsp/default.lds')
-rw-r--r--fw/fe310/bsp/default.lds153
1 files changed, 153 insertions, 0 deletions
diff --git a/fw/fe310/bsp/default.lds b/fw/fe310/bsp/default.lds
new file mode 100644
index 0000000..cabcf01
--- /dev/null
+++ b/fw/fe310/bsp/default.lds
@@ -0,0 +1,153 @@
+OUTPUT_ARCH("riscv")
+
+ENTRY(_enter)
+
+MEMORY
+{
+ flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x6a120
+ itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x2000
+ ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000
+}
+
+PHDRS
+{
+ flash PT_LOAD;
+ ram PT_LOAD;
+ ram_init PT_LOAD;
+ itim PT_LOAD;
+ itim_init PT_LOAD;
+}
+
+SECTIONS
+{
+
+ __stack_size = 0x1000;
+ PROVIDE(__metal_boot_hart = 0);
+ PROVIDE(__metal_chicken_bit = 0);
+
+ .init : {
+ KEEP (*(.text.metal.init.enter))
+ KEEP (*(.text.metal.init.*))
+ KEEP (*(SORT_NONE(.init)))
+ KEEP (*(.text.libgloss.start))
+ } >flash AT>flash :flash
+
+ .fini : {
+ KEEP (*(SORT_NONE(.fini)))
+ } >flash AT>flash :flash
+
+ .text : {
+ *(.text.unlikely .text.unlikely.*)
+ *(.text.startup .text.startup.*)
+ *(.text .text.*)
+ *(.gnu.linkonce.t.*)
+ } >flash AT>flash :flash
+
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+
+ .rodata : {
+ *(.rdata)
+ *(.rodata .rodata.*)
+ *(.gnu.linkonce.r.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ } >flash AT>flash :flash
+
+ . = ALIGN(8);
+
+ .preinit_array : {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >flash AT>flash :flash
+
+ .init_array : {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >flash AT>flash :flash
+
+ .fini_array : {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >flash AT>flash :flash
+
+ .ctors : {
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ } >flash AT>flash :flash
+
+ .dtors : {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ } >flash AT>flash :flash
+
+ .itim : ALIGN(8) {
+ *(.itim .itim.*)
+ } >itim AT>flash :itim_init
+
+ PROVIDE( metal_segment_itim_source_start = LOADADDR(.itim) );
+ PROVIDE( metal_segment_itim_target_start = ADDR(.itim) );
+ PROVIDE( metal_segment_itim_target_end = ADDR(.itim) + SIZEOF(.itim) );
+
+ .data : ALIGN(8) {
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.* .sdata2.*)
+ *(.gnu.linkonce.s.*)
+ } >itim AT>flash :itim_init
+/* >ram AT>flash :ram_init */
+
+ PROVIDE( metal_segment_data_source_start = LOADADDR(.data) );
+ PROVIDE( metal_segment_data_target_start = ADDR(.data) );
+ PROVIDE( metal_segment_data_target_end = ADDR(.data) + SIZEOF(.data) );
+
+ .bss : ALIGN(8) {
+ *(.ibss .ibss.*)
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss .bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ } >itim AT>ram :itim
+/* >ram AT>ram :ram */
+
+ PROVIDE( metal_segment_bss_target_start = ADDR(.bss) );
+ PROVIDE( metal_segment_bss_target_end = ADDR(.bss) + SIZEOF(.bss) );
+
+ __heap_size = 0x4000 - __stack_size;
+ .heap : {
+ PROVIDE( metal_segment_heap_target_start = . );
+ . += __heap_size;
+ PROVIDE( metal_segment_heap_target_end = . );
+ PROVIDE( _heap_end = . );
+ } >ram AT>ram :ram
+
+ PROVIDE(__stack_size = __stack_size);
+
+ .stack : {
+ PROVIDE(metal_segment_stack_begin = .);
+ . += __stack_size;
+ PROVIDE(metal_segment_stack_end = .);
+ PROVIDE( _sp = . );
+ } >ram AT>ram :ram
+
+}
+