]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Pei/PeiLib/Print/Print.c
EdkCompatabilityPkg: Fix build issues with X64 clang
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Pei / PeiLib / Print / Print.c
CommitLineData
3eb9473e 1/*++\r
2\r
4ea9375a
HT
3Copyright (c) 2004, Intel Corporation. All rights reserved.<BR>\r
4This program and the accompanying materials \r
3eb9473e 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 Print.c\r
15\r
16Abstract:\r
17\r
18 Basic Ascii AvSPrintf() function named AvSPrint(). AvSPrint() enables very\r
19 simple implemenation of debug prints.\r
20\r
21 You can not Print more than PEI_LIB_MAX_PRINT_BUFFER characters at a \r
22 time. This makes the implementation very simple.\r
23\r
24 AvSPrint format specification has the follwoing form\r
25\r
26 %[flags][width]type\r
27\r
28 flags:\r
29 '-' - Left justify\r
30 '+' - Prefix a sign\r
31 ' ' - Prefix a blank\r
32 ',' - Place commas in numberss\r
33 '0' - Prefix for width with zeros\r
34 'l' - UINT64\r
35 'L' - UINT64\r
36\r
37 width:\r
38 '*' - Get width from a UINTN argumnet from the argument list\r
39 Decimal number that represents width of print\r
40\r
41 type:\r
0f77dfb6 42 'p' - arugment is VOID *; printed as hex number\r
3eb9473e 43 'X' - argument is a UINTN hex number, prefix '0'\r
44 'x' - argument is a hex number\r
45 'd' - argument is a decimal number\r
46 'a' - argument is an ascii string \r
47 'S', 's' - argument is an Unicode string\r
48 'g' - argument is a pointer to an EFI_GUID\r
49 't' - argument is a pointer to an EFI_TIME structure\r
50 'c' - argument is an ascii character\r
51 'r' - argument is EFI_STATUS\r
52 '%' - Print a %\r
53\r
54--*/\r
55\r
56#include "Tiano.h"\r
57#include "Pei.h"\r
58#include "PeiLib.h"\r
59#include "Print.h"\r
60\r
3eb9473e 61\r
62STATIC\r
63UINTN\r
64ValueToString (\r
65 IN OUT CHAR8 *Buffer, \r
66 IN INT64 Value, \r
67 IN UINTN Flags, \r
68 IN UINTN Width\r
69 );\r
70\r
71STATIC\r
72UINTN\r
73ValueTomHexStr (\r
74 IN OUT CHAR8 *Buffer, \r
75 IN UINT64 Value, \r
76 IN UINTN Flags, \r
77 IN UINTN Width\r
78 );\r
79\r
80STATIC\r
81UINTN\r
82GuidToString (\r
83 IN EFI_GUID *Guid,\r
84 IN OUT CHAR8 *Buffer,\r
85 IN UINTN BufferSize\r
86 );\r
87\r
88STATIC\r
89UINTN\r
90TimeToString (\r
91 IN EFI_TIME *Time,\r
92 IN OUT CHAR8 *Buffer,\r
93 IN UINTN BufferSize\r
94 );\r
95\r
96STATIC\r
97UINTN\r
98EfiStatusToString (\r
99 IN EFI_STATUS Status,\r
100 OUT CHAR8 *Buffer,\r
101 IN UINTN BufferSize\r
102 );\r
103\r
104\r
105UINTN\r
106ASPrint (\r
107 OUT CHAR8 *Buffer,\r
108 IN UINTN BufferSize,\r
109 IN CONST CHAR8 *Format,\r
110 ...\r
111 )\r
112/*++\r
113\r
114Routine Description:\r
115\r
116 ASPrint function to process format and place the results in Buffer.\r
117\r
118Arguments:\r
119\r
120 Buffer - Ascii buffer to print the results of the parsing of Format into.\r
121\r
122 BufferSize - Maximum number of characters to put into buffer. Zero means no \r
123 limit.\r
124\r
125 Format - Ascii format string see file header for more details.\r
126\r
127 ... - Vararg list consumed by processing Format.\r
128\r
129Returns: \r
130\r
131 Number of characters printed.\r
132\r
133--*/\r
134{\r
135 UINTN Return;\r
136 VA_LIST Marker;\r
137\r
138 VA_START(Marker, Format);\r
139 Return = AvSPrint(Buffer, BufferSize, Format, Marker);\r
140 VA_END (Marker);\r
141 \r
142 return Return;\r
143}\r
144\r
145\r
146UINTN\r
147AvSPrint (\r
148 OUT CHAR8 *StartOfBuffer,\r
149 IN UINTN BufferSize,\r
150 IN CONST CHAR8 *FormatString,\r
151 IN VA_LIST Marker\r
152 )\r
153/*++\r
154\r
155Routine Description:\r
156\r
157 AvSPrint function to process format and place the results in Buffer. Since a \r
158 VA_LIST is used this rountine allows the nesting of Vararg routines. Thus \r
159 this is the main print working routine\r
160\r
161Arguments:\r
162\r
163 StartOfBuffer - Ascii buffer to print the results of the parsing of Format into.\r
164\r
165 BufferSize - Maximum number of characters to put into buffer. Zero means \r
166 no limit.\r
167\r
168 FormatString - Ascii format string see file header for more details.\r
169\r
170 Marker - Vararg list consumed by processing Format.\r
171\r
172Returns: \r
173\r
174 Number of characters printed.\r
175\r
176--*/\r
177{\r
178 CHAR8 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
179 CHAR8 *Buffer;\r
180 CHAR8 *AsciiStr;\r
181 CHAR16 *UnicodeStr;\r
182 CHAR8 *Format;\r
183 UINTN Index;\r
184 UINTN Flags;\r
185 UINTN Width;\r
186 UINTN Count;\r
187 UINTN BufferLeft;\r
188 UINT64 Value;\r
189 EFI_GUID *TmpGUID;\r
271d2c7f 190 BOOLEAN Done;\r
191 \r
3eb9473e 192 //\r
193 // Process the format string. Stop if Buffer is over run.\r
194 //\r
195 Buffer = StartOfBuffer;\r
196 Format = (CHAR8 *) FormatString;\r
197 BufferLeft = BufferSize;\r
198 for (Index = 0; (*Format != '\0') && (Index < BufferSize - 1); Format++) {\r
199 if (*Format != '%') {\r
200 if ((*Format == '\n') && (Index < BufferSize - 2)) {\r
201 //\r
202 // If carage return add line feed\r
203 //\r
204 Buffer[Index++] = '\r';\r
205 BufferLeft -= sizeof (CHAR8);\r
206 }\r
207\r
208 Buffer[Index++] = *Format;\r
209 BufferLeft -= sizeof (CHAR8);\r
210 } else {\r
211 \r
212 //\r
213 // Now it's time to parse what follows after %\r
271d2c7f 214 // \r
215 Flags = 0;\r
216 Width = 0;\r
217 for (Done = FALSE; !Done; ) {\r
218 Format++;\r
219 \r
220 switch (*Format) {\r
221 \r
222 case '-': Flags |= LEFT_JUSTIFY; break;\r
223 case '+': Flags |= PREFIX_SIGN; break;\r
224 case ' ': Flags |= PREFIX_BLANK; break;\r
225 case ',': Flags |= COMMA_TYPE; break;\r
226 case 'L':\r
227 case 'l': Flags |= LONG_TYPE; break;\r
228 \r
229 case '*':\r
230 Width = VA_ARG (Marker, UINTN);\r
231 break;\r
232 \r
233 case '0':\r
234 Flags |= PREFIX_ZERO;\r
235 case '1':\r
236 case '2':\r
237 case '3':\r
238 case '4':\r
239 case '5':\r
240 case '6':\r
241 case '7':\r
242 case '8':\r
243 case '9':\r
244 Count = 0;\r
245 do {\r
246 Count = (Count * 10) + *Format - '0';\r
247 Format++;\r
248 } while ((*Format >= '0') && (*Format <= '9'));\r
249 Format--;\r
250 Width = Count;\r
251 break;\r
252 \r
253 default:\r
254 Done = TRUE;\r
255 }\r
256 }\r
257\r
3eb9473e 258 switch (*Format) {\r
0f77dfb6 259 case 'p':\r
260 //\r
261 // Flag space, +, 0, L & l are invalid for type p.\r
262 //\r
263 Flags &= ~(PREFIX_BLANK| PREFIX_SIGN | LONG_TYPE);\r
264 if (sizeof (VOID *) > 4) {\r
265 Flags |= LONG_TYPE;\r
266 Value = VA_ARG (Marker, UINT64);\r
267 } else {\r
268 Value = VA_ARG (Marker, UINTN);\r
269 }\r
270 Flags |= PREFIX_ZERO;\r
271 \r
272 ValueTomHexStr (TempBuffer, Value, Flags, Width);\r
273 AsciiStr = TempBuffer;\r
274\r
275 for (; (*AsciiStr != '\0') && (Index < BufferSize - 1); AsciiStr++) {\r
276 Buffer[Index++] = *AsciiStr;\r
277 }\r
278 break;\r
3eb9473e 279 case 'X':\r
280 Flags |= PREFIX_ZERO;\r
281 Width = sizeof (UINT64) * 2;\r
282\r
283 //\r
284 // break skiped on purpose\r
285 //\r
286 case 'x':\r
287 if ((Flags & LONG_TYPE) == LONG_TYPE) {\r
288 Value = VA_ARG (Marker, UINT64);\r
289 } else {\r
290 Value = VA_ARG (Marker, UINTN);\r
291 }\r
292\r
293 ValueTomHexStr (TempBuffer, Value, Flags, Width);\r
294 AsciiStr = TempBuffer;\r
295\r
296 for (; (*AsciiStr != '\0') && (Index < BufferSize - 1); AsciiStr++) {\r
297 Buffer[Index++] = *AsciiStr;\r
298 }\r
299 break;\r
300\r
301 case 'd':\r
302 if ((Flags & LONG_TYPE) == LONG_TYPE) {\r
303 Value = VA_ARG (Marker, UINT64);\r
304 } else {\r
305 Value = (UINTN) VA_ARG (Marker, UINTN);\r
306 }\r
307\r
308 ValueToString (TempBuffer, Value, Flags, Width);\r
309 AsciiStr = TempBuffer;\r
310\r
311 for (; (*AsciiStr != '\0') && (Index < BufferSize - 1); AsciiStr++) {\r
312 Buffer[Index++] = *AsciiStr;\r
313 }\r
314 break;\r
315\r
316 case 's':\r
317 case 'S':\r
318 UnicodeStr = (CHAR16 *) VA_ARG (Marker, CHAR8 *);\r
319 if (UnicodeStr == NULL) {\r
320 UnicodeStr = L"<null string>";\r
321 }\r
322\r
323 for (Count = 0; (*UnicodeStr != '\0') && (Index < BufferSize - 1); UnicodeStr++, Count++) {\r
324 Buffer[Index++] = (CHAR8) *UnicodeStr;\r
325 }\r
326 //\r
327 // Add padding if needed\r
328 //\r
329 for (; (Count < Width) && (Index < BufferSize - 1); Count++) {\r
330 Buffer[Index++] = ' ';\r
331 }\r
332\r
333 break;\r
334\r
335 case 'a':\r
336 AsciiStr = (CHAR8 *) VA_ARG (Marker, CHAR8 *);\r
337 if (AsciiStr == NULL) {\r
338 AsciiStr = "<null string>";\r
339 }\r
340\r
341 for (Count = 0; (*AsciiStr != '\0') && (Index < BufferSize - 1); AsciiStr++, Count++) {\r
342 Buffer[Index++] = *AsciiStr;\r
343 }\r
344 //\r
345 // Add padding if needed\r
346 //\r
347 for (; (Count < Width) && (Index < BufferSize - 1); Count++) {\r
348 Buffer[Index++] = ' ';\r
349 }\r
350 break;\r
351\r
352 case 'c':\r
353 Buffer[Index++] = (CHAR8) VA_ARG (Marker, UINTN);\r
354 break;\r
355\r
356 case 'g':\r
357 TmpGUID = VA_ARG (Marker, EFI_GUID *);\r
358 if (TmpGUID != NULL) {\r
359 Index += GuidToString (\r
360 TmpGUID,\r
361 &Buffer[Index],\r
362 BufferLeft\r
363 );\r
364 }\r
365 break;\r
366\r
367 case 't':\r
368 Index += TimeToString (\r
369 VA_ARG (Marker, EFI_TIME *), \r
370 &Buffer[Index],\r
371 BufferLeft\r
372 );\r
373 break;\r
374\r
375 case 'r':\r
376 Index += EfiStatusToString (\r
377 VA_ARG (Marker, EFI_STATUS), \r
378 &Buffer[Index],\r
379 BufferLeft\r
380 );\r
381 break;\r
382\r
383 case '%':\r
384 Buffer[Index++] = *Format;\r
385 break;\r
386\r
387 default:\r
388 //\r
389 // if the type is unknown print it to the screen\r
390 //\r
391 Buffer[Index++] = *Format;\r
392 }\r
393\r
394 BufferLeft = BufferSize - Index;\r
395 }\r
396 }\r
397\r
398 Buffer[Index++] = '\0';\r
399\r
400 return &Buffer[Index] - StartOfBuffer;\r
401}\r
402\r
403\r
404\r
3eb9473e 405static CHAR8 mHexStr[] = { '0','1','2','3','4','5','6','7',\r
406 '8','9','A','B','C','D','E','F' };\r
407\r
408STATIC\r
409UINTN\r
410ValueTomHexStr (\r
411 IN OUT CHAR8 *Buffer, \r
412 IN UINT64 Value, \r
413 IN UINTN Flags, \r
414 IN UINTN Width\r
415 )\r
416/*++\r
417\r
418Routine Description:\r
419\r
420 AvSPrint worker function that prints a Value as a hex number in Buffer\r
421\r
422Arguments:\r
423\r
424 Buffer - Location to place ascii hex string of Value.\r
425\r
426 Value - Hex value to convert to a string in Buffer.\r
427\r
428 Flags - Flags to use in printing Hex string, see file header for details.\r
429\r
430 Width - Width of hex value.\r
431\r
432Returns: \r
433\r
434 Number of characters printed. \r
435\r
436--*/\r
437{\r
438 CHAR8 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
439 CHAR8 *TempStr;\r
440 CHAR8 Prefix;\r
441 CHAR8 *BufferPtr;\r
442 UINTN Count;\r
443 UINTN Index;\r
444\r
445 TempStr = TempBuffer;\r
446 BufferPtr = Buffer;\r
447 \r
448 //\r
449 // Count starts at one since we will null terminate. Each iteration of the\r
450 // loop picks off one nibble. Oh yea TempStr ends up backwards\r
451 //\r
452 Count = 0;\r
453 do {\r
454 *(TempStr++) = mHexStr[Value & 0x0f];\r
455 Value = RShiftU64 (Value, 4);\r
456 Count++;\r
457 } while (Value != 0);\r
458\r
459 if (Flags & PREFIX_ZERO) {\r
460 Prefix = '0';\r
461 } else if (!(Flags & LEFT_JUSTIFY)) { \r
462 Prefix = ' ';\r
463 } else {\r
464 Prefix = 0x00;\r
465 } \r
466 for (Index = Count; Index < Width; Index++) {\r
467 *(TempStr++) = Prefix;\r
468 }\r
469\r
470 //\r
471 // Reverse temp string into Buffer.\r
472 //\r
473 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
474 TempStr = TempBuffer + Width;\r
475 }\r
476 Index = 0;\r
477 while (TempStr != TempBuffer) {\r
478 *(BufferPtr++) = *(--TempStr);\r
479 Index++;\r
480 }\r
481 \r
482 *BufferPtr = 0;\r
483 return Index;\r
484}\r
485\r
486STATIC\r
487UINTN\r
488ValueToString (\r
489 IN OUT CHAR8 *Buffer, \r
490 IN INT64 Value, \r
491 IN UINTN Flags, \r
492 IN UINTN Width\r
493 )\r
494/*++\r
495\r
496Routine Description:\r
497\r
498 AvSPrint worker function that prints a Value as a decimal number in Buffer\r
499\r
500Arguments:\r
501\r
502 Buffer - Location to place ascii decimal number string of Value.\r
503\r
504 Value - Decimal value to convert to a string in Buffer.\r
505\r
506 Flags - Flags to use in printing decimal string, see file header for details.\r
507\r
508 Width - Width of hex value.\r
509\r
510Returns: \r
511\r
512 Number of characters printed. \r
513\r
514--*/\r
515{\r
516 CHAR8 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
517 CHAR8 *TempStr;\r
518 CHAR8 *BufferPtr;\r
519 UINTN Count;\r
520 UINTN NumberCount;\r
521 UINTN Remainder;\r
522 BOOLEAN Negative;\r
523 UINTN Index;\r
524\r
525 Negative = FALSE;\r
526 TempStr = TempBuffer;\r
527 BufferPtr = Buffer;\r
528 Count = 0;\r
529 NumberCount = 0;\r
530\r
531 if (Value < 0) {\r
532 Negative = TRUE;\r
533 Value = -Value;\r
534 }\r
535\r
536 do {\r
537 Value = (INT64)DivU64x32 ((UINT64)Value, 10, &Remainder);\r
538 *(TempStr++) = (CHAR8)(Remainder + '0');\r
539 Count++;\r
540 NumberCount++;\r
541 if ((Flags & COMMA_TYPE) == COMMA_TYPE) {\r
542 if (NumberCount % 3 == 0 && Value != 0) {\r
543 *(TempStr++) = ',';\r
544 Count++;\r
545 }\r
546 }\r
547 } while (Value != 0);\r
548\r
549 if (Negative) {\r
550 *(BufferPtr++) = '-';\r
551 Count++;\r
552 }\r
553\r
554 //\r
555 // Reverse temp string into Buffer.\r
556 //\r
557 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
558 TempStr = TempBuffer + Width;\r
559 }\r
560 Index = 0;\r
561 while (TempStr != TempBuffer) {\r
562 *(BufferPtr++) = *(--TempStr);\r
563 } \r
564\r
565 *BufferPtr = 0;\r
566 return Index;\r
567}\r
568\r
569STATIC\r
570UINTN\r
571GuidToString (\r
572 IN EFI_GUID *Guid,\r
573 IN CHAR8 *Buffer,\r
574 IN UINTN BufferSize\r
575 )\r
576/*++\r
577\r
578Routine Description:\r
579\r
580 AvSPrint worker function that prints an EFI_GUID.\r
581\r
582Arguments:\r
583\r
584 Guid - Pointer to GUID to print.\r
585\r
586 Buffer - Buffe to print Guid into.\r
587 \r
588 BufferSize - Size of Buffer.\r
589\r
590Returns: \r
591\r
592 Number of characters printed. \r
593\r
594--*/\r
595{\r
596 UINTN Size;\r
597\r
598 Size = ASPrint (\r
599 Buffer,\r
600 BufferSize, \r
601 "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
602 (UINTN)Guid->Data1, \r
603 (UINTN)Guid->Data2,\r
604 (UINTN)Guid->Data3,\r
605 (UINTN)Guid->Data4[0],\r
606 (UINTN)Guid->Data4[1],\r
607 (UINTN)Guid->Data4[2],\r
608 (UINTN)Guid->Data4[3],\r
609 (UINTN)Guid->Data4[4],\r
610 (UINTN)Guid->Data4[5],\r
611 (UINTN)Guid->Data4[6],\r
612 (UINTN)Guid->Data4[7]\r
613 );\r
614\r
615 //\r
616 // ASPrint will null terminate the string. The -1 skips the null\r
617 //\r
618 return Size - 1;\r
619}\r
620\r
621\r
622STATIC\r
623UINTN\r
624TimeToString (\r
625 IN EFI_TIME *Time,\r
626 OUT CHAR8 *Buffer,\r
627 IN UINTN BufferSize\r
628 )\r
629/*++\r
630\r
631Routine Description:\r
632\r
633 AvSPrint worker function that prints EFI_TIME.\r
634\r
635Arguments:\r
636\r
637 Time - Pointer to EFI_TIME sturcture to print.\r
638\r
639 Buffer - Buffer to print Time into.\r
640 \r
641 BufferSize - Size of Buffer.\r
642\r
643Returns: \r
644\r
645 Number of characters printed. \r
646\r
647--*/\r
648{ \r
649 UINTN Size;\r
650\r
651 Size = ASPrint (\r
652 Buffer,\r
653 BufferSize, \r
654 "%02d/%02d/%04d %02d:%02d",\r
655 (UINTN)Time->Month,\r
656 (UINTN)Time->Day,\r
657 (UINTN)Time->Year,\r
658 (UINTN)Time->Hour,\r
659 (UINTN)Time->Minute\r
660 );\r
661\r
662 //\r
663 // ASPrint will null terminate the string. The -1 skips the null\r
664 //\r
665 return Size - 1;\r
666} \r
667\r
668STATIC\r
669UINTN\r
670EfiStatusToString (\r
671 IN EFI_STATUS Status,\r
672 OUT CHAR8 *Buffer,\r
673 IN UINTN BufferSize\r
674 )\r
675/*++\r
676\r
677Routine Description:\r
678\r
679 AvSPrint worker function that prints EFI_STATUS as a string. If string is\r
680 not known a hex value will be printed.\r
681\r
682Arguments:\r
683\r
684 Status - EFI_STATUS sturcture to print.\r
685\r
686 Buffer - Buffer to print EFI_STATUS message string into.\r
687 \r
688 BufferSize - Size of Buffer.\r
689\r
690Returns: \r
691\r
692 Number of characters printed. \r
693\r
694--*/\r
695{\r
696 UINTN Size;\r
697 CHAR8 *Desc;\r
698 \r
699 if (Status == EFI_SUCCESS) {\r
700 Desc = "Success";\r
701 } else if (Status == EFI_LOAD_ERROR) {\r
702 Desc = "Load Error";\r
703 } else if (Status == EFI_INVALID_PARAMETER) {\r
704 Desc = "Invalid Parameter";\r
705 } else if (Status == EFI_UNSUPPORTED) {\r
706 Desc = "Unsupported";\r
707 } else if (Status == EFI_BAD_BUFFER_SIZE) {\r
708 Desc = "Bad Buffer Size";\r
709 } else if (Status == EFI_BUFFER_TOO_SMALL) {\r
710 Desc = "Buffer Too Small";\r
711 } else if (Status == EFI_NOT_READY) {\r
712 Desc = "Not Ready";\r
713 } else if (Status == EFI_DEVICE_ERROR) {\r
714 Desc = "Device Error";\r
715 } else if (Status == EFI_WRITE_PROTECTED) {\r
716 Desc = "Write Protected";\r
717 } else if (Status == EFI_OUT_OF_RESOURCES) {\r
718 Desc = "Out of Resources";\r
719 } else if (Status == EFI_VOLUME_CORRUPTED) {\r
720 Desc = "Volume Corrupt";\r
721 } else if (Status == EFI_VOLUME_FULL) {\r
722 Desc = "Volume Full";\r
723 } else if (Status == EFI_NO_MEDIA) {\r
724 Desc = "No Media";\r
725 } else if (Status == EFI_MEDIA_CHANGED) {\r
726 Desc = "Media changed";\r
727 } else if (Status == EFI_NOT_FOUND) {\r
728 Desc = "Not Found";\r
729 } else if (Status == EFI_ACCESS_DENIED) {\r
730 Desc = "Access Denied";\r
731 } else if (Status == EFI_NO_RESPONSE) {\r
732 Desc = "No Response";\r
733 } else if (Status == EFI_NO_MAPPING) {\r
734 Desc = "No mapping";\r
735 } else if (Status == EFI_TIMEOUT) {\r
736 Desc = "Time out";\r
737 } else if (Status == EFI_NOT_STARTED) {\r
738 Desc = "Not started";\r
739 } else if (Status == EFI_ALREADY_STARTED) {\r
740 Desc = "Already started";\r
741 } else if (Status == EFI_ABORTED) {\r
742 Desc = "Aborted";\r
743 } else if (Status == EFI_ICMP_ERROR) {\r
744 Desc = "ICMP Error";\r
745 } else if (Status == EFI_TFTP_ERROR) {\r
746 Desc = "TFTP Error";\r
747 } else if (Status == EFI_PROTOCOL_ERROR) {\r
748 Desc = "Protocol Error";\r
749 } else if (Status == EFI_WARN_UNKNOWN_GLYPH) {\r
750 Desc = "Warning Unknown Glyph";\r
751 } else if (Status == EFI_WARN_DELETE_FAILURE) {\r
752 Desc = "Warning Delete Failure";\r
753 } else if (Status == EFI_WARN_WRITE_FAILURE) {\r
754 Desc = "Warning Write Failure";\r
755 } else if (Status == EFI_WARN_BUFFER_TOO_SMALL) {\r
756 Desc = "Warning Buffer Too Small";\r
757 } else {\r
758 Desc = NULL;\r
759 }\r
760 //\r
761 // If we found a match, copy the message to the user's buffer. Otherwise\r
762 // sprint the hex status code to their buffer.\r
763 //\r
764 if (Desc != NULL) {\r
765 Size = ASPrint (Buffer, BufferSize, "%a", Desc);\r
766 } else {\r
767 Size = ASPrint (Buffer, BufferSize, "%X", Status);\r
768 }\r
769 return Size - 1;\r
770}\r