git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4527 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			981 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			981 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Obsolete library interfaces.
 | 
						|
 | 
						|
  This file contains part of obsolete library interfaces in EDK.
 | 
						|
  User is recommended to follow the porting Guide in R8Lib.c to elimante them.
 | 
						|
 | 
						|
  Copyright (c) 2006, 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.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
////
 | 
						|
BOOLEAN
 | 
						|
R8_EfiLibCompareLanguage (
 | 
						|
  IN  CHAR8  *Language1,
 | 
						|
  IN  CHAR8  *Language2
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Compare whether two names of languages are identical.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Language1 - Name of language 1
 | 
						|
  Language2 - Name of language 2
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  TRUE      - same
 | 
						|
  FALSE     - not same
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  UINTN Index;
 | 
						|
 | 
						|
  for (Index = 0; Index < 3; Index++) {
 | 
						|
    if (Language1[Index] != Language2[Index]) {
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#BaseLib
 | 
						|
EFI_STATUS
 | 
						|
R8_BufToHexString (
 | 
						|
  IN OUT CHAR16                    *Str,
 | 
						|
  IN OUT UINTN                     *HexStringBufferLength,
 | 
						|
  IN     UINT8                     *Buf,
 | 
						|
  IN     UINTN                      Len
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Converts binary buffer to Unicode string.
 | 
						|
    At a minimum, any blob of data could be represented as a hex string.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Str                   - Pointer to the string.
 | 
						|
    HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.
 | 
						|
                            If routine return with EFI_SUCCESS, containing length of hex string buffer.
 | 
						|
                            If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.
 | 
						|
    Buf                   - Buffer to be converted from.
 | 
						|
    Len                   - Length in bytes of the buffer to be converted.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS             - Routine success.
 | 
						|
    EFI_BUFFER_TOO_SMALL    - The hex string buffer is too small.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  UINTN       Idx;
 | 
						|
  UINT8       Byte;
 | 
						|
  UINTN       StrLen;
 | 
						|
 | 
						|
  //
 | 
						|
  // Make sure string is either passed or allocate enough.
 | 
						|
  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
 | 
						|
  // Plus the Unicode termination character.
 | 
						|
  //
 | 
						|
  StrLen = Len * 2;
 | 
						|
  if (StrLen > ((*HexStringBufferLength) - 1)) {
 | 
						|
    *HexStringBufferLength = StrLen + 1;
 | 
						|
    return EFI_BUFFER_TOO_SMALL;
 | 
						|
  }
 | 
						|
 | 
						|
  *HexStringBufferLength = StrLen + 1;
 | 
						|
  //
 | 
						|
  // Ends the string.
 | 
						|
  //
 | 
						|
  Str[StrLen] = L'\0'; 
 | 
						|
 | 
						|
  for (Idx = 0; Idx < Len; Idx++) {
 | 
						|
 | 
						|
    Byte = Buf[Idx];
 | 
						|
    Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);
 | 
						|
    Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
VOID
 | 
						|
R8_EfiStrTrim (
 | 
						|
  IN OUT CHAR16   *str,
 | 
						|
  IN     CHAR16   CharC
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
  
 | 
						|
  Removes (trims) specified leading and trailing characters from a string.
 | 
						|
  
 | 
						|
Arguments: 
 | 
						|
  
 | 
						|
  str     - Pointer to the null-terminated string to be trimmed. On return, 
 | 
						|
            str will hold the trimmed string. 
 | 
						|
  CharC   - Character will be trimmed from str.
 | 
						|
  
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  CHAR16  *p1;
 | 
						|
  CHAR16  *p2;
 | 
						|
  
 | 
						|
  if (*str == 0) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Trim off the leading and trailing characters c
 | 
						|
  //
 | 
						|
  for (p1 = str; *p1 && *p1 == CharC; p1++) {
 | 
						|
    ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  p2 = str;
 | 
						|
  if (p2 == p1) {
 | 
						|
    while (*p1) {
 | 
						|
      p2++;
 | 
						|
      p1++;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    while (*p1) {    
 | 
						|
    *p2 = *p1;    
 | 
						|
    p1++;
 | 
						|
    p2++;
 | 
						|
    }
 | 
						|
    *p2 = 0;
 | 
						|
  }
 | 
						|
  
 | 
						|
  
 | 
						|
  for (p1 = str + StrLen(str) - 1; p1 >= str && *p1 == CharC; p1--) {
 | 
						|
    ;
 | 
						|
  }
 | 
						|
  if  (p1 !=  str + StrLen(str) - 1) { 
 | 
						|
    *(p1 + 1) = 0;
 | 
						|
  }
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#PrintLib
 | 
						|
UINTN
 | 
						|
R8_EfiValueToHexStr (
 | 
						|
  IN  OUT CHAR16  *Buffer, 
 | 
						|
  IN  UINT64      Value, 
 | 
						|
  IN  UINTN       Flags, 
 | 
						|
  IN  UINTN       Width
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  VSPrint 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.  
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // Edk II BasePrintLib function UnicodeValueToString does not support 
 | 
						|
  // to convert Value to Hex String. 
 | 
						|
  // Include the source code to user code or use the full PrintLib funtion 
 | 
						|
  // UnicodeVSPrintAsciiFormat (Buffer, MAXIMUM_VALUE_CHARACTERS, "%x", Value) instead.
 | 
						|
  //
 | 
						|
 | 
						|
  CHAR16  TempBuffer[MAXIMUM_VALUE_CHARACTERS];
 | 
						|
  CHAR16  *TempStr;
 | 
						|
  CHAR16  Prefix;
 | 
						|
  CHAR16  *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;
 | 
						|
  
 | 
						|
  if (Width > MAXIMUM_VALUE_CHARACTERS - 1) {
 | 
						|
    Width = MAXIMUM_VALUE_CHARACTERS - 1;
 | 
						|
  }
 | 
						|
 | 
						|
  do {
 | 
						|
    //
 | 
						|
    // If Width == 0, it means no limit.
 | 
						|
    //
 | 
						|
    if ((Width != 0) && (Count >= Width)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    Index = ((UINTN)Value & 0xf);
 | 
						|
    *(TempStr++) = mHexStr[Index];
 | 
						|
    Value = RShiftU64 (Value, 4);
 | 
						|
    Count++;
 | 
						|
  } while (Value != 0);
 | 
						|
 | 
						|
  if (Flags & PREFIX_ZERO) {
 | 
						|
    Prefix = '0';
 | 
						|
  } else { 
 | 
						|
    Prefix = ' ';
 | 
						|
  }
 | 
						|
 | 
						|
  Index = Count;
 | 
						|
  if (!(Flags & LEFT_JUSTIFY)) {
 | 
						|
    for (; Index < Width; Index++) {
 | 
						|
      *(TempStr++) = Prefix;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Reverse temp string into Buffer.
 | 
						|
  //
 | 
						|
  while (TempStr != TempBuffer) {
 | 
						|
    *(BufferPtr++) = *(--TempStr);
 | 
						|
  }  
 | 
						|
    
 | 
						|
  *BufferPtr = 0;
 | 
						|
  return Index;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
 | 
						|
 | 
						|
////
 | 
						|
EFI_STATUS
 | 
						|
R8_HexStringToBuf (
 | 
						|
  IN OUT UINT8                     *Buf,   
 | 
						|
  IN OUT UINTN                    *Len,
 | 
						|
  IN     CHAR16                    *Str,
 | 
						|
  OUT    UINTN                     *ConvertedStrLen  OPTIONAL
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Converts Unicode string to binary buffer.
 | 
						|
    The conversion may be partial.
 | 
						|
    The first character in the string that is not hex digit stops the conversion.
 | 
						|
    At a minimum, any blob of data could be represented as a hex string.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Buf    - Pointer to buffer that receives the data.
 | 
						|
    Len    - Length in bytes of the buffer to hold converted data.
 | 
						|
                If routine return with EFI_SUCCESS, containing length of converted data.
 | 
						|
                If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.
 | 
						|
    Str    - String to be converted from.
 | 
						|
    ConvertedStrLen - Length of the Hex String consumed.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS           - Routine Success.
 | 
						|
    EFI_BUFFER_TOO_SMALL  - The buffer is too small to hold converted data.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  UINTN       HexCnt;
 | 
						|
  UINTN       Idx;
 | 
						|
  UINTN       BufferLength;
 | 
						|
  UINT8       Digit;
 | 
						|
  UINT8       Byte;
 | 
						|
 | 
						|
  //
 | 
						|
  // Find out how many hex characters the string has.
 | 
						|
  //
 | 
						|
  for (Idx = 0, HexCnt = 0; R8_IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
 | 
						|
 | 
						|
  if (HexCnt == 0) {
 | 
						|
    *Len = 0;
 | 
						|
    return EFI_SUCCESS;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Two Unicode characters make up 1 buffer byte. Round up.
 | 
						|
  //
 | 
						|
  BufferLength = (HexCnt + 1) / 2; 
 | 
						|
 | 
						|
  //
 | 
						|
  // Test if  buffer is passed enough.
 | 
						|
  //
 | 
						|
  if (BufferLength > (*Len)) {
 | 
						|
    *Len = BufferLength;
 | 
						|
    return EFI_BUFFER_TOO_SMALL;
 | 
						|
  }
 | 
						|
 | 
						|
  *Len = BufferLength;
 | 
						|
 | 
						|
  for (Idx = 0; Idx < HexCnt; Idx++) {
 | 
						|
 | 
						|
    R8_IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);
 | 
						|
 | 
						|
    //
 | 
						|
    // For odd charaters, write the lower nibble for each buffer byte,
 | 
						|
    // and for even characters, the upper nibble.
 | 
						|
    //
 | 
						|
    if ((Idx & 1) == 0) {
 | 
						|
      Byte = Digit;
 | 
						|
    } else {
 | 
						|
      Byte = Buf[Idx / 2];
 | 
						|
      Byte &= 0x0F;
 | 
						|
      Byte = (UINT8) (Byte | Digit << 4);
 | 
						|
    }
 | 
						|
 | 
						|
    Buf[Idx / 2] = Byte;
 | 
						|
  }
 | 
						|
 | 
						|
  if (ConvertedStrLen != NULL) {
 | 
						|
    *ConvertedStrLen = HexCnt;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
BOOLEAN
 | 
						|
R8_IsHexDigit (
 | 
						|
  OUT UINT8      *Digit,
 | 
						|
  IN  CHAR16      Char
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Determines if a Unicode character is a hexadecimal digit.
 | 
						|
    The test is case insensitive.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Digit - Pointer to byte that receives the value of the hex character.
 | 
						|
    Char  - Unicode character to test.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    TRUE  - If the character is a hexadecimal digit.
 | 
						|
    FALSE - Otherwise.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  if ((Char >= L'0') && (Char <= L'9')) {
 | 
						|
    *Digit = (UINT8) (Char - L'0');
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= L'A') && (Char <= L'F')) {
 | 
						|
    *Digit = (UINT8) (Char - L'A' + 0x0A);
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  if ((Char >= L'a') && (Char <= L'f')) {
 | 
						|
    *Digit = (UINT8) (Char - L'a' + 0x0A);
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
CHAR16
 | 
						|
R8_NibbleToHexChar (
 | 
						|
  IN UINT8      Nibble
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Converts the low nibble of a byte  to hex unicode character.
 | 
						|
 | 
						|
  Arguments:
 | 
						|
    Nibble - lower nibble of a byte.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    Hex unicode character.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  Nibble &= 0x0F;
 | 
						|
  if (Nibble <= 0x9) {
 | 
						|
    return (CHAR16)(Nibble + L'0');
 | 
						|
  }
 | 
						|
 | 
						|
  return (CHAR16)(Nibble - 0xA + L'A');
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
VOID *
 | 
						|
R8_GetHob (
 | 
						|
  IN UINT16  Type,
 | 
						|
  IN VOID    *HobStart
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  This function returns the first instance of a HOB type in a HOB list.
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Type          - The HOB type to return.
 | 
						|
  HobStart      - The first HOB in the HOB list.
 | 
						|
    
 | 
						|
Returns:
 | 
						|
 | 
						|
  HobStart      - There were no HOBs found with the requested type.
 | 
						|
  Other         - The first HOB with the matching type.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // Edk II HobLib GetNextHob () is an equivelent function with the following exceptions:
 | 
						|
  // 1. GetNextHob () does not allow NULL value as the argument of HobStart by ASSERT ()  
 | 
						|
  // 2. GetNextHob () will return NULL instead of returning HobStart when such kind of
 | 
						|
  //    HOB can be retrieved, so caller does not need to re-check the return HOB type any longer.
 | 
						|
  //
 | 
						|
 | 
						|
  VOID    *Hob;
 | 
						|
  //
 | 
						|
  // Return input if not found
 | 
						|
  //
 | 
						|
  if (HobStart == NULL) {
 | 
						|
    return HobStart;
 | 
						|
  }
 | 
						|
  Hob = GetNextHob (Type, HobStart);
 | 
						|
  if (Hob == NULL) {
 | 
						|
    return HobStart;
 | 
						|
  }
 | 
						|
  
 | 
						|
  return Hob;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
UINTN
 | 
						|
R8_GetHobListSize (
 | 
						|
  IN VOID  *HobStart
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get size of hob list.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart      - Start pointer of hob list
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Size of hob list.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  EFI_PEI_HOB_POINTERS  Hob;
 | 
						|
  UINTN                 Size;
 | 
						|
 | 
						|
  Hob.Raw = HobStart;
 | 
						|
  Size    = 0;
 | 
						|
 | 
						|
  while (Hob.Header->HobType != EFI_HOB_TYPE_END_OF_HOB_LIST) {
 | 
						|
    Size += Hob.Header->HobLength;
 | 
						|
    Hob.Raw += Hob.Header->HobLength;
 | 
						|
  }
 | 
						|
 | 
						|
  Size += Hob.Header->HobLength;
 | 
						|
 | 
						|
  return Size;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
UINT32
 | 
						|
R8_GetHobVersion (
 | 
						|
  IN VOID  *HobStart
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get hob version.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart      - Start pointer of hob list
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Hob version.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
 | 
						|
  EFI_PEI_HOB_POINTERS  Hob;
 | 
						|
 | 
						|
  Hob.Raw = HobStart;
 | 
						|
  return Hob.HandoffInformationTable->Version;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////
 | 
						|
EFI_STATUS
 | 
						|
R8_GetHobBootMode (
 | 
						|
  IN  VOID           *HobStart,
 | 
						|
  OUT EFI_BOOT_MODE  *BootMode
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get current boot mode.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart      - Start pointer of hob list
 | 
						|
  BootMode      - Current boot mode recorded in PHIT hob
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_NOT_FOUND     - Invalid hob header
 | 
						|
  EFI_SUCCESS       - Boot mode found
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  // In fact, since EFI_HANDOFF_HOB must be the first Hob,
 | 
						|
  // the following code can retrieve boot mode.
 | 
						|
  //
 | 
						|
  // EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;
 | 
						|
  //
 | 
						|
  // HandOffHob = GetHobList ();  
 | 
						|
  // ASSERT (HandOffHob->Header.HobType == EFI_HOB_TYPE_HANDOFF);
 | 
						|
  // 
 | 
						|
  // BootMode = HandOffHob->BootMode;
 | 
						|
  //
 | 
						|
  EFI_PEI_HOB_POINTERS  Hob;
 | 
						|
 | 
						|
  Hob.Raw = HobStart;
 | 
						|
  if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  *BootMode = Hob.HandoffInformationTable->BootMode;
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetCpuHobInfo (
 | 
						|
  IN  VOID   *HobStart,
 | 
						|
  OUT UINT8  *SizeOfMemorySpace,
 | 
						|
  OUT UINT8  *SizeOfIoSpace
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get information recorded in CPU hob (Memory space size, Io space size)
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart            - Start pointer of hob list
 | 
						|
  SizeOfMemorySpace   - Size of memory size
 | 
						|
  SizeOfIoSpace       - Size of IO size
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_NOT_FOUND     - CPU hob not found
 | 
						|
  EFI_SUCCESS       - CPU hob found and information got.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  // If Cpu HOB info is indispensable, user is able to ASSERT ()
 | 
						|
  // first to save error handling code
 | 
						|
  // For example:
 | 
						|
  //
 | 
						|
  // EFI_HOB_CPU  *CpuHob;
 | 
						|
  // 
 | 
						|
  // CpuHob = GetHob (EFI_HOB_TYPE_CPU, HobStart);
 | 
						|
  // ASSERT (CpuHob != NULL);
 | 
						|
  // 
 | 
						|
  // ...
 | 
						|
  // 
 | 
						|
  EFI_HOB_CPU  *CpuHob;
 | 
						|
 | 
						|
  CpuHob = GetHob (EFI_HOB_TYPE_CPU, HobStart);
 | 
						|
  if (CpuHob == NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  *SizeOfMemorySpace  = CpuHob->SizeOfMemorySpace;
 | 
						|
  *SizeOfIoSpace      = CpuHob->SizeOfIoSpace;
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetDxeCoreHobInfo (
 | 
						|
  IN  VOID                  *HobStart,
 | 
						|
  OUT EFI_PHYSICAL_ADDRESS  *BaseAddress,
 | 
						|
  OUT UINT64                *Length,
 | 
						|
  OUT VOID                  **EntryPoint,
 | 
						|
  OUT EFI_GUID              **FileName
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get memory allocation hob created for DXE core and extract its information
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart        - Start pointer of the hob list
 | 
						|
  BaseAddress     - Start address of memory allocated for DXE core
 | 
						|
  Length          - Length of memory allocated for DXE core
 | 
						|
  EntryPoint      - DXE core file name
 | 
						|
  FileName        - File Name
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_NOT_FOUND   - DxeCoreHob not found  
 | 
						|
  EFI_SUCCESS     - DxeCoreHob found and information got
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  // 
 | 
						|
  EFI_PEI_HOB_POINTERS  DxeCoreHob;
 | 
						|
  
 | 
						|
  for (DxeCoreHob.Raw = HobStart; 
 | 
						|
      (DxeCoreHob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw)) != NULL;
 | 
						|
       DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob)) {
 | 
						|
    if (CompareGuid (&DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.Name, 
 | 
						|
                      &gEfiHobMemeryAllocModuleGuid)) {
 | 
						|
        *BaseAddress  = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryBaseAddress;
 | 
						|
        *Length       = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryLength;
 | 
						|
        *EntryPoint   = (VOID *) (UINTN) DxeCoreHob.MemoryAllocationModule->EntryPoint;
 | 
						|
        *FileName     = &DxeCoreHob.MemoryAllocationModule->ModuleName;
 | 
						|
        return EFI_SUCCESS;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_NOT_FOUND;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetNextFirmwareVolumeHob (
 | 
						|
  IN OUT VOID                  **HobStart,
 | 
						|
  OUT    EFI_PHYSICAL_ADDRESS  *BaseAddress,
 | 
						|
  OUT    UINT64                *Length
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get next firmware volume hob from HobStart
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart        - Start pointer of hob list
 | 
						|
  BaseAddress     - Start address of next firmware volume
 | 
						|
  Length          - Length of next firmware volume
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_NOT_FOUND   - Next firmware volume not found
 | 
						|
  EFI_SUCCESS     - Next firmware volume found with address information
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  // Pay attention that caller is REQUIRED to update HobStart with:
 | 
						|
  // *HobStart =  GET_NEXT_HOB (FirmwareVolumeHob)
 | 
						|
  //
 | 
						|
  // If FV HOB info is indispensable, user is able to ASSERT ()
 | 
						|
  // first to save error handling code
 | 
						|
  // For example:
 | 
						|
  //
 | 
						|
  // EFI_HOB_FIRMWARE_VOLUME  *FirmwareVolumeHob;
 | 
						|
  // 
 | 
						|
  // FirmwareVolumeHob = GetHob (EFI_HOB_TYPE_FV, HobStart);
 | 
						|
  // ASSERT (FirmwareVolumeHob != NULL);
 | 
						|
  // 
 | 
						|
  // ...
 | 
						|
  //
 | 
						|
 | 
						|
  EFI_PEI_HOB_POINTERS  FirmwareVolumeHob;
 | 
						|
 | 
						|
  FirmwareVolumeHob.Raw = GetNextHob (EFI_HOB_TYPE_FV, *HobStart);
 | 
						|
  if (FirmwareVolumeHob.Raw != NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  *BaseAddress  = FirmwareVolumeHob.FirmwareVolume->BaseAddress;
 | 
						|
  *Length       = FirmwareVolumeHob.FirmwareVolume->Length;
 | 
						|
 | 
						|
  *HobStart     = GET_NEXT_HOB (FirmwareVolumeHob);
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetNextGuidHob (
 | 
						|
  IN OUT VOID      **HobStart,
 | 
						|
  IN     EFI_GUID  * Guid,
 | 
						|
  OUT    VOID      **Buffer,
 | 
						|
  OUT    UINTN     *BufferSize OPTIONAL
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
  Get the next guid hob.
 | 
						|
  
 | 
						|
Arguments:
 | 
						|
  HobStart        - A pointer to the start hob.
 | 
						|
  Guid            - A pointer to a guid.
 | 
						|
  Buffer          - A pointer to the buffer.
 | 
						|
  BufferSize      - Buffer size.
 | 
						|
  
 | 
						|
Returns:
 | 
						|
  EFI_NOT_FOUND          - Next Guid hob not found
 | 
						|
  EFI_SUCCESS            - Next Guid hob found and data for this Guid got
 | 
						|
  EFI_INVALID_PARAMETER  - invalid parameter
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is changed substantially with R9 counerpart GetNextGuidHob (). 
 | 
						|
  // 1. R9 GetNextGuidHob has two parameters and returns the matched GUID HOB from the StartHob. 
 | 
						|
  // 2. R9 GetNextGuidHob does not strip the HOB header, so caller is required to apply
 | 
						|
  //    GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE () to extract the data section and its
 | 
						|
  //    size info respectively.
 | 
						|
  // 3. this function does not skip the starting HOB pointer unconditionally:
 | 
						|
  //    it returns HobStart back if HobStart itself meets the requirement;
 | 
						|
  //    caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.
 | 
						|
  //
 | 
						|
  EFI_PEI_HOB_POINTERS  GuidHob;
 | 
						|
 | 
						|
  if (Buffer == NULL) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  GuidHob.Raw = GetNextGuidHob (Guid, *HobStart);
 | 
						|
  if (GuidHob.Raw == NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
  
 | 
						|
  *Buffer = GET_GUID_HOB_DATA (GuidHob.Guid);
 | 
						|
  if (BufferSize != NULL) {
 | 
						|
    *BufferSize = GET_GUID_HOB_DATA_SIZE (GuidHob.Guid);
 | 
						|
  }
 | 
						|
 | 
						|
  *HobStart = GET_NEXT_HOB (GuidHob);
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetPalEntryHobInfo (
 | 
						|
  IN  VOID                  *HobStart,
 | 
						|
  OUT EFI_PHYSICAL_ADDRESS  *PalEntry
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get PAL entry from PalEntryHob
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart      - Start pointer of hob list
 | 
						|
  PalEntry      - Pointer to PAL entry
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Status code.
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_HOB_GUID_TYPE   *GuidHob;
 | 
						|
 | 
						|
  GuidHob = GetNextGuidHob (&gPalEntryHob, HobStart);
 | 
						|
 | 
						|
  if (GuidHob == NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  *PalEntry = *((EFI_PHYSICAL_ADDRESS *) GET_GUID_HOB_DATA (GuidHob));
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_GetIoPortSpaceAddressHobInfo (
 | 
						|
  IN  VOID                  *HobStart,
 | 
						|
  OUT EFI_PHYSICAL_ADDRESS  *IoPortSpaceAddress
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Get IO port space address from IoBaseHob.
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  HobStart              - Start pointer of hob list
 | 
						|
  IoPortSpaceAddress    - IO port space address
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  Status code
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide:
 | 
						|
  // This library interface is simply obsolete. 
 | 
						|
  // Include the source code to user code.
 | 
						|
  //
 | 
						|
  EFI_HOB_GUID_TYPE   *GuidHob;
 | 
						|
 | 
						|
  GuidHob = GetNextGuidHob (&gEfiIoBaseHobGuid, HobStart);
 | 
						|
 | 
						|
  if (GuidHob == NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  *IoPortSpaceAddress = *((EFI_PHYSICAL_ADDRESS *) GET_GUID_HOB_DATA (GuidHob));
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
////~
 | 
						|
 | 
						|
////#HobLib
 | 
						|
EFI_STATUS
 | 
						|
R8_PeiBuildHobGuid (
 | 
						|
  IN  EFI_GUID          *Guid,
 | 
						|
  IN  UINTN             DataLength,
 | 
						|
  OUT VOID              **Hob
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
 | 
						|
  Builds a custom HOB that is tagged with a GUID for identification
 | 
						|
 | 
						|
Arguments:
 | 
						|
 | 
						|
  Guid        - The GUID of the custome HOB type
 | 
						|
  DataLength  - The size of the data payload for the GUIDed HOB
 | 
						|
  Hob         - Pointer to pointer to the created Hob
 | 
						|
 | 
						|
Returns:
 | 
						|
 | 
						|
  EFI_SUCCESS - Hob is successfully built.
 | 
						|
  Others      - Errors occur while creating new Hob
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Porting Guide: Apply the new interface of BuildGuidHob in R9 HobLib.
 | 
						|
  // Pay attention that the return value has been changed to the start address of
 | 
						|
  // GUID HOB data so that caller can fill the customized data. 
 | 
						|
  // For BuildGuidHob (), the HOB Header and Name field is already stripped..
 | 
						|
  //
 | 
						|
  VOID   *HobData; 
 | 
						|
 | 
						|
  HobData = BuildGuidHob (Guid, DataLength);
 | 
						|
  //
 | 
						|
  // This step is necessary to be compatible with R8 interface!
 | 
						|
  //
 | 
						|
  *Hob    = (VOID *) ((UINT8 *) HobData - sizeof (EFI_HOB_GUID_TYPE)); 
 | 
						|
 | 
						|
  return EFI_SUCCESS; 
 | 
						|
}
 | 
						|
////~
 |