1 /** @file
2   Implementation of the InternalMemCopyMem routine. This function is broken
3   out into its own source file so that it can be excluded from a build for a
4   particular platform easily if an optimized version is desired.
5 
6   Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
7   This program and the accompanying materials
8   are licensed and made available under the terms and conditions of the BSD License
9   which accompanies this distribution.  The full text of the license may be found at
10   http://opensource.org/licenses/bsd-license.php
11 
12   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 
18 
19 
20 #include "MemLibInternals.h"
21 
22 /**
23   Copy Length bytes from Source to Destination.
24 
25   @param  DestinationBuffer Target of copy
26   @param  SourceBuffer      Place to copy from
27   @param  Length            Number of bytes to copy
28 
29   @return Destination
30 
31 **/
32 VOID *
33 EFIAPI
InternalMemCopyMem(OUT VOID * DestinationBuffer,IN CONST VOID * SourceBuffer,IN UINTN Length)34 InternalMemCopyMem (
35   OUT     VOID                      *DestinationBuffer,
36   IN      CONST VOID                *SourceBuffer,
37   IN      UINTN                     Length
38   )
39 {
40   //
41   // Declare the local variables that actually move the data elements as
42   // volatile to prevent the optimizer from replacing this function with
43   // the intrinsic memcpy()
44   //
45   volatile UINT8                    *Destination8;
46   CONST UINT8                       *Source8;
47 
48   if (SourceBuffer > DestinationBuffer) {
49     Destination8 = (UINT8*)DestinationBuffer;
50     Source8 = (CONST UINT8*)SourceBuffer;
51     while (Length-- != 0) {
52       *(Destination8++) = *(Source8++);
53     }
54   } else if (SourceBuffer < DestinationBuffer) {
55     Destination8 = (UINT8*)DestinationBuffer + Length;
56     Source8 = (CONST UINT8*)SourceBuffer + Length;
57     while (Length-- != 0) {
58       *(--Destination8) = *(--Source8);
59     }
60   }
61   return DestinationBuffer;
62 }
63