1e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff/** @file
2e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  CopyMem() implementation.
3e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
42bfb60098f608dc32ff5d22b0fd087c1636b0881lgao  The following BaseMemoryLib instances contain the same copy of this file:
5eb1c78dbb988654f46cc111d5b4a9dabd5578c1fgikidy
6e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    BaseMemoryLib
7e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    BaseMemoryLibMmx
8e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    BaseMemoryLibSse2
9e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    BaseMemoryLibRepStr
102bfb60098f608dc32ff5d22b0fd087c1636b0881lgao    BaseMemoryLibOptDxe
112bfb60098f608dc32ff5d22b0fd087c1636b0881lgao    BaseMemoryLibOptPei
12e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    PeiMemoryLib
131fef058f4b8fefc455bb171e4908c3e835b1b492qhuang    UefiMemoryLib
14e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
152fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
16c33c6476ca8156ddf3c32dbf95048c32f30dc84ahhtian  This program and the accompanying materials
17d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  are licensed and made available under the terms and conditions of the BSD License
18d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  which accompanies this distribution.  The full text of the license may be found at
192fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  http://opensource.org/licenses/bsd-license.php.
20d531bfee01a957038d7ac1a16748558a62165fb2eric_tian
21d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
22d531bfee01a957038d7ac1a16748558a62165fb2eric_tian  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
23d531bfee01a957038d7ac1a16748558a62165fb2eric_tian
24e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff**/
25e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
26e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff#include "MemLibInternals.h"
27e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
28e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff/**
29e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  Copies a source buffer to a destination buffer, and returns the destination buffer.
30e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
31e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  This function copies Length bytes from SourceBuffer to DestinationBuffer, and returns
32e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  DestinationBuffer.  The implementation must be reentrant, and it must handle the case
33e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  where SourceBuffer overlaps DestinationBuffer.
34eb1c78dbb988654f46cc111d5b4a9dabd5578c1fgikidy
35eb1c78dbb988654f46cc111d5b4a9dabd5578c1fgikidy  If Length is greater than (MAX_ADDRESS - DestinationBuffer + 1), then ASSERT().
36eb1c78dbb988654f46cc111d5b4a9dabd5578c1fgikidy  If Length is greater than (MAX_ADDRESS - SourceBuffer + 1), then ASSERT().
37e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
382fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  DestinationBuffer   The pointer to the destination buffer of the memory copy.
392fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  SourceBuffer        The pointer to the source buffer of the memory copy.
402fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Length              The number of bytes to copy from SourceBuffer to DestinationBuffer.
41e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
42e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  @return DestinationBuffer.
43e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
44e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff**/
45e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeffVOID *
46e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeffEFIAPI
47e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeffCopyMem (
48e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  OUT VOID       *DestinationBuffer,
49e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  IN CONST VOID  *SourceBuffer,
50e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  IN UINTN       Length
51e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  )
52e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff{
532bfb60098f608dc32ff5d22b0fd087c1636b0881lgao  if (Length == 0) {
54e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    return DestinationBuffer;
55e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  }
56e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)DestinationBuffer));
57e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  ASSERT ((Length - 1) <= (MAX_ADDRESS - (UINTN)SourceBuffer));
58e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff
59e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  if (DestinationBuffer == SourceBuffer) {
60e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff    return DestinationBuffer;
61e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  }
62e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff  return InternalMemCopyMem (DestinationBuffer, SourceBuffer, Length);
63e1f414b6a7d8a0424e0e01f655b09a4612b4d0e8vanjeff}
64