diff options
author | Sandrine Bailleux <sandrine.bailleux@arm.com> | 2013-11-28 09:43:06 +0000 |
---|---|---|
committer | Dan Handley <dan.handley@arm.com> | 2013-12-05 11:33:15 +0000 |
commit | 65f546a14fbc0438c051b4243f71abd2206a7307 (patch) | |
tree | 1187ac9d3eb596ecb61ac4568969041392764a14 /lib | |
parent | 8d69a03f6a7db3c437b7cfdd15402627277d8cb4 (diff) |
Properly initialise the C runtime environment
This patch makes sure the C runtime environment is properly
initialised before executing any C code.
- Zero-initialise NOBITS sections (e.g. the bss section).
- Relocate BL1 data from ROM to RAM.
Change-Id: I0da81b417b2f0d1f7ef667cc5131b1e47e22571f
Diffstat (limited to 'lib')
-rw-r--r-- | lib/arch/aarch64/misc_helpers.S | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/arch/aarch64/misc_helpers.S b/lib/arch/aarch64/misc_helpers.S index 05e90f95..e36fdfa8 100644 --- a/lib/arch/aarch64/misc_helpers.S +++ b/lib/arch/aarch64/misc_helpers.S @@ -75,6 +75,8 @@ .globl eret .globl smc + .globl zeromem16 + .globl memcpy16 .section .text, "ax" @@ -285,3 +287,54 @@ eret:; .type eret, %function smc:; .type smc, %function smc #0 + +/* ----------------------------------------------------------------------- + * void zeromem16(void *mem, unsigned int length); + * + * Initialise a memory region to 0. + * The memory address must be 16-byte aligned. + * ----------------------------------------------------------------------- + */ +zeromem16: + add x2, x0, x1 +/* zero 16 bytes at a time */ +z_loop16: + sub x3, x2, x0 + cmp x3, #16 + b.lt z_loop1 + stp xzr, xzr, [x0], #16 + b z_loop16 +/* zero byte per byte */ +z_loop1: + cmp x0, x2 + b.eq z_end + strb wzr, [x0], #1 + b z_loop1 +z_end: ret + + +/* -------------------------------------------------------------------------- + * void memcpy16(void *dest, const void *src, unsigned int length) + * + * Copy length bytes from memory area src to memory area dest. + * The memory areas should not overlap. + * Destination and source addresses must be 16-byte aligned. + * -------------------------------------------------------------------------- + */ +memcpy16: +/* copy 16 bytes at a time */ +m_loop16: + cmp x2, #16 + b.lt m_loop1 + ldp x3, x4, [x1], #16 + stp x3, x4, [x0], #16 + sub x2, x2, #16 + b m_loop16 +/* copy byte per byte */ +m_loop1: + cbz x2, m_end + ldrb w3, [x1], #1 + strb w3, [x0], #1 + subs x2, x2, #1 + b.ne m_loop1 +m_end: ret |