From c8ea882b3ef0f5bb476041edd50765801bfea9be Mon Sep 17 00:00:00 2001 From: Eyck Jentzsch Date: Sat, 29 Nov 2025 12:49:50 +0100 Subject: [PATCH] adds some hooks for SMT startup --- env/entry.S | 1 - env/riscv_vp/flash.lds | 175 ++------------------------------------- env/riscv_vp/rom.lds | 175 ++------------------------------------- env/riscv_vp/sections.ld | 24 +++--- env/start.S | 32 ++++++- 5 files changed, 51 insertions(+), 356 deletions(-) diff --git a/env/entry.S b/env/entry.S index 17e5321..27bb555 100644 --- a/env/entry.S +++ b/env/entry.S @@ -92,5 +92,4 @@ trap_entry: handle_trap: 1: j 1b - #endif diff --git a/env/riscv_vp/flash.lds b/env/riscv_vp/flash.lds index 9209015..ecf3e89 100644 --- a/env/riscv_vp/flash.lds +++ b/env/riscv_vp/flash.lds @@ -4,174 +4,9 @@ ENTRY( _start ) INCLUDE memory_map.ld -PHDRS -{ - flash PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; - dram PT_NULL; -} +REGION_ALIAS("REGION_TEXT", flash); +REGION_ALIAS("REGION_RODATA", flash); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init ORIGIN(flash) : - { - 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 = .); - - .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 - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >flash AT>flash :flash - - .ctors : - { - /* 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 - - .dummy : - { - *(.comment.*) - - } - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >flash AT>flash :flash - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>flash :ram_init - - .data : - { - __DATA_BEGIN__ = .; - *(.data .data.*) - *(.gnu.linkonce.d.*) - } >ram AT>flash :ram_init - - .sdata : - { - __SDATA_BEGIN__ = .; - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - } >ram AT>flash :ram_init - - .srodata : - { - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>flash :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - __BSS_END__ = .; - __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram - - - - PROVIDE( tohost = . ); - PROVIDE( fromhost = . + 8 ); -} +INCLUDE sections.ld \ No newline at end of file diff --git a/env/riscv_vp/rom.lds b/env/riscv_vp/rom.lds index b79f003..b730a16 100644 --- a/env/riscv_vp/rom.lds +++ b/env/riscv_vp/rom.lds @@ -4,174 +4,9 @@ ENTRY( _start ) INCLUDE memory_map.ld -PHDRS -{ - rom PT_LOAD; - ram_init PT_LOAD; - ram PT_NULL; - dram PT_NULL; -} +REGION_ALIAS("REGION_TEXT", rom); +REGION_ALIAS("REGION_RODATA", rom); +REGION_ALIAS("REGION_DATA", ram); +REGION_ALIAS("REGION_BSS", ram); -SECTIONS -{ - __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - - .init ORIGIN(rom) : - { - KEEP (*(SORT_NONE(.init))) - } >rom AT>rom :rom - - .text : - { - *(.text.unlikely .text.unlikely.*) - *(.text.startup .text.startup.*) - *(.text .text.*) - *(.gnu.linkonce.t.*) - } >rom AT>rom :rom - - .fini : - { - KEEP (*(SORT_NONE(.fini))) - } >rom AT>rom :rom - - PROVIDE (__etext = .); - PROVIDE (_etext = .); - PROVIDE (etext = .); - - .rodata : - { - *(.rdata) - *(.rodata .rodata.*) - *(.gnu.linkonce.r.*) - } >rom AT>rom :rom - - . = ALIGN(4); - - .preinit_array : - { - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP (*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - } >rom AT>rom :rom - - .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 = .); - } >rom AT>rom :rom - - .fini_array : - { - PROVIDE_HIDDEN (__fini_array_start = .); - KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) - KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) - PROVIDE_HIDDEN (__fini_array_end = .); - } >rom AT>rom :rom - - .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)) - } >rom AT>rom :rom - - .dtors : - { - KEEP (*crtbegin.o(.dtors)) - KEEP (*crtbegin?.o(.dtors)) - KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) - KEEP (*(SORT(.dtors.*))) - KEEP (*(.dtors)) - } >rom AT>rom :rom - - .dummy : - { - *(.comment.*) - - } - .lalign : - { - . = ALIGN(4); - PROVIDE( _data_lma = . ); - } >rom AT>rom :rom - - .dalign : - { - . = ALIGN(4); - PROVIDE( _data = . ); - } >ram AT>rom :ram_init - - .data : - { - __DATA_BEGIN__ = .; - *(.data .data.*) - *(.gnu.linkonce.d.*) - } >ram AT>rom :ram_init - - .sdata : - { - __SDATA_BEGIN__ = .; - *(.sdata .sdata.*) - *(.gnu.linkonce.s.*) - } >ram AT>rom :ram_init - - .srodata : - { - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >ram AT>rom :ram_init - - . = ALIGN(4); - PROVIDE( _edata = . ); - PROVIDE( edata = . ); - - PROVIDE( _fbss = . ); - PROVIDE( __bss_start = . ); - .bss : - { - *(.sbss*) - *(.gnu.linkonce.sb.*) - *(.bss .bss.*) - *(.gnu.linkonce.b.*) - *(COMMON) - . = ALIGN(4); - } >ram AT>ram :ram - - . = ALIGN(8); - __BSS_END__ = .; - __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800, MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); - PROVIDE( _end = . ); - PROVIDE( end = . ); - - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : - { - PROVIDE( _heap_end = . ); - . = __stack_size; - PROVIDE( _sp = . ); - } >ram AT>ram :ram - - - - PROVIDE( tohost = . ); - PROVIDE( fromhost = . + 8 ); -} +INCLUDE sections.ld \ No newline at end of file diff --git a/env/riscv_vp/sections.ld b/env/riscv_vp/sections.ld index 87b811d..3a4e184 100644 --- a/env/riscv_vp/sections.ld +++ b/env/riscv_vp/sections.ld @@ -9,7 +9,7 @@ PHDRS SECTIONS { __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; - + __stack_segment_size = DEFINED(__stack_segment_size) ? __stack_segment_size : __stack_size; .init ORIGIN(REGION_TEXT) : { KEEP (*(SORT_NONE(.init))) @@ -39,6 +39,15 @@ SECTIONS *(.gnu.linkonce.r.*) } >REGION_RODATA AT>REGION_RODATA :flash + .srodata : + { + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >REGION_RODATA AT>REGION_RODATA :flash + . = ALIGN(4); .preinit_array : @@ -126,15 +135,6 @@ SECTIONS *(.gnu.linkonce.s.*) } >REGION_DATA AT>REGION_RODATA :ram_init - .srodata : - { - *(.srodata.cst16) - *(.srodata.cst8) - *(.srodata.cst4) - *(.srodata.cst2) - *(.srodata .srodata.*) - } >REGION_DATA AT>REGION_RODATA :ram_init - . = ALIGN(4); PROVIDE( _edata = . ); PROVIDE( edata = . ); @@ -157,10 +157,10 @@ SECTIONS PROVIDE( _end = . ); PROVIDE( end = . ); - .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + .stack ORIGIN(ram) + LENGTH(ram) - __stack_segment_size : { PROVIDE( _heap_end = . ); - . = __stack_size; + . = __stack_segment_size; PROVIDE( _sp = . ); } >REGION_BSS AT>REGION_BSS :ram diff --git a/env/start.S b/env/start.S index 9582c85..3f83220 100644 --- a/env/start.S +++ b/env/start.S @@ -9,18 +9,35 @@ _start: .option push .option norelax .option norvc -//#ifdef WITH_SIGNATURE +#ifdef WITH_SIGNATURE j 1f .2byte 0x4e4d .2byte 0x5352 .4byte 0x669 1: -//#endif +#endif la gp, __global_pointer$ .option pop - la sp, _sp + csrr t0, mhartid // Get hart ID + la t1, __stack_size // stack size + la sp, _sp // Base stack address + /* this loop is to avoid multiplication which is not available on all ISAs */ +1: + beqz t0, 2f + sub sp, sp, t1 // Subtract __stack_size to get per-hart stack base + addi t0, t0, -1 + j 1b +2: la t0, trap_entry csrw mtvec, t0 +#ifdef HARTX_WAIT4WFI + /* block other cores until hart 0 has finished initialization */ + csrr t0, mhartid + beqz t0, hart0_init + wfi + j hartx_start +hart0_init: +#endif /* Load data section */ la a0, _data_lma la a1, _data @@ -50,6 +67,10 @@ _start: call atexit call __libc_init_array #endif + la a0, mtx + li t0, 1 + sw t0, 0(a0) +hartx_start: #ifndef __riscv_float_abi_soft /* Enable FPU */ li t0, MSTATUS_FS @@ -66,3 +87,8 @@ _start: li a1, 0 call main tail _exit + + +.data +mtx: + .word 0 # 32-bit value