From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x22a.google.com (mail-wm0-x22a.google.com [IPv6:2a00:1450:400c:c09::22a]) (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 B75671A1E56 for ; Thu, 1 Sep 2016 06:11:47 -0700 (PDT) Received: by mail-wm0-x22a.google.com with SMTP id 1so94186204wmz.1 for ; Thu, 01 Sep 2016 06:11:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=wUJvuPYCiaIcy+bIrQdLHrojdm8K1PNf87adnbblUrA=; b=WqVDl7UCCPqv7HCXjvKUdbQXliCLgiaUsxWKOQGfHVjlq3BVNvQwTCd1qib3hebQ73 YNnGa+i2htrWV02z3rKQ5guOsFZIfKDv0jQKbkGWtlycGRNg36mW8tQ8GWY4pr9gEyJn A+eYNxAWxJhm9GUl6OaJUwBcZEmNurxG6uzuM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=wUJvuPYCiaIcy+bIrQdLHrojdm8K1PNf87adnbblUrA=; b=nC7TeCgtoXH3OXkztaDE9JaCsJEFE7NaexreJkR0mo0Twb4QNmUMUGE5jfHpXlX4AV /XOfR05oC51Nmcxi72654zBGcdhnJm73hfPzYdnOPHp7bQ78u5jJDyS1DDTybOGBuEGF +NFtNT1EPQzEm3Cs9y9yyl12mPFOy+puV20Bloqe2zYTTcxuU1RSY5HJam+frxkuSkqp CQ/nRUfAfwjQ7KmmJkqTtorKV4vM/DOTaabcTJIrwZ0lXwDFPiQuwArs+1NCRK60P7jB HTEvkJBaWcBJctOVOjKAcqHQcLA0+KihL7Zw8ZM5kracrM4g7uK6wV2FAzaS402uYFwB orVg== X-Gm-Message-State: AE9vXwOu4E+sPtZpwc2krnWdDnoS3PmDPUwJE3SdRO1GEX6D4ahncyu+gKPk2iPPhXhcMkDO X-Received: by 10.28.174.76 with SMTP id x73mr14382763wme.60.1472735505626; Thu, 01 Sep 2016 06:11:45 -0700 (PDT) Received: from bivouac.eciton.net (bivouac.eciton.net. [2a00:1098:0:86:1000:23:0:2]) by smtp.gmail.com with ESMTPSA id n131sm29061998wmd.3.2016.09.01.06.11.44 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Sep 2016 06:11:44 -0700 (PDT) Date: Thu, 1 Sep 2016 14:11:42 +0100 From: Leif Lindholm To: Ard Biesheuvel Cc: edk2-devel@lists.01.org, eugene@hp.com, liming.gao@intel.com Message-ID: <20160901131142.GX4715@bivouac.eciton.net> References: <1470939632-32198-1-git-send-email-ard.biesheuvel@linaro.org> MIME-Version: 1.0 In-Reply-To: <1470939632-32198-1-git-send-email-ard.biesheuvel@linaro.org> User-Agent: Mutt/1.5.23 (2014-03-12) Subject: Re: [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: , X-List-Received-Date: Thu, 01 Sep 2016 13:11:48 -0000 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Aug 11, 2016 at 08:20:30PM +0200, Ard Biesheuvel wrote: > 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 This looks like a worthwhile bit of code cleanup. Reviewed-by: Leif Lindholm > --- > 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(-) > > 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 > -- > 2.7.4 >