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)34InternalMemCopyMem ( 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