mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-27 01:03:45 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			737 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			737 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c) 2004, Intel Corporation                                                         
 | |
| All rights reserved. This program and the accompanying materials                          
 | |
| are licensed and made available under the terms and conditions of the BSD License         
 | |
| which accompanies this distribution.  The full text of the license may be found at        
 | |
| http://opensource.org/licenses/bsd-license.php                                            
 | |
|                                                                                           
 | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   Print.c
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   Basic Ascii AvSPrintf() function named AvSPrint(). AvSPrint() enables very
 | |
|   simple implemenation of debug prints.
 | |
| 
 | |
|   You can not Print more than PEI_LIB_MAX_PRINT_BUFFER characters at a 
 | |
|   time. This makes the implementation very simple.
 | |
| 
 | |
|   AvSPrint format specification has the follwoing form
 | |
| 
 | |
|   %[flags][width]type
 | |
| 
 | |
|   flags:
 | |
|     '-' - Left justify
 | |
|     '+' - Prefix a sign
 | |
|     ' ' - Prefix a blank
 | |
|     ',' - Place commas in numberss
 | |
|     '0' - Prefix for width with zeros
 | |
|     'l' - UINT64
 | |
|     'L' - UINT64
 | |
| 
 | |
|   width:
 | |
|     '*' - Get width from a UINTN argumnet from the argument list
 | |
|     Decimal number that represents width of print
 | |
| 
 | |
|   type:
 | |
|     'X' - argument is a UINTN hex number, prefix '0'
 | |
|     'x' - argument is a hex number
 | |
|     'd' - argument is a decimal number
 | |
|     'a' - argument is an ascii string 
 | |
|     'S', 's' - argument is an Unicode string
 | |
|     'g' - argument is a pointer to an EFI_GUID
 | |
|     't' - argument is a pointer to an EFI_TIME structure
 | |
|     'c' - argument is an ascii character
 | |
|     'r' - argument is EFI_STATUS
 | |
|     '%' - Print a %
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #include "Tiano.h"
 | |
| #include "Pei.h"
 | |
| #include "PeiLib.h"
 | |
| #include "Print.h"
 | |
| 
 | |
| 
 | |
| STATIC
 | |
| CHAR8 *
 | |
| GetFlagsAndWidth (
 | |
|   IN  CHAR8       *Format, 
 | |
|   OUT UINTN       *Flags, 
 | |
|   OUT UINTN       *Width,
 | |
|   IN OUT  VA_LIST *Marker
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| ValueToString (
 | |
|   IN  OUT CHAR8   *Buffer, 
 | |
|   IN  INT64       Value, 
 | |
|   IN  UINTN       Flags, 
 | |
|   IN  UINTN       Width
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| ValueTomHexStr (
 | |
|   IN  OUT CHAR8   *Buffer, 
 | |
|   IN  UINT64      Value, 
 | |
|   IN  UINTN       Flags, 
 | |
|   IN  UINTN       Width
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| GuidToString (
 | |
|   IN  EFI_GUID  *Guid,
 | |
|   IN OUT CHAR8  *Buffer,
 | |
|   IN  UINTN     BufferSize
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| TimeToString (
 | |
|   IN  EFI_TIME  *Time,
 | |
|   IN OUT CHAR8  *Buffer,
 | |
|   IN  UINTN     BufferSize
 | |
|   );
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| EfiStatusToString (
 | |
|   IN EFI_STATUS   Status,
 | |
|   OUT CHAR8       *Buffer,
 | |
|   IN  UINTN       BufferSize
 | |
|   );
 | |
| 
 | |
| 
 | |
| UINTN
 | |
| ASPrint (
 | |
|   OUT CHAR8         *Buffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR8   *Format,
 | |
|   ...
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   ASPrint function to process format and place the results in Buffer.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Buffer     - Ascii buffer to print the results of the parsing of Format into.
 | |
| 
 | |
|   BufferSize - Maximum number of characters to put into buffer. Zero means no 
 | |
|                limit.
 | |
| 
 | |
|   Format - Ascii format string see file header for more details.
 | |
| 
 | |
|   ...    - Vararg list consumed by processing Format.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Return;
 | |
|   VA_LIST Marker;
 | |
| 
 | |
|   VA_START(Marker, Format);
 | |
|   Return = AvSPrint(Buffer, BufferSize, Format, Marker);
 | |
|   VA_END (Marker);
 | |
|   
 | |
|   return Return;
 | |
| }
 | |
| 
 | |
| 
 | |
| UINTN
 | |
| AvSPrint (
 | |
|   OUT CHAR8         *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR8   *FormatString,
 | |
|   IN  VA_LIST       Marker
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint function to process format and place the results in Buffer. Since a 
 | |
|   VA_LIST is used this rountine allows the nesting of Vararg routines. Thus 
 | |
|   this is the main print working routine
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   StartOfBuffer - Ascii buffer to print the results of the parsing of Format into.
 | |
| 
 | |
|   BufferSize    - Maximum number of characters to put into buffer. Zero means 
 | |
|                   no limit.
 | |
| 
 | |
|   FormatString  - Ascii format string see file header for more details.
 | |
| 
 | |
|   Marker        - Vararg list consumed by processing Format.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR8   *Buffer;
 | |
|   CHAR8   *AsciiStr;
 | |
|   CHAR16  *UnicodeStr;
 | |
|   CHAR8   *Format;
 | |
|   UINTN   Index;
 | |
|   UINTN   Flags;
 | |
|   UINTN   Width;
 | |
|   UINT64  Value;
 | |
| 
 | |
|   //
 | |
|   // Process the format string. Stop if Buffer is over run.
 | |
|   //
 | |
| 
 | |
|   Buffer = StartOfBuffer;
 | |
|   Format = (CHAR8 *)FormatString; 
 | |
|   for (Index = 0; (*Format != '\0') && (Index < BufferSize); Format++) {
 | |
|     if (*Format != '%') {
 | |
|       if (*Format == '\n') {
 | |
|         //
 | |
|         // If carage return add line feed
 | |
|         //
 | |
|         Buffer[Index++] = '\r';
 | |
|       }
 | |
|       Buffer[Index++] = *Format;
 | |
|     } else {
 | |
|       
 | |
|       //
 | |
|       // Now it's time to parse what follows after %
 | |
|       //
 | |
|       Format = GetFlagsAndWidth (Format, &Flags, &Width, &Marker);
 | |
|       switch (*Format) {
 | |
|       case 'X':
 | |
|         Flags |= PREFIX_ZERO;
 | |
|         Width = sizeof (UINT64) * 2;
 | |
|         //
 | |
|         // break skiped on purpose
 | |
|         //
 | |
|       case 'x':
 | |
|         if ((Flags & LONG_TYPE) == LONG_TYPE) {
 | |
|           Value = VA_ARG (Marker, UINT64);
 | |
|         } else {
 | |
|           Value = VA_ARG (Marker, UINTN);
 | |
|         }
 | |
|         Index += ValueTomHexStr (&Buffer[Index], Value, Flags, Width);
 | |
|         break;
 | |
| 
 | |
|       case 'd':
 | |
|         if ((Flags & LONG_TYPE) == LONG_TYPE) {
 | |
|           Value = VA_ARG (Marker, UINT64);
 | |
|         } else {
 | |
|           Value = (UINTN)VA_ARG (Marker, UINTN);
 | |
|         }
 | |
|         Index += ValueToString (&Buffer[Index], Value, Flags, Width);
 | |
|         break;
 | |
| 
 | |
|       case 's':
 | |
|       case 'S':
 | |
|         UnicodeStr = (CHAR16 *)VA_ARG (Marker, CHAR16 *);
 | |
|         if (UnicodeStr == NULL) {
 | |
|           UnicodeStr = L"<null string>";
 | |
|         }
 | |
|         for ( ;*UnicodeStr != '\0'; UnicodeStr++) {
 | |
|           Buffer[Index++] = (CHAR8)*UnicodeStr;
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 'a':
 | |
|         AsciiStr = (CHAR8 *)VA_ARG (Marker, CHAR8 *);
 | |
|         if (AsciiStr == NULL) {
 | |
|           AsciiStr = "<null string>";
 | |
|         }
 | |
|         while (*AsciiStr != '\0') {
 | |
|           Buffer[Index++] = *AsciiStr++;
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 'c':
 | |
|         Buffer[Index++] = (CHAR8)VA_ARG (Marker, UINTN);
 | |
|         break;
 | |
| 
 | |
|       case 'g':
 | |
|         Index += GuidToString (
 | |
|                   VA_ARG (Marker, EFI_GUID *), 
 | |
|                   &Buffer[Index], 
 | |
|                   BufferSize
 | |
|                   );
 | |
|         break;
 | |
| 
 | |
|       case 't':
 | |
|         Index += TimeToString (
 | |
|                   VA_ARG (Marker, EFI_TIME *), 
 | |
|                   &Buffer[Index], 
 | |
|                   BufferSize
 | |
|                   );
 | |
|         break;
 | |
| 
 | |
|       case 'r':
 | |
|         Index += EfiStatusToString (
 | |
|                   VA_ARG (Marker, EFI_STATUS), 
 | |
|                   &Buffer[Index], 
 | |
|                   BufferSize
 | |
|                   );
 | |
|         break;
 | |
| 
 | |
|       case '%':
 | |
|         Buffer[Index++] = *Format;
 | |
|         break;
 | |
|     
 | |
|       default:
 | |
|         //
 | |
|         // if the type is unknown print it to the screen
 | |
|         //
 | |
|         Buffer[Index++] = *Format;
 | |
|       }
 | |
| 
 | |
|     } 
 | |
|   }
 | |
|   Buffer[Index++] = '\0'; 
 | |
|   
 | |
|   return &Buffer[Index] - StartOfBuffer;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| STATIC
 | |
| CHAR8 *
 | |
| GetFlagsAndWidth (
 | |
|   IN  CHAR8       *Format, 
 | |
|   OUT UINTN       *Flags, 
 | |
|   OUT UINTN       *Width,
 | |
|   IN OUT  VA_LIST *Marker
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that parses flag and width information from the 
 | |
|   Format string and returns the next index into the Format string that needs
 | |
|   to be parsed. See file headed for details of Flag and Width.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Format - Current location in the AvSPrint format string.
 | |
| 
 | |
|   Flags  - Returns flags
 | |
| 
 | |
|   Width  - Returns width of element
 | |
| 
 | |
|   Marker - Vararg list that may be paritally consumed and returned.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Pointer indexed into the Format string for all the information parsed
 | |
|   by this routine.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Count;
 | |
|   BOOLEAN Done;
 | |
| 
 | |
|   *Flags = 0;
 | |
|   *Width = 0;
 | |
|   for (Done = FALSE; !Done; ) {
 | |
|     Format++;
 | |
| 
 | |
|     switch (*Format) {
 | |
| 
 | |
|     case '-': *Flags |= LEFT_JUSTIFY; break;
 | |
|     case '+': *Flags |= PREFIX_SIGN;  break;
 | |
|     case ' ': *Flags |= PREFIX_BLANK; break;
 | |
|     case ',': *Flags |= COMMA_TYPE;   break;
 | |
|     case 'L':
 | |
|     case 'l': *Flags |= LONG_TYPE;    break;
 | |
| 
 | |
|     case '*':
 | |
|       *Width = VA_ARG (*Marker, UINTN);
 | |
|       break;
 | |
| 
 | |
|     case '0':
 | |
|       *Flags |= PREFIX_ZERO;
 | |
|     case '1':
 | |
|     case '2':
 | |
|     case '3':
 | |
|     case '4':
 | |
|     case '5':
 | |
|     case '6':
 | |
|     case '7':
 | |
|     case '8':
 | |
|     case '9':
 | |
|       Count = 0;
 | |
|       do {
 | |
|         Count = (Count * 10) + *Format - '0';
 | |
|         Format++;
 | |
|       } while ((*Format >= '0')  &&  (*Format <= '9'));
 | |
|       Format--;
 | |
|       *Width = Count;
 | |
|       break;
 | |
| 
 | |
|     default:
 | |
|       Done = TRUE;
 | |
|     }
 | |
|   }
 | |
|   return Format;
 | |
| }
 | |
| 
 | |
| static CHAR8 mHexStr[] = { '0','1','2','3','4','5','6','7',
 | |
|                           '8','9','A','B','C','D','E','F' };
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| ValueTomHexStr (
 | |
|   IN  OUT CHAR8   *Buffer, 
 | |
|   IN  UINT64      Value, 
 | |
|   IN  UINTN       Flags, 
 | |
|   IN  UINTN       Width
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that prints a Value as a hex number in Buffer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Buffer - Location to place ascii hex string of Value.
 | |
| 
 | |
|   Value  - Hex value to convert to a string in Buffer.
 | |
| 
 | |
|   Flags  - Flags to use in printing Hex string, see file header for details.
 | |
| 
 | |
|   Width  - Width of hex value.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.  
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR8   TempBuffer[30];
 | |
|   CHAR8   *TempStr;
 | |
|   CHAR8   Prefix;
 | |
|   CHAR8   *BufferPtr;
 | |
|   UINTN   Count;
 | |
|   UINTN   Index;
 | |
| 
 | |
|   TempStr = TempBuffer;
 | |
|   BufferPtr = Buffer;
 | |
|   
 | |
|   //
 | |
|   // Count starts at one since we will null terminate. Each iteration of the
 | |
|   // loop picks off one nibble. Oh yea TempStr ends up backwards
 | |
|   //
 | |
|   Count = 0;
 | |
|   do {
 | |
|     *(TempStr++) = mHexStr[Value & 0x0f];
 | |
|     Value = RShiftU64 (Value, 4);
 | |
|     Count++;
 | |
|   } while (Value != 0);
 | |
| 
 | |
|   if (Flags & PREFIX_ZERO) {
 | |
|     Prefix = '0';
 | |
|   } else if (!(Flags & LEFT_JUSTIFY)) { 
 | |
|     Prefix = ' ';
 | |
|   } else {
 | |
|     Prefix = 0x00;
 | |
|   }                    
 | |
|   for (Index = Count; Index < Width; Index++) {
 | |
|     *(TempStr++) = Prefix;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Reverse temp string into Buffer.
 | |
|   //
 | |
|   while (TempStr != TempBuffer) {
 | |
|     *(BufferPtr++) = *(--TempStr);
 | |
|   }  
 | |
|     
 | |
|   *BufferPtr = 0;
 | |
|   return Index;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| ValueToString (
 | |
|   IN  OUT CHAR8   *Buffer, 
 | |
|   IN  INT64       Value, 
 | |
|   IN  UINTN       Flags, 
 | |
|   IN  UINTN       Width
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that prints a Value as a decimal number in Buffer
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Buffer - Location to place ascii decimal number string of Value.
 | |
| 
 | |
|   Value  - Decimal value to convert to a string in Buffer.
 | |
| 
 | |
|   Flags  - Flags to use in printing decimal string, see file header for details.
 | |
| 
 | |
|   Width  - Width of hex value.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.  
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR8   TempBuffer[30];
 | |
|   CHAR8   *TempStr;
 | |
|   CHAR8   *BufferPtr;
 | |
|   UINTN   Count;
 | |
|   UINTN   Remainder;
 | |
| 
 | |
|   TempStr = TempBuffer;
 | |
|   BufferPtr = Buffer;
 | |
|   Count = 0;
 | |
| 
 | |
|   if (Value < 0) {
 | |
|     *(BufferPtr++) = '-';
 | |
|     Value = -Value;
 | |
|     Count++;
 | |
|   }
 | |
| 
 | |
|   do {
 | |
|     Value = (INT64)DivU64x32 ((UINT64)Value, 10, &Remainder);
 | |
|     *(TempStr++) = (CHAR8)(Remainder + '0');
 | |
|     Count++;
 | |
|     if ((Flags & COMMA_TYPE) == COMMA_TYPE) {
 | |
|       if (Count % 3 == 0) {
 | |
|         *(TempStr++) = ',';
 | |
|       }
 | |
|     }
 | |
|   } while (Value != 0);
 | |
| 
 | |
|   //
 | |
|   // Reverse temp string into Buffer.
 | |
|   //
 | |
|   while (TempStr != TempBuffer) {
 | |
|     *(BufferPtr++) = *(--TempStr);
 | |
|   }  
 | |
| 
 | |
|   *BufferPtr = 0;
 | |
|   return Count;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| GuidToString (
 | |
|   IN  EFI_GUID  *Guid,
 | |
|   IN  CHAR8     *Buffer,
 | |
|   IN  UINTN     BufferSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that prints an EFI_GUID.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Guid       - Pointer to GUID to print.
 | |
| 
 | |
|   Buffer     - Buffe to print Guid into.
 | |
|   
 | |
|   BufferSize - Size of Buffer.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.  
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN Size;
 | |
| 
 | |
|   Size = ASPrint (
 | |
|             Buffer,
 | |
|             BufferSize, 
 | |
|             "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 | |
|             Guid->Data1,                    
 | |
|             Guid->Data2,
 | |
|             Guid->Data3,
 | |
|             Guid->Data4[0],
 | |
|             Guid->Data4[1],
 | |
|             Guid->Data4[2],
 | |
|             Guid->Data4[3],
 | |
|             Guid->Data4[4],
 | |
|             Guid->Data4[5],
 | |
|             Guid->Data4[6],
 | |
|             Guid->Data4[7]
 | |
|             );
 | |
| 
 | |
|   //
 | |
|   // ASPrint will null terminate the string. The -1 skips the null
 | |
|   //
 | |
|   return Size - 1;
 | |
| }
 | |
| 
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| TimeToString (
 | |
|   IN EFI_TIME   *Time,
 | |
|   OUT CHAR8     *Buffer,
 | |
|   IN  UINTN     BufferSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that prints EFI_TIME.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Time       - Pointer to EFI_TIME sturcture to print.
 | |
| 
 | |
|   Buffer     - Buffer to print Time into.
 | |
|   
 | |
|   BufferSize - Size of Buffer.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.  
 | |
| 
 | |
| --*/
 | |
| { 
 | |
|   UINTN Size;
 | |
| 
 | |
|   Size = ASPrint (
 | |
|             Buffer,
 | |
|             BufferSize, 
 | |
|             "%02d/%02d/%04d  %02d:%02d",
 | |
|             Time->Month,
 | |
|             Time->Day,
 | |
|             Time->Year,
 | |
|             Time->Hour,
 | |
|             Time->Minute
 | |
|             );
 | |
| 
 | |
|   //
 | |
|   // ASPrint will null terminate the string. The -1 skips the null
 | |
|   //
 | |
|   return Size - 1;
 | |
| } 
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| EfiStatusToString (
 | |
|   IN EFI_STATUS   Status,
 | |
|   OUT CHAR8       *Buffer,
 | |
|   IN  UINTN       BufferSize
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   AvSPrint worker function that prints EFI_STATUS as a string. If string is
 | |
|   not known a hex value will be printed.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Status     -  EFI_STATUS sturcture to print.
 | |
| 
 | |
|   Buffer     - Buffer to print EFI_STATUS message string into.
 | |
|   
 | |
|   BufferSize - Size of Buffer.
 | |
| 
 | |
| Returns: 
 | |
| 
 | |
|   Number of characters printed.  
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Size;
 | |
|   CHAR8   *Desc;
 | |
|   
 | |
|   if (Status == EFI_SUCCESS) {
 | |
|     Desc = "Success";
 | |
|   } else if (Status == EFI_LOAD_ERROR) {
 | |
|     Desc = "Load Error";
 | |
|   } else if (Status == EFI_INVALID_PARAMETER) {
 | |
|     Desc = "Invalid Parameter";
 | |
|   } else if (Status == EFI_UNSUPPORTED) {
 | |
|     Desc = "Unsupported";
 | |
|   } else if (Status == EFI_BAD_BUFFER_SIZE) {
 | |
|     Desc = "Bad Buffer Size";
 | |
|   } else if (Status == EFI_BUFFER_TOO_SMALL) {
 | |
|     Desc = "Buffer Too Small";
 | |
|   } else if (Status == EFI_NOT_READY) {
 | |
|     Desc = "Not Ready";
 | |
|   } else if (Status == EFI_DEVICE_ERROR) {
 | |
|     Desc = "Device Error";
 | |
|   } else if (Status == EFI_WRITE_PROTECTED) {
 | |
|     Desc = "Write Protected";
 | |
|   } else if (Status == EFI_OUT_OF_RESOURCES) {
 | |
|     Desc = "Out of Resources";
 | |
|   } else if (Status == EFI_VOLUME_CORRUPTED) {
 | |
|     Desc = "Volume Corrupt";
 | |
|   } else if (Status == EFI_VOLUME_FULL) {
 | |
|     Desc = "Volume Full";
 | |
|   } else if (Status == EFI_NO_MEDIA) {
 | |
|     Desc = "No Media";
 | |
|   } else if (Status == EFI_MEDIA_CHANGED) {
 | |
|     Desc = "Media changed";
 | |
|   } else if (Status == EFI_NOT_FOUND) {
 | |
|     Desc = "Not Found";
 | |
|   } else if (Status == EFI_ACCESS_DENIED) {
 | |
|     Desc = "Access Denied";
 | |
|   } else if (Status == EFI_NO_RESPONSE) {
 | |
|     Desc = "No Response";
 | |
|   } else if (Status == EFI_NO_MAPPING) {
 | |
|     Desc = "No mapping";
 | |
|   } else if (Status == EFI_TIMEOUT) {
 | |
|     Desc = "Time out";
 | |
|   } else if (Status == EFI_NOT_STARTED) {
 | |
|     Desc = "Not started";
 | |
|   } else if (Status == EFI_ALREADY_STARTED) {
 | |
|     Desc = "Already started";
 | |
|   } else if (Status == EFI_ABORTED) {
 | |
|     Desc = "Aborted";
 | |
|   } else if (Status == EFI_ICMP_ERROR) {
 | |
|     Desc = "ICMP Error";
 | |
|   } else if (Status == EFI_TFTP_ERROR) {
 | |
|     Desc = "TFTP Error";
 | |
|   } else if (Status == EFI_PROTOCOL_ERROR) {
 | |
|     Desc = "Protocol Error";
 | |
|   } else if (Status == EFI_WARN_UNKNOWN_GLYPH) {
 | |
|     Desc = "Warning Unknown Glyph";
 | |
|   } else if (Status == EFI_WARN_DELETE_FAILURE) {
 | |
|     Desc = "Warning Delete Failure";
 | |
|   } else if (Status == EFI_WARN_WRITE_FAILURE) {
 | |
|     Desc = "Warning Write Failure";
 | |
|   } else if (Status == EFI_WARN_BUFFER_TOO_SMALL) {
 | |
|     Desc = "Warning Buffer Too Small";
 | |
|   } else {
 | |
|     Desc = NULL;
 | |
|   }
 | |
|   //
 | |
|   // If we found a match, copy the message to the user's buffer. Otherwise
 | |
|   // sprint the hex status code to their buffer.
 | |
|   //
 | |
|   if (Desc != NULL) {
 | |
|     Size = ASPrint (Buffer, BufferSize, "%a", Desc);
 | |
|   } else {
 | |
|     Size = ASPrint (Buffer, BufferSize, "%X", Status);
 | |
|   }
 | |
|   return Size - 1;
 | |
| }
 |