]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Sample/Tools/Source/Common/CommonLib.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / Common / CommonLib.c
CommitLineData
3eb9473e 1/*++\r
2\r
3Copyright (c) 2004, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 CommonLib.c\r
15\r
16Abstract:\r
17\r
18 Common Library Functions\r
19 \r
20--*/\r
21\r
22#include "TianoCommon.h"\r
23#include "PeiHob.h"\r
24#include <stdio.h>\r
25#include <string.h>\r
26#include <stdlib.h>\r
27#include "CommonLib.h"\r
28\r
29VOID\r
30PeiZeroMem (\r
31 IN VOID *Buffer,\r
32 IN UINTN Size\r
33 )\r
34/*++\r
35\r
36Routine Description:\r
37\r
38 Set Buffer to zero for Size bytes.\r
39\r
40Arguments:\r
41\r
42 Buffer - Memory to set.\r
43\r
44 Size - Number of bytes to set\r
45\r
46Returns:\r
47\r
48 None\r
49\r
50--*/\r
51{\r
52 INT8 *Ptr;\r
53\r
54 Ptr = Buffer;\r
55 while (Size--) {\r
56 *(Ptr++) = 0;\r
57 }\r
58}\r
59\r
60VOID\r
61PeiCopyMem (\r
62 IN VOID *Destination,\r
63 IN VOID *Source,\r
64 IN UINTN Length\r
65 )\r
66/*++\r
67\r
68Routine Description:\r
69\r
70 Copy Length bytes from Source to Destination.\r
71\r
72Arguments:\r
73\r
74 Destination - Target of copy\r
75\r
76 Source - Place to copy from\r
77\r
78 Length - Number of bytes to copy\r
79\r
80Returns:\r
81\r
82 None\r
83\r
84--*/\r
85{\r
86 CHAR8 *Destination8;\r
87 CHAR8 *Source8;\r
88\r
89 Destination8 = Destination;\r
90 Source8 = Source;\r
91 while (Length--) {\r
92 *(Destination8++) = *(Source8++);\r
93 }\r
94}\r
95\r
96VOID\r
97ZeroMem (\r
98 IN VOID *Buffer,\r
99 IN UINTN Size\r
100 )\r
101{\r
102 PeiZeroMem (Buffer, Size);\r
103}\r
104\r
105VOID\r
106CopyMem (\r
107 IN VOID *Destination,\r
108 IN VOID *Source,\r
109 IN UINTN Length\r
110 )\r
111{\r
112 PeiCopyMem (Destination, Source, Length);\r
113}\r
114\r
115INTN\r
116CompareGuid (\r
117 IN EFI_GUID *Guid1,\r
118 IN EFI_GUID *Guid2\r
119 )\r
120/*++\r
121\r
122Routine Description:\r
123\r
124 Compares to GUIDs\r
125\r
126Arguments:\r
127\r
128 Guid1 - guid to compare\r
129 Guid2 - guid to compare\r
130\r
131Returns:\r
132 = 0 if Guid1 == Guid2\r
133 != 0 if Guid1 != Guid2 \r
134\r
135--*/\r
136{\r
137 INT32 *g1;\r
138 INT32 *g2;\r
139 INT32 r;\r
140\r
141 //\r
142 // Compare 32 bits at a time\r
143 //\r
144 g1 = (INT32 *) Guid1;\r
145 g2 = (INT32 *) Guid2;\r
146\r
147 r = g1[0] - g2[0];\r
148 r |= g1[1] - g2[1];\r
149 r |= g1[2] - g2[2];\r
150 r |= g1[3] - g2[3];\r
151\r
152 return r;\r
153}\r
154\r
155EFI_STATUS\r
156GetFileImage (\r
157 IN CHAR8 *InputFileName,\r
158 OUT CHAR8 **InputFileImage,\r
159 OUT UINT32 *BytesRead\r
160 )\r
161/*++\r
162\r
163Routine Description:\r
164\r
165 This function opens a file and reads it into a memory buffer. The function \r
166 will allocate the memory buffer and returns the size of the buffer.\r
167\r
168Arguments:\r
169\r
170 InputFileName The name of the file to read.\r
171 InputFileImage A pointer to the memory buffer.\r
172 BytesRead The size of the memory buffer.\r
173\r
174Returns:\r
175\r
176 EFI_SUCCESS The function completed successfully.\r
177 EFI_INVALID_PARAMETER One of the input parameters was invalid.\r
178 EFI_ABORTED An error occurred.\r
179 EFI_OUT_OF_RESOURCES No resource to complete operations.\r
180\r
181--*/\r
182{\r
183 FILE *InputFile;\r
184 UINT32 FileSize;\r
185\r
186 //\r
187 // Verify input parameters.\r
188 //\r
189 if (InputFileName == NULL || strlen (InputFileName) == 0 || InputFileImage == NULL) {\r
190 return EFI_INVALID_PARAMETER;\r
191 }\r
192 //\r
193 // Open the file and copy contents into a memory buffer.\r
194 //\r
195 //\r
196 // Open the file\r
197 //\r
198 InputFile = fopen (InputFileName, "rb");\r
199 if (InputFile == NULL) {\r
200 printf ("ERROR: Could not open input file \"%s\".\n", InputFileName);\r
201 return EFI_ABORTED;\r
202 }\r
203 //\r
204 // Go to the end so that we can determine the file size\r
205 //\r
206 if (fseek (InputFile, 0, SEEK_END)) {\r
207 printf ("ERROR: System error reading input file \"%s\".\n", InputFileName);\r
208 fclose (InputFile);\r
209 return EFI_ABORTED;\r
210 }\r
211 //\r
212 // Get the file size\r
213 //\r
214 FileSize = ftell (InputFile);\r
215 if (FileSize == -1) {\r
216 printf ("ERROR: System error parsing input file \"%s\".\n", InputFileName);\r
217 fclose (InputFile);\r
218 return EFI_ABORTED;\r
219 }\r
220 //\r
221 // Allocate a buffer\r
222 //\r
223 *InputFileImage = malloc (FileSize);\r
224 if (*InputFileImage == NULL) {\r
225 fclose (InputFile);\r
226 return EFI_OUT_OF_RESOURCES;\r
227 }\r
228 //\r
229 // Reset to the beginning of the file\r
230 //\r
231 if (fseek (InputFile, 0, SEEK_SET)) {\r
232 printf ("ERROR: System error reading input file \"%s\".\n", InputFileName);\r
233 fclose (InputFile);\r
234 free (*InputFileImage);\r
235 *InputFileImage = NULL;\r
236 return EFI_ABORTED;\r
237 }\r
238 //\r
239 // Read all of the file contents.\r
240 //\r
241 *BytesRead = fread (*InputFileImage, sizeof (UINT8), FileSize, InputFile);\r
242 if (*BytesRead != sizeof (UINT8) * FileSize) {\r
243 printf ("ERROR: Reading file \"%s\"%i.\n", InputFileName);\r
244 fclose (InputFile);\r
245 free (*InputFileImage);\r
246 *InputFileImage = NULL;\r
247 return EFI_ABORTED;\r
248 }\r
249 //\r
250 // Close the file\r
251 //\r
252 fclose (InputFile);\r
253\r
254 return EFI_SUCCESS;\r
255}\r
256\r
257UINT8\r
258CalculateChecksum8 (\r
259 IN UINT8 *Buffer,\r
260 IN UINTN Size\r
261 )\r
262/*++\r
263 \r
264Routine Description:\r
265\r
266 This function calculates the value needed for a valid UINT8 checksum\r
267\r
268Arguments:\r
269\r
270 Buffer Pointer to buffer containing byte data of component.\r
271 Size Size of the buffer\r
272\r
273Returns:\r
274\r
275 The 8 bit checksum value needed.\r
276\r
277--*/\r
278{\r
279 return (UINT8) (0x100 - CalculateSum8 (Buffer, Size));\r
280}\r
281\r
282UINT8\r
283CalculateSum8 (\r
284 IN UINT8 *Buffer,\r
285 IN UINT32 Size\r
286 )\r
287/*++\r
288 \r
289Routine Description::\r
290\r
291 This function calculates the UINT8 sum for the requested region.\r
292\r
293Arguments:\r
294\r
295 Buffer Pointer to buffer containing byte data of component.\r
296 Size Size of the buffer\r
297\r
298Returns:\r
299\r
300 The 8 bit checksum value needed.\r
301\r
302--*/\r
303{\r
304 UINTN Index;\r
305 UINT8 Sum;\r
306\r
307 Sum = 0;\r
308\r
309 //\r
310 // Perform the byte sum for buffer\r
311 //\r
312 for (Index = 0; Index < Size; Index++) {\r
313 Sum = (UINT8) (Sum + Buffer[Index]);\r
314 }\r
315\r
316 return Sum;\r
317}\r
318\r
319UINT16\r
320CalculateChecksum16 (\r
321 IN UINT16 *Buffer,\r
322 IN UINTN Size\r
323 )\r
324/*++\r
325 \r
326Routine Description::\r
327\r
328 This function calculates the value needed for a valid UINT16 checksum\r
329\r
330Arguments:\r
331\r
332 Buffer Pointer to buffer containing byte data of component.\r
333 Size Size of the buffer\r
334\r
335Returns:\r
336\r
337 The 16 bit checksum value needed.\r
338\r
339--*/\r
340{\r
341 return (UINT16) (0x10000 - CalculateSum16 (Buffer, Size));\r
342}\r
343\r
344UINT16\r
345CalculateSum16 (\r
346 IN UINT16 *Buffer,\r
347 IN UINTN Size\r
348 )\r
349/*++\r
350 \r
351Routine Description:\r
352\r
353 This function calculates the UINT16 sum for the requested region.\r
354\r
355Arguments:\r
356\r
357 Buffer Pointer to buffer containing byte data of component.\r
358 Size Size of the buffer\r
359\r
360Returns:\r
361\r
362 The 16 bit checksum\r
363\r
364--*/\r
365{\r
366 UINTN Index;\r
367 UINT16 Sum;\r
368\r
369 Sum = 0;\r
370\r
371 //\r
372 // Perform the word sum for buffer\r
373 //\r
374 for (Index = 0; Index < Size; Index++) {\r
375 Sum = (UINT16) (Sum + Buffer[Index]);\r
376 }\r
377\r
378 return (UINT16) Sum;\r
379}\r
380\r
381EFI_STATUS\r
382PrintGuid (\r
383 IN EFI_GUID *Guid\r
384 )\r
385/*++\r
386\r
387Routine Description:\r
388\r
389 This function prints a GUID to STDOUT.\r
390\r
391Arguments:\r
392\r
393 Guid Pointer to a GUID to print.\r
394\r
395Returns:\r
396\r
397 EFI_SUCCESS The GUID was printed.\r
398 EFI_INVALID_PARAMETER The input was NULL.\r
399\r
400--*/\r
401{\r
402 if (Guid == NULL) {\r
403 printf ("ERROR: PrintGuid called with a NULL value.\n");\r
404 return EFI_INVALID_PARAMETER;\r
405 }\r
406\r
407 printf (\r
408 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",\r
409 Guid->Data1,\r
410 Guid->Data2,\r
411 Guid->Data3,\r
412 Guid->Data4[0],\r
413 Guid->Data4[1],\r
414 Guid->Data4[2],\r
415 Guid->Data4[3],\r
416 Guid->Data4[4],\r
417 Guid->Data4[5],\r
418 Guid->Data4[6],\r
419 Guid->Data4[7]\r
420 );\r
421 return EFI_SUCCESS;\r
422}\r
423\r
424EFI_STATUS\r
425PrintGuidToBuffer (\r
426 IN EFI_GUID *Guid,\r
427 IN OUT UINT8 *Buffer,\r
428 IN UINT32 BufferLen,\r
429 IN BOOLEAN Uppercase\r
430 )\r
431/*++\r
432\r
433Routine Description:\r
434\r
435 This function prints a GUID to a buffer\r
436\r
437Arguments:\r
438\r
439 Guid - Pointer to a GUID to print.\r
440 Buffer - Pointer to a user-provided buffer to print to\r
441 BufferLen - Size of the Buffer\r
442 Uppercase - If use upper case.\r
443\r
444Returns:\r
445\r
446 EFI_SUCCESS The GUID was printed.\r
447 EFI_INVALID_PARAMETER The input was NULL.\r
448 EFI_BUFFER_TOO_SMALL The input buffer was not big enough\r
449 \r
450--*/\r
451{\r
452 if (Guid == NULL) {\r
453 printf ("ERROR: PrintGuidToBuffer() called with a NULL value\n");\r
454 return EFI_INVALID_PARAMETER;\r
455 }\r
456\r
457 if (BufferLen < PRINTED_GUID_BUFFER_SIZE) {\r
458 printf ("ERORR: PrintGuidToBuffer() called with invalid buffer size\n");\r
459 return EFI_BUFFER_TOO_SMALL;\r
460 }\r
461\r
462 if (Uppercase) {\r
463 sprintf (\r
464 Buffer,\r
465 "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X",\r
466 Guid->Data1,\r
467 Guid->Data2,\r
468 Guid->Data3,\r
469 Guid->Data4[0],\r
470 Guid->Data4[1],\r
471 Guid->Data4[2],\r
472 Guid->Data4[3],\r
473 Guid->Data4[4],\r
474 Guid->Data4[5],\r
475 Guid->Data4[6],\r
476 Guid->Data4[7]\r
477 );\r
478 } else {\r
479 sprintf (\r
480 Buffer,\r
481 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
482 Guid->Data1,\r
483 Guid->Data2,\r
484 Guid->Data3,\r
485 Guid->Data4[0],\r
486 Guid->Data4[1],\r
487 Guid->Data4[2],\r
488 Guid->Data4[3],\r
489 Guid->Data4[4],\r
490 Guid->Data4[5],\r
491 Guid->Data4[6],\r
492 Guid->Data4[7]\r
493 );\r
494 }\r
495\r
496 return EFI_SUCCESS;\r
497}\r