diff options
| author | Bunnaroath Sou <35707615+bsousi5@users.noreply.github.com> | 2019-03-18 15:06:06 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-03-18 15:06:06 -0700 | 
| commit | 0f8c780d82b2ec3eda351229e79953bbde7bb95a (patch) | |
| tree | 9f9b0362f09e165cb767d3159fc9f52d6d22920c | |
| parent | 732f4902aadcd5bda62c8ea0858112a06580406d (diff) | |
| parent | 44c064f651cf4756f44fb96d542a8db2d4a33471 (diff) | |
Merge pull request #202 from sifive/arty-19.2
Add ramrodata, scratchpad linker files, and correct timebase value
95 files changed, 10076 insertions, 112 deletions
diff --git a/bsp/coreip-e20-arty/design.dts b/bsp/coreip-e20-arty/design.dts index b71170c..de47256 100644 --- a/bsp/coreip-e20-arty/design.dts +++ b/bsp/coreip-e20-arty/design.dts @@ -22,7 +22,7 @@  			reg = <0x0>;  			riscv,isa = "rv32imc";  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <32000000>;                          hardware-exec-breakpoint-count = <4>;  			L2: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-e20-arty/metal.lds b/bsp/coreip-e20-arty/metal.default.lds index 4c81b1b..46e2407 100644 --- a/bsp/coreip-e20-arty/metal.lds +++ b/bsp/coreip-e20-arty/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -137,6 +138,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e20-arty/metal.h b/bsp/coreip-e20-arty/metal.h index 27baf68..93154a8 100644 --- a/bsp/coreip-e20-arty/metal.h +++ b/bsp/coreip-e20-arty/metal.h @@ -150,7 +150,7 @@ struct __metal_driver_fixed_clock __metal_dt_clock_0 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 32000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e24-arty/metal.lds b/bsp/coreip-e20-arty/metal.ramrodata.lds index 4c81b1b..bb8171e 100644 --- a/bsp/coreip-e24-arty/metal.lds +++ b/bsp/coreip-e20-arty/metal.ramrodata.lds @@ -27,17 +27,10 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash -	.text 		: -	{ -		*(.text.unlikely .text.unlikely.*) -		*(.text.startup .text.startup.*) -		*(.text .text.*) -		*(.itim .itim.*) -		*(.gnu.linkonce.t.*) -	} >flash AT>flash :flash  	.fini 		: @@ -51,12 +44,6 @@ SECTIONS  	PROVIDE (etext = .); -	.rodata 		: -	{ -		*(.rdata) -		*(.rodata .rodata.*) -		*(.gnu.linkonce.r.*) -	} >flash AT>flash :flash  	. = ALIGN(4); @@ -137,11 +124,20 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash  	. = ALIGN(8);  	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash  	.lalign 		: @@ -161,11 +157,14 @@ SECTIONS  	.data 		:  	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*)  		*(.data .data.*)  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e20-arty/metal.scratchpad.lds b/bsp/coreip-e20-arty/metal.scratchpad.lds new file mode 100644 index 0000000..9b63e9b --- /dev/null +++ b/bsp/coreip-e20-arty/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-rtl/metal.lds b/bsp/coreip-e20-rtl/metal.default.lds index d98efc5..4900be7 100644 --- a/bsp/coreip-e24-rtl/metal.lds +++ b/bsp/coreip-e20-rtl/metal.default.lds @@ -26,6 +26,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -136,6 +137,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >ram AT>ram :ram_init @@ -164,7 +166,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e20-rtl/metal.h b/bsp/coreip-e20-rtl/metal.h index f2441c6..4e03f92 100644 --- a/bsp/coreip-e20-rtl/metal.h +++ b/bsp/coreip-e20-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E20__METAL_H -#define COREIP_E20__METAL_H +#ifndef COREIP_E20_RTL__METAL_H +#define COREIP_E20_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -205,5 +205,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E20__METAL_H*/ +#endif /* COREIP_E20_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e21-rtl/metal.lds b/bsp/coreip-e20-rtl/metal.ramrodata.lds index d98efc5..050f35f 100644 --- a/bsp/coreip-e21-rtl/metal.lds +++ b/bsp/coreip-e20-rtl/metal.ramrodata.lds @@ -26,17 +26,10 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram -	.text 		: -	{ -		*(.text.unlikely .text.unlikely.*) -		*(.text.startup .text.startup.*) -		*(.text .text.*) -		*(.itim .itim.*) -		*(.gnu.linkonce.t.*) -	} >ram AT>ram :ram  	.fini 		: @@ -50,12 +43,6 @@ SECTIONS  	PROVIDE (etext = .); -	.rodata 		: -	{ -		*(.rdata) -		*(.rodata .rodata.*) -		*(.gnu.linkonce.r.*) -	} >ram AT>ram :ram  	. = ALIGN(4); @@ -136,11 +123,20 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >ram AT>ram :ram_init  	. = ALIGN(8);  	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram  	.lalign 		: @@ -160,11 +156,14 @@ SECTIONS  	.data 		:  	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*)  		*(.data .data.*)  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e20-rtl/metal.lds b/bsp/coreip-e20-rtl/metal.scratchpad.lds index d98efc5..4900be7 100644 --- a/bsp/coreip-e20-rtl/metal.lds +++ b/bsp/coreip-e20-rtl/metal.scratchpad.lds @@ -26,6 +26,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -136,6 +137,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >ram AT>ram :ram_init @@ -164,7 +166,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e21-arty/design.dts b/bsp/coreip-e21-arty/design.dts index 32ef5e8..6ac4e18 100644 --- a/bsp/coreip-e21-arty/design.dts +++ b/bsp/coreip-e21-arty/design.dts @@ -22,7 +22,7 @@  			reg = <0x0>;  			riscv,isa = "rv32imac";  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <32000000>;                          hardware-exec-breakpoint-count = <4>;  			L3: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-e21-arty/metal.default.lds b/bsp/coreip-e21-arty/metal.default.lds new file mode 100644 index 0000000..dde63b9 --- /dev/null +++ b/bsp/coreip-e21-arty/metal.default.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >flash AT>flash :flash + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e21-arty/metal.h b/bsp/coreip-e21-arty/metal.h index 5a9459b..f469e41 100644 --- a/bsp/coreip-e21-arty/metal.h +++ b/bsp/coreip-e21-arty/metal.h @@ -150,7 +150,7 @@ struct __metal_driver_fixed_clock __metal_dt_clock_0 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 32000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e21-arty/metal.ramrodata.lds b/bsp/coreip-e21-arty/metal.ramrodata.lds new file mode 100644 index 0000000..b653bbb --- /dev/null +++ b/bsp/coreip-e21-arty/metal.ramrodata.lds @@ -0,0 +1,228 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e21-arty/metal.scratchpad.lds b/bsp/coreip-e21-arty/metal.scratchpad.lds new file mode 100644 index 0000000..7541b7b --- /dev/null +++ b/bsp/coreip-e21-arty/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e21-rtl/metal.default.lds b/bsp/coreip-e21-rtl/metal.default.lds new file mode 100644 index 0000000..a17a5f1 --- /dev/null +++ b/bsp/coreip-e21-rtl/metal.default.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >flash AT>flash :flash + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e21-rtl/metal.h b/bsp/coreip-e21-rtl/metal.h index b901bfb..8f1799b 100644 --- a/bsp/coreip-e21-rtl/metal.h +++ b/bsp/coreip-e21-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E21__METAL_H -#define COREIP_E21__METAL_H +#ifndef COREIP_E21_RTL__METAL_H +#define COREIP_E21_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -311,5 +311,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E21__METAL_H*/ +#endif /* COREIP_E21_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e21-rtl/metal.ramrodata.lds b/bsp/coreip-e21-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..cb1ac45 --- /dev/null +++ b/bsp/coreip-e21-rtl/metal.ramrodata.lds @@ -0,0 +1,228 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e21-rtl/metal.scratchpad.lds b/bsp/coreip-e21-rtl/metal.scratchpad.lds new file mode 100644 index 0000000..cb5d41c --- /dev/null +++ b/bsp/coreip-e21-rtl/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-arty/design.dts b/bsp/coreip-e24-arty/design.dts index b636a82..9d08297 100644 --- a/bsp/coreip-e24-arty/design.dts +++ b/bsp/coreip-e24-arty/design.dts @@ -22,7 +22,7 @@  			reg = <0x0>;  			riscv,isa = "rv32imafc";  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <32000000>;                          hardware-exec-breakpoint-count = <4>;  			L3: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-e24-arty/metal.default.lds b/bsp/coreip-e24-arty/metal.default.lds new file mode 100644 index 0000000..dde63b9 --- /dev/null +++ b/bsp/coreip-e24-arty/metal.default.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >flash AT>flash :flash + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-arty/metal.h b/bsp/coreip-e24-arty/metal.h index 129eeee..c9ccb86 100644 --- a/bsp/coreip-e24-arty/metal.h +++ b/bsp/coreip-e24-arty/metal.h @@ -150,7 +150,7 @@ struct __metal_driver_fixed_clock __metal_dt_clock_0 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 32000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e24-arty/metal.ramrodata.lds b/bsp/coreip-e24-arty/metal.ramrodata.lds new file mode 100644 index 0000000..b653bbb --- /dev/null +++ b/bsp/coreip-e24-arty/metal.ramrodata.lds @@ -0,0 +1,228 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-arty/metal.scratchpad.lds b/bsp/coreip-e24-arty/metal.scratchpad.lds new file mode 100644 index 0000000..7541b7b --- /dev/null +++ b/bsp/coreip-e24-arty/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-rtl/metal.default.lds b/bsp/coreip-e24-rtl/metal.default.lds new file mode 100644 index 0000000..a17a5f1 --- /dev/null +++ b/bsp/coreip-e24-rtl/metal.default.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >flash AT>flash :flash + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-rtl/metal.h b/bsp/coreip-e24-rtl/metal.h index 23ed8d2..40f92c8 100644 --- a/bsp/coreip-e24-rtl/metal.h +++ b/bsp/coreip-e24-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E24__METAL_H -#define COREIP_E24__METAL_H +#ifndef COREIP_E24_RTL__METAL_H +#define COREIP_E24_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -311,5 +311,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E24__METAL_H*/ +#endif /* COREIP_E24_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e24-rtl/metal.ramrodata.lds b/bsp/coreip-e24-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..cb1ac45 --- /dev/null +++ b/bsp/coreip-e24-rtl/metal.ramrodata.lds @@ -0,0 +1,228 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >itim AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e24-rtl/metal.scratchpad.lds b/bsp/coreip-e24-rtl/metal.scratchpad.lds new file mode 100644 index 0000000..cb5d41c --- /dev/null +++ b/bsp/coreip-e24-rtl/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x8000 +	itim (wx!rai) : ORIGIN = 0x80008000, LENGTH = 0x8000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31-arty/design.dts b/bsp/coreip-e31-arty/design.dts index 2500df0..e9dda78 100644 --- a/bsp/coreip-e31-arty/design.dts +++ b/bsp/coreip-e31-arty/design.dts @@ -28,7 +28,7 @@  			sifive,dtim = <&L6>;  			sifive,itim = <&L5>;  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-e34-arty/metal.lds b/bsp/coreip-e31-arty/metal.default.lds index ae57468..bb593e9 100644 --- a/bsp/coreip-e34-arty/metal.lds +++ b/bsp/coreip-e31-arty/metal.default.lds @@ -28,6 +28,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -36,6 +37,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >flash AT>flash :flash @@ -166,7 +168,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e31-arty/metal.dhrystone.lds b/bsp/coreip-e31-arty/metal.dhrystone.lds new file mode 100644 index 0000000..edf8749 --- /dev/null +++ b/bsp/coreip-e31-arty/metal.dhrystone.lds @@ -0,0 +1,221 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +                *(.rdata) +                *(.rodata .rodata.*) +                *(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31-arty/metal.lds b/bsp/coreip-e31-arty/metal.flash.lds index ae57468..ae57468 100644 --- a/bsp/coreip-e31-arty/metal.lds +++ b/bsp/coreip-e31-arty/metal.flash.lds diff --git a/bsp/coreip-e31-arty/metal.h b/bsp/coreip-e31-arty/metal.h index 9b087b9..41bcf11 100644 --- a/bsp/coreip-e31-arty/metal.h +++ b/bsp/coreip-e31-arty/metal.h @@ -169,7 +169,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e31-arty/metal.ramrodata.lds b/bsp/coreip-e31-arty/metal.ramrodata.lds new file mode 100644 index 0000000..ed516b5 --- /dev/null +++ b/bsp/coreip-e31-arty/metal.ramrodata.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31-arty/metal.scratchpad.lds b/bsp/coreip-e31-arty/metal.scratchpad.lds new file mode 100644 index 0000000..5dc9cc8 --- /dev/null +++ b/bsp/coreip-e31-arty/metal.scratchpad.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e34-rtl/metal.lds b/bsp/coreip-e31-rtl/metal.default.lds index 11c32e0..26744c6 100644 --- a/bsp/coreip-e34-rtl/metal.lds +++ b/bsp/coreip-e31-rtl/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -35,6 +36,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >ram AT>ram :ram @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e31-rtl/metal.h b/bsp/coreip-e31-rtl/metal.h index d6b0a52..7133c5e 100644 --- a/bsp/coreip-e31-rtl/metal.h +++ b/bsp/coreip-e31-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E31__METAL_H -#define COREIP_E31__METAL_H +#ifndef COREIP_E31_RTL__METAL_H +#define COREIP_E31_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -367,5 +367,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E31__METAL_H*/ +#endif /* COREIP_E31_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e31-rtl/metal.ramrodata.lds b/bsp/coreip-e31-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..1373c32 --- /dev/null +++ b/bsp/coreip-e31-rtl/metal.ramrodata.lds @@ -0,0 +1,223 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e31-rtl/metal.lds b/bsp/coreip-e31-rtl/metal.scratchpad.lds index 11c32e0..26744c6 100644 --- a/bsp/coreip-e31-rtl/metal.lds +++ b/bsp/coreip-e31-rtl/metal.scratchpad.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -35,6 +36,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >ram AT>ram :ram @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e34-arty/design.dts b/bsp/coreip-e34-arty/design.dts index 55f3d23..d0e640b 100644 --- a/bsp/coreip-e34-arty/design.dts +++ b/bsp/coreip-e34-arty/design.dts @@ -28,7 +28,7 @@  			sifive,dtim = <&L6>;  			sifive,itim = <&L5>;  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-s51-arty/metal.lds b/bsp/coreip-e34-arty/metal.default.lds index ae57468..bb593e9 100644 --- a/bsp/coreip-s51-arty/metal.lds +++ b/bsp/coreip-e34-arty/metal.default.lds @@ -28,6 +28,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -36,6 +37,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >flash AT>flash :flash @@ -166,7 +168,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e34-arty/metal.h b/bsp/coreip-e34-arty/metal.h index 6de1b7c..abf1c4d 100644 --- a/bsp/coreip-e34-arty/metal.h +++ b/bsp/coreip-e34-arty/metal.h @@ -169,7 +169,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e34-arty/metal.ramrodata.lds b/bsp/coreip-e34-arty/metal.ramrodata.lds new file mode 100644 index 0000000..ed516b5 --- /dev/null +++ b/bsp/coreip-e34-arty/metal.ramrodata.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e34-arty/metal.scratchpad.lds b/bsp/coreip-e34-arty/metal.scratchpad.lds new file mode 100644 index 0000000..5dc9cc8 --- /dev/null +++ b/bsp/coreip-e34-arty/metal.scratchpad.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e34-rtl/metal.default.lds b/bsp/coreip-e34-rtl/metal.default.lds new file mode 100644 index 0000000..26744c6 --- /dev/null +++ b/bsp/coreip-e34-rtl/metal.default.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e34-rtl/metal.h b/bsp/coreip-e34-rtl/metal.h index 197e59d..091b759 100644 --- a/bsp/coreip-e34-rtl/metal.h +++ b/bsp/coreip-e34-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E34__METAL_H -#define COREIP_E34__METAL_H +#ifndef COREIP_E34_RTL__METAL_H +#define COREIP_E34_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -367,5 +367,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E34__METAL_H*/ +#endif /* COREIP_E34_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e34-rtl/metal.ramrodata.lds b/bsp/coreip-e34-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..1373c32 --- /dev/null +++ b/bsp/coreip-e34-rtl/metal.ramrodata.lds @@ -0,0 +1,223 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e34-rtl/metal.scratchpad.lds b/bsp/coreip-e34-rtl/metal.scratchpad.lds new file mode 100644 index 0000000..26744c6 --- /dev/null +++ b/bsp/coreip-e34-rtl/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x8000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e76-arty/design.dts b/bsp/coreip-e76-arty/design.dts index bf72b33..55edc8b 100644 --- a/bsp/coreip-e76-arty/design.dts +++ b/bsp/coreip-e76-arty/design.dts @@ -29,7 +29,7 @@  			reg = <0x0>;  			riscv,isa = "rv32imafc";  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-s76-arty/metal.lds b/bsp/coreip-e76-arty/metal.default.lds index 3875c94..c4cae6b 100644 --- a/bsp/coreip-s76-arty/metal.lds +++ b/bsp/coreip-e76-arty/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -137,6 +138,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e76-arty/metal.h b/bsp/coreip-e76-arty/metal.h index b35bce6..2c052e0 100644 --- a/bsp/coreip-e76-arty/metal.h +++ b/bsp/coreip-e76-arty/metal.h @@ -165,7 +165,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-e21-arty/metal.lds b/bsp/coreip-e76-arty/metal.ramrodata.lds index 4c81b1b..cb59d74 100644 --- a/bsp/coreip-e21-arty/metal.lds +++ b/bsp/coreip-e76-arty/metal.ramrodata.lds @@ -4,7 +4,7 @@ ENTRY(_enter)  MEMORY  { -	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000000  	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000  } @@ -27,17 +27,10 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash -	.text 		: -	{ -		*(.text.unlikely .text.unlikely.*) -		*(.text.startup .text.startup.*) -		*(.text .text.*) -		*(.itim .itim.*) -		*(.gnu.linkonce.t.*) -	} >flash AT>flash :flash  	.fini 		: @@ -51,12 +44,6 @@ SECTIONS  	PROVIDE (etext = .); -	.rodata 		: -	{ -		*(.rdata) -		*(.rodata .rodata.*) -		*(.gnu.linkonce.r.*) -	} >flash AT>flash :flash  	. = ALIGN(4); @@ -137,11 +124,20 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash  	. = ALIGN(8);  	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash  	.lalign 		: @@ -161,11 +157,14 @@ SECTIONS  	.data 		:  	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*)  		*(.data .data.*)  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e76-arty/metal.scratchpad.lds b/bsp/coreip-e76-arty/metal.scratchpad.lds new file mode 100644 index 0000000..f75dc04 --- /dev/null +++ b/bsp/coreip-e76-arty/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-rtl/metal.lds b/bsp/coreip-e76-rtl/metal.default.lds index 34f97e6..ea5918b 100644 --- a/bsp/coreip-s76-rtl/metal.lds +++ b/bsp/coreip-e76-rtl/metal.default.lds @@ -26,6 +26,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -136,6 +137,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >ram AT>ram :ram_init @@ -164,7 +166,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-e76-rtl/metal.h b/bsp/coreip-e76-rtl/metal.h index 99ffef7..6002785 100644 --- a/bsp/coreip-e76-rtl/metal.h +++ b/bsp/coreip-e76-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_E76__METAL_H -#define COREIP_E76__METAL_H +#ifndef COREIP_E76_RTL__METAL_H +#define COREIP_E76_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -318,5 +318,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_E76__METAL_H*/ +#endif /* COREIP_E76_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-e76-rtl/metal.ramrodata.lds b/bsp/coreip-e76-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..201621e --- /dev/null +++ b/bsp/coreip-e76-rtl/metal.ramrodata.lds @@ -0,0 +1,222 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x20000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-e76-rtl/metal.lds b/bsp/coreip-e76-rtl/metal.scratchpad.lds index 34f97e6..ea5918b 100644 --- a/bsp/coreip-e76-rtl/metal.lds +++ b/bsp/coreip-e76-rtl/metal.scratchpad.lds @@ -26,6 +26,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -136,6 +137,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >ram AT>ram :ram_init @@ -164,7 +166,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-s51-arty/design.dts b/bsp/coreip-s51-arty/design.dts index 137e7d8..7d8e0d2 100644 --- a/bsp/coreip-s51-arty/design.dts +++ b/bsp/coreip-s51-arty/design.dts @@ -28,7 +28,7 @@  			sifive,dtim = <&L6>;  			sifive,itim = <&L5>;  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-s54-arty/metal.lds b/bsp/coreip-s51-arty/metal.default.lds index ae57468..bb593e9 100644 --- a/bsp/coreip-s54-arty/metal.lds +++ b/bsp/coreip-s51-arty/metal.default.lds @@ -28,6 +28,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -36,6 +37,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >flash AT>flash :flash @@ -166,7 +168,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-s51-arty/metal.h b/bsp/coreip-s51-arty/metal.h index 304f5b0..ca81d85 100644 --- a/bsp/coreip-s51-arty/metal.h +++ b/bsp/coreip-s51-arty/metal.h @@ -169,7 +169,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-s51-arty/metal.ramrodata.lds b/bsp/coreip-s51-arty/metal.ramrodata.lds new file mode 100644 index 0000000..ed516b5 --- /dev/null +++ b/bsp/coreip-s51-arty/metal.ramrodata.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s51-arty/metal.scratchpad.lds b/bsp/coreip-s51-arty/metal.scratchpad.lds new file mode 100644 index 0000000..5dc9cc8 --- /dev/null +++ b/bsp/coreip-s51-arty/metal.scratchpad.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s51-rtl/metal.lds b/bsp/coreip-s51-rtl/metal.default.lds index d5d77a3..bc7b16a 100644 --- a/bsp/coreip-s51-rtl/metal.lds +++ b/bsp/coreip-s51-rtl/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -35,6 +36,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >ram AT>ram :ram @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-s51-rtl/metal.h b/bsp/coreip-s51-rtl/metal.h index fb8ae89..6618a7c 100644 --- a/bsp/coreip-s51-rtl/metal.h +++ b/bsp/coreip-s51-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_S51__METAL_H -#define COREIP_S51__METAL_H +#ifndef COREIP_S51_RTL__METAL_H +#define COREIP_S51_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -367,5 +367,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_S51__METAL_H*/ +#endif /* COREIP_S51_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-s51-rtl/metal.ramrodata.lds b/bsp/coreip-s51-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..5afbc7b --- /dev/null +++ b/bsp/coreip-s51-rtl/metal.ramrodata.lds @@ -0,0 +1,223 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x4000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-rtl/metal.lds b/bsp/coreip-s51-rtl/metal.scratchpad.lds index d5d77a3..bc7b16a 100644 --- a/bsp/coreip-s54-rtl/metal.lds +++ b/bsp/coreip-s51-rtl/metal.scratchpad.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >ram AT>ram :ram @@ -35,6 +36,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >ram AT>ram :ram @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-s54-arty/design.dts b/bsp/coreip-s54-arty/design.dts index 7738c2a..ae42f18 100644 --- a/bsp/coreip-s54-arty/design.dts +++ b/bsp/coreip-s54-arty/design.dts @@ -28,7 +28,7 @@  			sifive,dtim = <&L6>;  			sifive,itim = <&L5>;  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-s54-arty/metal.default.lds b/bsp/coreip-s54-arty/metal.default.lds new file mode 100644 index 0000000..bb593e9 --- /dev/null +++ b/bsp/coreip-s54-arty/metal.default.lds @@ -0,0 +1,228 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >flash AT>flash :flash + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >flash AT>flash :flash + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-arty/metal.h b/bsp/coreip-s54-arty/metal.h index 98b535b..a757691 100644 --- a/bsp/coreip-s54-arty/metal.h +++ b/bsp/coreip-s54-arty/metal.h @@ -169,7 +169,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-s54-arty/metal.ramrodata.lds b/bsp/coreip-s54-arty/metal.ramrodata.lds new file mode 100644 index 0000000..ed516b5 --- /dev/null +++ b/bsp/coreip-s54-arty/metal.ramrodata.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-arty/metal.scratchpad.lds b/bsp/coreip-s54-arty/metal.scratchpad.lds new file mode 100644 index 0000000..5dc9cc8 --- /dev/null +++ b/bsp/coreip-s54-arty/metal.scratchpad.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-rtl/metal.default.lds b/bsp/coreip-s54-rtl/metal.default.lds new file mode 100644 index 0000000..bc7b16a --- /dev/null +++ b/bsp/coreip-s54-rtl/metal.default.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x4000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-rtl/metal.h b/bsp/coreip-s54-rtl/metal.h index ece862b..e094a58 100644 --- a/bsp/coreip-s54-rtl/metal.h +++ b/bsp/coreip-s54-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_S54__METAL_H -#define COREIP_S54__METAL_H +#ifndef COREIP_S54_RTL__METAL_H +#define COREIP_S54_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -367,5 +367,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_S54__METAL_H*/ +#endif /* COREIP_S54_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-s54-rtl/metal.ramrodata.lds b/bsp/coreip-s54-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..5afbc7b --- /dev/null +++ b/bsp/coreip-s54-rtl/metal.ramrodata.lds @@ -0,0 +1,223 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x4000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s54-rtl/metal.scratchpad.lds b/bsp/coreip-s54-rtl/metal.scratchpad.lds new file mode 100644 index 0000000..bc7b16a --- /dev/null +++ b/bsp/coreip-s54-rtl/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 0x4000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-arty/design.dts b/bsp/coreip-s76-arty/design.dts index f43d9c5..736d909 100644 --- a/bsp/coreip-s76-arty/design.dts +++ b/bsp/coreip-s76-arty/design.dts @@ -29,7 +29,7 @@  			reg = <0x0>;  			riscv,isa = "rv64imafdc";  			status = "okay"; -			timebase-frequency = <1000000>; +			timebase-frequency = <65000000>;                          hardware-exec-breakpoint-count = <4>;  			L4: interrupt-controller {  				#interrupt-cells = <1>; diff --git a/bsp/coreip-e76-arty/metal.lds b/bsp/coreip-s76-arty/metal.default.lds index 3875c94..c4cae6b 100644 --- a/bsp/coreip-e76-arty/metal.lds +++ b/bsp/coreip-s76-arty/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -137,6 +138,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/coreip-s76-arty/metal.h b/bsp/coreip-s76-arty/metal.h index eacfb1e..feb1b39 100644 --- a/bsp/coreip-s76-arty/metal.h +++ b/bsp/coreip-s76-arty/metal.h @@ -165,7 +165,7 @@ struct __metal_driver_riscv_clint0 __metal_dt_clint_2000000 = {  struct __metal_driver_cpu __metal_dt_cpu_0 = {      .vtable = &__metal_driver_vtable_cpu,      .cpu.vtable = &__metal_driver_vtable_cpu.cpu_vtable, -    .timebase = 1000000UL, +    .timebase = 65000000UL,      .interrupt_controller = &__metal_dt_interrupt_controller.controller,  }; diff --git a/bsp/coreip-s76-arty/metal.ramrodata.lds b/bsp/coreip-s76-arty/metal.ramrodata.lds new file mode 100644 index 0000000..cb59d74 --- /dev/null +++ b/bsp/coreip-s76-arty/metal.ramrodata.lds @@ -0,0 +1,224 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>flash :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-arty/metal.scratchpad.lds b/bsp/coreip-s76-arty/metal.scratchpad.lds new file mode 100644 index 0000000..f75dc04 --- /dev/null +++ b/bsp/coreip-s76-arty/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x10000000 +	flash (rxai!w) : ORIGIN = 0x40400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-rtl/metal.default.lds b/bsp/coreip-s76-rtl/metal.default.lds new file mode 100644 index 0000000..ea5918b --- /dev/null +++ b/bsp/coreip-s76-rtl/metal.default.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x20000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-rtl/metal.h b/bsp/coreip-s76-rtl/metal.h index 9a0623e..8295322 100644 --- a/bsp/coreip-s76-rtl/metal.h +++ b/bsp/coreip-s76-rtl/metal.h @@ -1,7 +1,7 @@  #ifndef ASSEMBLY -#ifndef COREIP_S76__METAL_H -#define COREIP_S76__METAL_H +#ifndef COREIP_S76_RTL__METAL_H +#define COREIP_S76_RTL__METAL_H  #ifdef __METAL_MACHINE_MACROS @@ -318,5 +318,5 @@ struct __metal_driver_sifive_spi0 *__metal_spi_table[] = {  #endif /* ! __METAL_MACHINE_MACROS */ -#endif /* COREIP_S76__METAL_H*/ +#endif /* COREIP_S76_RTL__METAL_H*/  #endif /* ! ASSEMBLY */ diff --git a/bsp/coreip-s76-rtl/metal.ramrodata.lds b/bsp/coreip-s76-rtl/metal.ramrodata.lds new file mode 100644 index 0000000..201621e --- /dev/null +++ b/bsp/coreip-s76-rtl/metal.ramrodata.lds @@ -0,0 +1,222 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x20000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >ram AT>ram :ram + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/coreip-s76-rtl/metal.scratchpad.lds b/bsp/coreip-s76-rtl/metal.scratchpad.lds new file mode 100644 index 0000000..ea5918b --- /dev/null +++ b/bsp/coreip-s76-rtl/metal.scratchpad.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x20000000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/freedom-e310-arty/metal.lds b/bsp/freedom-e310-arty/metal.default.lds index 1a1801b..04d9218 100644 --- a/bsp/freedom-e310-arty/metal.lds +++ b/bsp/freedom-e310-arty/metal.default.lds @@ -28,6 +28,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -36,6 +37,7 @@ SECTIONS  		*(.text.unlikely .text.unlikely.*)  		*(.text.startup .text.startup.*)  		*(.text .text.*) +		*(.itim .itim.*)  		*(.gnu.linkonce.t.*)  	} >flash AT>flash :flash @@ -166,7 +168,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/freedom-e310-arty/metal.ramrodata.lds b/bsp/freedom-e310-arty/metal.ramrodata.lds new file mode 100644 index 0000000..2898a03 --- /dev/null +++ b/bsp/freedom-e310-arty/metal.ramrodata.lds @@ -0,0 +1,225 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>flash :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>flash :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/freedom-e310-arty/metal.scratchpad.lds b/bsp/freedom-e310-arty/metal.scratchpad.lds new file mode 100644 index 0000000..98161de --- /dev/null +++ b/bsp/freedom-e310-arty/metal.scratchpad.lds @@ -0,0 +1,227 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	itim (wx!rai) : ORIGIN = 0x8000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >itim AT>ram :itim_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >itim AT>ram :itim_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/sifive-hifive1-revb/metal.lds b/bsp/sifive-hifive1-revb/metal.default.lds index f7050c4..878e09e 100644 --- a/bsp/sifive-hifive1-revb/metal.lds +++ b/bsp/sifive-hifive1-revb/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -137,6 +138,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/sifive-hifive1-revb/metal.ramrodata.lds b/bsp/sifive-hifive1-revb/metal.ramrodata.lds new file mode 100644 index 0000000..5f7b6d3 --- /dev/null +++ b/bsp/sifive-hifive1-revb/metal.ramrodata.lds @@ -0,0 +1,224 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20010000, LENGTH = 0x6a120 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>flash :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/sifive-hifive1-revb/metal.scratchpad.lds b/bsp/sifive-hifive1-revb/metal.scratchpad.lds new file mode 100644 index 0000000..416f203 --- /dev/null +++ b/bsp/sifive-hifive1-revb/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20010000, LENGTH = 0x6a120 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/sifive-hifive1/metal.lds b/bsp/sifive-hifive1/metal.default.lds index 32455d8..a656a41 100644 --- a/bsp/sifive-hifive1/metal.lds +++ b/bsp/sifive-hifive1/metal.default.lds @@ -27,6 +27,7 @@ SECTIONS  	{  		KEEP (*(.text.metal.init.enter))  		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start))  	} >flash AT>flash :flash @@ -137,6 +138,7 @@ SECTIONS  	.itim 		:  	{ +		*(.itim .itim.*)  	} >flash AT>flash :flash @@ -165,7 +167,7 @@ SECTIONS  		*(.gnu.linkonce.d.*)  		. = ALIGN(8);  		PROVIDE( __global_pointer$ = . + 0x800 ); -		*(.sdata .sdata.*) +		*(.sdata .sdata.* .sdata2.*)  		*(.gnu.linkonce.s.*)  		. = ALIGN(8);  		*(.srodata.cst16) diff --git a/bsp/sifive-hifive1/metal.ramrodata.lds b/bsp/sifive-hifive1/metal.ramrodata.lds new file mode 100644 index 0000000..58987fc --- /dev/null +++ b/bsp/sifive-hifive1/metal.ramrodata.lds @@ -0,0 +1,224 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_NULL; +	itim PT_NULL; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >flash AT>flash :flash + + + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >flash AT>flash :flash + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + + + +	. = ALIGN(4); + + +	.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 + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >flash AT>flash :flash + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		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 + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >flash AT>flash :flash + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>flash :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.gnu.linkonce.t.*) +		*(.itim .itim.*) +	} >flash AT>flash :flash + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >flash AT>flash :flash + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>flash :ram_init + + +	.data 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>flash :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		. = __heap_size == 0 ? 0 : ORIGIN(ram) + LENGTH(ram); +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/sifive-hifive1/metal.scratchpad.lds b/bsp/sifive-hifive1/metal.scratchpad.lds new file mode 100644 index 0000000..d10076f --- /dev/null +++ b/bsp/sifive-hifive1/metal.scratchpad.lds @@ -0,0 +1,226 @@ +OUTPUT_ARCH("riscv") + +ENTRY(_enter) + +MEMORY +{ +	ram (wxa!ri) : ORIGIN = 0x80000000, LENGTH = 0x4000 +	flash (rxai!w) : ORIGIN = 0x20400000, LENGTH = 0x1fc00000 +} + +PHDRS +{ +	flash PT_LOAD; +	ram_init PT_LOAD; +	itim_init PT_LOAD; +	ram PT_LOAD; +	itim PT_LOAD; +} + +SECTIONS +{ +	__stack_size = DEFINED(__stack_size) ? __stack_size : 0x400; +	__heap_size = DEFINED(__heap_size) ? __heap_size : 0x400; + + +	.init 		: +	{ +		KEEP (*(.text.metal.init.enter)) +		KEEP (*(SORT_NONE(.init))) +		KEEP (*(.text.libgloss.start)) +	} >ram AT>ram :ram + + +	.text 		: +	{ +		*(.text.unlikely .text.unlikely.*) +		*(.text.startup .text.startup.*) +		*(.text .text.*) +		*(.itim .itim.*) +		*(.gnu.linkonce.t.*) +	} >ram AT>ram :ram + + +	.fini 		: +	{ +		KEEP (*(SORT_NONE(.fini))) +	} >ram AT>ram :ram + + +	PROVIDE (__etext = .); +	PROVIDE (_etext = .); +	PROVIDE (etext = .); + + +	.rodata 		: +	{ +		*(.rdata) +		*(.rodata .rodata.*) +		*(.gnu.linkonce.r.*) +	} >ram AT>ram :ram + + +	. = ALIGN(4); + + +	.preinit_array 		: +	{ +		PROVIDE_HIDDEN (__preinit_array_start = .); +		KEEP (*(.preinit_array)) +		PROVIDE_HIDDEN (__preinit_array_end = .); +	} >ram AT>ram :ram + + +	.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 = .); +	} >ram AT>ram :ram + + +	.finit_array 		: +	{ +		PROVIDE_HIDDEN (__finit_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 (__finit_array_end = .); +	} >ram AT>ram :ram + + +	.ctors 		: +	{ +		/* gcc uses crtbegin.o to find the start of +		   the constructors, so we make sure it is +		   first.  Because this is a wildcard, it +		   doesn't matter if the user does not +		   actually link against crtbegin.o; the +		   linker won't look for a file to match a +		   wildcard.  The wildcard also means that it +		   doesn't matter which directory crtbegin.o +		   is in.  */ +		KEEP (*crtbegin.o(.ctors)) +		KEEP (*crtbegin?.o(.ctors)) +		/* We don't want to include the .ctor section from +		   the crtend.o file until after the sorted ctors. +		   The .ctor section from the crtend file contains the +		   end of ctors marker and it must be last */ +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) +		KEEP (*(SORT(.ctors.*))) +		KEEP (*(.ctors)) +	} >ram AT>ram :ram + + +	.dtors 		: +	{ +		KEEP (*crtbegin.o(.dtors)) +		KEEP (*crtbegin?.o(.dtors)) +		KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) +		KEEP (*(SORT(.dtors.*))) +		KEEP (*(.dtors)) +	} >ram AT>ram :ram + + +	.litimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_source_start = . ); +	} >ram AT>ram :ram + + +	.ditimalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_itim_target_start = . ); +	} >ram AT>ram :ram_init + + +	.itim 		: +	{ +		*(.itim .itim.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(8); +	PROVIDE( metal_segment_itim_target_end = . ); + + +	.lalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( _data_lma = . ); +		PROVIDE( metal_segment_data_source_start = . ); +	} >ram AT>ram :ram + + +	.dalign 		: +	{ +		. = ALIGN(4); +		PROVIDE( metal_segment_data_target_start = . ); +	} >ram AT>ram :ram_init + + +	.data 		: +	{ +		*(.data .data.*) +		*(.gnu.linkonce.d.*) +		. = ALIGN(8); +		PROVIDE( __global_pointer$ = . + 0x800 ); +		*(.sdata .sdata.* .sdata2.*) +		*(.gnu.linkonce.s.*) +		. = ALIGN(8); +		*(.srodata.cst16) +		*(.srodata.cst8) +		*(.srodata.cst4) +		*(.srodata.cst2) +		*(.srodata .srodata.*) +	} >ram AT>ram :ram_init + + +	. = ALIGN(4); +	PROVIDE( _edata = . ); +	PROVIDE( edata = . ); +	PROVIDE( metal_segment_data_target_end = . ); +	PROVIDE( _fbss = . ); +	PROVIDE( __bss_start = . ); +	PROVIDE( metal_segment_bss_target_start = . ); + + +	.bss 		: +	{ +		*(.sbss*) +		*(.gnu.linkonce.sb.*) +		*(.bss .bss.*) +		*(.gnu.linkonce.b.*) +		*(COMMON) +		. = ALIGN(4); +	} >ram AT>ram :ram + + +	. = ALIGN(8); +	PROVIDE( _end = . ); +	PROVIDE( end = . ); +	PROVIDE( metal_segment_bss_target_end = . ); + + +	.stack : +	{ +		PROVIDE(metal_segment_stack_begin = .); +		. = __stack_size; +		PROVIDE( _sp = . ); +		PROVIDE(metal_segment_stack_end = .); +	} >ram AT>ram :ram + + +	.heap : +	{ +		PROVIDE( metal_segment_heap_target_start = . ); +		. = __heap_size; +		PROVIDE( metal_segment_heap_target_end = . ); +		PROVIDE( _heap_end = . ); +	} >ram AT>ram :ram + + +} + diff --git a/bsp/update-targets.sh b/bsp/update-targets.sh index 8657883..c4c90cb 100755 --- a/bsp/update-targets.sh +++ b/bsp/update-targets.sh @@ -61,7 +61,9 @@ LDSCRIPT_GENERATOR=freedom-ldscript-generator  DTS_FILENAME=design.dts  DTB_FILENAME=temp.dtb  HEADER_FILENAME=metal.h -LDSCRIPT_FILENAME=metal.lds +LDS_DEFAULT_FILENAME=metal.default.lds +LDS_RAMRODATA_FILENAME=metal.ramrodata.lds +LDS_SCRATCHPAD_FILENAME=metal.scratchpad.lds  update_target() {      TARGET=$1 @@ -73,7 +75,9 @@ update_target() {      # Produce parameterized files      $MEE_HEADER_GENERATOR -d $TARGET/$DTB_FILENAME -o $TARGET/$HEADER_FILENAME || die "Failed to produce $TARGET/$HEADER_FILENAME" -    $LDSCRIPT_GENERATOR -d $TARGET/$DTB_FILENAME -l $TARGET/$LDSCRIPT_FILENAME || die "Failed to produce $TARGET/$LDSCRIPT_FILENAME" +    $LDSCRIPT_GENERATOR -d $TARGET/$DTB_FILENAME -l $TARGET/$LDS_DEFAULT_FILENAME || die "Failed to produce $TARGET/$LDS_DEFAULT_FILENAME" +    $LDSCRIPT_GENERATOR -d $TARGET/$DTB_FILENAME -l $TARGET/$LDS_RAMRODATA_FILENAME --ramrodata || die "Failed to produce $TARGET/$LDS_RAMRODATA_FILENAME" +    $LDSCRIPT_GENERATOR -d $TARGET/$DTB_FILENAME -l $TARGET/$LDS_SCRATCHPAD_FILENAME --scratchpad || die "Failed to produce $TARGET/$LDS_SCRATCHPAD_FILENAME"      # Remove temporary .dtb      rm $TARGET/$DTB_FILENAME diff --git a/scripts/libmetal.mk b/scripts/libmetal.mk index b50c599..c45972a 100644 --- a/scripts/libmetal.mk +++ b/scripts/libmetal.mk @@ -3,7 +3,7 @@  # Compiles an instance of Metal targeted at $(TARGET)  #############################################################  METAL_SOURCE_PATH ?= freedom-metal -METAL_LDSCRIPT	   = $(BSP_DIR)/metal.lds +METAL_LDSCRIPT	   = $(BSP_DIR)/metal.$(LINK_TARGET).lds  METAL_HEADER	   = $(BSP_DIR)/metal.h  METAL_PREFIX       = $(abspath $(BSP_DIR)/install) diff --git a/scripts/standalone.mk b/scripts/standalone.mk index fd7486b..06063b9 100644 --- a/scripts/standalone.mk +++ b/scripts/standalone.mk @@ -37,6 +37,10 @@ ifeq ($(RISCV_CMODEL),)  RISCV_CMODEL = medany  endif +ifeq ($(LINK_TARGET),) +LINK_TARGET = default +endif +  # Determines the XLEN from the toolchain tuple  ifeq ($(patsubst rv32%,rv32,$(RISCV_ARCH)),rv32)  RISCV_XLEN := 32 @@ -131,7 +135,7 @@ $(PROGRAM_ELF): \  		$(PROGRAM_SRCS) \  		$(BSP_DIR)/install/lib/$(CONFIGURATION)/libmetal.a \  		$(BSP_DIR)/install/lib/$(CONFIGURATION)/libmetal-gloss.a \ -		$(BSP_DIR)/metal.lds +		$(BSP_DIR)/metal.$(LINK_TARGET).lds  	mkdir -p $(dir $@)  	$(MAKE) -C $(SRC_DIR) $(basename $(notdir $@)) \  		AR=$(RISCV_AR) \  | 
