summaryrefslogtreecommitdiffstats
path: root/ArmPkg
diff options
context:
space:
mode:
Diffstat (limited to 'ArmPkg')
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S119
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c25
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S32
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm40
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm60
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S61
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm50
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf11
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c44
-rw-r--r--ArmPkg/Library/CompilerIntrinsicsLib/memset.c56
10 files changed, 103 insertions, 395 deletions
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 <AsmMacroIoLibV8.h>
-
-// 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.<BR>
-
- 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 <Base.h>
-
-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.<BR>
-#
-# 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.<BR>
-//
-// 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.<BR>
-//
-// 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.<BR>
-# Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
-#
-# 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.<BR>
-// Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
-//
-// 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.<BR>
+//
+// 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.<BR>
+//
+// 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