From 8e1f40a6329116fc553008e2e4b0304cccbb9c20 Mon Sep 17 00:00:00 2001 From: Eugeniy Paltsev Date: Tue, 15 Sep 2020 18:39:35 +0300 Subject: [PATCH] ARC: linker: merge GNU and MWDT linker scripts As discussed in #22668, there is additional risk ascociated with splitting linker files, as one may update one script and not be aware of the other. Especially related to updating GNU ld, and not mwdt could break code for mwdt unnoticed, as mwdt is not part of CI. Let's create a single entry point for linker template. Signed-off-by: Eugeniy Paltsev --- include/arch/arc/v2/linker-gnu.ld | 219 ------------------------- include/arch/arc/v2/linker-mwdt.ld | 247 ----------------------------- include/arch/arc/v2/linker.ld | 228 +++++++++++++++++++++++++- 3 files changed, 225 insertions(+), 469 deletions(-) delete mode 100644 include/arch/arc/v2/linker-gnu.ld delete mode 100644 include/arch/arc/v2/linker-mwdt.ld diff --git a/include/arch/arc/v2/linker-gnu.ld b/include/arch/arc/v2/linker-gnu.ld deleted file mode 100644 index 039b77fc09d..00000000000 --- a/include/arch/arc/v2/linker-gnu.ld +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2014-2015 Wind River Systems, Inc. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @brief Common parts of the linker scripts for the ARCv2/EM targets. - */ - -#include -#include -#include - -/* physical address of RAM */ -#ifdef CONFIG_HARVARD - #define ROMABLE_REGION ICCM - #define RAMABLE_REGION DCCM -#else - #if defined(CONFIG_XIP) && (FLASH_SIZE != 0) - #define ROMABLE_REGION FLASH - #define RAMABLE_REGION SRAM - #else - #define ROMABLE_REGION SRAM - #define RAMABLE_REGION SRAM - #endif -#endif - -#ifdef CONFIG_ARC_MPU_ENABLE - #if CONFIG_ARC_MPU_VER == 2 - #define MPU_MIN_SIZE 2048 - #elif CONFIG_ARC_MPU_VER == 3 - #define MPU_MIN_SIZE 32 - #endif - #define MPU_MIN_SIZE_ALIGN . = ALIGN(MPU_MIN_SIZE ); - #if defined(CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT) - #define MPU_ALIGN(region_size) \ - . = ALIGN(MPU_MIN_SIZE); \ - . = ALIGN( 1 << LOG2CEIL(region_size)) - #else - #define MPU_ALIGN(region_size) \ - . = ALIGN(MPU_MIN_SIZE) - #endif -#else - #define MPU_MIN_SIZE_ALIGN - #define MPU_ALIGN(region_size) . = ALIGN(4) -#endif - -#if defined(CONFIG_XIP) - #define _DATA_IN_ROM __data_rom_start -#else - #define _DATA_IN_ROM -#endif - -OUTPUT_ARCH(arc) -ENTRY(CONFIG_KERNEL_ENTRY) - -MEMORY { -#ifdef FLASH_START - FLASH (rx) : ORIGIN = FLASH_START, LENGTH = FLASH_SIZE -#endif -#ifdef ICCM_START - ICCM (rwx) : ORIGIN = ICCM_START, LENGTH = ICCM_SIZE -#endif -#ifdef SRAM_START - SRAM (rwx) : ORIGIN = SRAM_START, LENGTH = SRAM_SIZE -#endif -#ifdef DCCM_START - DCCM (rw) : ORIGIN = DCCM_START, LENGTH = DCCM_SIZE -#endif - /* Used by and documented in include/linker/intlist.ld */ - IDT_LIST (wx) : ORIGIN = 0xFFFFF7FF, LENGTH = 2K -} - -SECTIONS { - -#include - - GROUP_START(ROMABLE_REGION) - - SECTION_PROLOGUE(_TEXT_SECTION_NAME,,ALIGN(1024)) { - _image_rom_start = .; - _image_text_start = .; - -/* Located in generated directory. This file is populated by calling - * zephyr_linker_sources(ROM_START ...). This typically contains the vector - * table and debug information. - */ -#include - *(.text .text.*) - *(.gnu.linkonce.t.*) - -#include - } GROUP_LINK_IN(ROMABLE_REGION) - - _image_text_end = .; - _image_rodata_start = .; - -#include - - SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { - KEEP(*(.openocd_dbg)) - KEEP(*(".openocd_dbg.*")) - *(.rodata) - *(".rodata.*") - *(.gnu.linkonce.r.*) - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - -#include - - } GROUP_LINK_IN(ROMABLE_REGION) - -#include - - _image_rodata_end = .; - MPU_ALIGN(_image_rodata_end - _image_rom_start); - _image_rom_end = .; - _image_rom_size = _image_rom_end - _image_rom_start; - - GROUP_END(ROMABLE_REGION) - - GROUP_START(RAMABLE_REGION) - -#include - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - -#if defined(CONFIG_USERSPACE) -#define APP_SHARED_ALIGN MPU_MIN_SIZE_ALIGN -#define SMEM_PARTITION_ALIGN MPU_ALIGN - -#include - - _image_ram_start = _app_smem_start; - _app_smem_size = _app_smem_end - _app_smem_start; - _app_smem_rom_start = LOADADDR(_APP_SMEM_SECTION_NAME); -#endif /* CONFIG_USERSPACE */ - - SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) { - MPU_MIN_SIZE_ALIGN - /* - * For performance, BSS section is assumed to be 4 byte aligned and - * a multiple of 4 bytes - */ - . = ALIGN(4); - __bss_start = .; - _image_ram_start = .; - __kernel_ram_start = .; - *(.bss) - *(".bss.*") - *(COMMON) - *(".kernel_bss.*") - - /* - * BSP clears this memory in words only and doesn't clear any - * potential left over bytes. - */ - __bss_end = ALIGN(4); - } GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION) - -#include - - 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) - *(".data.*") - *(".kernel.*") - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); - -#include -#include -#include - - __data_ram_end = .; - - MPU_MIN_SIZE_ALIGN - - /* Define linker symbols */ - _image_ram_end = .; - _end = .; /* end of image */ - - __kernel_ram_end = .; - __kernel_ram_size = __kernel_ram_end - __kernel_ram_start; - - GROUP_END(RAMABLE_REGION) - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - -#include - - - SECTION_PROLOGUE(.ARC.attributes, 0,) - { - KEEP(*(.ARC.attributes)) - KEEP(*(.gnu.attributes)) - } - - /DISCARD/ : { *(.note.GNU-stack) } - } diff --git a/include/arch/arc/v2/linker-mwdt.ld b/include/arch/arc/v2/linker-mwdt.ld deleted file mode 100644 index a05348a1154..00000000000 --- a/include/arch/arc/v2/linker-mwdt.ld +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 2020 Synopsys. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @brief Common parts of the linker scripts for the ARCv2/EM targets. - */ -#include - -#include -#include - -/* physical address of RAM */ -#ifdef CONFIG_HARVARD - #define ROMABLE_REGION ICCM - #define RAMABLE_REGION DCCM -#else - #if defined(CONFIG_XIP) && (FLASH_SIZE != 0) - #define ROMABLE_REGION FLASH - #define RAMABLE_REGION SRAM - #else - #define ROMABLE_REGION SRAM - #define RAMABLE_REGION SRAM - #endif -#endif - -#ifdef CONFIG_ARC_MPU_ENABLE - #if CONFIG_ARC_MPU_VER == 2 - #define MPU_MIN_SIZE 2048 - #elif CONFIG_ARC_MPU_VER == 3 - #define MPU_MIN_SIZE 32 - #endif - #define MPU_MIN_SIZE_ALIGN . = ALIGN(MPU_MIN_SIZE); - #if defined(CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT) - #define MPU_REGION_SIZE(region_size) \ - (1 << LOG2CEIL(region_size)) - #else - #define MPU_REGION_SIZE(region_size) \ - (region_size) - #endif -#else - #define MPU_MIN_SIZE_ALIGN - #define MPU_REGION_SIZE(region_size) \ - (region_size) -#endif - -#if defined(CONFIG_XIP) - #define _DATA_IN_ROM __data_rom_start -#else - #define _DATA_IN_ROM -#endif - -ENTRY(CONFIG_KERNEL_ENTRY) - -MEMORY { -#ifdef FLASH_START - FLASH : ORIGIN = FLASH_START, LENGTH = FLASH_SIZE -#endif -#ifdef ICCM_START - ICCM : ORIGIN = ICCM_START, LENGTH = ICCM_SIZE -#endif -#ifdef SRAM_START - SRAM : ORIGIN = SRAM_START, LENGTH = SRAM_SIZE -#endif -#ifdef DCCM_START - DCCM : ORIGIN = DCCM_START, LENGTH = DCCM_SIZE -#endif - /* Used by and documented in include/linker/intlist.ld */ - IDT_LIST : ORIGIN = 0xFFFFF800, LENGTH = 2K -} - -SECTIONS { - - GROUP_START(ROMABLE_REGION) - - SECTION_PROLOGUE(_TEXT_SECTION_NAME,,ALIGN(1024)) { - _image_rom_start = .; - _image_text_start = .; - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - *(.text .text* .text.*) - -#ifdef CONFIG_USERSPACE -/* to make sure .kobject_data.text occupies a fixed hole, we use the trick - * of ALIGN here with a cost of memfoort print. If assigning program counter - * with an identifier is supported, this trick can be removed - */ - . = ALIGN(CONFIG_KOBJECT_TEXT_AREA); - _kobject_text_area_start = .; - *(".kobject_data.text*") - _kobject_text_area_end = .; - _kobject_text_area_used = _kobject_text_area_end - _kobject_text_area_start; -#ifndef LINKER_PASS2 - . = ALIGN(4); -#ifdef CONFIG_DYNAMIC_OBJECTS - PROVIDE(z_object_gperf_find = .); - PROVIDE(z_object_gperf_wordlist_foreach = .); -#else - PROVIDE(z_object_find = .); - PROVIDE(z_object_wordlist_foreach = .); -#endif - . = . + CONFIG_KOBJECT_TEXT_AREA; -#endif - . = ALIGN(CONFIG_KOBJECT_TEXT_AREA); -#endif /* CONFIG_USERSPACE */ - - - _image_text_end = .; - _image_rodata_start = .; - - } GROUP_LINK_IN(ROMABLE_REGION) - -#include - - SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { - KEEP(*(.openocd_dbg)) - KEEP(*(".openocd_dbg.*")) - *(".rodata") - *(".rodata.*") - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - -#include - -#if defined (CONFIG_CPLUSPLUS) -/* \todo: add mwdt c++ sections */ -#endif - - _image_rodata_end = .; - MPU_MIN_SIZE_ALIGN - _image_rom_end = _image_rom_start + MPU_REGION_SIZE(. - _image_rom_start); - _image_rom_size = _image_rom_end - _image_rom_start; - - } GROUP_LINK_IN(ROMABLE_REGION) - - GROUP_END(ROMABLE_REGION) - - GROUP_START(RAMABLE_REGION) - - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - -#if defined(CONFIG_USERSPACE) -/* - * because the linker of metware toolchain is strong as gcc's linker, - * e.g., the limitation on . operator, no LOG2CEIL, so for MPU wiht power of 2 - * requirement, the alignment of app smem is fixed to MPU_MIN_SIZE which - * is not a correct value for partition with size > MPU_MIN_SIZE. - */ -#define APP_SHARED_ALIGN . = ALIGN(MPU_MIN_SIZE) -#define SMEM_PARTITION_ALIGN(x) . = ALIGN(MPU_MIN_SIZE) - -#include - - _image_ram_start = _app_smem_start; - _app_smem_size = _app_smem_end - _app_smem_start; - _app_smem_rom_start = LOADADDR(_APP_SMEM_SECTION_NAME); -#endif /* CONFIG_USERSPACE */ - - SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) { - MPU_MIN_SIZE_ALIGN - /* - * For performance, BSS section is assumed to be 4 byte aligned and - * a multiple of 4 bytes - */ - . = ALIGN(4); - __bss_start = .; - _image_ram_start = .; - __kernel_ram_start = .; - *(".bss") - *(".bss.*") - *(COMMON) - *(".kernel_bss.*") - - /* - * BSP clears this memory in words only and doesn't clear any - * potential left over bytes. - */ - __bss_end = ALIGN(4); - } GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION) - -#include - - 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") - *(".data.*") - *(".kernel.*") - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - __data_rom_start = LOADADDR(_DATA_SECTION_NAME); - -#include -#include -#if defined (CONFIG_CPLUSPLUS) -/* \todo add mwdt specific c++ sections */ -#endif - -/* an empty region to hold symbols, mwdt does not support of setting . - * outside sections - */ - SECTION_DATA_PROLOGUE(_mwdt_ram_end,,) { - __data_ram_end = .; - MPU_MIN_SIZE_ALIGN - /* Define linker symbols */ - _image_ram_end = .; - _end = .; /* end of image */ - - __kernel_ram_end = .; - __kernel_ram_size = __kernel_ram_end - __kernel_ram_start; -/* mwdt requires _fstack, _estack which will be used in _stkchk. - * _stkchk is inserted by mwdt automatically, if _fstack, _estack is not - * set correctly, the brk_s instruction will be called - * here, we use a trick to deceive the compiler. - */ - _fstack = _image_ram_start; - _estack = .; - - } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) - - GROUP_END(RAMABLE_REGION) - -/* Located in generated directory. This file is populated by the - * zephyr_linker_sources() Cmake function. - */ -#include - - } diff --git a/include/arch/arc/v2/linker.ld b/include/arch/arc/v2/linker.ld index 545f27e186a..d649ff9687a 100644 --- a/include/arch/arc/v2/linker.ld +++ b/include/arch/arc/v2/linker.ld @@ -4,9 +4,231 @@ * SPDX-License-Identifier: Apache-2.0 */ +/** + * @brief Common parts of the linker scripts for the ARCv2 targets for + * GNU and MWDT toolchains. + */ -#if defined(__MWDT_LINKER_CMD__) -#include +#include +#include +#include + +/* physical address of RAM */ +#ifdef CONFIG_HARVARD + #define ROMABLE_REGION ICCM + #define RAMABLE_REGION DCCM #else -#include + #if defined(CONFIG_XIP) && (FLASH_SIZE != 0) + #define ROMABLE_REGION FLASH + #define RAMABLE_REGION SRAM + #else + #define ROMABLE_REGION SRAM + #define RAMABLE_REGION SRAM + #endif #endif + +#ifdef CONFIG_ARC_MPU_ENABLE + #if CONFIG_ARC_MPU_VER == 2 + #define MPU_MIN_SIZE 2048 + #elif CONFIG_ARC_MPU_VER == 3 + #define MPU_MIN_SIZE 32 + #endif + #define MPU_MIN_SIZE_ALIGN . = ALIGN(MPU_MIN_SIZE); + #if defined(CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT) + #define MPU_ALIGN(region_size) \ + . = ALIGN(MPU_MIN_SIZE); \ + . = ALIGN( 1 << LOG2CEIL(region_size)) + #else + #define MPU_ALIGN(region_size) \ + . = ALIGN(MPU_MIN_SIZE) + #endif +#else + #define MPU_MIN_SIZE_ALIGN + #define MPU_ALIGN(region_size) . = ALIGN(4) +#endif + +#if defined(CONFIG_XIP) + #define _DATA_IN_ROM __data_rom_start +#else + #define _DATA_IN_ROM +#endif + +OUTPUT_ARCH(arc) +ENTRY(CONFIG_KERNEL_ENTRY) + +MEMORY { +#ifdef FLASH_START + FLASH (rx) : ORIGIN = FLASH_START, LENGTH = FLASH_SIZE +#endif +#ifdef ICCM_START + ICCM (rwx) : ORIGIN = ICCM_START, LENGTH = ICCM_SIZE +#endif +#ifdef SRAM_START + SRAM (rwx) : ORIGIN = SRAM_START, LENGTH = SRAM_SIZE +#endif +#ifdef DCCM_START + DCCM (rw) : ORIGIN = DCCM_START, LENGTH = DCCM_SIZE +#endif + /* Used by and documented in include/linker/intlist.ld */ + IDT_LIST (wx) : ORIGIN = 0xFFFFF7FF, LENGTH = 2K +} + +SECTIONS { + +#include + + GROUP_START(ROMABLE_REGION) + + SECTION_PROLOGUE(_TEXT_SECTION_NAME,,ALIGN(1024)) { + _image_rom_start = .; + _image_text_start = .; + +/* Located in generated directory. This file is populated by the + * zephyr_linker_sources() Cmake function. + */ +#include + *(.text .text.*) + *(.gnu.linkonce.t.*) + + . = ALIGN(4); +#include + } GROUP_LINK_IN(ROMABLE_REGION) + + _image_text_end = .; + _image_rodata_start = .; + +#include + + SECTION_PROLOGUE(_RODATA_SECTION_NAME,,) { + KEEP(*(.openocd_dbg)) + KEEP(*(".openocd_dbg.*")) + *(".rodata") + *(".rodata.*") + *(.gnu.linkonce.r.*) + +/* Located in generated directory. This file is populated by the + * zephyr_linker_sources() Cmake function. + */ +#include + +#include + } GROUP_LINK_IN(ROMABLE_REGION) + +#ifdef __MWDT_LINKER_CMD__ +/* TODO: add mwdt specific ROM C++ sections */ +#else +#include +#endif /* __MWDT_LINKER_CMD__ */ + + _image_rodata_end = .; + MPU_ALIGN(_image_rodata_end - _image_rom_start); + _image_rom_end = .; + _image_rom_size = _image_rom_end - _image_rom_start; + + GROUP_END(ROMABLE_REGION) + + GROUP_START(RAMABLE_REGION) + +#include + +/* Located in generated directory. This file is populated by the + * zephyr_linker_sources() Cmake function. + */ +#include + +#if defined(CONFIG_USERSPACE) +#define APP_SHARED_ALIGN MPU_MIN_SIZE_ALIGN +#define SMEM_PARTITION_ALIGN MPU_ALIGN + +#include + + _image_ram_start = _app_smem_start; + _app_smem_size = _app_smem_end - _app_smem_start; + _app_smem_rom_start = LOADADDR(_APP_SMEM_SECTION_NAME); +#endif /* CONFIG_USERSPACE */ + + SECTION_DATA_PROLOGUE(_BSS_SECTION_NAME,(NOLOAD),) { + MPU_MIN_SIZE_ALIGN + /* + * For performance, BSS section is assumed to be 4 byte aligned and + * a multiple of 4 bytes + */ + . = ALIGN(4); + __bss_start = .; + _image_ram_start = .; + __kernel_ram_start = .; + *(".bss") + *(".bss.*") + *(COMMON) + *(".kernel_bss.*") + + /* + * BSP clears this memory in words only and doesn't clear any + * potential left over bytes. + */ + __bss_end = ALIGN(4); + } GROUP_DATA_LINK_IN(RAMABLE_REGION, RAMABLE_REGION) + +#include + + 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") + *(".data.*") + *(".kernel.*") + +/* Located in generated directory. This file is populated by the + * zephyr_linker_sources() Cmake function. + */ +#include + + } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) + + __data_rom_start = LOADADDR(_DATA_SECTION_NAME); + +#include +#include + +#ifdef __MWDT_LINKER_CMD__ +/* TODO: add mwdt specific RAM C++ sections */ +#else +#include +#endif /* __MWDT_LINKER_CMD__ */ + + __data_ram_end = .; + MPU_MIN_SIZE_ALIGN + /* Define linker symbols */ + _image_ram_end = .; + _end = .; /* end of image */ + + __kernel_ram_end = .; + __kernel_ram_size = __kernel_ram_end - __kernel_ram_start; + +#ifdef __MWDT_LINKER_CMD__ +/* mwdt requires _fstack, _estack which will be used in _stkchk. + * _stkchk is inserted by mwdt automatically, if _fstack, _estack is not + * set correctly, the brk_s instruction will be called + * here, we use a trick to deceive the compiler. + */ + _fstack = _image_ram_start; + _estack = .; +#endif /* __MWDT_LINKER_CMD__ */ + + GROUP_END(RAMABLE_REGION) + +/* Located in generated directory. This file is populated by the + * zephyr_linker_sources() Cmake function. + */ +#include + +#include + + SECTION_PROLOGUE(.ARC.attributes, 0,) { + KEEP(*(.ARC.attributes)) + KEEP(*(.gnu.attributes)) + } + + /DISCARD/ : { *(.note.GNU-stack) } +}