__user_setup_stackheap()
__user_setup_stackheap()
sets up and returns the locations of the initial stack and heap.
If you define this function, it is called by the C library during program start-up.
When __user_setup_stackheap()
is called, sp
has
the same value it had on entry to the application. If this was set
to a valid value before calling the C library initialization code,
it can be left at this value. If sp
is not valid, __user_setup_stackheap()
must
change this value before using any stack and before returning.
__user_setup_stackheap()
returns the:
- Heap base, if the program uses the heap.
- In AArch32 state, register R0 contains the heap base.
- In AArch64 state, register X0 contains the heap base.
-
Stack base in
sp
. - Heap limit, if the program uses the heap and uses two-region memory.
- In AArch32 state, register R2 contains the heap limit.
- In AArch64 state, register X2 contains the heap limit.
If this function is re-implemented, it must:
- Preserve the registers required by the PCS, except for SP.
- Ensure alignment of the heap:
- In AArch32 state, maintain 8-byte alignment of the heap by ensuring that the heap base is a multiple of 8.
- In AArch64 state, maintain 16-byte alignment of the heap by ensuring that the heap base is a multiple of 16.
To create a version of __user_setup_stackheap()
that inherits sp
from
the execution environment and does not have a heap:
- In AArch32 state, set
r0
andr2
to zero and return. - In AArch64 state, set
x0
andx2
to zero and return.
There is no limit to the size of the stack. However, if the
heap region grows into the stack, malloc()
attempts
to detect the overlapping memory and fails the new memory allocation request.
Note
Any re-implementation of__user_setup_stackheap()
must
be in assembler.