diff options
author | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-03-20 10:48:23 +0000 |
---|---|---|
committer | Andrew Thoelke <andrew.thoelke@arm.com> | 2014-04-15 15:49:29 +0100 |
commit | 2bf28e620a6f05700753a2b45a888c6623e20723 (patch) | |
tree | c35374e36508ddf0c10324e9b511c983655213e4 /include | |
parent | 9c2c763d22469b0f73d76469442b474c08497e7a (diff) |
Allocate single stacks for BL1 and BL2
The BL images share common stack management code which provides
one coherent and one cacheable stack for every CPU. BL1 and BL2
just execute on the primary CPU during boot and do not require
the additional CPU stacks. This patch provides separate stack
support code for UP and MP images, substantially reducing the
RAM usage for BL1 and BL2 for the FVP platform.
This patch also provides macros for declaring stacks and
calculating stack base addresses to improve consistency where
this has to be done in the firmware.
The stack allocation source files are now included via
platform.mk rather than the common BLx makefiles. This allows
each platform to select the appropriate MP/UP stack support
for each BL image.
Each platform makefile must be updated when including this
commit.
Fixes ARM-software/tf-issues#76
Change-Id: Ia251f61b8148ffa73eae3f3711f57b1ffebfa632
Diffstat (limited to 'include')
-rw-r--r-- | include/asm_macros.S | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/include/asm_macros.S b/include/asm_macros.S index 135c11a6..8bcb7d28 100644 --- a/include/asm_macros.S +++ b/include/asm_macros.S @@ -91,3 +91,43 @@ .type \_name, %function \_name: .endm + + /* + * This macro declares an array of 1 or more stacks, properly + * aligned and in the requested section + */ +#define STACK_ALIGN 6 + + .macro declare_stack _name, _section, _size, _count + .if ((\_size & ((1 << STACK_ALIGN) - 1)) <> 0) + .error "Stack size not correctly aligned" + .endif + .section \_section, "aw", %nobits + .align STACK_ALIGN + \_name: + .space ((\_count) * (\_size)), 0 + .endm + + /* + * This macro calculates the base address of an MP stack using the + * platform_get_core_pos() index, the name of the stack storage and + * the size of each stack + * In: X0 = MPIDR of CPU whose stack is wanted + * Out: X0 = physical address of stack base + * Clobber: X30, X1, X2 + */ + .macro get_mp_stack _name, _size + bl platform_get_core_pos + ldr x2, =(\_name + \_size) + mov x1, #\_size + madd x0, x0, x1, x2 + .endm + + /* + * This macro calculates the base address of a UP stack using the + * name of the stack storage and the size of the stack + * Out: X0 = physical address of stack base + */ + .macro get_up_stack _name, _size + ldr x0, =(\_name + \_size) + .endm |