git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2456 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			2371 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2371 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| 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.             
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   DevicePathFromText.c
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   DevicePathFromText protocol as defined in the UEFI 2.0 specification.
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #include "DevicePath.h"
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| StrDuplicate (
 | |
|   IN CONST CHAR16  *Src
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Duplicate a string
 | |
| 
 | |
|   Arguments:
 | |
|     Src - Source string
 | |
| 
 | |
|   Returns:
 | |
|     Duplicated string
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Length;
 | |
|   CHAR16  *ReturnStr;
 | |
| 
 | |
|   Length = StrLen ((CHAR16 *) Src);
 | |
| 
 | |
|   ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);
 | |
| 
 | |
|   return ReturnStr;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| GetParamByNodeName (
 | |
|   IN CHAR16 *Str,
 | |
|   IN CHAR16 *NodeName
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Get parameter in a pair of parentheses follow the given node name.
 | |
|     For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
 | |
| 
 | |
|   Arguments:
 | |
|     Str      - Device Path Text
 | |
|     NodeName - Name of the node
 | |
| 
 | |
|   Returns:
 | |
|     Parameter text for the node
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR16  *ParamStr;
 | |
|   CHAR16  *StrPointer;
 | |
|   UINTN   NodeNameLength;
 | |
|   UINTN   ParameterLength;
 | |
| 
 | |
|   //
 | |
|   // Check whether the node name matchs
 | |
|   //
 | |
|   NodeNameLength = StrLen (NodeName);
 | |
|   if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   ParamStr = Str + NodeNameLength;
 | |
|   if (!IS_LEFT_PARENTH (*ParamStr)) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Skip the found '(' and find first occurrence of ')'
 | |
|   //
 | |
|   ParamStr++;
 | |
|   ParameterLength = 0;
 | |
|   StrPointer = ParamStr;
 | |
|   while (!IS_NULL (*StrPointer)) {
 | |
|     if (IS_RIGHT_PARENTH (*StrPointer)) {
 | |
|       break;
 | |
|     }
 | |
|     StrPointer++;
 | |
|     ParameterLength++;
 | |
|   }
 | |
|   if (IS_NULL (*StrPointer)) {
 | |
|     //
 | |
|     // ')' not found
 | |
|     //
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
 | |
|   if (ParamStr == NULL) {
 | |
|     return NULL;
 | |
|   }
 | |
|   //
 | |
|   // Terminate the parameter string
 | |
|   //
 | |
|   ParamStr[ParameterLength] = L'\0';
 | |
| 
 | |
|   return ParamStr;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| SplitStr (
 | |
|   IN OUT CHAR16 **List,
 | |
|   IN     CHAR16 Separator
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Get current sub-string from a string list, before return
 | |
|     the list header is moved to next sub-string. The sub-string is separated
 | |
|     by the specified character. For example, the separator is ',', the string
 | |
|     list is "2,0,3", it returns "2", the remain list move to "2,3"
 | |
| 
 | |
|   Arguments:
 | |
|     List       - A string list separated by the specified separator
 | |
|     Separator  - The separator character
 | |
| 
 | |
|   Returns:
 | |
|     pointer    - The current sub-string
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR16  *Str;
 | |
|   CHAR16  *ReturnStr;
 | |
| 
 | |
|   Str = *List;
 | |
|   ReturnStr = Str;
 | |
| 
 | |
|   if (IS_NULL (*Str)) {
 | |
|     return ReturnStr;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Find first occurrence of the separator
 | |
|   //
 | |
|   while (!IS_NULL (*Str)) {
 | |
|     if (*Str == Separator) {
 | |
|       break;
 | |
|     }
 | |
|     Str++;
 | |
|   }
 | |
| 
 | |
|   if (*Str == Separator) {
 | |
|     //
 | |
|     // Find a sub-string, terminate it
 | |
|     //
 | |
|     *Str = L'\0';
 | |
|     Str++;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Move to next sub-string
 | |
|   //
 | |
|   *List = Str;
 | |
| 
 | |
|   return ReturnStr;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| GetNextParamStr (
 | |
|   IN OUT CHAR16 **List
 | |
|   )
 | |
| {
 | |
|   //
 | |
|   // The separator is comma
 | |
|   //
 | |
|   return SplitStr (List, L',');
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| GetNextDeviceNodeStr (
 | |
|   IN OUT CHAR16   **DevicePath,
 | |
|   OUT    BOOLEAN  *IsInstanceEnd
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Get one device node from entire device path text.
 | |
| 
 | |
|   Arguments:
 | |
|     Str           - The entire device path text string
 | |
|     IsInstanceEnd - This node is the end of a device path instance
 | |
| 
 | |
|   Returns:
 | |
|     a pointer     - A device node text
 | |
|     NULL          - No more device node available
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   CHAR16  *Str;
 | |
|   CHAR16  *ReturnStr;
 | |
|   UINTN   ParenthesesStack;
 | |
| 
 | |
|   Str = *DevicePath;
 | |
|   if (IS_NULL (*Str)) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Skip the leading '/', '(', ')' and ','
 | |
|   //
 | |
|   while (!IS_NULL (*Str)) {
 | |
|     if (!IS_SLASH (*Str) &&
 | |
|         !IS_COMMA (*Str) &&
 | |
|         !IS_LEFT_PARENTH (*Str) &&
 | |
|         !IS_RIGHT_PARENTH (*Str)) {
 | |
|       break;
 | |
|     }
 | |
|     Str++;
 | |
|   }
 | |
| 
 | |
|   ReturnStr = Str;
 | |
| 
 | |
|   //
 | |
|   // Scan for the separator of this device node, '/' or ','
 | |
|   //
 | |
|   ParenthesesStack = 0;
 | |
|   while (!IS_NULL (*Str)) {
 | |
|     if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     if (IS_LEFT_PARENTH (*Str)) {
 | |
|       ParenthesesStack++;
 | |
|     } else if (IS_RIGHT_PARENTH (*Str)) {
 | |
|       ParenthesesStack--;
 | |
|     }
 | |
| 
 | |
|     Str++;
 | |
|   }
 | |
| 
 | |
|   if (ParenthesesStack != 0) {
 | |
|     //
 | |
|     // The '(' doesn't pair with ')', invalid device path text
 | |
|     //
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   if (IS_COMMA (*Str)) {
 | |
|     *IsInstanceEnd = TRUE;
 | |
|     *Str = L'\0';
 | |
|     Str++;
 | |
|   } else {
 | |
|     *IsInstanceEnd = FALSE;
 | |
|     if (!IS_NULL (*Str)) {
 | |
|       *Str = L'\0';
 | |
|       Str++;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   *DevicePath = Str;
 | |
| 
 | |
|   return ReturnStr;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| BOOLEAN
 | |
| 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.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   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;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| 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.
 | |
|     EFI_
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN       HexCnt;
 | |
|   UINTN       Idx;
 | |
|   UINTN       BufferLength;
 | |
|   UINT8       Digit;
 | |
|   UINT8       Byte;
 | |
| 
 | |
|   //
 | |
|   // Find out how many hex characters the string has.
 | |
|   //
 | |
|   for (Idx = 0, HexCnt = 0; 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++) {
 | |
| 
 | |
|     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;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| CHAR16 *
 | |
| TrimHexStr (
 | |
|   IN CHAR16  *Str
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Skip the leading white space and '0x' or '0X' of a hex string
 | |
| 
 | |
|   Arguments:
 | |
|     Str  -  The hex string
 | |
| 
 | |
|   Returns:
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   //
 | |
|   // skip preceeding white space
 | |
|   //
 | |
|   while (*Str && *Str == ' ') {
 | |
|     Str += 1;
 | |
|   }
 | |
|   //
 | |
|   // skip preceeding zeros
 | |
|   //
 | |
|   while (*Str && *Str == '0') {
 | |
|     Str += 1;
 | |
|   }
 | |
|   //
 | |
|   // skip preceeding character 'x' or 'X'
 | |
|   //
 | |
|   if (*Str && (*Str == 'x' || *Str == 'X')) {
 | |
|     Str += 1;
 | |
|   }
 | |
| 
 | |
|   return Str;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| Xtoi (
 | |
|   IN CHAR16  *Str
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Convert hex string to uint
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Str  -  The string
 | |
|   
 | |
| Returns:
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Rvalue;
 | |
|   UINTN   Length;
 | |
| 
 | |
|   ASSERT (Str != NULL);
 | |
| 
 | |
|   //
 | |
|   // convert hex digits
 | |
|   //
 | |
|   Rvalue = 0;
 | |
|   Length = sizeof (UINTN);
 | |
|   HexStringToBuf ((UINT8 *) &Rvalue, &Length, TrimHexStr (Str), NULL);
 | |
| 
 | |
|   return Rvalue;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| Xtoi64 (
 | |
|   IN CHAR16  *Str,
 | |
|   IN UINT64  *Data
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Convert hex string to 64 bit data.
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Str  -  The string
 | |
|   
 | |
| Returns:
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN  Length;
 | |
| 
 | |
|   *Data  = 0;
 | |
|   Length = sizeof (UINT64);
 | |
|   HexStringToBuf ((UINT8 *) Data, &Length, TrimHexStr (Str), NULL);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| UINTN
 | |
| Atoi (
 | |
|   IN CHAR16  *str
 | |
|   )
 | |
| /*++
 | |
| 
 | |
| Routine Description:
 | |
| 
 | |
|   Convert decimal string to uint
 | |
| 
 | |
| Arguments:
 | |
| 
 | |
|   Str  -  The string
 | |
|   
 | |
| Returns:
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   UINTN   Rvalue;
 | |
|   CHAR16  Char;
 | |
|   UINTN   High;
 | |
|   UINTN   Low;
 | |
| 
 | |
|   ASSERT (str != NULL);
 | |
| 
 | |
|   High = (UINTN) -1 / 10;
 | |
|   Low  = (UINTN) -1 % 10;
 | |
|   //
 | |
|   // skip preceeding white space
 | |
|   //
 | |
|   while (*str && *str == ' ') {
 | |
|     str += 1;
 | |
|   }
 | |
|   //
 | |
|   // convert digits
 | |
|   //
 | |
|   Rvalue = 0;
 | |
|   Char = *(str++);
 | |
|   while (Char) {
 | |
|     if (Char >= '0' && Char <= '9') {
 | |
|       if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {
 | |
|         return (UINTN) -1;
 | |
|       }
 | |
| 
 | |
|       Rvalue = (Rvalue * 10) + Char - '0';
 | |
|     } else {
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     Char = *(str++);
 | |
|   }
 | |
| 
 | |
|   return Rvalue;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_STATUS 
 | |
| StrToBuf (
 | |
|   OUT UINT8    *Buf,
 | |
|   IN  UINTN    BufferLength,
 | |
|   IN  CHAR16   *Str
 | |
|   )
 | |
| {
 | |
|   UINTN       Index;
 | |
|   UINTN       StrLength;
 | |
|   UINT8       Digit;
 | |
|   UINT8       Byte;
 | |
| 
 | |
|   //
 | |
|   // Two hex char make up one byte
 | |
|   //
 | |
|   StrLength = BufferLength * sizeof (CHAR16);
 | |
| 
 | |
|   for(Index = 0; Index < StrLength; Index++, Str++) {
 | |
| 
 | |
|     IsHexDigit (&Digit, *Str);
 | |
| 
 | |
|     //
 | |
|     // For odd charaters, write the upper nibble for each buffer byte,
 | |
|     // and for even characters, the lower nibble.
 | |
|     //
 | |
|     if ((Index & 1) == 0) {
 | |
|       Byte = (UINT8) (Digit << 4);
 | |
|     } else {
 | |
|       Byte = Buf[Index / 2];
 | |
|       Byte &= 0xF0;
 | |
|       Byte = (UINT8) (Byte | Digit);
 | |
|     }
 | |
| 
 | |
|     Buf[Index / 2] = Byte;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| StrToGuid (
 | |
|   IN  CHAR16   *Str,
 | |
|   OUT EFI_GUID *Guid
 | |
|   )
 | |
| {
 | |
|   UINTN       BufferLength;
 | |
|   UINTN       ConvertedStrLen;
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   BufferLength = sizeof (Guid->Data1);
 | |
|   Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   Str += ConvertedStrLen;
 | |
|   if (IS_HYPHEN (*Str)) {
 | |
|     Str++;   
 | |
|   } else {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   BufferLength = sizeof (Guid->Data2);
 | |
|   Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   Str += ConvertedStrLen;
 | |
|   if (IS_HYPHEN (*Str)) {
 | |
|     Str++;
 | |
|   } else {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   BufferLength = sizeof (Guid->Data3);
 | |
|   Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);
 | |
|   if (EFI_ERROR (Status)) {
 | |
|     return Status;
 | |
|   }
 | |
|   Str += ConvertedStrLen;
 | |
|   if (IS_HYPHEN (*Str)) {
 | |
|     Str++;
 | |
|   } else {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
| 
 | |
|   StrToBuf (&Guid->Data4[0], 2, Str);
 | |
|   //
 | |
|   // Skip 2 byte hex chars
 | |
|   //
 | |
|   Str += 2 * 2;
 | |
| 
 | |
|   if (IS_HYPHEN (*Str)) {
 | |
|     Str++;
 | |
|   } else {
 | |
|     return EFI_UNSUPPORTED;
 | |
|   }
 | |
|   StrToBuf (&Guid->Data4[2], 6, Str);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| StrToIPv4Addr (
 | |
|   IN OUT CHAR16           **Str,
 | |
|   OUT    EFI_IPv4_ADDRESS *IPv4Addr
 | |
|   )
 | |
| {
 | |
|   UINTN  Index;
 | |
| 
 | |
|   for (Index = 0; Index < 4; Index++) {
 | |
|     IPv4Addr->Addr[Index] = (UINT8) Atoi (SplitStr (Str, L'.'));
 | |
|   }
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| StrToIPv6Addr (
 | |
|   IN OUT CHAR16           **Str,
 | |
|   OUT    EFI_IPv6_ADDRESS *IPv6Addr
 | |
|   )
 | |
| {
 | |
|   UINTN  Index;
 | |
|   UINT16 Data;
 | |
| 
 | |
|   for (Index = 0; Index < 8; Index++) {
 | |
|     Data = (UINT16) Xtoi (SplitStr (Str, L':'));
 | |
|     IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);
 | |
|     IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);
 | |
|   }
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| VOID
 | |
| StrToAscii (
 | |
|   IN     CHAR16 *Str,
 | |
|   IN OUT CHAR8  **AsciiStr
 | |
|   )
 | |
| {
 | |
|   CHAR8 *Dest;
 | |
| 
 | |
|   Dest = *AsciiStr;
 | |
|   while (!IS_NULL (*Str)) {
 | |
|     *(Dest++) = (CHAR8) *(Str++);
 | |
|   }
 | |
|   *Dest = 0;
 | |
| 
 | |
|   //
 | |
|   // Return the string next to it
 | |
|   //
 | |
|   *AsciiStr = Dest + 1;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextPci (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16          *FunctionStr;
 | |
|   CHAR16          *DeviceStr;
 | |
|   PCI_DEVICE_PATH *Pci;
 | |
| 
 | |
|   FunctionStr = GetNextParamStr (&TextDeviceNode);
 | |
|   DeviceStr   = GetNextParamStr (&TextDeviceNode);
 | |
|   Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                       HARDWARE_DEVICE_PATH,
 | |
|                                       HW_PCI_DP,
 | |
|                                       sizeof (PCI_DEVICE_PATH)
 | |
|                                       );
 | |
| 
 | |
|   Pci->Function = (UINT8) Xtoi (FunctionStr);
 | |
|   Pci->Device   = (UINT8) Xtoi (DeviceStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Pci;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextPcCard (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16              *FunctionNumberStr;
 | |
|   PCCARD_DEVICE_PATH  *Pccard;
 | |
| 
 | |
|   FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                HARDWARE_DEVICE_PATH,
 | |
|                                                HW_PCCARD_DP,
 | |
|                                                sizeof (PCCARD_DEVICE_PATH)
 | |
|                                                );
 | |
| 
 | |
|   Pccard->FunctionNumber  = (UINT8) Xtoi (FunctionNumberStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextMemoryMapped (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16              *StartingAddressStr;
 | |
|   CHAR16              *EndingAddressStr;
 | |
|   MEMMAP_DEVICE_PATH  *MemMap;
 | |
| 
 | |
|   StartingAddressStr = GetNextParamStr (&TextDeviceNode);
 | |
|   EndingAddressStr   = GetNextParamStr (&TextDeviceNode);
 | |
|   MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                HARDWARE_DEVICE_PATH,
 | |
|                                                HW_MEMMAP_DP,
 | |
|                                                sizeof (MEMMAP_DEVICE_PATH)
 | |
|                                                );
 | |
| 
 | |
|   MemMap->MemoryType  = 0;
 | |
| 
 | |
|   Xtoi64 (StartingAddressStr, &MemMap->StartingAddress);
 | |
|   Xtoi64 (EndingAddressStr, &MemMap->EndingAddress);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| ConvertFromTextVendor (
 | |
|   IN CHAR16 *TextDeviceNode,
 | |
|   IN UINT8  Type,
 | |
|   IN UINT8  SubType
 | |
|   )
 | |
| {
 | |
|   CHAR16              *GuidStr;
 | |
|   CHAR16              *DataStr;
 | |
|   UINTN               Length;
 | |
|   VENDOR_DEVICE_PATH  *Vendor;
 | |
| 
 | |
|   GuidStr = GetNextParamStr (&TextDeviceNode);
 | |
| 
 | |
|   DataStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Length  = StrLen (DataStr);
 | |
|   //
 | |
|   // Two hex characters make up 1 buffer byte
 | |
|   //
 | |
|   Length  = (Length + 1) / 2;
 | |
| 
 | |
|   Vendor  = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                      Type,
 | |
|                                      SubType,
 | |
|                                      sizeof (VENDOR_DEVICE_PATH) + (UINT16) Length
 | |
|                                      );
 | |
| 
 | |
|   StrToGuid (GuidStr, &Vendor->Guid);
 | |
|   StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenHw (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextVendor (
 | |
|            TextDeviceNode,
 | |
|            HARDWARE_DEVICE_PATH,
 | |
|            HW_VENDOR_DP
 | |
|            );
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextCtrl (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                  *ControllerStr;
 | |
|   CONTROLLER_DEVICE_PATH  *Controller;
 | |
| 
 | |
|   ControllerStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                HARDWARE_DEVICE_PATH,
 | |
|                                                HW_CONTROLLER_DP,
 | |
|                                                sizeof (CONTROLLER_DEVICE_PATH)
 | |
|                                                );
 | |
|   Controller->ControllerNumber = (UINT32) Xtoi (ControllerStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Controller;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextAcpi (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                *HIDStr;
 | |
|   CHAR16                *UIDStr;
 | |
|   ACPI_HID_DEVICE_PATH  *Acpi;
 | |
| 
 | |
|   HIDStr = GetNextParamStr (&TextDeviceNode);
 | |
|   UIDStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                       ACPI_DEVICE_PATH,
 | |
|                                       ACPI_DP,
 | |
|                                       sizeof (ACPI_HID_DEVICE_PATH)
 | |
|                                       );
 | |
| 
 | |
|   if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
 | |
|     HIDStr += 3;
 | |
|   }
 | |
| 
 | |
|   Acpi->HID = EISA_PNP_ID (Xtoi (HIDStr));
 | |
|   Acpi->UID = (UINT32) Xtoi (UIDStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| ConvertFromTextAcpi (
 | |
|   IN CHAR16 *TextDeviceNode,
 | |
|   IN UINT32  Hid
 | |
|   )
 | |
| {
 | |
|   CHAR16                *UIDStr;
 | |
|   ACPI_HID_DEVICE_PATH  *Acpi;
 | |
| 
 | |
|   UIDStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                       ACPI_DEVICE_PATH,
 | |
|                                       ACPI_DP,
 | |
|                                       sizeof (ACPI_HID_DEVICE_PATH)
 | |
|                                       );
 | |
| 
 | |
|   Acpi->HID = Hid;
 | |
|   Acpi->UID = (UINT32) Xtoi (UIDStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextPciRoot (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextFloppy (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextKeyboard (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextSerial (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextParallelPort (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextAcpiEx (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                                  *HIDStr;
 | |
|   CHAR16                                  *CIDStr;
 | |
|   CHAR16                                  *UIDStr;
 | |
|   CHAR16                                  *HIDSTRStr;
 | |
|   CHAR16                                  *CIDSTRStr;
 | |
|   CHAR16                                  *UIDSTRStr;
 | |
|   CHAR8                                   *AsciiStr;
 | |
|   UINT16                                  Length;
 | |
|   ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;
 | |
| 
 | |
|   HIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   CIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   UIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   HIDSTRStr = GetNextParamStr (&TextDeviceNode);
 | |
|   CIDSTRStr = GetNextParamStr (&TextDeviceNode);
 | |
|   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
 | |
| 
 | |
|   Length    = (UINT16) (sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + StrLen (HIDSTRStr) + 1);
 | |
|   Length    = (UINT16) (Length + StrLen (UIDSTRStr) + 1);
 | |
|   Length    = (UINT16) (Length + StrLen (CIDSTRStr) + 1);
 | |
|   AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (
 | |
|                                                          ACPI_DEVICE_PATH,
 | |
|                                                          ACPI_EXTENDED_DP,
 | |
|                                                          Length
 | |
|                                                          );
 | |
| 
 | |
|   if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
 | |
|     HIDStr += 3;
 | |
|     AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));
 | |
|   } else {
 | |
|     AcpiExt->HID = (UINT32) Xtoi (HIDStr);
 | |
|   }
 | |
| 
 | |
|   AcpiExt->UID  = (UINT32) Xtoi (UIDStr);
 | |
|   AcpiExt->CID  = (UINT32) Xtoi (CIDStr);
 | |
| 
 | |
|   AsciiStr = AcpiExt->HidUidCidStr;
 | |
|   StrToAscii (HIDSTRStr, &AsciiStr);
 | |
|   StrToAscii (UIDSTRStr, &AsciiStr);
 | |
|   StrToAscii (CIDSTRStr, &AsciiStr);
 | |
|   
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextAcpiExp (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                                  *HIDStr;
 | |
|   CHAR16                                  *CIDStr;
 | |
|   CHAR16                                  *UIDSTRStr;
 | |
|   CHAR8                                   *AsciiStr;
 | |
|   UINT16                                  Length;
 | |
|   ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;
 | |
| 
 | |
|   HIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   CIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   UIDSTRStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Length    = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + (UINT16) StrLen (UIDSTRStr) + 3;
 | |
|   AcpiExt   = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (
 | |
|                                                            ACPI_DEVICE_PATH,
 | |
|                                                            ACPI_EXTENDED_DP,
 | |
|                                                            Length
 | |
|                                                            );
 | |
| 
 | |
|   if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
 | |
|     HIDStr += 3;
 | |
|     AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));
 | |
|   } else {
 | |
|     AcpiExt->HID = (UINT32) Xtoi (HIDStr);
 | |
|   }
 | |
| 
 | |
|   AcpiExt->UID = 0;
 | |
|   AcpiExt->CID = (UINT32) Xtoi (CIDStr);
 | |
| 
 | |
|   AsciiStr = AcpiExt->HidUidCidStr;
 | |
|   //
 | |
|   // HID string is NULL
 | |
|   //
 | |
|   *AsciiStr = 0;
 | |
|   //
 | |
|   // Convert UID string
 | |
|   //
 | |
|   AsciiStr++;
 | |
|   StrToAscii (UIDSTRStr, &AsciiStr);
 | |
|   //
 | |
|   // CID string is NULL
 | |
|   //
 | |
|   *AsciiStr = 0;
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextAta (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *PrimarySecondaryStr;
 | |
|   CHAR16            *SlaveMasterStr;
 | |
|   CHAR16            *LunStr;
 | |
|   ATAPI_DEVICE_PATH *Atapi;
 | |
| 
 | |
|   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                   MESSAGING_DEVICE_PATH,
 | |
|                                   MSG_ATAPI_DP,
 | |
|                                   sizeof (ATAPI_DEVICE_PATH)
 | |
|                                   );
 | |
| 
 | |
|   PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   SlaveMasterStr          = GetNextParamStr (&TextDeviceNode);
 | |
|   LunStr                  = GetNextParamStr (&TextDeviceNode);
 | |
| 
 | |
|   Atapi->PrimarySecondary = (UINT8) ((StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? 0 : 1);
 | |
|   Atapi->SlaveMaster      = (UINT8) ((StrCmp (SlaveMasterStr, L"Master") == 0) ? 0 : 1);
 | |
|   Atapi->Lun              = (UINT16) Xtoi (LunStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextScsi (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *PunStr;
 | |
|   CHAR16            *LunStr;
 | |
|   SCSI_DEVICE_PATH  *Scsi;
 | |
| 
 | |
|   PunStr = GetNextParamStr (&TextDeviceNode);
 | |
|   LunStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                    MESSAGING_DEVICE_PATH,
 | |
|                                    MSG_SCSI_DP,
 | |
|                                    sizeof (SCSI_DEVICE_PATH)
 | |
|                                    );
 | |
| 
 | |
|   Scsi->Pun = (UINT16) Xtoi (PunStr);
 | |
|   Scsi->Lun = (UINT16) Xtoi (LunStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextFibre (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                    *WWNStr;
 | |
|   CHAR16                    *LunStr;
 | |
|   FIBRECHANNEL_DEVICE_PATH  *Fibre;
 | |
| 
 | |
|   WWNStr = GetNextParamStr (&TextDeviceNode);
 | |
|   LunStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                           MESSAGING_DEVICE_PATH,
 | |
|                                           MSG_FIBRECHANNEL_DP,
 | |
|                                           sizeof (FIBRECHANNEL_DEVICE_PATH)
 | |
|                                           );
 | |
| 
 | |
|   Fibre->Reserved = 0;
 | |
|   Xtoi64 (WWNStr, &Fibre->WWN);
 | |
|   Xtoi64 (LunStr, &Fibre->Lun);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromText1394 (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *GuidStr;
 | |
|   F1394_DEVICE_PATH *F1394;
 | |
| 
 | |
|   GuidStr = GetNextParamStr (&TextDeviceNode);
 | |
|   F1394  = (F1394_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                    MESSAGING_DEVICE_PATH,
 | |
|                                    MSG_1394_DP,
 | |
|                                    sizeof (F1394_DEVICE_PATH)
 | |
|                                    );
 | |
| 
 | |
|   F1394->Reserved = 0;
 | |
|   Xtoi64 (GuidStr, &F1394->Guid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) F1394;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsb (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16          *PortStr;
 | |
|   CHAR16          *InterfaceStr;
 | |
|   USB_DEVICE_PATH *Usb;
 | |
| 
 | |
|   PortStr               = GetNextParamStr (&TextDeviceNode);
 | |
|   InterfaceStr          = GetNextParamStr (&TextDeviceNode);
 | |
|   Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                 MESSAGING_DEVICE_PATH,
 | |
|                                                 MSG_USB_DP,
 | |
|                                                 sizeof (USB_DEVICE_PATH)
 | |
|                                                 );
 | |
| 
 | |
|   Usb->ParentPortNumber = (UINT8) Xtoi (PortStr);
 | |
|   Usb->InterfaceNumber  = (UINT8) Xtoi (InterfaceStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Usb;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextI2O (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16          *TIDStr;
 | |
|   I2O_DEVICE_PATH *I2O;
 | |
| 
 | |
|   TIDStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   I2O       = (I2O_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MESSAGING_DEVICE_PATH,
 | |
|                                     MSG_I2O_DP,
 | |
|                                     sizeof (I2O_DEVICE_PATH)
 | |
|                                     );
 | |
| 
 | |
|   I2O->Tid  = (UINT32) Xtoi (TIDStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) I2O;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextInfiniband (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                  *FlagsStr;
 | |
|   CHAR16                  *GuidStr;
 | |
|   CHAR16                  *SidStr;
 | |
|   CHAR16                  *TidStr;
 | |
|   CHAR16                  *DidStr;
 | |
|   EFI_GUID                PortGid;
 | |
|   INFINIBAND_DEVICE_PATH  *InfiniBand;
 | |
| 
 | |
|   FlagsStr   = GetNextParamStr (&TextDeviceNode);
 | |
|   GuidStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   SidStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   TidStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   DidStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                             MESSAGING_DEVICE_PATH,
 | |
|                                             MSG_INFINIBAND_DP,
 | |
|                                             sizeof (INFINIBAND_DEVICE_PATH)
 | |
|                                             );
 | |
| 
 | |
|   InfiniBand->ResourceFlags = (UINT32) Xtoi (FlagsStr);
 | |
|   StrToGuid (GuidStr, &PortGid);
 | |
|   CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));
 | |
|   Xtoi64 (SidStr, &InfiniBand->ServiceId);
 | |
|   Xtoi64 (TidStr, &InfiniBand->TargetPortId);
 | |
|   Xtoi64 (DidStr, &InfiniBand->DeviceId);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenMsg (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextVendor (
 | |
|             TextDeviceNode,
 | |
|             MESSAGING_DEVICE_PATH,
 | |
|             MSG_VENDOR_DP
 | |
|             );
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenPcAnsi (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   VENDOR_DEVICE_PATH  *Vendor;
 | |
| 
 | |
|   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MESSAGING_DEVICE_PATH,
 | |
|                                     MSG_VENDOR_DP,
 | |
|                                     sizeof (VENDOR_DEVICE_PATH));
 | |
|   CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenVt100 (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   VENDOR_DEVICE_PATH  *Vendor;
 | |
| 
 | |
|   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MESSAGING_DEVICE_PATH,
 | |
|                                     MSG_VENDOR_DP,
 | |
|                                     sizeof (VENDOR_DEVICE_PATH));
 | |
|   CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenVt100Plus (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   VENDOR_DEVICE_PATH  *Vendor;
 | |
| 
 | |
|   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MESSAGING_DEVICE_PATH,
 | |
|                                     MSG_VENDOR_DP,
 | |
|                                     sizeof (VENDOR_DEVICE_PATH));
 | |
|   CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenUtf8 (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   VENDOR_DEVICE_PATH  *Vendor;
 | |
| 
 | |
|   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MESSAGING_DEVICE_PATH,
 | |
|                                     MSG_VENDOR_DP,
 | |
|                                     sizeof (VENDOR_DEVICE_PATH));
 | |
|   CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUartFlowCtrl (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                        *ValueStr;
 | |
|   UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
 | |
| 
 | |
|   ValueStr        = GetNextParamStr (&TextDeviceNode);
 | |
|   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                         MESSAGING_DEVICE_PATH,
 | |
|                                                         MSG_VENDOR_DP,
 | |
|                                                         sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
 | |
|                                                         );
 | |
| 
 | |
|   CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);
 | |
|   if (StrCmp (ValueStr, L"XonXoff") == 0) {
 | |
|     UartFlowControl->FlowControlMap = 2;
 | |
|   } else if (StrCmp (ValueStr, L"Hardware") == 0) {
 | |
|     UartFlowControl->FlowControlMap = 1;
 | |
|   } else {
 | |
|     UartFlowControl->FlowControlMap = 0;
 | |
|   }
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextSAS (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16          *AddressStr;
 | |
|   CHAR16          *LunStr;
 | |
|   CHAR16          *RTPStr;
 | |
|   CHAR16          *SASSATAStr;
 | |
|   CHAR16          *LocationStr;
 | |
|   CHAR16          *ConnectStr;
 | |
|   CHAR16          *DriveBayStr;
 | |
|   CHAR16          *ReservedStr;
 | |
|   UINT16          Info;
 | |
|   SAS_DEVICE_PATH *Sas;
 | |
| 
 | |
|   AddressStr  = GetNextParamStr (&TextDeviceNode);
 | |
|   LunStr      = GetNextParamStr (&TextDeviceNode);
 | |
|   RTPStr      = GetNextParamStr (&TextDeviceNode);
 | |
|   SASSATAStr  = GetNextParamStr (&TextDeviceNode);
 | |
|   LocationStr = GetNextParamStr (&TextDeviceNode);
 | |
|   ConnectStr  = GetNextParamStr (&TextDeviceNode);
 | |
|   DriveBayStr = GetNextParamStr (&TextDeviceNode);
 | |
|   ReservedStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Info        = 0x0000;
 | |
|   Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                        MESSAGING_DEVICE_PATH,
 | |
|                                        MSG_VENDOR_DP,
 | |
|                                        sizeof (SAS_DEVICE_PATH)
 | |
|                                        );
 | |
| 
 | |
|   CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);
 | |
|   Xtoi64 (AddressStr, &Sas->SasAddress);
 | |
|   Xtoi64 (LunStr, &Sas->Lun);
 | |
|   Sas->RelativeTargetPort = (UINT16) Xtoi (RTPStr);
 | |
|   if (StrCmp (SASSATAStr, L"NoTopology") == 0)
 | |
|     ;
 | |
|   else {
 | |
|     if (StrCmp (DriveBayStr, L"0") == 0) {
 | |
|       Info |= 0x0001;
 | |
|     } else {
 | |
|       Info |= 0x0002;
 | |
|       Info |= (Xtoi (DriveBayStr) << 8);
 | |
|     }
 | |
| 
 | |
|     if (StrCmp (SASSATAStr, L"SATA") == 0) {
 | |
|       Info |= 0x0010;
 | |
|     }
 | |
| 
 | |
|     if (StrCmp (LocationStr, L"External") == 0) {
 | |
|       Info |= 0x0020;
 | |
|     }
 | |
| 
 | |
|     if (StrCmp (ConnectStr, L"Expanded") == 0) {
 | |
|       Info |= 0x0040;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Sas->DeviceTopology = Info;
 | |
|   Sas->Reserved       = (UINT32) Xtoi (ReservedStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Sas;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextDebugPort (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;
 | |
| 
 | |
|   Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                     MESSAGING_DEVICE_PATH,
 | |
|                                                     MSG_VENDOR_DP,
 | |
|                                                     sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)
 | |
|                                                     );
 | |
| 
 | |
|   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Vend;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextMAC (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                *AddressStr;
 | |
|   CHAR16                *IfTypeStr;
 | |
|   UINTN                 Length;
 | |
|   MAC_ADDR_DEVICE_PATH  *MAC;
 | |
| 
 | |
|   AddressStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   IfTypeStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   MAC           = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                               MESSAGING_DEVICE_PATH,
 | |
|                                               MSG_MAC_ADDR_DP,
 | |
|                                               sizeof (MAC_ADDR_DEVICE_PATH)
 | |
|                                               );
 | |
| 
 | |
|   MAC->IfType   = (UINT8) Xtoi (IfTypeStr);
 | |
| 
 | |
|   Length = sizeof (EFI_MAC_ADDRESS);
 | |
|   StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) MAC;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextIPv4 (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *RemoteIPStr;
 | |
|   CHAR16            *ProtocolStr;
 | |
|   CHAR16            *TypeStr;
 | |
|   CHAR16            *LocalIPStr;
 | |
|   IPv4_DEVICE_PATH  *IPv4;
 | |
| 
 | |
|   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   TypeStr               = GetNextParamStr (&TextDeviceNode);
 | |
|   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
 | |
|   IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                  MESSAGING_DEVICE_PATH,
 | |
|                                                  MSG_IPv4_DP,
 | |
|                                                  sizeof (IPv4_DEVICE_PATH)
 | |
|                                                  );
 | |
| 
 | |
|   StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);
 | |
|   IPv4->Protocol = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);
 | |
|   if (StrCmp (TypeStr, L"Static") == 0) {
 | |
|     IPv4->StaticIpAddress = TRUE;
 | |
|   } else {
 | |
|     IPv4->StaticIpAddress = FALSE;
 | |
|   }
 | |
| 
 | |
|   StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);
 | |
| 
 | |
|   IPv4->LocalPort      = 0;
 | |
|   IPv4->RemotePort     = 0;
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextIPv6 (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *RemoteIPStr;
 | |
|   CHAR16            *ProtocolStr;
 | |
|   CHAR16            *TypeStr;
 | |
|   CHAR16            *LocalIPStr;
 | |
|   IPv6_DEVICE_PATH  *IPv6;
 | |
| 
 | |
|   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   ProtocolStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   TypeStr               = GetNextParamStr (&TextDeviceNode);
 | |
|   LocalIPStr            = GetNextParamStr (&TextDeviceNode);
 | |
|   IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                  MESSAGING_DEVICE_PATH,
 | |
|                                                  MSG_IPv6_DP,
 | |
|                                                  sizeof (IPv6_DEVICE_PATH)
 | |
|                                                  );
 | |
| 
 | |
|   StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);
 | |
|   IPv6->Protocol        = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);
 | |
|   if (StrCmp (TypeStr, L"Static") == 0) {
 | |
|     IPv6->StaticIpAddress = TRUE;
 | |
|   } else {
 | |
|     IPv6->StaticIpAddress = FALSE;
 | |
|   }
 | |
| 
 | |
|   StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);
 | |
| 
 | |
|   IPv6->LocalPort       = 0;
 | |
|   IPv6->RemotePort      = 0;
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUart (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *BaudStr;
 | |
|   CHAR16            *DataBitsStr;
 | |
|   CHAR16            *ParityStr;
 | |
|   CHAR16            *StopBitsStr;
 | |
|   UART_DEVICE_PATH  *Uart;
 | |
| 
 | |
|   BaudStr         = GetNextParamStr (&TextDeviceNode);
 | |
|   DataBitsStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   ParityStr       = GetNextParamStr (&TextDeviceNode);
 | |
|   StopBitsStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                            MESSAGING_DEVICE_PATH,
 | |
|                                            MSG_UART_DP,
 | |
|                                            sizeof (UART_DEVICE_PATH)
 | |
|                                            );
 | |
| 
 | |
|   Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Atoi (BaudStr);
 | |
|   Uart->DataBits  = (UINT8) ((StrCmp (DataBitsStr, L"DEFAULT") == 0) ? 8 : Atoi (DataBitsStr));
 | |
|   switch (*ParityStr) {
 | |
|   case L'D':
 | |
|     Uart->Parity = 0;
 | |
|     break;
 | |
| 
 | |
|   case L'N':
 | |
|     Uart->Parity = 1;
 | |
|     break;
 | |
| 
 | |
|   case L'E':
 | |
|     Uart->Parity = 2;
 | |
|     break;
 | |
| 
 | |
|   case L'O':
 | |
|     Uart->Parity = 3;
 | |
|     break;
 | |
| 
 | |
|   case L'M':
 | |
|     Uart->Parity = 4;
 | |
|     break;
 | |
| 
 | |
|   case L'S':
 | |
|     Uart->Parity = 5;
 | |
| 
 | |
|   default:
 | |
|     Uart->Parity = 0xff;
 | |
|   }
 | |
| 
 | |
|   if (StrCmp (StopBitsStr, L"D") == 0) {
 | |
|     Uart->StopBits = (UINT8) 0;
 | |
|   } else if (StrCmp (StopBitsStr, L"1") == 0) {
 | |
|     Uart->StopBits = (UINT8) 1;
 | |
|   } else if (StrCmp (StopBitsStr, L"1.5") == 0) {
 | |
|     Uart->StopBits = (UINT8) 2;
 | |
|   } else if (StrCmp (StopBitsStr, L"2") == 0) {
 | |
|     Uart->StopBits = (UINT8) 3;
 | |
|   } else {
 | |
|     Uart->StopBits = 0xff;
 | |
|   }
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Uart;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| ConvertFromTextUsbClass (
 | |
|   IN CHAR16         *TextDeviceNode,
 | |
|   IN USB_CLASS_TEXT *UsbClassText
 | |
|   )
 | |
| {
 | |
|   CHAR16                *VIDStr;
 | |
|   CHAR16                *PIDStr;
 | |
|   CHAR16                *ClassStr;
 | |
|   CHAR16                *SubClassStr;
 | |
|   CHAR16                *ProtocolStr;
 | |
|   USB_CLASS_DEVICE_PATH *UsbClass;
 | |
| 
 | |
|   UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                             MESSAGING_DEVICE_PATH,
 | |
|                                             MSG_USB_CLASS_DP,
 | |
|                                             sizeof (USB_CLASS_DEVICE_PATH)
 | |
|                                             );
 | |
| 
 | |
|   VIDStr      = GetNextParamStr (&TextDeviceNode);
 | |
|   PIDStr      = GetNextParamStr (&TextDeviceNode);
 | |
|   if (UsbClassText->ClassExist) {
 | |
|     ClassStr = GetNextParamStr (&TextDeviceNode);
 | |
|     UsbClass->DeviceClass = (UINT8) Xtoi (ClassStr);
 | |
|   } else {
 | |
|     UsbClass->DeviceClass = UsbClassText->Class;
 | |
|   }
 | |
|   if (UsbClassText->SubClassExist) {
 | |
|     SubClassStr = GetNextParamStr (&TextDeviceNode);
 | |
|     UsbClass->DeviceSubClass = (UINT8) Xtoi (SubClassStr);
 | |
|   } else {
 | |
|     UsbClass->DeviceSubClass = UsbClassText->SubClass;
 | |
|   }  
 | |
| 
 | |
|   ProtocolStr = GetNextParamStr (&TextDeviceNode);
 | |
| 
 | |
|   UsbClass->VendorId        = (UINT16) Xtoi (VIDStr);
 | |
|   UsbClass->ProductId       = (UINT16) Xtoi (PIDStr);
 | |
|   UsbClass->DeviceProtocol  = (UINT8) Xtoi (ProtocolStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;
 | |
| }
 | |
| 
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbClass (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = TRUE;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbAudio (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_AUDIO;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbCDCControl (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_CDCCONTROL;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbHID (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_HID;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbImage (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_IMAGE;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbPrinter (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_PRINTER;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbMassStorage (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_MASS_STORAGE;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbHub (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_HUB;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbCDCData (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_CDCDATA;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbSmartCard (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_SMART_CARD;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbVideo (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_VIDEO;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbDiagnostic (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbWireless (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_WIRELESS;
 | |
|   UsbClassText.SubClassExist = TRUE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbDeviceFirmwareUpdate (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_RESERVE;
 | |
|   UsbClassText.SubClassExist = FALSE;
 | |
|   UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbIrdaBridge (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_RESERVE;
 | |
|   UsbClassText.SubClassExist = FALSE;
 | |
|   UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbTestAndMeasurement (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   USB_CLASS_TEXT  UsbClassText;
 | |
| 
 | |
|   UsbClassText.ClassExist    = FALSE;
 | |
|   UsbClassText.Class         = USB_CLASS_RESERVE;
 | |
|   UsbClassText.SubClassExist = FALSE;
 | |
|   UsbClassText.SubClass      = USB_SUBCLASS_TEST;
 | |
| 
 | |
|   return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUsbWwid (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                *VIDStr;
 | |
|   CHAR16                *PIDStr;
 | |
|   CHAR16                *InterfaceNumStr;
 | |
|   USB_WWID_DEVICE_PATH  *UsbWwid;
 | |
| 
 | |
|   VIDStr                    = GetNextParamStr (&TextDeviceNode);
 | |
|   PIDStr                    = GetNextParamStr (&TextDeviceNode);
 | |
|   InterfaceNumStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   UsbWwid                   = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                          MESSAGING_DEVICE_PATH,
 | |
|                                                          MSG_USB_WWID_DP,
 | |
|                                                          sizeof (USB_WWID_DEVICE_PATH)
 | |
|                                                          );
 | |
| 
 | |
|   UsbWwid->VendorId         = (UINT16) Xtoi (VIDStr);
 | |
|   UsbWwid->ProductId        = (UINT16) Xtoi (PIDStr);
 | |
|   UsbWwid->InterfaceNumber  = (UINT16) Xtoi (InterfaceNumStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextUnit (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                          *LunStr;
 | |
|   DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
 | |
| 
 | |
|   LunStr      = GetNextParamStr (&TextDeviceNode);
 | |
|   LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                       MESSAGING_DEVICE_PATH,
 | |
|                                                       MSG_DEVICE_LOGICAL_UNIT_DP,
 | |
|                                                       sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
 | |
|                                                       );
 | |
| 
 | |
|   LogicalUnit->Lun  = (UINT8) Xtoi (LunStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextiSCSI (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   UINT16                      Options;
 | |
|   CHAR16                      *NameStr;
 | |
|   CHAR16                      *PortalGroupStr;
 | |
|   CHAR16                      *LunStr;
 | |
|   CHAR16                      *HeaderDigestStr;
 | |
|   CHAR16                      *DataDigestStr;
 | |
|   CHAR16                      *AuthenticationStr;
 | |
|   CHAR16                      *ProtocolStr;
 | |
|   ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;
 | |
| 
 | |
|   NameStr           = GetNextParamStr (&TextDeviceNode);
 | |
|   PortalGroupStr    = GetNextParamStr (&TextDeviceNode);
 | |
|   LunStr            = GetNextParamStr (&TextDeviceNode);
 | |
|   HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);
 | |
|   DataDigestStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   AuthenticationStr = GetNextParamStr (&TextDeviceNode);
 | |
|   ProtocolStr       = GetNextParamStr (&TextDeviceNode);
 | |
|   iSCSI             = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (
 | |
|                                                         MESSAGING_DEVICE_PATH,
 | |
|                                                         MSG_ISCSI_DP,
 | |
|                                                         sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + (UINT16) (StrLen (NameStr) * 2)
 | |
|                                                         );
 | |
| 
 | |
|   StrCpy (iSCSI->iSCSITargetName, NameStr);
 | |
|   iSCSI->TargetPortalGroupTag = (UINT16) Xtoi (PortalGroupStr);
 | |
|   Xtoi64 (LunStr, &iSCSI->Lun);
 | |
| 
 | |
|   Options = 0x0000;
 | |
|   if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {
 | |
|     Options |= 0x0002;
 | |
|   }
 | |
| 
 | |
|   if (StrCmp (DataDigestStr, L"CRC32C") == 0) {
 | |
|     Options |= 0x0008;
 | |
|   }
 | |
| 
 | |
|   if (StrCmp (AuthenticationStr, L"None") == 0) {
 | |
|     Options |= 0x0800;
 | |
|   }
 | |
| 
 | |
|   if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {
 | |
|     Options |= 0x1000;
 | |
|   }
 | |
| 
 | |
|   iSCSI->LoginOption      = (UINT16) Options;
 | |
| 
 | |
|   iSCSI->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");
 | |
|   iSCSI->Reserved         = (UINT16) 0;
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextHD (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                *PartitionStr;
 | |
|   CHAR16                *TypeStr;
 | |
|   CHAR16                *SignatureStr;
 | |
|   CHAR16                *StartStr;
 | |
|   CHAR16                *SizeStr;
 | |
|   UINT32                Signature32;
 | |
|   EFI_GUID              SignatureGuid;
 | |
|   HARDDRIVE_DEVICE_PATH *Hd;
 | |
| 
 | |
|   PartitionStr        = GetNextParamStr (&TextDeviceNode);
 | |
|   TypeStr             = GetNextParamStr (&TextDeviceNode);
 | |
|   SignatureStr        = GetNextParamStr (&TextDeviceNode);
 | |
|   StartStr            = GetNextParamStr (&TextDeviceNode);
 | |
|   SizeStr             = GetNextParamStr (&TextDeviceNode);
 | |
|   Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                     MEDIA_DEVICE_PATH,
 | |
|                                                     MEDIA_HARDDRIVE_DP,
 | |
|                                                     sizeof (HARDDRIVE_DEVICE_PATH)
 | |
|                                                     );
 | |
| 
 | |
|   Hd->PartitionNumber = (UINT32) Atoi (PartitionStr);
 | |
| 
 | |
|   ZeroMem (Hd->Signature, 16);
 | |
|   Hd->MBRType = (UINT8) 0;
 | |
| 
 | |
|   if (StrCmp (TypeStr, L"None") == 0) {
 | |
|     Hd->SignatureType = (UINT8) 0;
 | |
|   } else if (StrCmp (TypeStr, L"MBR") == 0) {
 | |
|     Hd->SignatureType = SIGNATURE_TYPE_MBR;
 | |
|     Hd->MBRType       = 0x01;
 | |
| 
 | |
|     Signature32       = (UINT32) Xtoi (SignatureStr);
 | |
|     CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
 | |
|   } else if (StrCmp (TypeStr, L"GUID") == 0) {
 | |
|     Hd->SignatureType = SIGNATURE_TYPE_GUID;
 | |
|     Hd->MBRType       = 0x02;
 | |
| 
 | |
|     StrToGuid (SignatureStr, &SignatureGuid);
 | |
|     CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));
 | |
|   } else {
 | |
|     Hd->SignatureType = 0xff;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   Xtoi64 (StartStr, &Hd->PartitionStart);
 | |
|   Xtoi64 (SizeStr, &Hd->PartitionSize);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Hd;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextCDROM (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16            *EntryStr;
 | |
|   CHAR16            *StartStr;
 | |
|   CHAR16            *SizeStr;
 | |
|   CDROM_DEVICE_PATH *CDROM;
 | |
| 
 | |
|   EntryStr              = GetNextParamStr (&TextDeviceNode);
 | |
|   StartStr              = GetNextParamStr (&TextDeviceNode);
 | |
|   SizeStr               = GetNextParamStr (&TextDeviceNode);
 | |
|   CDROM                 = (CDROM_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                                   MEDIA_DEVICE_PATH,
 | |
|                                                   MEDIA_CDROM_DP,
 | |
|                                                   sizeof (CDROM_DEVICE_PATH)
 | |
|                                                   );
 | |
| 
 | |
|   CDROM->BootEntry      = (UINT32) Xtoi (EntryStr);
 | |
|   Xtoi64 (StartStr, &CDROM->PartitionStart);
 | |
|   Xtoi64 (SizeStr, &CDROM->PartitionSize);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextVenMEDIA (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   return ConvertFromTextVendor (
 | |
|            TextDeviceNode,
 | |
|            MEDIA_DEVICE_PATH,
 | |
|            MEDIA_VENDOR_DP
 | |
|            );
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextFilePath (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   FILEPATH_DEVICE_PATH  *File;
 | |
| 
 | |
|   File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                     MEDIA_DEVICE_PATH,
 | |
|                                     MEDIA_FILEPATH_DP,
 | |
|                                     sizeof (FILEPATH_DEVICE_PATH) + (UINT16) (StrLen (TextDeviceNode) * 2)
 | |
|                                     );
 | |
| 
 | |
|   StrCpy (File->PathName, TextDeviceNode);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) File;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextMedia (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16                      *GuidStr;
 | |
|   MEDIA_PROTOCOL_DEVICE_PATH  *Media;
 | |
| 
 | |
|   GuidStr = GetNextParamStr (&TextDeviceNode);
 | |
|   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                              MEDIA_DEVICE_PATH,
 | |
|                                              MEDIA_PROTOCOL_DP,
 | |
|                                              sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
 | |
|                                              );
 | |
| 
 | |
|   StrToGuid (GuidStr, &Media->Protocol);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Media;
 | |
| }
 | |
| 
 | |
| STATIC
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| DevPathFromTextBBS (
 | |
|   IN CHAR16 *TextDeviceNode
 | |
|   )
 | |
| {
 | |
|   CHAR16              *TypeStr;
 | |
|   CHAR16              *IdStr;
 | |
|   CHAR16              *FlagsStr;
 | |
|   UINT8               *AsciiStr;
 | |
|   BBS_BBS_DEVICE_PATH *Bbs;
 | |
| 
 | |
|   TypeStr   = GetNextParamStr (&TextDeviceNode);
 | |
|   IdStr     = GetNextParamStr (&TextDeviceNode);
 | |
|   FlagsStr  = GetNextParamStr (&TextDeviceNode);
 | |
|   Bbs       = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (
 | |
|                                         BBS_DEVICE_PATH,
 | |
|                                         BBS_BBS_DP,
 | |
|                                         sizeof (BBS_BBS_DEVICE_PATH) + (UINT16) (StrLen (IdStr))
 | |
|                                         );
 | |
| 
 | |
|   if (StrCmp (TypeStr, L"Floppy") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_FLOPPY;
 | |
|   } else if (StrCmp (TypeStr, L"HD") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
 | |
|   } else if (StrCmp (TypeStr, L"CDROM") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_CDROM;
 | |
|   } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_PCMCIA;
 | |
|   } else if (StrCmp (TypeStr, L"USB") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_USB;
 | |
|   } else if (StrCmp (TypeStr, L"Network") == 0) {
 | |
|     Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
 | |
|   } else {
 | |
|     Bbs->DeviceType = BBS_TYPE_UNKNOWN;
 | |
|   }
 | |
| 
 | |
|   AsciiStr = (UINT8 *) Bbs->String;
 | |
|   StrToAscii (IdStr, (CHAR8 **) &AsciiStr);
 | |
| 
 | |
|   Bbs->StatusFlag = (UINT16) Xtoi (FlagsStr);
 | |
| 
 | |
|   return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;
 | |
| }
 | |
| 
 | |
| GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {
 | |
|   {L"Pci", DevPathFromTextPci},
 | |
|   {L"PcCard", DevPathFromTextPcCard},
 | |
|   {L"MemoryMapped", DevPathFromTextMemoryMapped},
 | |
|   {L"VenHw", DevPathFromTextVenHw},
 | |
|   {L"Ctrl", DevPathFromTextCtrl},
 | |
|   {L"Acpi", DevPathFromTextAcpi},
 | |
|   {L"PciRoot", DevPathFromTextPciRoot},
 | |
|   {L"Floppy", DevPathFromTextFloppy},
 | |
|   {L"Keyboard", DevPathFromTextKeyboard},
 | |
|   {L"Serial", DevPathFromTextSerial},
 | |
|   {L"ParallelPort", DevPathFromTextParallelPort},
 | |
|   {L"AcpiEx", DevPathFromTextAcpiEx},
 | |
|   {L"AcpiExp", DevPathFromTextAcpiExp},
 | |
|   {L"Ata", DevPathFromTextAta},
 | |
|   {L"Scsi", DevPathFromTextScsi},
 | |
|   {L"Fibre", DevPathFromTextFibre},
 | |
|   {L"I1394", DevPathFromText1394},
 | |
|   {L"USB", DevPathFromTextUsb},
 | |
|   {L"I2O", DevPathFromTextI2O},
 | |
|   {L"Infiniband", DevPathFromTextInfiniband},
 | |
|   {L"VenMsg", DevPathFromTextVenMsg},
 | |
|   {L"VenPcAnsi", DevPathFromTextVenPcAnsi},
 | |
|   {L"VenVt100", DevPathFromTextVenVt100},
 | |
|   {L"VenVt100Plus", DevPathFromTextVenVt100Plus},
 | |
|   {L"VenUtf8", DevPathFromTextVenUtf8},
 | |
|   {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},
 | |
|   {L"SAS", DevPathFromTextSAS},
 | |
|   {L"DebugPort", DevPathFromTextDebugPort},
 | |
|   {L"MAC", DevPathFromTextMAC},
 | |
|   {L"IPv4", DevPathFromTextIPv4},
 | |
|   {L"IPv6", DevPathFromTextIPv6},
 | |
|   {L"Uart", DevPathFromTextUart},
 | |
|   {L"UsbClass", DevPathFromTextUsbClass},
 | |
|   {L"UsbAudio", DevPathFromTextUsbAudio},
 | |
|   {L"UsbCDCControl", DevPathFromTextUsbCDCControl},
 | |
|   {L"UsbHID", DevPathFromTextUsbHID},
 | |
|   {L"UsbImage", DevPathFromTextUsbImage},
 | |
|   {L"UsbPrinter", DevPathFromTextUsbPrinter},
 | |
|   {L"UsbMassStorage", DevPathFromTextUsbMassStorage},
 | |
|   {L"UsbHub", DevPathFromTextUsbHub},
 | |
|   {L"UsbCDCData", DevPathFromTextUsbCDCData},
 | |
|   {L"UsbSmartCard", DevPathFromTextUsbSmartCard},
 | |
|   {L"UsbVideo", DevPathFromTextUsbVideo},
 | |
|   {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},
 | |
|   {L"UsbWireless", DevPathFromTextUsbWireless},
 | |
|   {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},
 | |
|   {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},
 | |
|   {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},
 | |
|   {L"UsbWwid", DevPathFromTextUsbWwid},
 | |
|   {L"Unit", DevPathFromTextUnit},
 | |
|   {L"iSCSI", DevPathFromTextiSCSI},
 | |
|   {L"HD", DevPathFromTextHD},
 | |
|   {L"CDROM", DevPathFromTextCDROM},
 | |
|   {L"VenMEDIA", DevPathFromTextVenMEDIA},
 | |
|   {L"Media", DevPathFromTextMedia},
 | |
|   {L"BBS", DevPathFromTextBBS},
 | |
|   {NULL, NULL}
 | |
| };
 | |
| 
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| ConvertTextToDeviceNode (
 | |
|   IN CONST CHAR16 *TextDeviceNode
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Convert text to the binary representation of a device node.
 | |
| 
 | |
|   Arguments:
 | |
|     TextDeviceNode   -   TextDeviceNode points to the text representation of a device
 | |
|                          node. Conversion starts with the first character and continues
 | |
|                          until the first non-device node character.
 | |
| 
 | |
|   Returns:
 | |
|     A pointer        -   Pointer to the EFI device node.
 | |
|     NULL             -   If TextDeviceNode is NULL or there was insufficient memory or text unsupported.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);
 | |
|   CHAR16                   *ParamStr;
 | |
|   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
 | |
|   CHAR16                   *DeviceNodeStr;
 | |
|   UINTN                    Index;
 | |
| 
 | |
|   if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   ParamStr      = NULL;
 | |
|   DumpNode      = NULL;
 | |
|   DeviceNodeStr = StrDuplicate (TextDeviceNode);
 | |
| 
 | |
|   for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {
 | |
|     ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);
 | |
|     if (ParamStr != NULL) {
 | |
|       DumpNode = DevPathFromTextTable[Index].Function;
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (DumpNode == NULL) {
 | |
|     //
 | |
|     // A file path
 | |
|     //
 | |
|     DumpNode = DevPathFromTextFilePath;
 | |
|     DeviceNode = DumpNode (DeviceNodeStr);
 | |
|   } else {
 | |
|     DeviceNode = DumpNode (ParamStr);
 | |
|     FreePool (ParamStr);
 | |
|   }
 | |
| 
 | |
|   FreePool (DeviceNodeStr);
 | |
| 
 | |
|   return DeviceNode;
 | |
| }
 | |
| 
 | |
| EFI_DEVICE_PATH_PROTOCOL *
 | |
| ConvertTextToDevicePath (
 | |
|   IN CONST CHAR16 *TextDevicePath
 | |
|   )
 | |
| /*++
 | |
| 
 | |
|   Routine Description:
 | |
|     Convert text to the binary representation of a device path.
 | |
| 
 | |
|   Arguments:
 | |
|     TextDevicePath   -   TextDevicePath points to the text representation of a device
 | |
|                          path. Conversion starts with the first character and continues
 | |
|                          until the first non-device node character.
 | |
| 
 | |
|   Returns:
 | |
|     A pointer        -   Pointer to the allocated device path.
 | |
|     NULL             -   If TextDeviceNode is NULL or there was insufficient memory.
 | |
| 
 | |
| --*/
 | |
| {
 | |
|   EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);
 | |
|   CHAR16                   *ParamStr;
 | |
|   EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
 | |
|   UINTN                    Index;
 | |
|   EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
 | |
|   CHAR16                   *DevicePathStr;
 | |
|   CHAR16                   *Str;
 | |
|   CHAR16                   *DeviceNodeStr;
 | |
|   UINT8                    IsInstanceEnd;
 | |
|   EFI_DEVICE_PATH_PROTOCOL *DevicePath;
 | |
| 
 | |
|   if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
 | |
|     return NULL;
 | |
|   }
 | |
| 
 | |
|   DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
 | |
|   SetDevicePathEndNode (DevicePath);
 | |
| 
 | |
|   ParamStr            = NULL;
 | |
|   DeviceNodeStr       = NULL;
 | |
|   DevicePathStr       = StrDuplicate (TextDevicePath);
 | |
| 
 | |
|   Str                 = DevicePathStr;
 | |
|   while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
 | |
|     DumpNode = NULL;
 | |
|     for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {
 | |
|       ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);
 | |
|       if (ParamStr != NULL) {
 | |
|         DumpNode = DevPathFromTextTable[Index].Function;
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (DumpNode == NULL) {
 | |
|       //
 | |
|       // A file path
 | |
|       //
 | |
|       DumpNode  = DevPathFromTextFilePath;
 | |
|       DeviceNode = DumpNode (DeviceNodeStr);
 | |
|     } else {
 | |
|       DeviceNode = DumpNode (ParamStr);
 | |
|       FreePool (ParamStr);
 | |
|     }
 | |
| 
 | |
|     NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
 | |
|     FreePool (DevicePath);
 | |
|     FreePool (DeviceNode);
 | |
|     DevicePath = NewDevicePath;
 | |
| 
 | |
|     if (IsInstanceEnd) {
 | |
|       DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
 | |
|       SetDevicePathInstanceEndNode (DeviceNode);
 | |
| 
 | |
|       NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
 | |
|       FreePool (DevicePath);
 | |
|       FreePool (DeviceNode);
 | |
|       DevicePath = NewDevicePath;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   FreePool (DevicePathStr);
 | |
|   return DevicePath;
 | |
| }
 |