From 0e3192e70744485b6fb8943a67900cb0d36c1ed8 Mon Sep 17 00:00:00 2001 From: Daniel DeGrasse Date: Fri, 1 Nov 2024 22:36:32 +0000 Subject: [PATCH 1/2] arch: common: fix copy for ramfunc region during XIP init ramfunc region is copied into RAM from FLASH region during XIP init. We copy from the loadaddr of the region, and were previously loading to the symbol __ramfunc_start. This is incorrect when using an MPU with alignment requirements, as the __ramfunc_start symbol may have padding placed before it in the region. The __ramfunc_start symbol still needs to be aligned in order to be used by the MPU though, so define a new symbol __ramfunc_region_start, and use that symbol when copying the __ramfunc region from FLASH to RAM. Fixes #75296 Signed-off-by: Daniel DeGrasse (cherry picked from commit 6023d6a1428d880a988f1be3ab1b5da5a6e86d61) --- arch/common/ramfunc.ld | 1 + cmake/linker_script/arm/linker.cmake | 1 + include/zephyr/linker/linker-defs.h | 1 + kernel/xip.c | 4 ++-- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/arch/common/ramfunc.ld b/arch/common/ramfunc.ld index 3894dbfef435..45dea79d6b66 100644 --- a/arch/common/ramfunc.ld +++ b/arch/common/ramfunc.ld @@ -9,6 +9,7 @@ SECTION_DATA_PROLOGUE(.ramfunc,,) { + __ramfunc_region_start = .; MPU_ALIGN(__ramfunc_size); __ramfunc_start = .; *(.ramfunc) diff --git a/cmake/linker_script/arm/linker.cmake b/cmake/linker_script/arm/linker.cmake index 332d44b24359..bb501a16cdb2 100644 --- a/cmake/linker_script/arm/linker.cmake +++ b/cmake/linker_script/arm/linker.cmake @@ -144,6 +144,7 @@ endif() include(${COMMON_ZEPHYR_LINKER_DIR}/ram-end.cmake) +zephyr_linker_symbol(SYMBOL __ramfunc_region_start EXPR "ADDR(.ramfunc)") zephyr_linker_symbol(SYMBOL __kernel_ram_start EXPR "(@__bss_start@)") zephyr_linker_symbol(SYMBOL __kernel_ram_end EXPR "(${RAM_ADDR} + ${RAM_SIZE})") zephyr_linker_symbol(SYMBOL __kernel_ram_size EXPR "(@__kernel_ram_end@ - @__bss_start@)") diff --git a/include/zephyr/linker/linker-defs.h b/include/zephyr/linker/linker-defs.h index d860222ffac7..6e3a30683159 100644 --- a/include/zephyr/linker/linker-defs.h +++ b/include/zephyr/linker/linker-defs.h @@ -230,6 +230,7 @@ extern char _nocache_ram_size[]; * section, stored in RAM instead of FLASH. */ #ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT +extern char __ramfunc_region_start[]; extern char __ramfunc_start[]; extern char __ramfunc_end[]; extern char __ramfunc_size[]; diff --git a/kernel/xip.c b/kernel/xip.c index a5752560c853..f6de78423b17 100644 --- a/kernel/xip.c +++ b/kernel/xip.c @@ -28,8 +28,8 @@ void z_data_copy(void) z_early_memcpy(&__data_region_start, &__data_region_load_start, __data_region_end - __data_region_start); #ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT - z_early_memcpy(&__ramfunc_start, &__ramfunc_load_start, - (uintptr_t) &__ramfunc_size); + z_early_memcpy(&__ramfunc_region_start, &__ramfunc_load_start, + __ramfunc_end - __ramfunc_region_start); #endif /* CONFIG_ARCH_HAS_RAMFUNC_SUPPORT */ #if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_ccm), okay) z_early_memcpy(&__ccm_data_start, &__ccm_data_rom_start, From c8bbc5268e54f6ad8387d40467f4c99ad406c3d3 Mon Sep 17 00:00:00 2001 From: Daniel DeGrasse Date: Mon, 14 Apr 2025 10:19:46 -0500 Subject: [PATCH 2/2] cmake: arm: linker: remove usage of ld-specific ADDR() function Remove usage of ld-specific ADDR function within the cmake linker generator scripting. Since the linker generator scripting doesn't support MPUs, we can simply set the __ramfunc_region_start symbol to be equal to __ramfunc_start Fixes #87200 Signed-off-by: Daniel DeGrasse (cherry picked from commit b84076a192717894b09d6f4b643c727aa754673c) --- cmake/linker_script/arm/linker.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/linker_script/arm/linker.cmake b/cmake/linker_script/arm/linker.cmake index bb501a16cdb2..ef70b3b44b0d 100644 --- a/cmake/linker_script/arm/linker.cmake +++ b/cmake/linker_script/arm/linker.cmake @@ -144,7 +144,7 @@ endif() include(${COMMON_ZEPHYR_LINKER_DIR}/ram-end.cmake) -zephyr_linker_symbol(SYMBOL __ramfunc_region_start EXPR "ADDR(.ramfunc)") +zephyr_linker_symbol(SYMBOL __ramfunc_region_start EXPR "(@__ramfunc_start@)") zephyr_linker_symbol(SYMBOL __kernel_ram_start EXPR "(@__bss_start@)") zephyr_linker_symbol(SYMBOL __kernel_ram_end EXPR "(${RAM_ADDR} + ${RAM_SIZE})") zephyr_linker_symbol(SYMBOL __kernel_ram_size EXPR "(@__kernel_ram_end@ - @__bss_start@)")