diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/src/armv7-m/ld.S | 79 | ||||
-rw-r--r-- | arch/src/armv7-m/scatter.S | 75 | ||||
-rw-r--r-- | arch/src/armv7-m/scatter.h | 76 |
3 files changed, 78 insertions, 152 deletions
diff --git a/arch/src/armv7-m/ld.S b/arch/src/armv7-m/ld.S index 79a89296..7a36de0b 100644 --- a/arch/src/armv7-m/ld.S +++ b/arch/src/armv7-m/ld.S @@ -6,86 +6,9 @@ * * Description: * GNU LD linker script. - * - * There are three supported memory layouts for the ARMv7-M architecture: - * - * Layout 1 - Single region: - * - All sections are placed in one contiguous region. - * - This layout uses only the mem0 memory region. - * - The memory is considered RXW by the linker, but the sections can be - * configured later on with different attributes using the MPU. - * - The main stack is placed at the end of mem0. - * - This layout is mainly used by second-stage firmware that is loaded directly - * into a single RAM. - * - * Layout 2 - Dual region with relocation: - * - One region is used for .text and .data (storage). - * - A second region is used for the remaining sections. - * - This layout uses memory regions mem0 and mem1 as the first and second - * regions, respectively. - * - The main stack is placed at the end of mem1. - * - This layout is mainly used by ROM firmware which uses part of the RAM for - * the data sections. - * - * Layout 3 - Dual region without relocation - * - One region is used only for the .text section. - * - A second region is used for all data sections. - * - This layout uses memory regions mem0 and mem1 as the first and second - * regions, respectively. - * - The main stack is placed at the end of mem1. - * - The main difference from layout 2 is that there is no relocation of the - * .data section. - * - This layout is mainly used by second-stage firmware loaded directly into - * two RAM regions. One of the RAM regions is attached to the instruction bus, - * which improves the performance as data and instruction accesses are - * independent. - * - */ - -#define FWK_MEM_MODE_INVALID 0 -#define FWK_MEM_MODE_SINGLE_REGION 1 -#define FWK_MEM_MODE_DUAL_REGION_RELOCATION 2 -#define FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION 3 - -#include <fmw_memory.ld.S> - -/* Align the stack on an 8-byte boundary as CCR.STKALIGN is enabled */ -#define STACK_ALIGNMENT 8 - -/* Align the heap on a 4-byte boundary to avoid unaligned accesses */ -#define HEAP_ALIGNMENT 4 - -/* - * Input validation */ -#ifndef FIRMWARE_MEM_MODE - #error "FIRMWARE_MEM_MODE has not been configured" -#endif - -#ifndef FIRMWARE_MEM0_BASE - #error "FIRMWARE_MEM0_BASE has not been configured" -#endif - -#ifndef FIRMWARE_MEM0_SIZE - #error "FIRMWARE_MEM0_SIZE has not been configured" -#endif - -#if ((FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION) && \ - (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_RELOCATION) && \ - (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION)) - #error "FIRMWARE_MEM_MODE has been configured improperly" -#endif - -#if FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION - #ifndef FIRMWARE_MEM1_BASE - #error "FIRMWARE_MEM1_BASE has not been configured" - #endif - - #ifndef FIRMWARE_MEM1_SIZE - #error "FIRMWARE_MEM1_SIZE has not been configured" - #endif -#endif +#include "scatter.h" ENTRY(arm_exception_reset) diff --git a/arch/src/armv7-m/scatter.S b/arch/src/armv7-m/scatter.S index 4c03e616..a484776d 100644 --- a/arch/src/armv7-m/scatter.S +++ b/arch/src/armv7-m/scatter.S @@ -6,82 +6,9 @@ * * Description: * Arm Compiler 6 scatter file. - * - * There are three supported memory layouts for the ARMv7-M architecture: - * - * Layout 1 - Single region: - * - All sections are placed in one contiguous region. - * - This layout uses only the mem0 memory region. - * - The memory is considered RXW by the linker, but the sections can be - * configured later on with different attributes using the MPU. - * - The main stack is placed at the end of mem0. - * - This layout is mainly used by second-stage firmware that is loaded directly - * into a single RAM. - * - * Layout 2 - Dual region with relocation: - * - One region is used for .text and .data (storage). - * - A second region is used for the remaining sections. - * - This layout uses memory regions mem0 and mem1 as the first and second - * regions, respectively. - * - The main stack is placed at the end of mem1. - * - This layout is mainly used by ROM firmware which uses part of the RAM for - * the data sections. - * - * Layout 3 - Dual region without relocation - * - One region is used only for the .text section. - * - A second region is used for all data sections. - * - This layout uses memory regions mem0 and mem1 as the first and second - * regions, respectively. - * - The main stack is placed at the end of mem1. - * - The main difference from layout 2 is that there is no relocation of the - * .data section. - * - This layout is mainly used by second-stage firmware loaded directly into - * two RAM regions. One of the RAM regions is attached to the instruction bus, - * which improves the performance as data and instruction accesses are - * independent. - * */ -#define FWK_MEM_MODE_INVALID 0 -#define FWK_MEM_MODE_SINGLE_REGION 1 -#define FWK_MEM_MODE_DUAL_REGION_RELOCATION 2 -#define FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION 3 - -#include <fmw_memory.ld.S> - -/* - * Input validation - */ - -#ifndef FIRMWARE_MEM_MODE - #error "FIRMWARE_MEM_MODE has not been configured" -#endif - -#ifndef FIRMWARE_MEM0_BASE - #error "FIRMWARE_MEM0_BASE has not been configured" -#endif - -#ifndef FIRMWARE_MEM0_SIZE - #error "FIRMWARE_MEM0_SIZE has not been configured" -#endif - -#if ((FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION) && \ - (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_RELOCATION) && \ - (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION)) - #error "FIRMWARE_MEM_MODE has been configured improperly" -#endif - -#if FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION - #ifndef FIRMWARE_MEM1_BASE - #error "FIRMWARE_MEM1_BASE has not been configured" - #endif - - #ifndef FIRMWARE_MEM1_SIZE - #error "FIRMWARE_MEM1_SIZE has not been configured" - #endif -#endif - -#define FIRMWARE_MEM0_LIMIT (FIRMWARE_MEM0_BASE + FIRMWARE_MEM0_SIZE) +#include "scatter.h" #if FIRMWARE_MEM_MODE == FWK_MEM_MODE_SINGLE_REGION #define FIRMWARE_MEM1_BASE +0 diff --git a/arch/src/armv7-m/scatter.h b/arch/src/armv7-m/scatter.h new file mode 100644 index 00000000..e0cdaba2 --- /dev/null +++ b/arch/src/armv7-m/scatter.h @@ -0,0 +1,76 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2015-2018, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + * + * Description: + * Common linker script configuration options. + * + * There are three supported memory layouts for the ARMv7-M architecture: + * + * Layout 1 - Single region: + * This layout uses a single read/write/execute memory region for all data. + * This is traditionally used by firmware running from a general-purpose + * RAM region. In this configuration MEM0 represents the RAM region, and + * MEM1 is unused. + * + * Layout 2 - Dual region with relocation: + * This layout uses a read/execute memory region for read-only and + * executable data, and a write memory region for writable data. This is + * traditionally used by firmware running from a ROM region. In this + * configuration MEM0 represents the ROM region and MEM1 represents the RAM + * region. + * + * Layout 3 - Dual region without relocation: + * This layout uses an execute memory region for executable data, and a + * read/write memory region for writable data. This is traditionally used + * by firmware running from a RAM region attached to the instruction bus. + * In this configuration MEM0 represents the RAM region attached to the + * instruction bus and MEM1 represents the RAM region attached to the data + * bus. + */ + +#define FWK_MEM_MODE_SINGLE_REGION 0 +#define FWK_MEM_MODE_DUAL_REGION_RELOCATION 1 +#define FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION 2 + +#include <fmw_memory.ld.S> + +#ifndef FIRMWARE_MEM_MODE + #error "FIRMWARE_MEM_MODE has not been configured" +#endif + +#if (FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION) && \ + (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_RELOCATION) && \ + (FIRMWARE_MEM_MODE != FWK_MEM_MODE_DUAL_REGION_NO_RELOCATION) + #error "FIRMWARE_MEM_MODE has been configured improperly" +#endif + +#ifndef FIRMWARE_MEM0_BASE + #error "FIRMWARE_MEM0_BASE has not been configured" +#endif + +#ifndef FIRMWARE_MEM0_SIZE + #error "FIRMWARE_MEM0_SIZE has not been configured" +#endif + +#define FIRMWARE_MEM0_LIMIT (FIRMWARE_MEM0_BASE + FIRMWARE_MEM0_SIZE) + +#if FIRMWARE_MEM_MODE != FWK_MEM_MODE_SINGLE_REGION + #ifndef FIRMWARE_MEM1_BASE + #error "FIRMWARE_MEM1_BASE has not been configured" + #endif + + #ifndef FIRMWARE_MEM1_SIZE + #error "FIRMWARE_MEM1_SIZE has not been configured" + #endif + + #define FIRMWARE_MEM1_LIMIT (FIRMWARE_MEM1_BASE + FIRMWARE_MEM1_SIZE) +#endif + +/* Alignment of the heap */ +#define HEAP_ALIGNMENT 4 + +/* Alignment of the stack (CCR.STKALIGN is enabled) */ +#define STACK_ALIGNMENT 8 |