~ubuntu-branches/ubuntu/wily/edk2/wily

1 by Steve Langasek
Import upstream version 0~20121205.edae8d2d
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 - 2010, 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  The pointer to the target buffer to fill.
26
  @param  Length  The count of 16-bit value to fill.
27
  @param  Value   The 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  The pointer to the target buffer to fill.
50
  @param  Length  The count of 32-bit value to fill.
51
  @param  Value   The 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  The pointer to the target buffer to fill.
74
  @param  Length  The count of 64-bit value to fill.
75
  @param  Value   The 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 The 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 The first memory buffer
117
  @param  SourceBuffer      The second memory buffer
118
  @param  Length            The 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  The pointer to the target buffer to scan.
147
  @param  Length  The count of 8-bit value to scan. Must be non-zero.
148
  @param  Value   The value to search for in the target buffer.
149
150
  @return The 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
  } while (--Length != 0);
169
  return NULL;
170
}
171
172
/**
173
  Scans a target buffer for a 16-bit value, and returns a pointer to the
174
  matching 16-bit value in the target buffer.
175
176
  @param  Buffer  The pointer to the target buffer to scan.
177
  @param  Length  The count of 16-bit value to scan. Must be non-zero.
178
  @param  Value   The value to search for in the target buffer.
179
180
  @return The pointer to the first occurrence or NULL if not found.
181
182
**/
183
CONST VOID *
184
EFIAPI
185
InternalMemScanMem16 (
186
  IN      CONST VOID                *Buffer,
187
  IN      UINTN                     Length,
188
  IN      UINT16                    Value
189
  )
190
{
191
  CONST UINT16                      *Pointer;
192
193
  Pointer = (CONST UINT16*)Buffer;
194
  do {
195
    if (*(Pointer++) == Value) {
196
      return --Pointer;
197
    }
198
  } while (--Length != 0);
199
  return NULL;
200
}
201
202
/**
203
  Scans a target buffer for a 32-bit value, and returns a pointer to the
204
  matching 32-bit value in the target buffer.
205
206
  @param  Buffer  The pointer to the target buffer to scan.
207
  @param  Length  The count of 32-bit value to scan. Must be non-zero.
208
  @param  Value   The value to search for in the target buffer.
209
210
  @return The pointer to the first occurrence or NULL if not found.
211
212
**/
213
CONST VOID *
214
EFIAPI
215
InternalMemScanMem32 (
216
  IN      CONST VOID                *Buffer,
217
  IN      UINTN                     Length,
218
  IN      UINT32                    Value
219
  )
220
{
221
  CONST UINT32                      *Pointer;
222
223
  Pointer = (CONST UINT32*)Buffer;
224
  do {
225
    if (*(Pointer++) == Value) {
226
      return --Pointer;
227
    }
228
  } while (--Length != 0);
229
  return NULL;
230
}
231
232
/**
233
  Scans a target buffer for a 64-bit value, and returns a pointer to the
234
  matching 64-bit value in the target buffer.
235
236
  @param  Buffer  The pointer to the target buffer to scan.
237
  @param  Length  The count of 64-bit value to scan. Must be non-zero.
238
  @param  Value   The value to search for in the target buffer.
239
240
  @return The pointer to the first occurrence or NULL if not found.
241
242
**/
243
CONST VOID *
244
EFIAPI
245
InternalMemScanMem64 (
246
  IN      CONST VOID                *Buffer,
247
  IN      UINTN                     Length,
248
  IN      UINT64                    Value
249
  )
250
{
251
  CONST UINT64                      *Pointer;
252
253
  Pointer = (CONST UINT64*)Buffer;
254
  do {
255
    if (*(Pointer++) == Value) {
256
      return --Pointer;
257
    }
258
  } while (--Length != 0);
259
  return NULL;
260
}