diff --git a/bl1/bl1_1/CMakeLists.txt b/bl1/bl1_1/CMakeLists.txt index ab14336312..08ebc942f0 100644 --- a/bl1/bl1_1/CMakeLists.txt +++ b/bl1/bl1_1/CMakeLists.txt @@ -40,6 +40,7 @@ target_link_options(bl1_1 target_sources(bl1_1 PRIVATE main.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/bl1/bl1_2/CMakeLists.txt b/bl1/bl1_2/CMakeLists.txt index 23fe370804..2d19e70d9d 100644 --- a/bl1/bl1_2/CMakeLists.txt +++ b/bl1/bl1_2/CMakeLists.txt @@ -42,6 +42,7 @@ target_link_options(bl1_2 target_sources(bl1_2 PRIVATE main.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/bl2/CMakeLists.txt b/bl2/CMakeLists.txt index b462dfee18..21dfa2e3b3 100644 --- a/bl2/CMakeLists.txt +++ b/bl2/CMakeLists.txt @@ -141,6 +141,7 @@ add_executable(bl2 $<$:src/default_flash_map.c> $<$:src/shared_data.c> $<$:src/provisioning.c> + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/cmake/install.cmake b/cmake/install.cmake index dc60e2bc26..c5faabeb9d 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -254,6 +254,11 @@ install(DIRECTORY $ $ DESTINATION ${INSTALL_PLATFORM_NS_DIR}/ext/cmsis) +if(CONFIG_PICOLIBC) + install(FILES ${PLATFORM_DIR}/ext/common/picolibc.c + DESTINATION ${INSTALL_PLATFORM_NS_DIR}/ext/common) +endif() + if(PLATFORM_DEFAULT_UART_STDOUT) install(FILES ${PLATFORM_DIR}/ext/common/uart_stdout.c ${PLATFORM_DIR}/ext/common/uart_stdout.h diff --git a/cmake/spe-CMakeLists.cmake b/cmake/spe-CMakeLists.cmake index c342f4a3de..23dcd6d4a6 100644 --- a/cmake/spe-CMakeLists.cmake +++ b/cmake/spe-CMakeLists.cmake @@ -104,6 +104,7 @@ add_subdirectory(platform) target_sources(platform_ns PRIVATE + $<$:${CMAKE_CURRENT_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_CURRENT_SOURCE_DIR}/platform/ext/common/uart_stdout.c> ) diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index 15367499f8..2ea8ed6bf0 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -81,6 +81,7 @@ target_sources(platform_s $<$:ext/common/provisioning.c> $<$,$>:${CMAKE_SOURCE_DIR}/platform/ext/common/test_interrupt.c> $<$:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -203,6 +204,7 @@ if(BL2) $<$,$>:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> $<$:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -304,6 +306,7 @@ if(BL1 AND PLATFORM_DEFAULT_BL1) $<$:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> $<$,$>:ext/common/tfm_sanitize_handlers.c> + $<$:ext/common/picolibc.c> ./ext/common/tfm_fatal_error.c ) @@ -359,6 +362,7 @@ if(BL1 AND PLATFORM_DEFAULT_BL1) $<$:ext/common/template/nv_counters.c> $<$,$>:ext/common/template/flash_otp_nv_counters_backend.c> $<$:ext/common/template/otp_flash.c> + $<$:ext/common/picolibc.c> ) target_link_libraries(platform_bl1_2 diff --git a/platform/ext/common/gcc/tfm_common_bl2.ld b/platform/ext/common/gcc/tfm_common_bl2.ld index aa09da982d..8f095fa99f 100644 --- a/platform/ext/common/gcc/tfm_common_bl2.ld +++ b/platform/ext/common/gcc/tfm_common_bl2.ld @@ -60,6 +60,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -69,6 +70,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -212,8 +214,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/common/gcc/tfm_common_ns.ld b/platform/ext/common/gcc/tfm_common_ns.ld index dd303d9dca..41dbce9d77 100644 --- a/platform/ext/common/gcc/tfm_common_ns.ld +++ b/platform/ext/common/gcc/tfm_common_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -158,8 +160,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/common/gcc/tfm_common_s.ld.template b/platform/ext/common/gcc/tfm_common_s.ld.template index eee6de4286..2c47b04076 100644 --- a/platform/ext/common/gcc/tfm_common_s.ld.template +++ b/platform/ext/common/gcc/tfm_common_s.ld.template @@ -200,6 +200,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); @@ -225,6 +228,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -234,6 +238,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -273,6 +278,9 @@ SECTIONS /* .zero.table */ . = ALIGN(4); __zero_table_start__ = .; + LONG (ADDR(.TFM_BSS)) + LONG (SIZEOF(.TFM_BSS) / 4) + LONG (ADDR(.TFM_PSA_ROT_LINKER_BSS)) LONG (SIZEOF(.TFM_PSA_ROT_LINKER_BSS) / 4) /* Aligment checked after the section */ @@ -406,8 +414,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif diff --git a/platform/ext/common/gcc/tfm_isolation_s.ld.template b/platform/ext/common/gcc/tfm_isolation_s.ld.template index 95c054f6a2..adda9b4b7c 100644 --- a/platform/ext/common/gcc/tfm_isolation_s.ld.template +++ b/platform/ext/common/gcc/tfm_isolation_s.ld.template @@ -218,6 +218,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -227,6 +228,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -264,6 +266,9 @@ SECTIONS /* .zero.table */ . = ALIGN(4); __zero_table_start__ = .; + LONG (ADDR(.TFM_BSS)) + LONG (SIZEOF(.TFM_BSS) / 4) + {% for partition in partitions %} LONG (ADDR(.ER_{{partition.manifest.name}}_BSS)) LONG (SIZEOF(.ER_{{partition.manifest.name}}_BSS) / 4) /* Aligment checked after the section */ @@ -350,6 +355,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); @@ -510,8 +518,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif diff --git a/platform/ext/common/llvm/tfm_common_ns.ldc b/platform/ext/common/llvm/tfm_common_ns.ldc index 4ba14fb8d8..d73fbce8ee 100644 --- a/platform/ext/common/llvm/tfm_common_ns.ldc +++ b/platform/ext/common/llvm/tfm_common_ns.ldc @@ -42,6 +42,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -51,6 +52,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/common/llvm/tfm_isolation_s.ld.template b/platform/ext/common/llvm/tfm_isolation_s.ld.template index 0b7e8d7aba..fbef56ed83 100644 --- a/platform/ext/common/llvm/tfm_isolation_s.ld.template +++ b/platform/ext/common/llvm/tfm_isolation_s.ld.template @@ -192,6 +192,7 @@ SECTIONS { /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -201,6 +202,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -323,6 +325,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); diff --git a/platform/ext/common/picolibc.c b/platform/ext/common/picolibc.c new file mode 100644 index 0000000000..9789dc9b1e --- /dev/null +++ b/platform/ext/common/picolibc.c @@ -0,0 +1,56 @@ +/* + * Copyright 2025, Keith Packard + * + * SPDX-License-Identifier: BSD-3-Clause + * + */ + +#include +#include +#include "config_impl.h" + +#ifdef __PICOLIBC__ + +/* + * Picolibc's startup code only initializes a single data and bss + * segment. Replace that to initialize all of the segments using + * the lists provided by the linker script. + */ + +void __libc_init_array(void); +void _start(void); +int main(int, char **); + +void +_start(void) +{ + typedef struct __copy_table { + uint32_t const* src; + uint32_t* dest; + uint32_t wlen; + } __copy_table_t; + + typedef struct __zero_table { + uint32_t* dest; + uint32_t wlen; + } __zero_table_t; + + extern const __copy_table_t __copy_table_start__; + extern const __copy_table_t __copy_table_end__; + extern const __zero_table_t __zero_table_start__; + extern const __zero_table_t __zero_table_end__; + + for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) { + memcpy(pTable->dest, pTable->src, pTable->wlen << 2); + } + + for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) { + memset(pTable->dest, 0, pTable->wlen << 2); + } + + __libc_init_array(); + main(0, NULL); + return; +} + +#endif /* __PICOLIBC__ */ diff --git a/platform/ext/common/provisioning_bundle/CMakeLists.txt b/platform/ext/common/provisioning_bundle/CMakeLists.txt index 220b1a902a..83cc7379ee 100644 --- a/platform/ext/common/provisioning_bundle/CMakeLists.txt +++ b/platform/ext/common/provisioning_bundle/CMakeLists.txt @@ -54,6 +54,7 @@ target_sources(provisioning_bundle PRIVATE ./provisioning_code.c ./provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/common/syscalls_stub.c b/platform/ext/common/syscalls_stub.c index 9ebe78e97e..7256b774b3 100644 --- a/platform/ext/common/syscalls_stub.c +++ b/platform/ext/common/syscalls_stub.c @@ -14,6 +14,14 @@ #include #include +#ifdef __PICOLIBC__ +__attribute__((weak)) +void _exit(int status) +{ + (void) status; + for(;;); +} +#else __attribute__((weak)) void _close(void) { @@ -53,3 +61,5 @@ __attribute__((weak)) void _write(void) { } + +#endif /* !__PICOLIBC__ */ diff --git a/platform/ext/common/uart_stdout.c b/platform/ext/common/uart_stdout.c index fec035ada7..e1fdb82f27 100644 --- a/platform/ext/common/uart_stdout.c +++ b/platform/ext/common/uart_stdout.c @@ -85,7 +85,7 @@ int fputc(int ch, FILE *f) /* Redirect sdtio for PicoLib in LLVM toolchain as per https://github.com/picolibc/picolibc/blob/main/doc/os.md 'fputch()' named intentionally different from 'fputc()' from picolib */ -#elif defined(__clang_major__) +#elif defined(__PICOLIBC__) int fputch(char ch, struct __file *f) { diff --git a/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld b/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld index 10a91a559f..7a07617d42 100644 --- a/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld +++ b/platform/ext/target/adi/max32657/device/gcc/max32657_sla.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -196,8 +198,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld index 08b5e8d3ce..c1a2b7bd35 100644 --- a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld +++ b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_1.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -172,8 +174,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld index 01998bf37e..3da19618c6 100644 --- a/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld +++ b/platform/ext/target/arm/corstone1000/Device/Source/gcc/corstone1000_bl1_2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -176,8 +178,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld index 44f04021a5..286883de84 100644 --- a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld +++ b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_1.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -191,8 +193,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld index 83aaf144f7..c9a62f3278 100644 --- a/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld +++ b/platform/ext/target/arm/mps4/common/device/source/gcc/mps4_corstone3xx_bl1_2.ld @@ -50,6 +50,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -59,6 +60,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -192,8 +194,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt index 80626cd5e2..f25f076448 100644 --- a/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt +++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_cm/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources(cm_provisioning_bundle PRIVATE cm_provisioning_code.c cm_provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt index 5a8614b8e6..a1fe359334 100644 --- a/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt +++ b/platform/ext/target/arm/mps4/common/provisioning/bundle_dm/CMakeLists.txt @@ -65,6 +65,7 @@ target_sources(dm_provisioning_bundle PRIVATE dm_provisioning_code.c dm_provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld index c0878d790c..16ccbb5193 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_bl2.ld @@ -58,6 +58,10 @@ SECTIONS *libflash_drivers.o(.rodata*) . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + Image$$ER_CODE_SRAM$$Base = ADDR(.ER_CODE_SRAM); Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); @@ -68,6 +72,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -77,6 +82,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -204,8 +210,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld index 04634359de..128d29dfbc 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/gcc/musca_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -164,8 +166,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld index 09aef8d9c6..2cf14e0511 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld +++ b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_bl2.ld @@ -57,6 +57,10 @@ SECTIONS *libflash_drivers.o(.rodata*) . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + Image$$ER_CODE_SRAM$$Base = ADDR(.ER_CODE_SRAM); Image$$ER_CODE_SRAM$$Limit = ADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); diff --git a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc index 5c7ad897cb..7e1ad8d668 100644 --- a/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc +++ b/platform/ext/target/arm/musca_b1/Device/Source/llvm/musca_ns.ldc @@ -43,6 +43,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -52,6 +53,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld index 8b92674ede..20e5636c65 100644 --- a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld +++ b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_1.ld @@ -48,6 +48,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -57,6 +58,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -181,8 +183,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld index bff127a214..cacae46b00 100644 --- a/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld +++ b/platform/ext/target/arm/rse/common/device/source/gcc/rse_bl1_2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -174,8 +176,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt b/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt index c4aa7e0272..e2a86ef677 100644 --- a/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt +++ b/platform/ext/target/arm/rse/common/provisioning/bundle/CMakeLists.txt @@ -67,6 +67,7 @@ macro(create_provisioning_code_target target) target_sources(${target}_provisioning_code PRIVATE + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld b/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld index d5b00b465e..c095bce81d 100644 --- a/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld +++ b/platform/ext/target/arm/rse/common/tests/rse_test_executable/rse_tests.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -173,8 +175,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt b/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt index 4e4e72f344..cb020fd623 100644 --- a/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt +++ b/platform/ext/target/armchina/mps3/common/provisioning/CMakeLists.txt @@ -50,6 +50,7 @@ target_sources(provisioning_bundle PRIVATE ./provisioning_code.c ./provisioning_data.c + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> ) diff --git a/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld b/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld index c839303458..16e8f910be 100644 --- a/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld +++ b/platform/ext/target/cypress/psoc64/Device/Source/gcc/psoc6_ns.ld @@ -116,6 +116,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -125,6 +126,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -267,11 +269,13 @@ SECTIONS .heap (NOLOAD): { __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); __end__ = .; PROVIDE(end = .); end = __end__; . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > ram diff --git a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld index fd72a3e55a..8525948b5a 100644 --- a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld +++ b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_bl2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -171,8 +173,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld index 42cd99082f..b198da6f4b 100644 --- a/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld +++ b/platform/ext/target/nuvoton/m2351/device/source/gcc/m2351_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -157,8 +159,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld index fd72a3e55a..8525948b5a 100644 --- a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld +++ b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_bl2.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -171,8 +173,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld index 42cd99082f..b198da6f4b 100644 --- a/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld +++ b/platform/ext/target/nuvoton/m2354/device/source/gcc/m2354_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -157,8 +159,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/rpi/rp2350/linker_bl2.ld b/platform/ext/target/rpi/rp2350/linker_bl2.ld index 5dfd04ce92..e958204428 100644 --- a/platform/ext/target/rpi/rp2350/linker_bl2.ld +++ b/platform/ext/target/rpi/rp2350/linker_bl2.ld @@ -39,6 +39,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -48,6 +49,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ PROVIDE_HIDDEN (__fini_array_start = .); @@ -241,9 +243,11 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); KEEP(*(.heap*)) . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM Image$$ARM_LIB_HEAP$$ZI$$Limit = ADDR(.heap) + SIZEOF(.heap); diff --git a/platform/ext/target/rpi/rp2350/linker_ns.ld b/platform/ext/target/rpi/rp2350/linker_ns.ld index 3e2744352d..1485d85119 100644 --- a/platform/ext/target/rpi/rp2350/linker_ns.ld +++ b/platform/ext/target/rpi/rp2350/linker_ns.ld @@ -67,6 +67,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -77,6 +78,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -196,8 +198,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/rpi/rp2350/linker_s.ld b/platform/ext/target/rpi/rp2350/linker_s.ld index 084b1fc67c..8a07cb8ec1 100644 --- a/platform/ext/target/rpi/rp2350/linker_s.ld +++ b/platform/ext/target/rpi/rp2350/linker_s.ld @@ -150,6 +150,9 @@ SECTIONS . = ALIGN(4); /* This alignment is needed to make the section size 4 bytes aligned */ } > CODE_RAM AT > FLASH + /* Reset current position for subsequent sections */ + . = LOADADDR(.ER_CODE_SRAM) + SIZEOF(.ER_CODE_SRAM); + ASSERT(S_RAM_CODE_START % 4 == 0, "S_RAM_CODE_START must be divisible by 4") Image$$ER_CODE_SRAM$$RO$$Base = ADDR(.ER_CODE_SRAM); @@ -197,6 +200,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(SORT(.preinit_array.*))) KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -207,6 +211,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -376,9 +381,11 @@ SECTIONS end = __end__; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); KEEP(*(.heap*)) . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; } > RAM #else diff --git a/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld b/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld index 833c1aa042..96e340e977 100644 --- a/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld +++ b/platform/ext/target/stm/common/hal/template/gcc/appli_ns.ld @@ -47,6 +47,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -56,6 +57,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -170,8 +172,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/hal/template/gcc/bl2.ld b/platform/ext/target/stm/common/hal/template/gcc/bl2.ld index 04910acd3b..97b94daf96 100644 --- a/platform/ext/target/stm/common/hal/template/gcc/bl2.ld +++ b/platform/ext/target/stm/common/hal/template/gcc/bl2.ld @@ -88,6 +88,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -97,6 +98,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -202,8 +204,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld index 930d7b4ae3..391b375a30 100644 --- a/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32h5xx/Device/Source/gcc/tfm_common_s.ld @@ -219,8 +219,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -249,8 +251,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -261,8 +265,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ @@ -318,6 +324,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -327,6 +334,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ diff --git a/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld b/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld index 74ccad1f58..132e53fb62 100644 --- a/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld +++ b/platform/ext/target/stm/common/stm32h5xx/template/gcc/bl2.ld @@ -78,6 +78,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -87,6 +88,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -192,8 +194,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM diff --git a/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld index 591c193c17..f56d4e52c5 100644 --- a/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32u5xx/Device/Source/gcc/tfm_common_s.ld @@ -108,6 +108,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -117,6 +118,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -238,8 +240,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -268,8 +272,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -280,8 +286,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ diff --git a/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld b/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld index ce3d9f0491..2febd57d77 100644 --- a/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld +++ b/platform/ext/target/stm/common/stm32wbaxx/Device/Source/gcc/tfm_common_s.ld @@ -119,6 +119,7 @@ SECTIONS . = ALIGN(4); /* preinit data */ PROVIDE_HIDDEN (__preinit_array_start = .); + PROVIDE(__bothinit_array_start = __preinit_array_start); KEEP(*(.preinit_array)) PROVIDE_HIDDEN (__preinit_array_end = .); @@ -128,6 +129,7 @@ SECTIONS KEEP(*(SORT(.init_array.*))) KEEP(*(.init_array)) PROVIDE_HIDDEN (__init_array_end = .); + PROVIDE(__bothinit_array_end = __init_array_end); . = ALIGN(4); /* finit data */ @@ -249,8 +251,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM #endif /* TFM_ISOLATION_LEVEL == 1 */ @@ -279,8 +283,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ . = ALIGN(32); @@ -291,8 +297,10 @@ SECTIONS __end__ = .; PROVIDE(end = .); __HeapBase = .; + PROVIDE(__heap_start = __HeapBase); . += __heap_size__; __HeapLimit = .; + PROVIDE(__heap_end = __HeapLimit); __heap_limit = .; /* Add for _sbrk */ } > RAM AT> RAM #endif /* TFM_PARTITION_TEST_SECURE_SERVICES */ diff --git a/platform/ns/toolchain_ns_GNUARM.cmake b/platform/ns/toolchain_ns_GNUARM.cmake index 8f23f818bc..202955dced 100644 --- a/platform/ns/toolchain_ns_GNUARM.cmake +++ b/platform/ns/toolchain_ns_GNUARM.cmake @@ -176,9 +176,32 @@ string(APPEND CMAKE_ASM_LINK_FLAGS " " ${LINKER_CP_OPTION}) # For GNU Arm Embedded Toolchain doesn't emit __ARM_ARCH_8_1M_MAIN__, adding this macro manually. add_compile_definitions($<$:__ARM_ARCH_8_1M_MAIN__=1>) +if(NOT DEFINED CONFIG_PICOLIBC) + set(CONFIG_PICOLIBC TRUE) +endif() + +if (CONFIG_PICOLIBC) + set(LIBC_COMPILE_OPTIONS + -specs=picolibc.specs + ) + set(LIBC_LINK_OPTIONS + -specs=picolibc.specs + -nostartfiles + -u main + ) +else() + set(LIBC_COMPILE_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) + set(LIBC_LINK_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) +endif() + add_compile_options( - -specs=nano.specs - -specs=nosys.specs + ${LIBC_COMPILE_OPTIONS} -Wall -Wno-format -Warray-parameter @@ -200,8 +223,8 @@ add_compile_options( add_link_options( --entry=Reset_Handler - -specs=nano.specs - -specs=nosys.specs + ${LIBC_LINK_OPTIONS} + -mthumb LINKER:-check-sections LINKER:-fatal-warnings LINKER:--gc-sections diff --git a/secure_fw/partitions/lib/runtime/CMakeLists.txt b/secure_fw/partitions/lib/runtime/CMakeLists.txt index 12e3116148..a5d2cf6aca 100644 --- a/secure_fw/partitions/lib/runtime/CMakeLists.txt +++ b/secure_fw/partitions/lib/runtime/CMakeLists.txt @@ -18,6 +18,7 @@ target_include_directories(tfm_sprt target_sources(tfm_sprt PUBLIC + $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/picolibc.c> $<$:${CMAKE_SOURCE_DIR}/platform/ext/common/syscalls_stub.c> PRIVATE crt_memcmp.c diff --git a/toolchain_GNUARM.cmake b/toolchain_GNUARM.cmake index 46e28b4ab2..53bffaebd6 100644 --- a/toolchain_GNUARM.cmake +++ b/toolchain_GNUARM.cmake @@ -106,9 +106,32 @@ if(GCC_VERSION VERSION_GREATER_EQUAL "8.0.0") endif() endif() +if(NOT DEFINED CONFIG_PICOLIBC) + set(CONFIG_PICOLIBC TRUE) +endif() + +if (CONFIG_PICOLIBC) + set(LIBC_COMPILE_OPTIONS + -specs=picolibc.specs + ) + set(LIBC_LINK_OPTIONS + -specs=picolibc.specs + -nostartfiles + -u main + ) +else() + set(LIBC_COMPILE_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) + set(LIBC_LINK_OPTIONS + -specs=nano.specs + -specs=nosys.specs + ) +endif() + add_compile_options( - -specs=nano.specs - -specs=nosys.specs + ${LIBC_COMPILE_OPTIONS} -Wall -Wno-format -Warray-parameter @@ -147,8 +170,8 @@ endif() add_link_options( --entry=Reset_Handler - -specs=nano.specs - -specs=nosys.specs + ${LIBC_LINK_OPTIONS} + -mthumb LINKER:-check-sections LINKER:-fatal-warnings LINKER:--gc-sections