Commit 0e3192e7 authored by Daniel DeGrasse's avatar Daniel DeGrasse Committed by github-actions[bot]
Browse files

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: default avatarDaniel DeGrasse <daniel.degrasse@nxp.com>
(cherry picked from commit 6023d6a1)
parent 1ddf9758
Loading
Loading
Loading
Loading
+1 −0
Changes for arch/common/ramfunc.ld: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

SECTION_DATA_PROLOGUE(.ramfunc,,)
{
	__ramfunc_region_start = .;
	MPU_ALIGN(__ramfunc_size);
	__ramfunc_start = .;
	*(.ramfunc)
+1 −0
Changes for cmake/linker_script/arm/linker.cmake: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -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@)")
+1 −0
Changes for include/zephyr/linker/linker-defs.h: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -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[];
+2 −2
Changes for kernel/xip.c: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -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,