diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S deleted file mode 100644 index 4dd6cf2077..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (c) 2011 - 2013, ARM Ltd - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the company may not be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include - -// Taken from Newlib BSD implementation. -ASM_FUNC(memcpy) - // Copy dst to x6, so we can preserve return value. - mov x6, x0 - - // NOTE: although size_t is unsigned, this code uses signed - // comparisons on x2 so relies on nb never having its top bit - // set. In practice this is not going to be a real problem. - - // Require at least 64 bytes to be worth aligning. - cmp x2, #64 - blt qwordcopy - - // Compute offset to align destination to 16 bytes. - neg x3, x0 - and x3, x3, 15 - - cbz x3, blockcopy // offset == 0 is likely - - // We know there is at least 64 bytes to be done, so we - // do a 16 byte misaligned copy at first and then later do - // all 16-byte aligned copies. Some bytes will be copied - // twice, but there's no harm in that since memcpy does not - // guarantee correctness on overlap. - - sub x2, x2, x3 // nb -= offset - ldp x4, x5, [x1] - add x1, x1, x3 - stp x4, x5, [x6] - add x6, x6, x3 - - // The destination pointer is now qword (16 byte) aligned. - // (The src pointer might be.) - -blockcopy: - // Copy 64 bytes at a time. - subs x2, x2, #64 - blt 3f -2: subs x2, x2, #64 - ldp x4, x5, [x1,#0] - ldp x8, x9, [x1,#16] - ldp x10,x11,[x1,#32] - ldp x12,x13,[x1,#48] - add x1, x1, #64 - stp x4, x5, [x6,#0] - stp x8, x9, [x6,#16] - stp x10,x11,[x6,#32] - stp x12,x13,[x6,#48] - add x6, x6, #64 - bge 2b - - // Unwind pre-decrement -3: add x2, x2, #64 - -qwordcopy: - // Copy 0-48 bytes, 16 bytes at a time. - subs x2, x2, #16 - blt tailcopy -2: ldp x4, x5, [x1],#16 - subs x2, x2, #16 - stp x4, x5, [x6],#16 - bge 2b - - // No need to unwind the pre-decrement, it would not change - // the low 4 bits of the count. But how likely is it for the - // byte count to be multiple of 16? Is it worth the overhead - // of testing for x2 == -16? - -tailcopy: - // Copy trailing 0-15 bytes. - tbz x2, #3, 1f - ldr x4, [x1],#8 // copy 8 bytes - str x4, [x6],#8 -1: - tbz x2, #2, 1f - ldr w4, [x1],#4 // copy 4 bytes - str w4, [x6],#4 -1: - tbz x2, #1, 1f - ldrh w4, [x1],#2 // copy 2 bytes - strh w4, [x6],#2 -1: - tbz x2, #0, return - ldrb w4, [x1] // copy 1 byte - strb w4, [x6] - -return: - // This is the only return point of memcpy. - ret diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c deleted file mode 100644 index 069c932a67..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c +++ /dev/null @@ -1,25 +0,0 @@ -/** @file - - 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 - 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. - -**/ - -#include - -void *memset(void *Destination, int Value, int Count) -{ - CHAR8 *Ptr = Destination; - - while (Count--) - *Ptr++ = Value; - - return Destination; -} diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S deleted file mode 100644 index b68ed8a6ea..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S +++ /dev/null @@ -1,32 +0,0 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2008 - 2009, Apple Inc. 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(__aeabi_memcpy) - GCC_ASM_EXPORT(memcpy) - -ASM_PFX(__aeabi_memcpy): -ASM_PFX(memcpy): - cmp r2, #0 - bxeq lr - push {lr} - mov lr, r0 -L5: - ldrb r3, [r1], #1 @ zero_extendqisi2 - strb r3, [lr], #1 - subs r2, r2, #1 - bne L5 - pop {pc} - diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm deleted file mode 100644 index ae91197128..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm +++ /dev/null @@ -1,40 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. 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. -// -//------------------------------------------------------------------------------ - - - - INCLUDE AsmMacroExport.inc - -; -;VOID -;EFIAPI -;__aeabi_memcpy ( -; IN VOID *Destination, -; IN VOID *Source, -; IN UINT32 Size -; ); -; - RVCT_ASM_EXPORT __aeabi_memcpy - cmp r2, #0 - bxeq lr - push {lr} - mov lr, r0 -L5 - ldrb r3, [r1], #1 - strb r3, [lr], #1 - subs r2, r2, #1 - bne L5 - pop {pc} - - END diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm deleted file mode 100644 index 3465e89eba..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm +++ /dev/null @@ -1,60 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Copyright (c) 2008 - 2009, Apple Inc. 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. -// -//------------------------------------------------------------------------------ - - - - INCLUDE AsmMacroExport.inc - -; -;VOID -;EFIAPI -;__aeabi_memcpy ( -; IN VOID *Destination, -; IN VOID *Source, -; IN UINT32 Size -; ); -; - RVCT_ASM_EXPORT __aeabi_memcpy4 - stmdb sp!, {r4, lr} - subs r2, r2, #32 ; 0x20 - bcc memcpy4_label2 -memcpy4_label1 - ldmcsia r1!, {r3, r4, ip, lr} - stmcsia r0!, {r3, r4, ip, lr} - ldmcsia r1!, {r3, r4, ip, lr} - stmcsia r0!, {r3, r4, ip, lr} - subcss r2, r2, #32 ; 0x20 - bcs memcpy4_label1 -memcpy4_label2 - movs ip, r2, lsl #28 - ldmcsia r1!, {r3, r4, ip, lr} - stmcsia r0!, {r3, r4, ip, lr} - ldmmiia r1!, {r3, r4} - stmmiia r0!, {r3, r4} - ldmia sp!, {r4, lr} - movs ip, r2, lsl #30 - ldrcs r3, [r1], #4 - strcs r3, [r0], #4 - bxeq lr - -_memcpy4_lastbytes_aligned - movs r2, r2, lsl #31 - ldrcsh r3, [r1], #2 - ldrmib r2, [r1], #1 - strcsh r3, [r0], #2 - strmib r2, [r0], #1 - bx lr - - END - diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S deleted file mode 100644 index 65f6289b41..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S +++ /dev/null @@ -1,61 +0,0 @@ -#------------------------------------------------------------------------------ -# -# 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 -# 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 - .syntax unified - .align 2 - GCC_ASM_EXPORT (memset) - GCC_ASM_EXPORT (__aeabi_memset) - -# VOID -# EFIAPI -# __aeabi_memset ( -# IN VOID *Destination, -# IN UINT32 Size -# IN UINT32 Character, -# ); -ASM_PFX(__aeabi_memset): - subs ip, r1, #0 - bxeq lr - mov r1, r2 - b L10 - -# VOID -# EFIAPI -# memset ( -# IN VOID *Destination, -# IN UINT32 Character, -# IN UINT32 Size -# ); - // - // This object may be pulled in to satisfy an undefined reference to - // __aeabi_memset above, but in some cases, memset() is already provided - // by another library (i.e., CryptoPkg/IntrinsicLib), in which case we - // prefer the other version. So allow this one to be overridden by - // giving it weak linkage. - // - .weak memset -ASM_PFX(memset): - subs ip, r2, #0 - bxeq lr - @ args = 0, pretend = 0, frame = 0 - @ frame_needed = 1, uses_anonymous_args = 0 -L10: - strb r1, [r0], #1 - subs ip, ip, #1 - @ While size is not 0 - bne L10 - bx lr diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm b/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm deleted file mode 100644 index bae3c1fada..0000000000 --- a/ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm +++ /dev/null @@ -1,50 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 -// 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. -// -//------------------------------------------------------------------------------ - - - EXPORT __aeabi_memset - EXPORT __aeabi_memclr - EXPORT __aeabi_memclr4 - - 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 Size, -; IN UINT32 Character -; ); -; -__aeabi_memset - cmp r1, #0 - bxeq lr - ; args = 0, pretend = 0, frame = 0 - ; frame_needed = 1, uses_anonymous_args = 0 -L10 - strb r2, [r0], #1 - subs r1, r1, #1 - ; While size is not 0 - bne L10 - bx lr - - END diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf index 103f515064..44333141a7 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -22,17 +22,14 @@ VERSION_STRING = 1.0 LIBRARY_CLASS = CompilerIntrinsicsLib -[Sources.AARCH64] - AArch64/memcpy.S - AArch64/memset.c +[Sources] + memcpy.c + memset.c [Sources.ARM] Arm/mullu.asm | RVCT Arm/switch.asm | RVCT Arm/llsr.asm | RVCT - Arm/memcpy.asm | RVCT - Arm/memcpy4.asm | RVCT - Arm/memset.asm | RVCT Arm/memmove.asm | RVCT Arm/uread.asm | RVCT Arm/uwrite.asm | RVCT @@ -58,8 +55,6 @@ Arm/divsi3.S | GCC Arm/lshrdi3.S | GCC - Arm/memcpy.S | GCC - Arm/memset.S | GCC Arm/memmove.S | GCC # Arm/modsi3.c | GCC diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c new file mode 100644 index 0000000000..a944e00b89 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c @@ -0,0 +1,44 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) 2016, Linaro Ltd. 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. +// +//------------------------------------------------------------------------------ + +typedef __SIZE_TYPE__ size_t; + +static __attribute__((__used__)) +void *__memcpy(void *dest, const void *src, size_t n) +{ + unsigned char *d = dest; + unsigned char const *s = src; + + while (n--) + *d++ = *s++; + + return dest; +} + +__attribute__((__alias__("__memcpy"))) +void *memcpy(void *dest, const void *src, size_t n); + +#ifdef __arm__ + +__attribute__((__alias__("__memcpy"))) +void __aeabi_memcpy(void *dest, const void *src, size_t n); + +__attribute__((__alias__("__memcpy"))) +void __aeabi_memcpy4(void *dest, const void *src, size_t n); + +__attribute__((__alias__("__memcpy"))) +void __aeabi_memcpy8(void *dest, const void *src, size_t n); + +#endif diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/memset.c b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c new file mode 100644 index 0000000000..3d417d7972 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c @@ -0,0 +1,56 @@ +//------------------------------------------------------------------------------ +// +// Copyright (c) 2016, Linaro Ltd. 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. +// +//------------------------------------------------------------------------------ + +typedef __SIZE_TYPE__ size_t; + +static __attribute__((__used__)) +void *__memset(void *s, int c, size_t n) +{ + unsigned char *d = s; + + while (n--) + *d++ = c; + + return s; +} + +__attribute__((__alias__("__memset"))) +void *memset(void *dest, int c, size_t n); + +#ifdef __arm__ + +void __aeabi_memset(void *dest, size_t n, int c) +{ + __memset(dest, c, n); +} + +__attribute__((__alias__("__aeabi_memset"))) +void __aeabi_memset4(void *dest, size_t n, int c); + +__attribute__((__alias__("__aeabi_memset"))) +void __aeabi_memset8(void *dest, size_t n, int c); + +void __aeabi_memclr(void *dest, size_t n) +{ + __memset(dest, 0, n); +} + +__attribute__((__alias__("__aeabi_memclr"))) +void __aeabi_memclr4(void *dest, size_t n); + +__attribute__((__alias__("__aeabi_memclr"))) +void __aeabi_memclr8(void *dest, size_t n); + +#endif