diff options
Diffstat (limited to 'plat/common')
-rw-r--r-- | plat/common/aarch64/platform_mp_stack.S | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/plat/common/aarch64/platform_mp_stack.S b/plat/common/aarch64/platform_mp_stack.S index f9780e80c..e2d71da7a 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 @@ endfunc plat_get_my_stack * ----------------------------------------------------- */ 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. * ----------------------------------------------------- */ |