]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiMemoryLib/MemLibGeneric.c
Split wrapper functions into separate source files to reduce image code size
[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
135 ASSERT (Length > 0);\r
136 while ((--Length != 0) &&\r
137 (*(INT8*)DestinationBuffer == *(INT8*)SourceBuffer)) {\r
138 DestinationBuffer = (INT8*)DestinationBuffer + 1;\r
139 SourceBuffer = (INT8*)SourceBuffer + 1;\r
140 }\r
141 return (INTN)*(UINT8*)DestinationBuffer - (INTN)*(UINT8*)SourceBuffer;\r
142}\r
143\r
144/**\r
145 Scans a target buffer for an 8-bit value, and returns a pointer to the\r
146 matching 8-bit value in the target buffer.\r
147\r
148 @param Buffer Pointer to the target buffer to scan.\r
149 @param Length Number of bytes in Buffer to scan. Must be non-zero.\r
150 @param Value Value to search for in the target buffer.\r
151\r
152 @return Pointer to the first occurrence or NULL if not found.\r
153\r
154**/\r
155CONST VOID *\r
156EFIAPI\r
157InternalMemScanMem8 (\r
158 IN CONST VOID *Buffer,\r
159 IN UINTN Length,\r
160 IN UINT8 Value\r
161 )\r
162{\r
163 CONST UINT8 *Pointer;\r
164\r
165 ASSERT (Length > 0);\r
166 Pointer = (CONST UINT8*)Buffer;\r
167 do {\r
168 if (*(Pointer++) == Value) {\r
169 return Pointer;\r
170 }\r
171 } while (--Length != 0);\r
172 return NULL;\r
173}\r
174\r
175/**\r
176 Scans a target buffer for a 16-bit value, and returns a pointer to the\r
177 matching 16-bit value in the target buffer.\r
178\r
179 @param Buffer Pointer to the target buffer to scan.\r
180 @param Length Number of bytes in Buffer to scan. Must be non-zero.\r
181 @param Value Value to search for in the target buffer.\r
182\r
183 @return Pointer to the first occurrence or NULL if not found.\r
184\r
185**/\r
186CONST VOID *\r
187EFIAPI\r
188InternalMemScanMem16 (\r
189 IN CONST VOID *Buffer,\r
190 IN UINTN Length,\r
191 IN UINT16 Value\r
192 )\r
193{\r
194 CONST UINT16 *Pointer;\r
195\r
196 ASSERT (Length > 0);\r
197 Pointer = (CONST UINT16*)Buffer;\r
198 do {\r
199 if (*(Pointer++) == Value) {\r
200 return Pointer;\r
201 }\r
202 } while (--Length != 0);\r
203 return NULL;\r
204}\r
205\r
206/**\r
207 Scans a target buffer for a 32-bit value, and returns a pointer to the\r
208 matching 32-bit value in the target buffer.\r
209\r
210 @param Buffer Pointer to the target buffer to scan.\r
211 @param Length Number of bytes in Buffer to scan. Must be non-zero.\r
212 @param Value Value to search for in the target buffer.\r
213\r
214 @return Pointer to the first occurrence or NULL if not found.\r
215\r
216**/\r
217CONST VOID *\r
218EFIAPI\r
219InternalMemScanMem32 (\r
220 IN CONST VOID *Buffer,\r
221 IN UINTN Length,\r
222 IN UINT32 Value\r
223 )\r
224{\r
225 CONST UINT32 *Pointer;\r
226\r
227 ASSERT (Length > 0);\r
228 Pointer = (CONST UINT32*)Buffer;\r
229 do {\r
230 if (*(Pointer++) == Value) {\r
231 return Pointer;\r
232 }\r
233 } while (--Length != 0);\r
234 return NULL;\r
235}\r
236\r
237/**\r
238 Scans a target buffer for a 64-bit value, and returns a pointer to the\r
239 matching 64-bit value in the target buffer.\r
240\r
241 @param Buffer Pointer to the target buffer to scan.\r
242 @param Length Number of bytes in Buffer to scan. Must be non-zero.\r
243 @param Value Value to search for in the target buffer.\r
244\r
245 @return Pointer to the first occurrence or NULL if not found.\r
246\r
247**/\r
248CONST VOID *\r
249EFIAPI\r
250InternalMemScanMem64 (\r
251 IN CONST VOID *Buffer,\r
252 IN UINTN Length,\r
253 IN UINT64 Value\r
254 )\r
255{\r
256 CONST UINT64 *Pointer;\r
257\r
258 ASSERT (Length > 0);\r
259 Pointer = (CONST UINT64*)Buffer;\r
260 do {\r
261 if (*(Pointer++) == Value) {\r
262 return Pointer;\r
263 }\r
264 } while (--Length != 0);\r
265 return NULL;\r
266}\r