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