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