From patchwork Thu Aug 11 18:20:30 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 73810 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp241939qga; Thu, 11 Aug 2016 11:21:22 -0700 (PDT) X-Received: by 10.66.139.227 with SMTP id rb3mr19600017pab.26.1470939682553; Thu, 11 Aug 2016 11:21:22 -0700 (PDT) Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id m10si4270856pab.157.2016.08.11.11.21.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Aug 2016 11:21:22 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 876A31A1DFC; Thu, 11 Aug 2016 11:21:21 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received: from mail-wm0-x22f.google.com (mail-wm0-x22f.google.com [IPv6:2a00:1450:400c:c09::22f]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5F08F1A1DEB for ; Thu, 11 Aug 2016 11:21:19 -0700 (PDT) Received: by mail-wm0-x22f.google.com with SMTP id i5so8144528wmg.0 for ; Thu, 11 Aug 2016 11:21:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=CED91siLQPXulFGI8HXupJ9j2zNsHIjM0O6GL3PU3b8=; b=B4Q+qtCPvuLbzC1OwI8zMWGHMcDba7Xd4+OR8xkZYc8B1HNQBiTeq3UWXMPu7lojlX lwrlgqx0i6wEMWdQA78J9WzesS9qc5/+Ub9aZdjtXghfk52kyo7aMhgTOsdgcOTb+sPR EY9gf1D7KKOTKmKme4JQ7VNyh1v6s1SDfBp4I= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=CED91siLQPXulFGI8HXupJ9j2zNsHIjM0O6GL3PU3b8=; b=PnZGYnEyWn8AT6l/a5gtbMCklmP160+ptLD26VDA6Ta6Hv8vg1wJpWfS59+F9ntRz0 QsLg47sZqwGZZc1RYi6FVaB58+Z5iofx4DuM42Lc4j9Rrk7sDPuiy0JqqktfthcCF0su Q9Y2V9YV5MklvYvBZP9FQ6Gsq/qAFRnmZVpHtmTNnWUWYDoFtMdc7KqFtjVyzvUvMtHo jUUreyg9AQhk0HFrhg1GAkveARrKZAzbRDOAoTjFgugqk5yxNPVhk/pgTRM37lKLW9WN mpBbaXBotxyTOsR6kIBQXrFiMM+Jr/6cjCb9IMBvtOPwKBeb8O1jleSbvfjn3cAOSRlD a2MA== X-Gm-Message-State: AEkoouvJjuJNVMdQq26/B4j8fePnG6NnFXpDxVJZHnyL7303LW6h98MRl1VxguROIqygEPXE X-Received: by 10.28.39.134 with SMTP id n128mr10362146wmn.60.1470939677188; Thu, 11 Aug 2016 11:21:17 -0700 (PDT) Received: from localhost.localdomain (46.red-81-37-107.dynamicip.rima-tde.net. [81.37.107.46]) by smtp.gmail.com with ESMTPSA id b203sm948382wmh.20.2016.08.11.11.20.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 11 Aug 2016 11:21:15 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org, eugene@hp.com, liming.gao@intel.com Date: Thu, 11 Aug 2016 20:20:30 +0200 Message-Id: <1470939632-32198-1-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.7.4 Subject: [edk2] [PATCH 1/3] ArmPkg/CompilerIntrinsicsLib: replace memcpy and memset with C code X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" This replaces the various implementations of memset and memcpy, including the ARM RTABI ones (__aeabi_mem[set|clr]_[|4|8]) with a single C implementation for each. The ones we have are either not very sophisticated (ARM), or they are too sophisticated (memcpy() on AARCH64, which may perform unaligned accesses) or already coded in C (memset on AArch64). The Tianocore codebase mandates the explicit use of its SetMem() and CopyMem() equivalents, of which various implementations exist for use in different contexts (PEI, DXE). Few compiler generated references to these functions should remain, and so our implementations in this BASE library should be small and usable with the MMU off. So replace them with a simple C implementation that builds correctly on GCC/AARCH64, CLANG/AARCH64, GCC/ARM, CLANG/ARM and RVCT/ARM. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel --- ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S | 119 -------------------- ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memset.c | 25 ---- ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.S | 32 ------ ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy.asm | 40 ------- ArmPkg/Library/CompilerIntrinsicsLib/Arm/memcpy4.asm | 60 ---------- ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.S | 61 ---------- ArmPkg/Library/CompilerIntrinsicsLib/Arm/memset.asm | 50 -------- ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf | 11 +- ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c | 43 +++++++ ArmPkg/Library/CompilerIntrinsicsLib/memset.c | 55 +++++++++ 10 files changed, 101 insertions(+), 395 deletions(-) -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm diff --git a/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S b/ArmPkg/Library/CompilerIntrinsicsLib/AArch64/memcpy.S deleted file mode 100644 index 4dd6cf207754..000000000000 --- 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 069c932a6763..000000000000 --- 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 b68ed8a6ea6b..000000000000 --- 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 ae911971286a..000000000000 --- 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 3465e89eba34..000000000000 --- 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 65f6289b410b..000000000000 --- 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 bae3c1fada11..000000000000 --- 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 103f515064ba..44333141a70a 100644 --- a/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf +++ b/ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf @@ -22,17 +22,14 @@ [Defines] 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 @@ [Sources.ARM] 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 000000000000..62c79a6d2491 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memcpy.c @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// +// 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 000000000000..81505f155827 --- /dev/null +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c @@ -0,0 +1,55 @@ +//------------------------------------------------------------------------------ +// +// 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, size_t n, int c); + +#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