aboutsummaryrefslogtreecommitdiffstats
path: root/plat/common
diff options
context:
space:
mode:
Diffstat (limited to 'plat/common')
-rw-r--r--plat/common/aarch64/platform_mp_stack.S40
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.
* -----------------------------------------------------
*/