public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Leif Lindholm <leif.lindholm@linaro.org>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: edk2-devel@lists.01.org, eugene@hp.com, liming.gao@intel.com
Subject: Re: [PATCH 1/3] ArmPkg/CompilerIntrinsicsLib: replace memcpy and memset with C code
Date: Thu, 1 Sep 2016 14:11:42 +0100	[thread overview]
Message-ID: <20160901131142.GX4715@bivouac.eciton.net> (raw)
In-Reply-To: <1470939632-32198-1-git-send-email-ard.biesheuvel@linaro.org>

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 <ard.biesheuvel@linaro.org>

This looks like a worthwhile bit of code cleanup.

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  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 <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 069c932a6763..000000000000
> --- 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 b68ed8a6ea6b..000000000000
> --- 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 ae911971286a..000000000000
> --- 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 3465e89eba34..000000000000
> --- 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 65f6289b410b..000000000000
> --- 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 bae3c1fada11..000000000000
> --- 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 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.<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 000000000000..81505f155827
> --- /dev/null
> +++ b/ArmPkg/Library/CompilerIntrinsicsLib/memset.c
> @@ -0,0 +1,55 @@
> +//------------------------------------------------------------------------------
> +//
> +// 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, 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
> 


      parent reply	other threads:[~2016-09-01 13:11 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-11 18:20 [PATCH 1/3] ArmPkg/CompilerIntrinsicsLib: replace memcpy and memset with C code Ard Biesheuvel
2016-08-11 18:20 ` [PATCH 2/3] BaseTools RVCT: ignore various RVC diagnostics Ard Biesheuvel
2016-08-12  3:04   ` Gao, Liming
2016-08-11 18:20 ` [PATCH 3/3] MdePkg RVCT: add definition of UNREACHABLE Ard Biesheuvel
2016-08-12  3:04   ` Gao, Liming
2016-08-11 21:34 ` [PATCH 1/3] ArmPkg/CompilerIntrinsicsLib: replace memcpy and memset with C code Cohen, Eugene
2016-08-11 21:45   ` Ard Biesheuvel
2016-08-11 21:50     ` Cohen, Eugene
2016-08-11 21:53       ` Ard Biesheuvel
2016-08-11 23:04       ` Andrew Fish
2016-08-12  8:09         ` Ard Biesheuvel
2016-09-01 13:11 ` Leif Lindholm [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160901131142.GX4715@bivouac.eciton.net \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox