| /* |
| * Copyright (c) 2017-2020, 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__ = .; |
| *(*text.init*); |
| __INIT_CODE_END__ = .; |
| } >RAM |
| |
| #ifdef BL31_PROGBITS_LIMIT |
| ASSERT(__INIT_CODE_END__ <= BL31_PROGBITS_LIMIT, |
| "BL31 init has exceeded progbits limit.") |
| #endif |
| |
| ASSERT(__INIT_CODE_END__ <= __STACKS_END__, |
| "Init code ends past the end of the stacks") |
| |
| } |
| |
| #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); \ |
| . = ALIGN(PAGE_SIZE); \ |
| __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 */ |