From 65a2de84a9d5c535167951bf1cf610c4f7967ea5 Mon Sep 17 00:00:00 2001 From: Torsten Rasmussen Date: Fri, 21 May 2021 21:21:52 +0200 Subject: [PATCH] linker: align __data_ram/rom_start/end linker symbol names Cleanup and preparation commit for linker script generator. Zephyr linker scripts provides start and end symbols for each section, and sometimes even size and LMA start symbols. Generally, start and end symbols uses the following pattern, as: Section name: foo Section start symbol: __foo_start Section end symbol: __foo_end However, this pattern is not followed consistently. To allow for linker script generation and ensure consistent naming of symbols then the following pattern is introduced consistently to allow for cleaner linker script generation. Section name: foo Section start symbol: __foo_start Section end symbol: __foo_end Section size symbol: __foo_size Section LMA start symbol: __foo_load_start This commit aligns the symbols for _data_ram/rom to other symbols and in such a way they follow consistent pattern which allows for linker script and scatter file generation. The symbols are named according to the section name they describe. Section name is `data` A new group named data_region is introduced which instead spans all the input and output sections that was previously covered by __data_ram_start, __data_ram_end, and __data_rom_start. The following symbols are aligned in this commit: - __data_ram_start -> __data_region_start - __data_ram_end -> __data_region_end - __data_rom_start -> __data_region_load_start The following new symbols are introduced so that the data section is aligned with other sections: - __data_end - __data_start value identical to __data_region_start but describes start of the section. Signed-off-by: Torsten Rasmussen --- include/arch/arc/v2/linker.ld | 16 +++++++++++++--- .../arm/aarch32/cortex_a_r/scripts/linker.ld | 11 ++++++++--- .../arm/aarch32/cortex_m/scripts/linker.ld | 13 ++++++++++--- include/arch/arm64/scripts/linker.ld | 12 +++++++++--- include/arch/nios2/linker.ld | 18 +++++++++++------- include/arch/posix/linker.ld | 2 +- include/arch/riscv/common/linker.ld | 11 ++++++++--- include/arch/sparc/linker.ld | 11 ++++++++--- include/arch/x86/ia32/linker.ld | 14 ++++++++++---- include/linker/linker-defs.h | 12 ++++++------ kernel/xip.c | 4 ++-- soc/riscv/openisa_rv32m1/linker.ld | 12 +++++++++--- 12 files changed, 95 insertions(+), 41 deletions(-) diff --git a/include/arch/arc/v2/linker.ld b/include/arch/arc/v2/linker.ld index 18ffade96aceac..248521957bd8e2 100644 --- a/include/arch/arc/v2/linker.ld +++ b/include/arch/arc/v2/linker.ld @@ -178,10 +178,14 @@ SECTIONS { #include + GROUP_START(DATA_REGION) + + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { /* when XIP, .text is in ROM, but vector table must be at start of .data */ - __data_ram_start = .; + __data_start = .; *(".data") *(".data.*") *(".kernel.*") @@ -191,9 +195,14 @@ SECTIONS { */ #include + __data_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); + + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -209,7 +218,8 @@ SECTIONS { */ #include - __data_ram_end = .; + __data_region_end = .; + MPU_MIN_SIZE_ALIGN /* Define linker symbols */ _image_ram_end = .; diff --git a/include/arch/arm/aarch32/cortex_a_r/scripts/linker.ld b/include/arch/arm/aarch32/cortex_a_r/scripts/linker.ld index 9b628593527680..255f2dd39504ad 100644 --- a/include/arch/arm/aarch32/cortex_a_r/scripts/linker.ld +++ b/include/arch/arm/aarch32/cortex_a_r/scripts/linker.ld @@ -278,9 +278,11 @@ SECTIONS #include + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { - __data_ram_start = .; + __data_start = .; *(.data) *(".data.*") *(".kernel.*") @@ -293,10 +295,13 @@ SECTIONS #ifdef CONFIG_CODE_DATA_RELOCATION #include #endif + __data_end = .; } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -307,7 +312,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; /* Define linker symbols */ diff --git a/include/arch/arm/aarch32/cortex_m/scripts/linker.ld b/include/arch/arm/aarch32/cortex_m/scripts/linker.ld index 9d2044ac4d8980..543b5a8142f036 100644 --- a/include/arch/arm/aarch32/cortex_m/scripts/linker.ld +++ b/include/arch/arm/aarch32/cortex_m/scripts/linker.ld @@ -292,9 +292,13 @@ SECTIONS #endif /* CONFIG_USERSPACE */ + GROUP_START(DATA_REGION) + + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { - __data_ram_start = .; + __data_start = .; *(.data) *(".data.*") *(".kernel.*") @@ -307,10 +311,13 @@ SECTIONS #ifdef CONFIG_CODE_DATA_RELOCATION #include #endif + __data_end = .; } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -322,7 +329,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; #ifndef CONFIG_USERSPACE SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) diff --git a/include/arch/arm64/scripts/linker.ld b/include/arch/arm64/scripts/linker.ld index bf8ddb07ae6fba..573aee7dee32cd 100644 --- a/include/arch/arm64/scripts/linker.ld +++ b/include/arch/arm64/scripts/linker.ld @@ -248,9 +248,11 @@ SECTIONS #include + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { - __data_ram_start = .; + __data_start = .; *(.data) *(".data.*") *(".kernel.*") @@ -260,9 +262,13 @@ SECTIONS */ #include + __data_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -273,7 +279,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; /* Define linker symbols */ diff --git a/include/arch/nios2/linker.ld b/include/arch/nios2/linker.ld index 70a3cc7f01d8e4..d54dc2defd3be9 100644 --- a/include/arch/nios2/linker.ld +++ b/include/arch/nios2/linker.ld @@ -97,7 +97,7 @@ SECTIONS } GROUP_START(ROMABLE_REGION) - _image_rom_start = _ROM_ADDR; + __rom_region_start = _ROM_ADDR; SECTION_PROLOGUE(_RESET_SECTION_NAME,,) { @@ -119,21 +119,21 @@ SECTIONS * we are going to waste flash space? */ . = ALT_CPU_RESET_ADDR; - _image_text_start = .; + __text_region_start = .; *(.text) *(".text.*") *(.gnu.linkonce.t.*) } GROUP_LINK_IN(ROMABLE_REGION) - _image_text_end = .; + __text_region_end = .; #if defined(CONFIG_GP_ALL_DATA) _gp = ABSOLUTE(. + 0x8000); PROVIDE(gp = _gp); #endif - _image_rodata_start = .; + __rodata_region_start = .; #include @@ -159,7 +159,7 @@ SECTIONS _image_rodata_size = _image_rodata_end - _image_rodata_start; _image_rom_end = .; - __data_rom_start = ALIGN(4); /* XIP imaged DATA ROM start addr */ + __data_region_load_start = ALIGN(4); /* XIP imaged DATA ROM start addr */ GROUP_END(ROMABLE_REGION) @@ -175,7 +175,7 @@ SECTIONS SECTION_DATA_PROLOGUE(_EXCEPTION_SECTION_NAME,,) { _image_ram_start = .; - __data_ram_start = .; + __data_region_start = .; KEEP(*(".exception.entry.*")) *(".exception.other.*") @@ -191,6 +191,7 @@ SECTIONS SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { + __data_start = .; *(.data) *(".data.*") @@ -223,8 +224,11 @@ SECTIONS * zephyr_linker_sources() Cmake function. */ #include + __data_end = .; } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); #include @@ -233,7 +237,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) { diff --git a/include/arch/posix/linker.ld b/include/arch/posix/linker.ld index 3cc2d44069f136..d56260e76af285 100644 --- a/include/arch/posix/linker.ld +++ b/include/arch/posix/linker.ld @@ -53,7 +53,7 @@ SECTIONS */ #include - __data_ram_end = .; +__data_region_end = .; /* Located in generated directory. This file is populated by the * zephyr_linker_sources() Cmake function. diff --git a/include/arch/riscv/common/linker.ld b/include/arch/riscv/common/linker.ld index bc3475e321db73..7ac29711074378 100644 --- a/include/arch/riscv/common/linker.ld +++ b/include/arch/riscv/common/linker.ld @@ -229,11 +229,13 @@ SECTIONS #include #include + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { . = ALIGN(4); /* _image_ram_start = .; */ - __data_ram_start = .; + __data_start = .; *(.data) *(".data.*") @@ -260,10 +262,13 @@ SECTIONS * zephyr_linker_sources() Cmake function. */ #include + __data_end = .; } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -278,7 +283,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; MPU_MIN_SIZE_ALIGN diff --git a/include/arch/sparc/linker.ld b/include/arch/sparc/linker.ld index 217f2d08b6e4db..1bb491ee8dc995 100644 --- a/include/arch/sparc/linker.ld +++ b/include/arch/sparc/linker.ld @@ -67,7 +67,8 @@ SECTIONS _image_rom_end = .; - __data_rom_start = .; + __data_region_load_start = .; + __data_region_start = .; SECTION_PROLOGUE(.plt,,) @@ -84,7 +85,7 @@ SECTIONS { . = ALIGN(8); _image_ram_start = .; - __data_ram_start = .; + __data_start = .; *(.data) *(.data.*) @@ -96,7 +97,11 @@ SECTIONS */ #include + __data_end = .; + } GROUP_DATA_LINK_IN(REGION_DATA_VMA, REGION_DATA_LMA) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); #include @@ -110,7 +115,7 @@ SECTIONS */ #include - __data_ram_end = .; + __data_region_end = .; SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) { diff --git a/include/arch/x86/ia32/linker.ld b/include/arch/x86/ia32/linker.ld index 6550a29a45f437..7b2a6342bc379a 100644 --- a/include/arch/x86/ia32/linker.ld +++ b/include/arch/x86/ia32/linker.ld @@ -437,10 +437,12 @@ SECTIONS MMU_PAGE_ALIGN_PERM + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { - __data_ram_start = .; + __data_region_start = .; + __data_start = .; *(.data) *(".data.*") @@ -462,9 +464,13 @@ SECTIONS #endif /* !CONFIG_LINKER_USE_PINNED_SECTION */ . = ALIGN(4); + __data_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); #include @@ -482,7 +488,7 @@ SECTIONS #include MMU_PAGE_ALIGN - __data_ram_end = .; + __data_region_end = .; /* All unused memory also owned by the kernel for heaps */ __kernel_ram_end = KERNEL_BASE_ADDR + KERNEL_RAM_SIZE; @@ -536,6 +542,6 @@ SECTIONS * to 3 extra bytes copied in next section (BSS). At run time, the XIP copy * is done first followed by clearing the BSS section. */ -__data_size = (__data_ram_end - __data_ram_start); +__data_size = (__data_region_end - __data_region_start); __data_num_words = (__data_size + 3) >> 2; #endif diff --git a/include/linker/linker-defs.h b/include/linker/linker-defs.h index 7efab81f38c393..d28f3c39c9b5f9 100644 --- a/include/linker/linker-defs.h +++ b/include/linker/linker-defs.h @@ -172,9 +172,9 @@ GDATA(__bss_start) GDATA(__bss_num_words) #ifdef CONFIG_XIP -GDATA(__data_rom_start) -GDATA(__data_ram_start) -GDATA(__data_num_words) +GDATA(__data_region_load_start) +GDATA(__data_region_start) +GDATA(__data_region_num_words) #endif #else /* ! _ASMLANGUAGE */ @@ -224,9 +224,9 @@ extern char __bss_end[]; /* Used by z_data_copy() or arch-specific implementation */ #ifdef CONFIG_XIP -extern char __data_rom_start[]; -extern char __data_ram_start[]; -extern char __data_ram_end[]; +extern char __data_region_load_start[]; +extern char __data_region_start[]; +extern char __data_region_end[]; #endif /* CONFIG_XIP */ #ifdef CONFIG_MMU diff --git a/kernel/xip.c b/kernel/xip.c index c59edc456aa7fe..0498ae6bcd879d 100644 --- a/kernel/xip.c +++ b/kernel/xip.c @@ -25,8 +25,8 @@ extern volatile uintptr_t __stack_chk_guard; */ void z_data_copy(void) { - (void)memcpy(&__data_ram_start, &__data_rom_start, - __data_ram_end - __data_ram_start); + (void)memcpy(&__data_region_start, &__data_region_load_start, + __data_region_end - __data_region_start); #ifdef CONFIG_ARCH_HAS_RAMFUNC_SUPPORT (void)memcpy(&_ramfunc_ram_start, &_ramfunc_rom_start, (uintptr_t) &_ramfunc_ram_size); diff --git a/soc/riscv/openisa_rv32m1/linker.ld b/soc/riscv/openisa_rv32m1/linker.ld index c46f6df67d1413..fea4cd1390290a 100644 --- a/soc/riscv/openisa_rv32m1/linker.ld +++ b/soc/riscv/openisa_rv32m1/linker.ld @@ -159,11 +159,13 @@ SECTIONS GROUP_START(RAM) + __data_region_start = .; + SECTION_DATA_PROLOGUE(_DATA_SECTION_NAME,,) { . = ALIGN(4); _image_ram_start = .; - __data_ram_start = .; + __data_start = .; *(.data) *(.data.*) @@ -178,7 +180,11 @@ SECTIONS */ #include + __data_end = .; + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + __data_size = __data_end - __data_start; + __data_load_start = LOADADDR(_DATA_SECTION_NAME); #include #include @@ -188,8 +194,8 @@ SECTIONS */ #include - __data_ram_end = .; - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + __data_region_end = .; + __data_region_load_start = LOADADDR(_DATA_SECTION_NAME); SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) {