diff options
author | Alexei Fedorov <Alexei.Fedorov@arm.com> | 2020-07-17 17:03:25 +0100 |
---|---|---|
committer | Alexei Fedorov <Alexei.Fedorov@arm.com> | 2020-07-23 12:57:40 +0100 |
commit | 86c3e442ab0a53ed10f433153f68f93830687bc6 (patch) | |
tree | 1e8456f80c2b0a5db69abd07284418085bbb4ca7 /lib | |
parent | ec87d759429e9496947aa917e012f85e98d9d5fa (diff) |
TFTF: Fix Aarch32 zeromem() function
This patch fixes the following bugs in zeromem() Aarch32 variant:
- Removed ASM_ASSERT for length parameter passed in R1 register.
This is causing assertion in tftf_entrypoint() code
ldr r0, =__BSS_START__
ldr r1, =__BSS_SIZE__
bl zeromem
when __BSS_SIZE__ is not 4-byte aligned:
0x000000000000cced __BSS_SIZE__ = SIZEOF (.bss)
- With ENABLE_ASSERTIONS = 0 for RELEASE builds and R1 not 4-bytes
aligned zeromem() was writing 0 into all the memory in infinite
z_loop, because of the code:
z_loop:
cmp r2, r0
beq z_end
str r1, [r0], #4
b z_loop
with R0 being increased by 4 on each step and R2 = R0 condition
would never be met.
- BLT instruction was used for 'unsigned int length' value in R1
changed to BLO.
This patch also fixes BLO instruction bug in 'memcpy4()' and function
itself is optimised.
Signed-off-by: Alexei Fedorov <Alexei.Fedorov@arm.com>
Change-Id: I8128399681def8ba80241882e355c3ca2778605f
Diffstat (limited to 'lib')
-rw-r--r-- | lib/aarch32/misc_helpers.S | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/lib/aarch32/misc_helpers.S b/lib/aarch32/misc_helpers.S index ab37be9..6cabea2 100644 --- a/lib/aarch32/misc_helpers.S +++ b/lib/aarch32/misc_helpers.S @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Arm Limited. All rights reserved. + * Copyright (c) 2018-2020, Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -16,24 +16,29 @@ * void zeromem(void *mem, unsigned int length); * * Initialise a memory region to 0. - * The memory address and length must be 4-byte aligned. + * The memory address must be 4-byte aligned. * ----------------------------------------------------------------------- */ func zeromem #if ENABLE_ASSERTIONS tst r0, #0x3 ASM_ASSERT(eq) - tst r1, #0x3 - ASM_ASSERT(eq) #endif - add r2, r0, r1 - mov r1, #0 -z_loop: - cmp r2, r0 - beq z_end - str r1, [r0], #4 - b z_loop -z_end: + mov r2, #0 +/* zero 4 bytes at a time */ +z_loop4: + cmp r1, #4 + blo z_loop1 + str r2, [r0], #4 + subs r1, r1, #4 + bne z_loop4 + bx lr + +/* zero byte per byte */ +z_loop1: + strb r2, [r0], #1 + subs r1, r1, #1 + bne z_loop1 bx lr endfunc zeromem @@ -54,20 +59,19 @@ func memcpy4 /* copy 4 bytes at a time */ m_loop4: cmp r2, #4 - blt m_loop1 + blo m_loop1 ldr r3, [r1], #4 str r3, [r0], #4 - sub r2, r2, #4 - b m_loop4 + subs r2, r2, #4 + bne m_loop4 + bx lr + /* copy byte per byte */ m_loop1: - cmp r2,#0 - beq m_end ldrb r3, [r1], #1 strb r3, [r0], #1 subs r2, r2, #1 bne m_loop1 -m_end: bx lr endfunc memcpy4 |