Home | History | Annotate | Download | only in EfiCommonLib
      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