X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FBaseMemoryLib%2FCopyMem.c;fp=MdePkg%2FLibrary%2FBaseMemoryLib%2FCopyMem.c;h=df5258c93ee15cae363cf3516f47da6f9cce51ce;hp=0000000000000000000000000000000000000000;hb=e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8;hpb=e053747a04ad7b8d71c7593b93e1575ba0057a91 diff --git a/MdePkg/Library/BaseMemoryLib/CopyMem.c b/MdePkg/Library/BaseMemoryLib/CopyMem.c new file mode 100644 index 0000000000..df5258c93e --- /dev/null +++ b/MdePkg/Library/BaseMemoryLib/CopyMem.c @@ -0,0 +1,67 @@ +/** @file + Implementation of the EfiCopyMem routine. This function is broken + out into its own source file so that it can be excluded from a + build for a particular platform easily if an optimized version + is desired. + + Copyright (c) 2006, Intel Corporation
+ 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. + + Module Name: EfiCopyMem.c + +**/ + +// +// Include common header file for this module. +// +#include "CommonHeader.h" + +#include "MemLibInternals.h" + +/** + Copy Length bytes from Source to Destination. + + @param Destination Target of copy + @param Source Place to copy from + @param Length Number of bytes to copy + + @return Destination + +**/ +VOID * +EFIAPI +InternalMemCopyMem ( + OUT VOID *Destination, + IN CONST VOID *Source, + IN UINTN Length + ) +{ + // + // Declare the local variables that actually move the data elements as + // volatile to prevent the optimizer from replacing this function with + // the intrinsic memcpy() + // + volatile UINT8 *Destination8; + CONST UINT8 *Source8; + + if (Source > Destination) { + Destination8 = (UINT8*)Destination; + Source8 = (CONST UINT8*)Source; + while (Length-- != 0) { + *(Destination8++) = *(Source8++); + } + } else if (Source < Destination) { + Destination8 = (UINT8*)Destination + Length; + Source8 = (CONST UINT8*)Source + Length; + while (Length-- != 0) { + *(--Destination8) = *(--Source8); + } + } + return Destination; +}