diff --git a/include/common/bl_common.ld.h b/include/common/bl_common.ld.h index 97fed72..208e3d6 100644 --- a/include/common/bl_common.ld.h +++ b/include/common/bl_common.ld.h @@ -101,12 +101,14 @@ __DATA_END__ = .; \ } +#if !(defined(IMAGE_BL31) && RECLAIM_INIT_CODE) #define STACK_SECTION \ stacks (NOLOAD) : { \ __STACKS_START__ = .; \ *(tzfw_normal_stacks) \ __STACKS_END__ = .; \ } +#endif /* * If BL doesn't use any bakery lock then __PERCPU_BAKERY_LOCK_SIZE__ diff --git a/include/plat/arm/common/arm_reclaim_init.ld.S b/include/plat/arm/common/arm_reclaim_init.ld.S index b5bf473..03976f3 100644 --- a/include/plat/arm/common/arm_reclaim_init.ld.S +++ b/include/plat/arm/common/arm_reclaim_init.ld.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -12,11 +12,7 @@ . = . + 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*) + *(*text.init*); __INIT_CODE_UNALIGNED__ = .; . = ALIGN(PAGE_SIZE); __INIT_CODE_END__ = .; @@ -32,4 +28,41 @@ } +#undef MIN +#define ABS ABSOLUTE +#define COUNT PLATFORM_CORE_COUNT +#define ALIGN_MASK ~(CACHE_WRITEBACK_GRANULE - 1) + +#define PRIMARY_STACK \ + __STACKS_START__ = .; \ + *(tzfw_normal_stacks) \ + OFFSET = ABS(SIZEOF(.init) - (. - __STACKS_START__)); \ + /* Offset sign */ \ + SIGN = ABS(OFFSET) & (1 << 63); \ + /* Offset mask */ \ + MASK = ABS(SIGN >> 63) - 1; \ + . += ABS(OFFSET) & ABS(MASK); \ + __STACKS_END__ = .; \ + /* Total stack size */ \ + SIZE = ABS(. - __STACKS_START__); \ + /* Maximum primary CPU stack */ \ + STACK = ABS(__STACKS_START__ + SIZE / COUNT) & ALIGN_MASK; \ + /* Primary CPU stack */ \ + __PRIMARY_STACK__ = MIN(STACK, ABS(__INIT_CODE_START__)); + +#if (COUNT > 1) +#define SECONDARY_STACK \ + /* Size of the secondary CPUs' stack */ \ + REST = ABS(__STACKS_END__ - __PRIMARY_STACK__); \ + /* Secondary per-CPU stack size */ \ + __STACK_SIZE__ = ABS(REST / (COUNT - 1)); +#else +#define SECONDARY_STACK +#endif + +#define STACK_SECTION \ + stacks (NOLOAD) : { \ + PRIMARY_STACK \ + SECONDARY_STACK \ + } #endif /* ARM_RECLAIM_INIT_LD_S */ diff --git a/plat/common/aarch64/platform_mp_stack.S b/plat/common/aarch64/platform_mp_stack.S index f9780e8..e2d71da 100644 --- a/plat/common/aarch64/platform_mp_stack.S +++ b/plat/common/aarch64/platform_mp_stack.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -32,9 +32,41 @@ * ----------------------------------------------------- */ func plat_get_my_stack - mov x10, x30 // lr +#if (defined(IMAGE_BL31) && RECLAIM_INIT_CODE) +#if (PLATFORM_CORE_COUNT == 1) + /* Single CPU */ + adrp x0, __PRIMARY_STACK__ + add x0, x0, :lo12:__PRIMARY_STACK__ + ret +#else + mov x10, x30 + bl plat_my_core_pos + cbnz x0, 2f + + /* Primary CPU */ + adrp x0, __PRIMARY_STACK__ + add x0, x0, :lo12:__PRIMARY_STACK__ + ret x10 + + /* Secondary CPU */ +2: sub x0, x0, #(PLATFORM_CORE_COUNT - 1) + adrp x1, __STACKS_END__ + adrp x2, __STACK_SIZE__ + add x1, x1, :lo12:__STACKS_END__ + add x2, x2, :lo12:__STACK_SIZE__ + + madd x0, x0, x2, x1 + bic x0, x0, #(CACHE_WRITEBACK_GRANULE - 1) + ret x10 +#endif + .word platform_normal_stacks + +#else /* !(IMAGE_BL31 && RECLAIM_INIT_CODE) */ + mov x10, x30 get_my_mp_stack platform_normal_stacks, PLATFORM_STACK_SIZE ret x10 + +#endif /* IMAGE_BL31 && RECLAIM_INIT_CODE */ endfunc plat_get_my_stack /* ----------------------------------------------------- @@ -45,14 +77,14 @@ * ----------------------------------------------------- */ func plat_set_my_stack - mov x9, x30 // lr + mov x9, x30 bl plat_get_my_stack mov sp, x0 ret x9 endfunc plat_set_my_stack /* ----------------------------------------------------- - * Per-cpu stacks in normal memory. Each cpu gets a + * Per-CPU stacks in normal memory. Each CPU gets a * stack of PLATFORM_STACK_SIZE bytes. * ----------------------------------------------------- */