1 /*++ 2 3 Copyright (c) 2004, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 EfiCompareMem.c 15 16 Abstract: 17 18 Generic compare-memory routine. 19 20 --*/ 21 22 #include "Tiano.h" 23 #include "EfiDriverLib.h" 24 25 26 INTN 27 EfiCompareMem ( 28 IN VOID *MemOne, 29 IN VOID *MemTwo, 30 IN UINTN Length 31 ) 32 /*++ 33 34 Routine Description: 35 36 Compares two memory buffers of a given length. 37 38 Arguments: 39 40 MemOne - First memory buffer 41 42 MemTwo - Second memory buffer 43 44 Len - Length of Mem1 and Mem2 memory regions to compare 45 46 Returns: 47 48 = 0 if MemOne == MemTwo 49 50 --*/ 51 { 52 INTN ReturnValue; 53 54 if (!(EFI_UINTN_ALIGNED (MemOne) || EFI_UINTN_ALIGNED (MemTwo) || EFI_UINTN_ALIGNED (Length))) { 55 // 56 // If Destination/Source/Length are aligned do UINTN conpare 57 // 58 for (; Length > 0; Length -= sizeof (INTN), MemOne = (VOID *)((UINTN)MemOne + sizeof (INTN)), MemTwo = (VOID *)((UINTN)MemTwo + sizeof (INTN))) { 59 if (*(INTN *)MemOne != *(INTN *)MemTwo) { 60 break; 61 } 62 } 63 } 64 65 // 66 // If Destination/Source/Length not aligned do byte compare 67 // 68 for (; Length > 0; Length--, MemOne = (VOID *)((UINTN)MemOne + 1), MemTwo = (VOID *)((UINTN)MemTwo + 1)) { 69 ReturnValue = (INTN)(*(INT8 *)MemOne - *(INT8 *)MemTwo); 70 if (ReturnValue != 0) { 71 return ReturnValue; 72 } 73 } 74 75 return 0; 76 } 77