From 284fb5c811fb7784ee3afa753dbdf5b389c4cdce Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Tue, 11 Nov 2014 00:52:11 +0000 Subject: [PATCH] ArmPkg/CompilerIntrinsicesLib: Fixed memmove() and memset() - Fixed memmove when going backward: the copy started one byte after the end of the region to copy - memset: - removed unused register - fixed arguments size and character arguments were actually reversed - Added memmove() to ARM32 GCC Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16328 6f19259b-4bc3-4df7-8a09-765794883524 --- .../CompilerIntrinsicsLib/Arm/memmove.S | 48 +++++++++++++++++++ .../CompilerIntrinsicsLib/Arm/memmove.asm | 21 ++++---- .../CompilerIntrinsicsLib/Arm/memset.S | 28 +++++------ .../CompilerIntrinsicsLib/Arm/memset.asm | 39 ++++++--------- .../CompilerIntrinsicsLib.inf | 1 + 5 files changed, 88 insertions(+), 49 deletions(-) create mode 100644 ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S new file mode 100644 index 0000000000..79f95b007d --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.S @@ -0,0 +1,48 @@ +#------------------------------------------------------------------------------ +# +# Copyright (c) 2011-2014, ARM Limited. All rights reserved. +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#------------------------------------------------------------------------------ + + .text + .align 2 + GCC_ASM_EXPORT (memmove) + +# VOID +# EFIAPI +# memmove ( +# IN VOID *Destination, +# IN CONST VOID *Source, +# IN UINT32 Size +# ); +ASM_PFX(memmove): + CMP r2, #0 + BXEQ lr + CMP r0, r1 + BXEQ lr + BHI memmove_backward + +memmove_forward: + LDRB r3, [r1], #1 + STRB r3, [r0], #1 + SUBS r2, r2, #1 + BXEQ lr + B memmove_forward + +memmove_backward: + add r0, r2 + add r1, r2 +memmove_backward_loop: + LDRB r3, [r1, #-1]! + STRB r3, [r0, #-1]! + SUBS r2, r2, #1 + BXEQ lr + B memmove_backward_loop diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm index ff7552d1c6..2147e29dbd 100755 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memmove.asm @@ -1,6 +1,6 @@ //------------------------------------------------------------------------------ // -// Copyright (c) 2011, ARM Limited. All rights reserved. +// Copyright (c) 2011-2014, ARM Limited. All rights reserved. // // This program and the accompanying materials // are licensed and made available under the terms and conditions of the BSD License @@ -28,27 +28,26 @@ ; __aeabi_memmove CMP r2, #0 - BXEQ r14 + BXEQ lr CMP r0, r1 - BXEQ r14 + BXEQ lr BHI memmove_backward - BLS memmove_forward memmove_forward LDRB r3, [r1], #1 STRB r3, [r0], #1 SUBS r2, r2, #1 - BXEQ r14 - B memmove_forward + BNE memmove_forward + BX lr memmove_backward add r0, r2 add r1, r2 memmove_backward_loop - LDRB r3, [r1], #-1 - STRB r3, [r0], #-1 - SUBS r2, r2, #-1 - BXEQ r14 - B memmove_backward_loop + LDRB r3, [r1, #-1]! + STRB r3, [r0, #-1]! + SUBS r2, r2, #1 + BNE memmove_backward_loop + BX lr END diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S index 7290e85958..0c7789eb58 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S @@ -1,6 +1,7 @@ #------------------------------------------------------------------------------ # # Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+# Copyright (c) 2014, ARM Ltd. All rights reserved.
# # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License @@ -17,22 +18,21 @@ .align 2 GCC_ASM_EXPORT (memset) - +# VOID +# EFIAPI +# memset ( +# IN VOID *Destination, +# IN UINT32 Character, +# IN UINT32 Size +# ); ASM_PFX(memset): - + cmp r2, #0 + bxeq lr @ args = 0, pretend = 0, frame = 0 @ frame_needed = 1, uses_anonymous_args = 0 - stmfd sp!, {r7, lr} - mov ip, #0 - add r7, sp, #0 - mov lr, r0 - b L9 L10: - and r3, r1, #255 - add ip, ip, #1 - strb r3, [lr], #1 -L9: - cmp ip, r2 + strb r1, [r0], #1 + subs r2, r2, #1 + @ While size is not 0 bne L10 - ldmfd sp!, {r7, pc} - + bx lr diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm index 74e0243048..bae3c1fada 100755 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm +++ b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm @@ -1,6 +1,7 @@ //------------------------------------------------------------------------------ // // Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
+// Copyright (c) 2014, ARM Ltd. All rights reserved.
// // This program and the accompanying materials // are licensed and made available under the terms and conditions of the BSD License @@ -19,41 +20,31 @@ AREA Memset, CODE, READONLY +; void __aeabi_memclr4(void *dest, size_t n); +; void __aeabi_memclr(void *dest, size_t n); +__aeabi_memclr +__aeabi_memclr4 + mov r2, #0 + ; ;VOID ;EFIAPI ;__aeabi_memset ( ; IN VOID *Destination, -; IN UINT32 Character, -; IN UINT32 Size +; IN UINT32 Size, +; IN UINT32 Character ; ); ; __aeabi_memset - + cmp r1, #0 + bxeq lr ; args = 0, pretend = 0, frame = 0 ; frame_needed = 1, uses_anonymous_args = 0 - stmfd sp!, {r7, lr} - mov ip, #0 - add r7, sp, #0 - mov lr, r0 - b L9 L10 - and r3, r1, #255 - add ip, ip, #1 - strb r3, [lr], #1 -L9 - cmp ip, r2 + strb r2, [r0], #1 + subs r1, r1, #1 + ; While size is not 0 bne L10 - ldmfd sp!, {r7, pc} - -__aeabi_memclr - mov r2, r1 - mov r1, #0 - b __aeabi_memset - -__aeabi_memclr4 - mov r2, r1 - mov r1, #0 - b __aeabi_memset + bx lr END diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index a1c9ae65b0..3487787a9c 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -60,6 +60,7 @@ Arm/memcpy.S | GCC Arm/memset.S | GCC + Arm/memmove.S | GCC # Arm/modsi3.c | GCC # Arm/moddi3.c | GCC