4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem() implementation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The following BaseMemoryLib instances contain the same copy of this file:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLibMmx
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLibSse2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLibRepStr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLibOptDxe
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BaseMemoryLibOptPei
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PeiMemoryLib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UefiMemoryLib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "MemLibInternals.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copies a source buffer to a destination buffer, and returns the destination buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function copies Length bytes from SourceBuffer to DestinationBuffer, and returns
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationBuffer. The implementation must be reentrant, and it must handle the case
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync where SourceBuffer overlaps DestinationBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DestinationBuffer The pointer to the destination buffer of the memory copy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SourceBuffer The pointer to the source buffer of the memory copy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Length The number of bytes to copy from SourceBuffer to DestinationBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return DestinationBuffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyMem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *DestinationBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *SourceBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DestinationBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestinationBuffer == SourceBuffer) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DestinationBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}