Home | History | Annotate | Download | only in BaseMemoryLibVstm
      1 /** @file
      2   Architecture Independent Base Memory Library Implementation.
      3 
      4   The following BaseMemoryLib instances contain the same copy of this file:
      5     BaseMemoryLib
      6     PeiMemoryLib
      7     UefiMemoryLib
      8 
      9   Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
     10   This program and the accompanying materials
     11   are licensed and made available under the terms and conditions of the BSD License
     12   which accompanies this distribution.  The full text of the license may be found at
     13   http://opensource.org/licenses/bsd-license.php
     14 
     15   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     16   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     17 
     18 **/
     19 
     20 #include "MemLibInternals.h"
     21 
     22 /**
     23   Fills a target buffer with a 16-bit value, and returns the target buffer.
     24 
     25   @param  Buffer  Pointer to the target buffer to fill.
     26   @param  Length  Count of 16-bit value to fill.
     27   @param  Value   Value with which to fill Length bytes of Buffer.
     28 
     29   @return Buffer
     30 
     31 **/
     32 VOID *
     33 EFIAPI
     34 InternalMemSetMem16 (
     35   OUT     VOID                      *Buffer,
     36   IN      UINTN                     Length,
     37   IN      UINT16                    Value
     38   )
     39 {
     40   do {
     41     ((UINT16*)Buffer)[--Length] = Value;
     42   } while (Length != 0);
     43   return Buffer;
     44 }
     45 
     46 /**
     47   Fills a target buffer with a 32-bit value, and returns the target buffer.
     48 
     49   @param  Buffer  Pointer to the target buffer to fill.
     50   @param  Length  Count of 32-bit value to fill.
     51   @param  Value   Value with which to fill Length bytes of Buffer.
     52 
     53   @return Buffer
     54 
     55 **/
     56 VOID *
     57 EFIAPI
     58 InternalMemSetMem32 (
     59   OUT     VOID                      *Buffer,
     60   IN      UINTN                     Length,
     61   IN      UINT32                    Value
     62   )
     63 {
     64   do {
     65     ((UINT32*)Buffer)[--Length] = Value;
     66   } while (Length != 0);
     67   return Buffer;
     68 }
     69 
     70 /**
     71   Fills a target buffer with a 64-bit value, and returns the target buffer.
     72 
     73   @param  Buffer  Pointer to the target buffer to fill.
     74   @param  Length  Count of 64-bit value to fill.
     75   @param  Value   Value with which to fill Length bytes of Buffer.
     76 
     77   @return Buffer
     78 
     79 **/
     80 VOID *
     81 EFIAPI
     82 InternalMemSetMem64 (
     83   OUT     VOID                      *Buffer,
     84   IN      UINTN                     Length,
     85   IN      UINT64                    Value
     86   )
     87 {
     88   do {
     89     ((UINT64*)Buffer)[--Length] = Value;
     90   } while (Length != 0);
     91   return Buffer;
     92 }
     93 
     94 /**
     95   Set Buffer to 0 for Size bytes.
     96 
     97   @param  Buffer Memory to set.
     98   @param  Length Number of bytes to set
     99 
    100   @return Buffer
    101 
    102 **/
    103 VOID *
    104 EFIAPI
    105 InternalMemZeroMem (
    106   OUT     VOID                      *Buffer,
    107   IN      UINTN                     Length
    108   )
    109 {
    110   return InternalMemSetMem (Buffer, Length, 0);
    111 }
    112 
    113 /**
    114   Compares two memory buffers of a given length.
    115 
    116   @param  DestinationBuffer First memory buffer
    117   @param  SourceBuffer      Second memory buffer
    118   @param  Length            Length of DestinationBuffer and SourceBuffer memory
    119                             regions to compare. Must be non-zero.
    120 
    121   @return 0                 All Length bytes of the two buffers are identical.
    122   @retval Non-zero          The first mismatched byte in SourceBuffer subtracted from the first
    123                             mismatched byte in DestinationBuffer.
    124 
    125 **/
    126 INTN
    127 EFIAPI
    128 InternalMemCompareMem (
    129   IN      CONST VOID                *DestinationBuffer,
    130   IN      CONST VOID                *SourceBuffer,
    131   IN      UINTN                     Length
    132   )
    133 {
    134   while ((--Length != 0) &&
    135          (*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) {
    136     DestinationBuffer = (INT8*)DestinationBuffer + 1;
    137     SourceBuffer = (INT8*)SourceBuffer + 1;
    138   }
    139   return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer;
    140 }
    141 
    142 /**
    143   Scans a target buffer for an 8-bit value, and returns a pointer to the
    144   matching 8-bit value in the target buffer.
    145 
    146   @param  Buffer  Pointer to the target buffer to scan.
    147   @param  Length  Count of 8-bit value to scan. Must be non-zero.
    148   @param  Value   Value to search for in the target buffer.
    149 
    150   @return Pointer to the first occurrence or NULL if not found.
    151 
    152 **/
    153 CONST VOID *
    154 EFIAPI
    155 InternalMemScanMem8 (
    156   IN      CONST VOID                *Buffer,
    157   IN      UINTN                     Length,
    158   IN      UINT8                     Value
    159   )
    160 {
    161   CONST UINT8                       *Pointer;
    162 
    163   Pointer = (CONST UINT8*)Buffer;
    164   do {
    165     if (*Pointer == Value) {
    166       return Pointer;
    167     }
    168     Pointer++;
    169   } while (--Length != 0);
    170   return NULL;
    171 }
    172 
    173 /**
    174   Scans a target buffer for a 16-bit value, and returns a pointer to the
    175   matching 16-bit value in the target buffer.
    176 
    177   @param  Buffer  Pointer to the target buffer to scan.
    178   @param  Length  Count of 16-bit value to scan. Must be non-zero.
    179   @param  Value   Value to search for in the target buffer.
    180 
    181   @return Pointer to the first occurrence or NULL if not found.
    182 
    183 **/
    184 CONST VOID *
    185 EFIAPI
    186 InternalMemScanMem16 (
    187   IN      CONST VOID                *Buffer,
    188   IN      UINTN                     Length,
    189   IN      UINT16                    Value
    190   )
    191 {
    192   CONST UINT16                      *Pointer;
    193 
    194   Pointer = (CONST UINT16*)Buffer;
    195   do {
    196     if (*Pointer == Value) {
    197       return Pointer;
    198     }
    199     Pointer++;
    200   } while (--Length != 0);
    201   return NULL;
    202 }
    203 
    204 /**
    205   Scans a target buffer for a 32-bit value, and returns a pointer to the
    206   matching 32-bit value in the target buffer.
    207 
    208   @param  Buffer  Pointer to the target buffer to scan.
    209   @param  Length  Count of 32-bit value to scan. Must be non-zero.
    210   @param  Value   Value to search for in the target buffer.
    211 
    212   @return Pointer to the first occurrence or NULL if not found.
    213 
    214 **/
    215 CONST VOID *
    216 EFIAPI
    217 InternalMemScanMem32 (
    218   IN      CONST VOID                *Buffer,
    219   IN      UINTN                     Length,
    220   IN      UINT32                    Value
    221   )
    222 {
    223   CONST UINT32                      *Pointer;
    224 
    225   Pointer = (CONST UINT32*)Buffer;
    226   do {
    227     if (*Pointer == Value) {
    228       return Pointer;
    229     }
    230     Pointer++;
    231   } while (--Length != 0);
    232   return NULL;
    233 }
    234 
    235 /**
    236   Scans a target buffer for a 64-bit value, and returns a pointer to the
    237   matching 64-bit value in the target buffer.
    238 
    239   @param  Buffer  Pointer to the target buffer to scan.
    240   @param  Length  Count of 64-bit value to scan. Must be non-zero.
    241   @param  Value   Value to search for in the target buffer.
    242 
    243   @return Pointer to the first occurrence or NULL if not found.
    244 
    245 **/
    246 CONST VOID *
    247 EFIAPI
    248 InternalMemScanMem64 (
    249   IN      CONST VOID                *Buffer,
    250   IN      UINTN                     Length,
    251   IN      UINT64                    Value
    252   )
    253 {
    254   CONST UINT64                      *Pointer;
    255 
    256   Pointer = (CONST UINT64*)Buffer;
    257   do {
    258     if (*Pointer == Value) {
    259       return Pointer;
    260     }
    261     Pointer++;
    262   } while (--Length != 0);
    263   return NULL;
    264 }
    265