1cb4adb0dSDaniel Boulby/* 2*34dd1e96SAlexei Fedorov * Copyright (c) 2017-2020, ARM Limited and Contributors. All rights reserved. 3cb4adb0dSDaniel Boulby * 4cb4adb0dSDaniel Boulby * SPDX-License-Identifier: BSD-3-Clause 5cb4adb0dSDaniel Boulby */ 6cb4adb0dSDaniel Boulby#ifndef ARM_RECLAIM_INIT_LD_S 7cb4adb0dSDaniel Boulby#define ARM_RECLAIM_INIT_LD_S 8cb4adb0dSDaniel Boulby 9cb4adb0dSDaniel BoulbySECTIONS 10cb4adb0dSDaniel Boulby{ 11cb4adb0dSDaniel Boulby .init __STACKS_START__ : { 12cb4adb0dSDaniel Boulby . = . + PLATFORM_STACK_SIZE; 13cb4adb0dSDaniel Boulby . = ALIGN(PAGE_SIZE); 14cb4adb0dSDaniel Boulby __INIT_CODE_START__ = .; 15*34dd1e96SAlexei Fedorov *(*text.init*); 16cb4adb0dSDaniel Boulby __INIT_CODE_UNALIGNED__ = .; 17cb4adb0dSDaniel Boulby . = ALIGN(PAGE_SIZE); 18cb4adb0dSDaniel Boulby __INIT_CODE_END__ = .; 19cb4adb0dSDaniel Boulby } >RAM 20cb4adb0dSDaniel Boulby 21cb4adb0dSDaniel Boulby#ifdef BL31_PROGBITS_LIMIT 22cb4adb0dSDaniel Boulby ASSERT(__INIT_CODE_END__ <= BL31_PROGBITS_LIMIT, 23cb4adb0dSDaniel Boulby "BL31 init has exceeded progbits limit.") 24cb4adb0dSDaniel Boulby#endif 25cb4adb0dSDaniel Boulby 26cb4adb0dSDaniel Boulby ASSERT(__INIT_CODE_END__ <= __STACKS_END__, 27cb4adb0dSDaniel Boulby "Init code ends past the end of the stacks") 28a71c59d5SAmbroise Vincent 29cb4adb0dSDaniel Boulby} 30cb4adb0dSDaniel Boulby 31*34dd1e96SAlexei Fedorov#undef MIN 32*34dd1e96SAlexei Fedorov#define ABS ABSOLUTE 33*34dd1e96SAlexei Fedorov#define COUNT PLATFORM_CORE_COUNT 34*34dd1e96SAlexei Fedorov#define ALIGN_MASK ~(CACHE_WRITEBACK_GRANULE - 1) 35*34dd1e96SAlexei Fedorov 36*34dd1e96SAlexei Fedorov#define PRIMARY_STACK \ 37*34dd1e96SAlexei Fedorov __STACKS_START__ = .; \ 38*34dd1e96SAlexei Fedorov *(tzfw_normal_stacks) \ 39*34dd1e96SAlexei Fedorov OFFSET = ABS(SIZEOF(.init) - (. - __STACKS_START__)); \ 40*34dd1e96SAlexei Fedorov /* Offset sign */ \ 41*34dd1e96SAlexei Fedorov SIGN = ABS(OFFSET) & (1 << 63); \ 42*34dd1e96SAlexei Fedorov /* Offset mask */ \ 43*34dd1e96SAlexei Fedorov MASK = ABS(SIGN >> 63) - 1; \ 44*34dd1e96SAlexei Fedorov . += ABS(OFFSET) & ABS(MASK); \ 45*34dd1e96SAlexei Fedorov __STACKS_END__ = .; \ 46*34dd1e96SAlexei Fedorov /* Total stack size */ \ 47*34dd1e96SAlexei Fedorov SIZE = ABS(. - __STACKS_START__); \ 48*34dd1e96SAlexei Fedorov /* Maximum primary CPU stack */ \ 49*34dd1e96SAlexei Fedorov STACK = ABS(__STACKS_START__ + SIZE / COUNT) & ALIGN_MASK; \ 50*34dd1e96SAlexei Fedorov /* Primary CPU stack */ \ 51*34dd1e96SAlexei Fedorov __PRIMARY_STACK__ = MIN(STACK, ABS(__INIT_CODE_START__)); 52*34dd1e96SAlexei Fedorov 53*34dd1e96SAlexei Fedorov#if (COUNT > 1) 54*34dd1e96SAlexei Fedorov#define SECONDARY_STACK \ 55*34dd1e96SAlexei Fedorov /* Size of the secondary CPUs' stack */ \ 56*34dd1e96SAlexei Fedorov REST = ABS(__STACKS_END__ - __PRIMARY_STACK__); \ 57*34dd1e96SAlexei Fedorov /* Secondary per-CPU stack size */ \ 58*34dd1e96SAlexei Fedorov __STACK_SIZE__ = ABS(REST / (COUNT - 1)); 59*34dd1e96SAlexei Fedorov#else 60*34dd1e96SAlexei Fedorov#define SECONDARY_STACK 61*34dd1e96SAlexei Fedorov#endif 62*34dd1e96SAlexei Fedorov 63*34dd1e96SAlexei Fedorov#define STACK_SECTION \ 64*34dd1e96SAlexei Fedorov stacks (NOLOAD) : { \ 65*34dd1e96SAlexei Fedorov PRIMARY_STACK \ 66*34dd1e96SAlexei Fedorov SECONDARY_STACK \ 67*34dd1e96SAlexei Fedorov } 68cb4adb0dSDaniel Boulby#endif /* ARM_RECLAIM_INIT_LD_S */ 69