mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-20 19:44:23 +00:00
FVP: Reclaim init code for the stack
Map the initialization code for BL31 to overlap with the memory required for the secondary cores stack. Once BL31 has been initialized the memory can be remapped to RW data so that it can be used for secondary cores stacks. By moving code from .text to .text.init the size of the BL31 image is decreased by a page. Split arm_common.ld.S into two linker scripts, one for tzc_dram (arm_tzc_dram.ld.S) and one for reclaiming initialization code (arm_reclaim_init.ld.S) so that platforms can chose which memory regions they wish to include. Change-Id: I648e88f3eda1aa71765744cf34343ecda9320b32 Signed-off-by: Daniel Boulby <daniel.boulby@arm.com>
This commit is contained in:
parent
c9263e62a7
commit
cb4adb0d8c
9 changed files with 100 additions and 6 deletions
|
@ -280,7 +280,7 @@
|
||||||
* The max number of regions like RO(code), coherent and data required by
|
* The max number of regions like RO(code), coherent and data required by
|
||||||
* different BL stages which need to be mapped in the MMU.
|
* different BL stages which need to be mapped in the MMU.
|
||||||
*/
|
*/
|
||||||
# define ARM_BL_REGIONS 4
|
#define ARM_BL_REGIONS 5
|
||||||
|
|
||||||
#define MAX_MMAP_REGIONS (PLAT_ARM_MMAP_ENTRIES + \
|
#define MAX_MMAP_REGIONS (PLAT_ARM_MMAP_ENTRIES + \
|
||||||
ARM_BL_REGIONS)
|
ARM_BL_REGIONS)
|
||||||
|
|
36
include/plat/arm/common/arm_reclaim_init.ld.S
Normal file
36
include/plat/arm/common/arm_reclaim_init.ld.S
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
#ifndef ARM_RECLAIM_INIT_LD_S
|
||||||
|
#define ARM_RECLAIM_INIT_LD_S
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.init __STACKS_START__ : {
|
||||||
|
. = . + PLATFORM_STACK_SIZE;
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
__INIT_CODE_START__ = .;
|
||||||
|
/*
|
||||||
|
* Exclude PSCI initialization functions to ensure the init section
|
||||||
|
* does not become larger than the overlaid stack region
|
||||||
|
*/
|
||||||
|
*(EXCLUDE_FILE (*psci_setup.o).text.init*)
|
||||||
|
__INIT_CODE_UNALIGNED__ = .;
|
||||||
|
. = ALIGN(PAGE_SIZE);
|
||||||
|
__INIT_CODE_END__ = .;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
#ifdef BL31_PROGBITS_LIMIT
|
||||||
|
ASSERT(__INIT_CODE_END__ <= BL31_PROGBITS_LIMIT,
|
||||||
|
"BL31 init has exceeded progbits limit.")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if RECLAIM_INIT_CODE
|
||||||
|
ASSERT(__INIT_CODE_END__ <= __STACKS_END__,
|
||||||
|
"Init code ends past the end of the stacks")
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ARM_RECLAIM_INIT_LD_S */
|
|
@ -3,8 +3,8 @@
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
#ifndef __ARM_COMMON_LD_S__
|
#ifndef ARM_TZC_DRAM_LD_S__
|
||||||
#define __ARM_COMMON_LD_S__
|
#define ARM_TZC_DRAM_LD_S__
|
||||||
|
|
||||||
#include <xlat_tables_defs.h>
|
#include <xlat_tables_defs.h>
|
||||||
|
|
||||||
|
@ -27,4 +27,4 @@ SECTIONS
|
||||||
} >EL3_SEC_DRAM
|
} >EL3_SEC_DRAM
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __ARM_COMMON_LD_S__ */
|
#endif /* ARM_TZC_DRAM_LD_S__ */
|
|
@ -220,6 +220,12 @@ void arm_bl2_dyn_cfg_init(void);
|
||||||
void arm_bl1_set_mbedtls_heap(void);
|
void arm_bl1_set_mbedtls_heap(void);
|
||||||
int arm_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
|
int arm_get_mbedtls_heap(void **heap_addr, size_t *heap_size);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Free the memory storing initialization code only used during an images boot
|
||||||
|
* time so it can be reclaimed for runtime data
|
||||||
|
*/
|
||||||
|
void arm_free_init_memory(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mandatory functions required in ARM standard platforms
|
* Mandatory functions required in ARM standard platforms
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#ifndef __PLAT_LD_S__
|
#ifndef __PLAT_LD_S__
|
||||||
#define __PLAT_LD_S__
|
#define __PLAT_LD_S__
|
||||||
|
|
||||||
#include <arm_common.ld.S>
|
#include <arm_tzc_dram.ld.S>
|
||||||
|
#include <arm_reclaim_init.ld.S>
|
||||||
|
|
||||||
#endif /* __PLAT_LD_S__ */
|
#endif /* __PLAT_LD_S__ */
|
||||||
|
|
|
@ -201,6 +201,9 @@ ENABLE_AMU := 1
|
||||||
# Enable dynamic mitigation support by default
|
# Enable dynamic mitigation support by default
|
||||||
DYNAMIC_WORKAROUND_CVE_2018_3639 := 1
|
DYNAMIC_WORKAROUND_CVE_2018_3639 := 1
|
||||||
|
|
||||||
|
# Enable reclaiming of BL31 initialisation code for secondary cores stacks for FVP
|
||||||
|
RECLAIM_INIT_CODE := 1
|
||||||
|
|
||||||
ifeq (${ENABLE_AMU},1)
|
ifeq (${ENABLE_AMU},1)
|
||||||
BL31_SOURCES += lib/cpus/aarch64/cortex_a75_pubsub.c \
|
BL31_SOURCES += lib/cpus/aarch64/cortex_a75_pubsub.c \
|
||||||
lib/cpus/aarch64/cortex_ares_pubsub.c \
|
lib/cpus/aarch64/cortex_ares_pubsub.c \
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
#include <plat_arm.h>
|
#include <plat_arm.h>
|
||||||
#include <platform.h>
|
#include <platform.h>
|
||||||
#include <ras.h>
|
#include <ras.h>
|
||||||
|
#include <utils.h>
|
||||||
|
#include <arm_xlat_tables.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Placeholder variables for copying the arguments that have been passed to
|
* Placeholder variables for copying the arguments that have been passed to
|
||||||
|
@ -39,6 +41,16 @@ CASSERT(BL31_BASE >= ARM_TB_FW_CONFIG_LIMIT, assert_bl31_base_overflows);
|
||||||
BL31_BASE, \
|
BL31_BASE, \
|
||||||
BL31_END - BL31_BASE, \
|
BL31_END - BL31_BASE, \
|
||||||
MT_MEMORY | MT_RW | MT_SECURE)
|
MT_MEMORY | MT_RW | MT_SECURE)
|
||||||
|
#if RECLAIM_INIT_CODE
|
||||||
|
IMPORT_SYM(unsigned long, __INIT_CODE_START__, BL_INIT_CODE_BASE);
|
||||||
|
IMPORT_SYM(unsigned long, __INIT_CODE_END__, BL_INIT_CODE_END);
|
||||||
|
|
||||||
|
#define MAP_BL_INIT_CODE MAP_REGION_FLAT( \
|
||||||
|
BL_INIT_CODE_BASE, \
|
||||||
|
BL_INIT_CODE_END \
|
||||||
|
- BL_INIT_CODE_BASE, \
|
||||||
|
MT_CODE | MT_SECURE)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Return a pointer to the 'entry_point_info' structure of the next image for the
|
* Return a pointer to the 'entry_point_info' structure of the next image for the
|
||||||
|
@ -233,8 +245,29 @@ void arm_bl31_plat_runtime_setup(void)
|
||||||
|
|
||||||
/* Initialize the runtime console */
|
/* Initialize the runtime console */
|
||||||
arm_console_runtime_init();
|
arm_console_runtime_init();
|
||||||
|
#if RECLAIM_INIT_CODE
|
||||||
|
arm_free_init_memory();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if RECLAIM_INIT_CODE
|
||||||
|
/*
|
||||||
|
* Zero out and make RW memory used to store image boot time code so it can
|
||||||
|
* be reclaimed during runtime
|
||||||
|
*/
|
||||||
|
void arm_free_init_memory(void)
|
||||||
|
{
|
||||||
|
int ret = xlat_change_mem_attributes(BL_INIT_CODE_BASE,
|
||||||
|
BL_INIT_CODE_END - BL_INIT_CODE_BASE,
|
||||||
|
MT_RW_DATA);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
ERROR("Could not reclaim initialization code");
|
||||||
|
panic();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init bl31_platform_setup(void)
|
void __init bl31_platform_setup(void)
|
||||||
{
|
{
|
||||||
arm_bl31_platform_setup();
|
arm_bl31_platform_setup();
|
||||||
|
@ -255,6 +288,9 @@ void __init arm_bl31_plat_arch_setup(void)
|
||||||
{
|
{
|
||||||
const mmap_region_t bl_regions[] = {
|
const mmap_region_t bl_regions[] = {
|
||||||
MAP_BL31_TOTAL,
|
MAP_BL31_TOTAL,
|
||||||
|
#if RECLAIM_INIT_CODE
|
||||||
|
MAP_BL_INIT_CODE,
|
||||||
|
#endif
|
||||||
ARM_MAP_BL_RO,
|
ARM_MAP_BL_RO,
|
||||||
#if USE_ROMLIB
|
#if USE_ROMLIB
|
||||||
ARM_MAP_ROMLIB_CODE,
|
ARM_MAP_ROMLIB_CODE,
|
||||||
|
|
|
@ -38,6 +38,7 @@ void arm_setup_romlib(void)
|
||||||
* as an array specifying the generic memory regions which can be;
|
* as an array specifying the generic memory regions which can be;
|
||||||
* - Code section;
|
* - Code section;
|
||||||
* - Read-only data section;
|
* - Read-only data section;
|
||||||
|
* - Init code section, if applicable
|
||||||
* - Coherent memory region, if applicable.
|
* - Coherent memory region, if applicable.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -273,3 +273,14 @@ endif
|
||||||
include ${IMG_PARSER_LIB_MK}
|
include ${IMG_PARSER_LIB_MK}
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# RECLAIM_INIT_CODE can only be set when LOAD_IMAGE_V2=2 and xlat tables v2
|
||||||
|
# are used
|
||||||
|
ifeq (${RECLAIM_INIT_CODE}, 1)
|
||||||
|
ifeq (${LOAD_IMAGE_V2}, 0)
|
||||||
|
$(error "LOAD_IMAGE_V2 must be enabled to use RECLAIM_INIT_CODE")
|
||||||
|
endif
|
||||||
|
ifeq (${ARM_XLAT_TABLES_LIB_V1}, 1)
|
||||||
|
$(error "To reclaim init code xlat tables v2 must be used")
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue