-/*++
-
-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"
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-CHAR16 *
-GetNextParamStr (
- IN OUT CHAR16 **List
- )
-{
- //
- // The separator is comma
- //
- return SplitStr (List, L',');
-}
-
-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;
-}
-
-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;
-}
-
-CHAR16
-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.
-
---*/
-{
- Nibble &= 0x0F;
- if (Nibble <= 0x9) {
- return (CHAR16)(Nibble + L'0');
- }
-
- return (CHAR16)(Nibble - 0xA + L'A');
-}
-
-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 |= Digit << 4;
- }
-
- Buf[Idx / 2] = Byte;
- }
-
- if (ConvertedStrLen != NULL) {
- *ConvertedStrLen = HexCnt;
- }
-
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-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.
-
---*/
-{
- 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;
-}
-
-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 white space
- //
- if (*Str && (*Str == 'x' || *Str == 'X')) {
- Str += 1;
- }
-
- return Str;
-}
-
-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;
-}
-
-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);
-}
-
-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;
-}
-
-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 = Digit << 4;
- } else {
- Byte = Buf[Index / 2];
- Byte &= 0xF0;
- Byte |= Digit;
- }
-
- Buf[Index / 2] = Byte;
- }
-
- return EFI_SUCCESS;
-}
-
-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;
-}
-
-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'.'));
- }
-}
-
-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);
- }
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenHw (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextVendor (
- TextDeviceNode,
- HARDWARE_DEVICE_PATH,
- HW_VENDOR_DP
- );
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextPciRoot (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextFloppy (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextKeyboard (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextSerial (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextParallelPort (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);
-}
-
-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 = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) +
- (UINT16) StrLen (HIDSTRStr) + 1 +
- (UINT16) StrLen (UIDSTRStr) + 1 +
- (UINT16) 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;
-}
-
-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;
-}
-
-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 = (StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? (UINT8) 0 : (UINT8) 1;
- Atapi->SlaveMaster = (StrCmp (SlaveMasterStr, L"Master") == 0) ? (UINT8) 0 : (UINT8) 1;
- Atapi->Lun = (UINT16) Xtoi (LunStr);
-
- return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenMsg (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextVendor (
- TextDeviceNode,
- MESSAGING_DEVICE_PATH,
- MSG_VENDOR_DP
- );
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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 = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 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;
-}
-
-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 = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 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;
-}
-
-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 = (StrCmp (DataBitsStr, L"DEFAULT") == 0) ? (UINT8) 8 : (UINT8) 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;
-}
-
-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;
-}
-
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbClass (
- IN CHAR16 *TextDeviceNode
- )
-{
- USB_CLASS_TEXT UsbClassText;
-
- UsbClassText.ClassExist = TRUE;
- UsbClassText.SubClassExist = TRUE;
-
- return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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);
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-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;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenMEDIA (
- IN CHAR16 *TextDeviceNode
- )
-{
- return ConvertFromTextVendor (
- TextDeviceNode,
- MEDIA_DEVICE_PATH,
- MEDIA_VENDOR_DP
- );
-}
-
-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;
-}
-
-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;
-}
-
-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);
- gBS->FreePool (ParamStr);
- }
-
- gBS->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);
- gBS->FreePool (ParamStr);
- }
-
- NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
- gBS->FreePool (DevicePath);
- gBS->FreePool (DeviceNode);
- DevicePath = NewDevicePath;
-
- if (IsInstanceEnd) {
- DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
- SetDevicePathInstanceEndNode (DeviceNode);
-
- NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
- gBS->FreePool (DevicePath);
- gBS->FreePool (DeviceNode);
- DevicePath = NewDevicePath;
- }
- }
-
- gBS->FreePool (DevicePathStr);
- return DevicePath;
-}
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ DevicePathFromText.c\r
+\r
+Abstract:\r
+\r
+ DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
+\r
+--*/\r
+\r
+#include "DevicePath.h"\r
+\r
+CHAR16 *\r
+StrDuplicate (\r
+ IN CONST CHAR16 *Src\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Duplicate a string\r
+\r
+ Arguments:\r
+ Src - Source string\r
+\r
+ Returns:\r
+ Duplicated string\r
+\r
+--*/\r
+{\r
+ UINTN Length;\r
+ CHAR16 *ReturnStr;\r
+\r
+ Length = StrLen ((CHAR16 *) Src);\r
+\r
+ ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);\r
+\r
+ return ReturnStr;\r
+}\r
+\r
+CHAR16 *\r
+GetParamByNodeName (\r
+ IN CHAR16 *Str,\r
+ IN CHAR16 *NodeName\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Get parameter in a pair of parentheses follow the given node name.\r
+ For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
+\r
+ Arguments:\r
+ Str - Device Path Text\r
+ NodeName - Name of the node\r
+\r
+ Returns:\r
+ Parameter text for the node\r
+\r
+--*/\r
+{\r
+ CHAR16 *ParamStr;\r
+ CHAR16 *StrPointer;\r
+ UINTN NodeNameLength;\r
+ UINTN ParameterLength;\r
+\r
+ //\r
+ // Check whether the node name matchs\r
+ //\r
+ NodeNameLength = StrLen (NodeName);\r
+ if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {\r
+ return NULL;\r
+ }\r
+\r
+ ParamStr = Str + NodeNameLength;\r
+ if (!IS_LEFT_PARENTH (*ParamStr)) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Skip the found '(' and find first occurrence of ')'\r
+ //\r
+ ParamStr++;\r
+ ParameterLength = 0;\r
+ StrPointer = ParamStr;\r
+ while (!IS_NULL (*StrPointer)) {\r
+ if (IS_RIGHT_PARENTH (*StrPointer)) {\r
+ break;\r
+ }\r
+ StrPointer++;\r
+ ParameterLength++;\r
+ }\r
+ if (IS_NULL (*StrPointer)) {\r
+ //\r
+ // ')' not found\r
+ //\r
+ return NULL;\r
+ }\r
+\r
+ ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);\r
+ if (ParamStr == NULL) {\r
+ return NULL;\r
+ }\r
+ //\r
+ // Terminate the parameter string\r
+ //\r
+ ParamStr[ParameterLength] = L'\0';\r
+\r
+ return ParamStr;\r
+}\r
+\r
+CHAR16 *\r
+SplitStr (\r
+ IN OUT CHAR16 **List,\r
+ IN CHAR16 Separator\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Get current sub-string from a string list, before return\r
+ the list header is moved to next sub-string. The sub-string is separated\r
+ by the specified character. For example, the separator is ',', the string\r
+ list is "2,0,3", it returns "2", the remain list move to "2,3"\r
+\r
+ Arguments:\r
+ List - A string list separated by the specified separator\r
+ Separator - The separator character\r
+\r
+ Returns:\r
+ pointer - The current sub-string\r
+\r
+--*/\r
+{\r
+ CHAR16 *Str;\r
+ CHAR16 *ReturnStr;\r
+\r
+ Str = *List;\r
+ ReturnStr = Str;\r
+\r
+ if (IS_NULL (*Str)) {\r
+ return ReturnStr;\r
+ }\r
+\r
+ //\r
+ // Find first occurrence of the separator\r
+ //\r
+ while (!IS_NULL (*Str)) {\r
+ if (*Str == Separator) {\r
+ break;\r
+ }\r
+ Str++;\r
+ }\r
+\r
+ if (*Str == Separator) {\r
+ //\r
+ // Find a sub-string, terminate it\r
+ //\r
+ *Str = L'\0';\r
+ Str++;\r
+ }\r
+\r
+ //\r
+ // Move to next sub-string\r
+ //\r
+ *List = Str;\r
+\r
+ return ReturnStr;\r
+}\r
+\r
+CHAR16 *\r
+GetNextParamStr (\r
+ IN OUT CHAR16 **List\r
+ )\r
+{\r
+ //\r
+ // The separator is comma\r
+ //\r
+ return SplitStr (List, L',');\r
+}\r
+\r
+CHAR16 *\r
+GetNextDeviceNodeStr (\r
+ IN OUT CHAR16 **DevicePath,\r
+ OUT BOOLEAN *IsInstanceEnd\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Get one device node from entire device path text.\r
+\r
+ Arguments:\r
+ Str - The entire device path text string\r
+ IsInstanceEnd - This node is the end of a device path instance\r
+\r
+ Returns:\r
+ a pointer - A device node text\r
+ NULL - No more device node available\r
+\r
+--*/\r
+{\r
+ CHAR16 *Str;\r
+ CHAR16 *ReturnStr;\r
+ UINTN ParenthesesStack;\r
+\r
+ Str = *DevicePath;\r
+ if (IS_NULL (*Str)) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Skip the leading '/', '(', ')' and ','\r
+ //\r
+ while (!IS_NULL (*Str)) {\r
+ if (!IS_SLASH (*Str) &&\r
+ !IS_COMMA (*Str) &&\r
+ !IS_LEFT_PARENTH (*Str) &&\r
+ !IS_RIGHT_PARENTH (*Str)) {\r
+ break;\r
+ }\r
+ Str++;\r
+ }\r
+\r
+ ReturnStr = Str;\r
+\r
+ //\r
+ // Scan for the separator of this device node, '/' or ','\r
+ //\r
+ ParenthesesStack = 0;\r
+ while (!IS_NULL (*Str)) {\r
+ if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {\r
+ break;\r
+ }\r
+\r
+ if (IS_LEFT_PARENTH (*Str)) {\r
+ ParenthesesStack++;\r
+ } else if (IS_RIGHT_PARENTH (*Str)) {\r
+ ParenthesesStack--;\r
+ }\r
+\r
+ Str++;\r
+ }\r
+\r
+ if (ParenthesesStack != 0) {\r
+ //\r
+ // The '(' doesn't pair with ')', invalid device path text\r
+ //\r
+ return NULL;\r
+ }\r
+\r
+ if (IS_COMMA (*Str)) {\r
+ *IsInstanceEnd = TRUE;\r
+ *Str = L'\0';\r
+ Str++;\r
+ } else {\r
+ *IsInstanceEnd = FALSE;\r
+ if (!IS_NULL (*Str)) {\r
+ *Str = L'\0';\r
+ Str++;\r
+ }\r
+ }\r
+\r
+ *DevicePath = Str;\r
+\r
+ return ReturnStr;\r
+}\r
+\r
+BOOLEAN\r
+IsHexDigit (\r
+ OUT UINT8 *Digit,\r
+ IN CHAR16 Char\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Determines if a Unicode character is a hexadecimal digit.\r
+ The test is case insensitive.\r
+\r
+ Arguments:\r
+ Digit - Pointer to byte that receives the value of the hex character.\r
+ Char - Unicode character to test.\r
+\r
+ Returns:\r
+ TRUE - If the character is a hexadecimal digit.\r
+ FALSE - Otherwise.\r
+\r
+--*/\r
+{\r
+ if ((Char >= L'0') && (Char <= L'9')) {\r
+ *Digit = (UINT8) (Char - L'0');\r
+ return TRUE;\r
+ }\r
+\r
+ if ((Char >= L'A') && (Char <= L'F')) {\r
+ *Digit = (UINT8) (Char - L'A' + 0x0A);\r
+ return TRUE;\r
+ }\r
+\r
+ if ((Char >= L'a') && (Char <= L'f')) {\r
+ *Digit = (UINT8) (Char - L'a' + 0x0A);\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+CHAR16\r
+NibbleToHexChar (\r
+ IN UINT8 Nibble\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Converts the low nibble of a byte to hex unicode character.\r
+\r
+ Arguments:\r
+ Nibble - lower nibble of a byte.\r
+\r
+ Returns:\r
+ Hex unicode character.\r
+\r
+--*/\r
+{\r
+ Nibble &= 0x0F;\r
+ if (Nibble <= 0x9) {\r
+ return (CHAR16)(Nibble + L'0');\r
+ }\r
+\r
+ return (CHAR16)(Nibble - 0xA + L'A');\r
+}\r
+\r
+EFI_STATUS\r
+HexStringToBuf (\r
+ IN OUT UINT8 *Buf, \r
+ IN OUT UINTN *Len,\r
+ IN CHAR16 *Str,\r
+ OUT UINTN *ConvertedStrLen OPTIONAL\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Converts Unicode string to binary buffer.\r
+ The conversion may be partial.\r
+ The first character in the string that is not hex digit stops the conversion.\r
+ At a minimum, any blob of data could be represented as a hex string.\r
+\r
+ Arguments:\r
+ Buf - Pointer to buffer that receives the data.\r
+ Len - Length in bytes of the buffer to hold converted data.\r
+ If routine return with EFI_SUCCESS, containing length of converted data.\r
+ If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
+ Str - String to be converted from.\r
+ ConvertedStrLen - Length of the Hex String consumed.\r
+\r
+ Returns:\r
+ EFI_SUCCESS: Routine Success.\r
+ EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.\r
+ EFI_\r
+\r
+--*/\r
+{\r
+ UINTN HexCnt;\r
+ UINTN Idx;\r
+ UINTN BufferLength;\r
+ UINT8 Digit;\r
+ UINT8 Byte;\r
+\r
+ //\r
+ // Find out how many hex characters the string has.\r
+ //\r
+ for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);\r
+\r
+ if (HexCnt == 0) {\r
+ *Len = 0;\r
+ return EFI_SUCCESS;\r
+ }\r
+ //\r
+ // Two Unicode characters make up 1 buffer byte. Round up.\r
+ //\r
+ BufferLength = (HexCnt + 1) / 2; \r
+\r
+ //\r
+ // Test if buffer is passed enough.\r
+ //\r
+ if (BufferLength > (*Len)) {\r
+ *Len = BufferLength;\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ *Len = BufferLength;\r
+\r
+ for (Idx = 0; Idx < HexCnt; Idx++) {\r
+\r
+ IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);\r
+\r
+ //\r
+ // For odd charaters, write the lower nibble for each buffer byte,\r
+ // and for even characters, the upper nibble.\r
+ //\r
+ if ((Idx & 1) == 0) {\r
+ Byte = Digit;\r
+ } else {\r
+ Byte = Buf[Idx / 2];\r
+ Byte &= 0x0F;\r
+ Byte |= Digit << 4;\r
+ }\r
+\r
+ Buf[Idx / 2] = Byte;\r
+ }\r
+\r
+ if (ConvertedStrLen != NULL) {\r
+ *ConvertedStrLen = HexCnt;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+BufToHexString (\r
+ IN OUT CHAR16 *Str,\r
+ IN OUT UINTN *HexStringBufferLength,\r
+ IN UINT8 *Buf,\r
+ IN UINTN Len\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Converts binary buffer to Unicode string.\r
+ At a minimum, any blob of data could be represented as a hex string.\r
+\r
+ Arguments:\r
+ Str - Pointer to the string.\r
+ HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.\r
+ If routine return with EFI_SUCCESS, containing length of hex string buffer.\r
+ If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.\r
+ Buf - Buffer to be converted from.\r
+ Len - Length in bytes of the buffer to be converted.\r
+\r
+ Returns:\r
+ EFI_SUCCESS: Routine success.\r
+ EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.\r
+\r
+--*/\r
+{\r
+ UINTN Idx;\r
+ UINT8 Byte;\r
+ UINTN StrLen;\r
+\r
+ //\r
+ // Make sure string is either passed or allocate enough.\r
+ // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
+ // Plus the Unicode termination character.\r
+ //\r
+ StrLen = Len * 2;\r
+ if (StrLen > ((*HexStringBufferLength) - 1)) {\r
+ *HexStringBufferLength = StrLen + 1;\r
+ return EFI_BUFFER_TOO_SMALL;\r
+ }\r
+\r
+ *HexStringBufferLength = StrLen + 1;\r
+ //\r
+ // Ends the string.\r
+ //\r
+ Str[StrLen] = L'\0'; \r
+\r
+ for (Idx = 0; Idx < Len; Idx++) {\r
+\r
+ Byte = Buf[Idx];\r
+ Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);\r
+ Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+CHAR16 *\r
+TrimHexStr (\r
+ IN CHAR16 *Str\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Skip the leading white space and '0x' or '0X' of a hex string\r
+\r
+ Arguments:\r
+ Str - The hex string\r
+\r
+ Returns:\r
+\r
+--*/\r
+{\r
+ //\r
+ // skip preceeding white space\r
+ //\r
+ while (*Str && *Str == ' ') {\r
+ Str += 1;\r
+ }\r
+ //\r
+ // skip preceeding zeros\r
+ //\r
+ while (*Str && *Str == '0') {\r
+ Str += 1;\r
+ }\r
+ //\r
+ // skip preceeding white space\r
+ //\r
+ if (*Str && (*Str == 'x' || *Str == 'X')) {\r
+ Str += 1;\r
+ }\r
+\r
+ return Str;\r
+}\r
+\r
+UINTN\r
+Xtoi (\r
+ IN CHAR16 *Str\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+ Str - The string\r
+ \r
+Returns:\r
+\r
+--*/\r
+{\r
+ UINTN Rvalue;\r
+ UINTN Length;\r
+\r
+ ASSERT (Str != NULL);\r
+\r
+ //\r
+ // convert hex digits\r
+ //\r
+ Rvalue = 0;\r
+ Length = sizeof (UINTN);\r
+ HexStringToBuf ((UINT8 *) &Rvalue, &Length, TrimHexStr (Str), NULL);\r
+\r
+ return Rvalue;\r
+}\r
+\r
+VOID\r
+Xtoi64 (\r
+ IN CHAR16 *Str,\r
+ IN UINT64 *Data\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Convert hex string to 64 bit data.\r
+\r
+Arguments:\r
+\r
+ Str - The string\r
+ \r
+Returns:\r
+\r
+--*/\r
+{\r
+ UINTN Length;\r
+\r
+ *Data = 0;\r
+ Length = sizeof (UINT64);\r
+ HexStringToBuf ((UINT8 *) Data, &Length, TrimHexStr (Str), NULL);\r
+}\r
+\r
+UINTN\r
+Atoi (\r
+ IN CHAR16 *str\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Convert decimal string to uint\r
+\r
+Arguments:\r
+\r
+ Str - The string\r
+ \r
+Returns:\r
+\r
+--*/\r
+{\r
+ UINTN Rvalue;\r
+ CHAR16 Char;\r
+ UINTN High;\r
+ UINTN Low;\r
+\r
+ ASSERT (str != NULL);\r
+\r
+ High = (UINTN) -1 / 10;\r
+ Low = (UINTN) -1 % 10;\r
+ //\r
+ // skip preceeding white space\r
+ //\r
+ while (*str && *str == ' ') {\r
+ str += 1;\r
+ }\r
+ //\r
+ // convert digits\r
+ //\r
+ Rvalue = 0;\r
+ Char = *(str++);\r
+ while (Char) {\r
+ if (Char >= '0' && Char <= '9') {\r
+ if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
+ return (UINTN) -1;\r
+ }\r
+\r
+ Rvalue = (Rvalue * 10) + Char - '0';\r
+ } else {\r
+ break;\r
+ }\r
+\r
+ Char = *(str++);\r
+ }\r
+\r
+ return Rvalue;\r
+}\r
+\r
+EFI_STATUS \r
+StrToBuf (\r
+ OUT UINT8 *Buf,\r
+ IN UINTN BufferLength,\r
+ IN CHAR16 *Str\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN StrLength;\r
+ UINT8 Digit;\r
+ UINT8 Byte;\r
+\r
+ //\r
+ // Two hex char make up one byte\r
+ //\r
+ StrLength = BufferLength * sizeof (CHAR16);\r
+\r
+ for(Index = 0; Index < StrLength; Index++, Str++) {\r
+\r
+ IsHexDigit (&Digit, *Str);\r
+\r
+ //\r
+ // For odd charaters, write the upper nibble for each buffer byte,\r
+ // and for even characters, the lower nibble.\r
+ //\r
+ if ((Index & 1) == 0) {\r
+ Byte = Digit << 4;\r
+ } else {\r
+ Byte = Buf[Index / 2];\r
+ Byte &= 0xF0;\r
+ Byte |= Digit;\r
+ }\r
+\r
+ Buf[Index / 2] = Byte;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+StrToGuid (\r
+ IN CHAR16 *Str,\r
+ OUT EFI_GUID *Guid\r
+ )\r
+{\r
+ UINTN BufferLength;\r
+ UINTN ConvertedStrLen;\r
+ EFI_STATUS Status;\r
+\r
+ BufferLength = sizeof (Guid->Data1);\r
+ Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Str += ConvertedStrLen;\r
+ if (IS_HYPHEN (*Str)) {\r
+ Str++; \r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ BufferLength = sizeof (Guid->Data2);\r
+ Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Str += ConvertedStrLen;\r
+ if (IS_HYPHEN (*Str)) {\r
+ Str++;\r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ BufferLength = sizeof (Guid->Data3);\r
+ Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Str += ConvertedStrLen;\r
+ if (IS_HYPHEN (*Str)) {\r
+ Str++;\r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ StrToBuf (&Guid->Data4[0], 2, Str);\r
+ //\r
+ // Skip 2 byte hex chars\r
+ //\r
+ Str += 2 * 2;\r
+\r
+ if (IS_HYPHEN (*Str)) {\r
+ Str++;\r
+ } else {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+ StrToBuf (&Guid->Data4[2], 6, Str);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+VOID\r
+StrToIPv4Addr (\r
+ IN OUT CHAR16 **Str,\r
+ OUT EFI_IPv4_ADDRESS *IPv4Addr\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < 4; Index++) {\r
+ IPv4Addr->Addr[Index] = (UINT8) Atoi (SplitStr (Str, L'.'));\r
+ }\r
+}\r
+\r
+VOID\r
+StrToIPv6Addr (\r
+ IN OUT CHAR16 **Str,\r
+ OUT EFI_IPv6_ADDRESS *IPv6Addr\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT16 Data;\r
+\r
+ for (Index = 0; Index < 8; Index++) {\r
+ Data = (UINT16) Xtoi (SplitStr (Str, L':'));\r
+ IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
+ IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
+ }\r
+}\r
+\r
+VOID\r
+StrToAscii (\r
+ IN CHAR16 *Str,\r
+ IN OUT CHAR8 **AsciiStr\r
+ )\r
+{\r
+ CHAR8 *Dest;\r
+\r
+ Dest = *AsciiStr;\r
+ while (!IS_NULL (*Str)) {\r
+ *(Dest++) = (CHAR8) *(Str++);\r
+ }\r
+ *Dest = 0;\r
+\r
+ //\r
+ // Return the string next to it\r
+ //\r
+ *AsciiStr = Dest + 1;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPci (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *FunctionStr;\r
+ CHAR16 *DeviceStr;\r
+ PCI_DEVICE_PATH *Pci;\r
+\r
+ FunctionStr = GetNextParamStr (&TextDeviceNode);\r
+ DeviceStr = GetNextParamStr (&TextDeviceNode);\r
+ Pci = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_PCI_DP,\r
+ sizeof (PCI_DEVICE_PATH)\r
+ );\r
+\r
+ Pci->Function = (UINT8) Xtoi (FunctionStr);\r
+ Pci->Device = (UINT8) Xtoi (DeviceStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPcCard (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *FunctionNumberStr;\r
+ PCCARD_DEVICE_PATH *Pccard;\r
+\r
+ FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
+ Pccard = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_PCCARD_DP,\r
+ sizeof (PCCARD_DEVICE_PATH)\r
+ );\r
+\r
+ Pccard->FunctionNumber = (UINT8) Xtoi (FunctionNumberStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMemoryMapped (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *StartingAddressStr;\r
+ CHAR16 *EndingAddressStr;\r
+ MEMMAP_DEVICE_PATH *MemMap;\r
+\r
+ StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
+ EndingAddressStr = GetNextParamStr (&TextDeviceNode);\r
+ MemMap = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_MEMMAP_DP,\r
+ sizeof (MEMMAP_DEVICE_PATH)\r
+ );\r
+\r
+ MemMap->MemoryType = 0;\r
+\r
+ Xtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
+ Xtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextVendor (\r
+ IN CHAR16 *TextDeviceNode,\r
+ IN UINT8 Type,\r
+ IN UINT8 SubType\r
+ )\r
+{\r
+ CHAR16 *GuidStr;\r
+ CHAR16 *DataStr;\r
+ UINTN Length;\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+\r
+ GuidStr = GetNextParamStr (&TextDeviceNode);\r
+\r
+ DataStr = GetNextParamStr (&TextDeviceNode);\r
+ Length = StrLen (DataStr);\r
+ //\r
+ // Two hex characters make up 1 buffer byte\r
+ //\r
+ Length = (Length + 1) / 2;\r
+\r
+ Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+ Type,\r
+ SubType,\r
+ sizeof (VENDOR_DEVICE_PATH) + (UINT16) Length\r
+ );\r
+\r
+ StrToGuid (GuidStr, &Vendor->Guid);\r
+ StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenHw (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextVendor (\r
+ TextDeviceNode,\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_VENDOR_DP\r
+ );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextCtrl (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *ControllerStr;\r
+ CONTROLLER_DEVICE_PATH *Controller;\r
+\r
+ ControllerStr = GetNextParamStr (&TextDeviceNode);\r
+ Controller = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
+ HARDWARE_DEVICE_PATH,\r
+ HW_CONTROLLER_DP,\r
+ sizeof (CONTROLLER_DEVICE_PATH)\r
+ );\r
+ Controller->ControllerNumber = (UINT32) Xtoi (ControllerStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpi (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *HIDStr;\r
+ CHAR16 *UIDStr;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+\r
+ HIDStr = GetNextParamStr (&TextDeviceNode);\r
+ UIDStr = GetNextParamStr (&TextDeviceNode);\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
+ ACPI_DEVICE_PATH,\r
+ ACPI_DP,\r
+ sizeof (ACPI_HID_DEVICE_PATH)\r
+ );\r
+\r
+ if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+ HIDStr += 3;\r
+ }\r
+\r
+ Acpi->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+ Acpi->UID = (UINT32) Xtoi (UIDStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextAcpi (\r
+ IN CHAR16 *TextDeviceNode,\r
+ IN UINT32 Hid\r
+ )\r
+{\r
+ CHAR16 *UIDStr;\r
+ ACPI_HID_DEVICE_PATH *Acpi;\r
+\r
+ UIDStr = GetNextParamStr (&TextDeviceNode);\r
+ Acpi = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
+ ACPI_DEVICE_PATH,\r
+ ACPI_DP,\r
+ sizeof (ACPI_HID_DEVICE_PATH)\r
+ );\r
+\r
+ Acpi->HID = Hid;\r
+ Acpi->UID = (UINT32) Xtoi (UIDStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPciRoot (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFloppy (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextKeyboard (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSerial (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextParallelPort (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiEx (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *HIDStr;\r
+ CHAR16 *CIDStr;\r
+ CHAR16 *UIDStr;\r
+ CHAR16 *HIDSTRStr;\r
+ CHAR16 *CIDSTRStr;\r
+ CHAR16 *UIDSTRStr;\r
+ CHAR8 *AsciiStr;\r
+ UINT16 Length;\r
+ ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *AcpiExt;\r
+\r
+ HIDStr = GetNextParamStr (&TextDeviceNode);\r
+ CIDStr = GetNextParamStr (&TextDeviceNode);\r
+ UIDStr = GetNextParamStr (&TextDeviceNode);\r
+ HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+ CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+ UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+ Length = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + \r
+ (UINT16) StrLen (HIDSTRStr) + 1 +\r
+ (UINT16) StrLen (UIDSTRStr) + 1 +\r
+ (UINT16) StrLen (CIDSTRStr) + 1;\r
+ AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
+ ACPI_DEVICE_PATH,\r
+ ACPI_EXTENDED_DP,\r
+ Length\r
+ );\r
+\r
+ if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+ HIDStr += 3;\r
+ AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+ } else {\r
+ AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
+ }\r
+\r
+ AcpiExt->UID = (UINT32) Xtoi (UIDStr);\r
+ AcpiExt->CID = (UINT32) Xtoi (CIDStr);\r
+\r
+ AsciiStr = AcpiExt->HidUidCidStr;\r
+ StrToAscii (HIDSTRStr, &AsciiStr);\r
+ StrToAscii (UIDSTRStr, &AsciiStr);\r
+ StrToAscii (CIDSTRStr, &AsciiStr);\r
+ \r
+ return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiExp (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *HIDStr;\r
+ CHAR16 *CIDStr;\r
+ CHAR16 *UIDSTRStr;\r
+ CHAR8 *AsciiStr;\r
+ UINT16 Length;\r
+ ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *AcpiExt;\r
+\r
+ HIDStr = GetNextParamStr (&TextDeviceNode);\r
+ CIDStr = GetNextParamStr (&TextDeviceNode);\r
+ UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+ Length = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + (UINT16) StrLen (UIDSTRStr) + 3;\r
+ AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
+ ACPI_DEVICE_PATH,\r
+ ACPI_EXTENDED_DP,\r
+ Length\r
+ );\r
+\r
+ if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+ HIDStr += 3;\r
+ AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+ } else {\r
+ AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
+ }\r
+\r
+ AcpiExt->UID = 0;\r
+ AcpiExt->CID = (UINT32) Xtoi (CIDStr);\r
+\r
+ AsciiStr = AcpiExt->HidUidCidStr;\r
+ //\r
+ // HID string is NULL\r
+ //\r
+ *AsciiStr = 0;\r
+ //\r
+ // Convert UID string\r
+ //\r
+ AsciiStr++;\r
+ StrToAscii (UIDSTRStr, &AsciiStr);\r
+ //\r
+ // CID string is NULL\r
+ //\r
+ *AsciiStr = 0;\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAta (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *PrimarySecondaryStr;\r
+ CHAR16 *SlaveMasterStr;\r
+ CHAR16 *LunStr;\r
+ ATAPI_DEVICE_PATH *Atapi;\r
+\r
+ Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_ATAPI_DP,\r
+ sizeof (ATAPI_DEVICE_PATH)\r
+ );\r
+\r
+ PrimarySecondaryStr = GetNextParamStr (&TextDeviceNode);\r
+ SlaveMasterStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+\r
+ Atapi->PrimarySecondary = (StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? (UINT8) 0 : (UINT8) 1;\r
+ Atapi->SlaveMaster = (StrCmp (SlaveMasterStr, L"Master") == 0) ? (UINT8) 0 : (UINT8) 1;\r
+ Atapi->Lun = (UINT16) Xtoi (LunStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextScsi (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *PunStr;\r
+ CHAR16 *LunStr;\r
+ SCSI_DEVICE_PATH *Scsi;\r
+\r
+ PunStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ Scsi = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_SCSI_DP,\r
+ sizeof (SCSI_DEVICE_PATH)\r
+ );\r
+\r
+ Scsi->Pun = (UINT16) Xtoi (PunStr);\r
+ Scsi->Lun = (UINT16) Xtoi (LunStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFibre (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *WWNStr;\r
+ CHAR16 *LunStr;\r
+ FIBRECHANNEL_DEVICE_PATH *Fibre;\r
+\r
+ WWNStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ Fibre = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_FIBRECHANNEL_DP,\r
+ sizeof (FIBRECHANNEL_DEVICE_PATH)\r
+ );\r
+\r
+ Fibre->Reserved = 0;\r
+ Xtoi64 (WWNStr, &Fibre->WWN);\r
+ Xtoi64 (LunStr, &Fibre->Lun);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromText1394 (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *GuidStr;\r
+ F1394_DEVICE_PATH *F1394;\r
+\r
+ GuidStr = GetNextParamStr (&TextDeviceNode);\r
+ F1394 = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_1394_DP,\r
+ sizeof (F1394_DEVICE_PATH)\r
+ );\r
+\r
+ F1394->Reserved = 0;\r
+ Xtoi64 (GuidStr, &F1394->Guid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) F1394;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsb (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *PortStr;\r
+ CHAR16 *InterfaceStr;\r
+ USB_DEVICE_PATH *Usb;\r
+\r
+ PortStr = GetNextParamStr (&TextDeviceNode);\r
+ InterfaceStr = GetNextParamStr (&TextDeviceNode);\r
+ Usb = (USB_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_USB_DP,\r
+ sizeof (USB_DEVICE_PATH)\r
+ );\r
+\r
+ Usb->ParentPortNumber = (UINT8) Xtoi (PortStr);\r
+ Usb->InterfaceNumber = (UINT8) Xtoi (InterfaceStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextI2O (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *TIDStr;\r
+ I2O_DEVICE_PATH *I2O;\r
+\r
+ TIDStr = GetNextParamStr (&TextDeviceNode);\r
+ I2O = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_I2O_DP,\r
+ sizeof (I2O_DEVICE_PATH)\r
+ );\r
+\r
+ I2O->Tid = (UINT32) Xtoi (TIDStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) I2O;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextInfiniband (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *FlagsStr;\r
+ CHAR16 *GuidStr;\r
+ CHAR16 *SidStr;\r
+ CHAR16 *TidStr;\r
+ CHAR16 *DidStr;\r
+ EFI_GUID PortGid;\r
+ INFINIBAND_DEVICE_PATH *InfiniBand;\r
+\r
+ FlagsStr = GetNextParamStr (&TextDeviceNode);\r
+ GuidStr = GetNextParamStr (&TextDeviceNode);\r
+ SidStr = GetNextParamStr (&TextDeviceNode);\r
+ TidStr = GetNextParamStr (&TextDeviceNode);\r
+ DidStr = GetNextParamStr (&TextDeviceNode);\r
+ InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_INFINIBAND_DP,\r
+ sizeof (INFINIBAND_DEVICE_PATH)\r
+ );\r
+\r
+ InfiniBand->ResourceFlags = (UINT32) Xtoi (FlagsStr);\r
+ StrToGuid (GuidStr, &PortGid);\r
+ CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
+ Xtoi64 (SidStr, &InfiniBand->ServiceId);\r
+ Xtoi64 (TidStr, &InfiniBand->TargetPortId);\r
+ Xtoi64 (DidStr, &InfiniBand->DeviceId);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenMsg (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextVendor (\r
+ TextDeviceNode,\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP\r
+ );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenPcAnsi (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+\r
+ Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (VENDOR_DEVICE_PATH));\r
+ CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenVt100 (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+\r
+ Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (VENDOR_DEVICE_PATH));\r
+ CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenVt100Plus (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+\r
+ Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (VENDOR_DEVICE_PATH));\r
+ CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenUtf8 (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ VENDOR_DEVICE_PATH *Vendor;\r
+\r
+ Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (VENDOR_DEVICE_PATH));\r
+ CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUartFlowCtrl (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *ValueStr;\r
+ UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
+\r
+ ValueStr = GetNextParamStr (&TextDeviceNode);\r
+ UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
+ );\r
+\r
+ CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);\r
+ if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
+ UartFlowControl->FlowControlMap = 2;\r
+ } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
+ UartFlowControl->FlowControlMap = 1;\r
+ } else {\r
+ UartFlowControl->FlowControlMap = 0;\r
+ }\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSAS (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *AddressStr;\r
+ CHAR16 *LunStr;\r
+ CHAR16 *RTPStr;\r
+ CHAR16 *SASSATAStr;\r
+ CHAR16 *LocationStr;\r
+ CHAR16 *ConnectStr;\r
+ CHAR16 *DriveBayStr;\r
+ CHAR16 *ReservedStr;\r
+ UINT16 Info;\r
+ SAS_DEVICE_PATH *Sas;\r
+\r
+ AddressStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ RTPStr = GetNextParamStr (&TextDeviceNode);\r
+ SASSATAStr = GetNextParamStr (&TextDeviceNode);\r
+ LocationStr = GetNextParamStr (&TextDeviceNode);\r
+ ConnectStr = GetNextParamStr (&TextDeviceNode);\r
+ DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
+ ReservedStr = GetNextParamStr (&TextDeviceNode);\r
+ Info = 0x0000;\r
+ Sas = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (SAS_DEVICE_PATH)\r
+ );\r
+\r
+ CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);\r
+ Xtoi64 (AddressStr, &Sas->SasAddress);\r
+ Xtoi64 (LunStr, &Sas->Lun);\r
+ Sas->RelativeTargetPort = (UINT16) Xtoi (RTPStr);\r
+ if (StrCmp (SASSATAStr, L"NoTopology") == 0)\r
+ ;\r
+ else {\r
+ if (StrCmp (DriveBayStr, L"0") == 0) {\r
+ Info |= 0x0001;\r
+ } else {\r
+ Info |= 0x0002;\r
+ Info |= (Xtoi (DriveBayStr) << 8);\r
+ }\r
+\r
+ if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
+ Info |= 0x0010;\r
+ }\r
+\r
+ if (StrCmp (LocationStr, L"External") == 0) {\r
+ Info |= 0x0020;\r
+ }\r
+\r
+ if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
+ Info |= 0x0040;\r
+ }\r
+ }\r
+\r
+ Sas->DeviceTopology = Info;\r
+ Sas->Reserved = (UINT32) Xtoi (ReservedStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextDebugPort (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ VENDOR_DEFINED_MESSAGING_DEVICE_PATH *Vend;\r
+\r
+ Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_VENDOR_DP,\r
+ sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+ );\r
+\r
+ CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMAC (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *AddressStr;\r
+ CHAR16 *IfTypeStr;\r
+ UINTN Length;\r
+ MAC_ADDR_DEVICE_PATH *MAC;\r
+\r
+ AddressStr = GetNextParamStr (&TextDeviceNode);\r
+ IfTypeStr = GetNextParamStr (&TextDeviceNode);\r
+ MAC = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_MAC_ADDR_DP,\r
+ sizeof (MAC_ADDR_DEVICE_PATH)\r
+ );\r
+\r
+ MAC->IfType = (UINT8) Xtoi (IfTypeStr);\r
+\r
+ Length = sizeof (EFI_MAC_ADDRESS);\r
+ StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextIPv4 (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *RemoteIPStr;\r
+ CHAR16 *ProtocolStr;\r
+ CHAR16 *TypeStr;\r
+ CHAR16 *LocalIPStr;\r
+ IPv4_DEVICE_PATH *IPv4;\r
+\r
+ RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
+ ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
+ TypeStr = GetNextParamStr (&TextDeviceNode);\r
+ LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
+ IPv4 = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_IPv4_DP,\r
+ sizeof (IPv4_DEVICE_PATH)\r
+ );\r
+\r
+ StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
+ IPv4->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
+ if (StrCmp (TypeStr, L"Static") == 0) {\r
+ IPv4->StaticIpAddress = TRUE;\r
+ } else {\r
+ IPv4->StaticIpAddress = FALSE;\r
+ }\r
+\r
+ StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+\r
+ IPv4->LocalPort = 0;\r
+ IPv4->RemotePort = 0;\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextIPv6 (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *RemoteIPStr;\r
+ CHAR16 *ProtocolStr;\r
+ CHAR16 *TypeStr;\r
+ CHAR16 *LocalIPStr;\r
+ IPv6_DEVICE_PATH *IPv6;\r
+\r
+ RemoteIPStr = GetNextParamStr (&TextDeviceNode);\r
+ ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
+ TypeStr = GetNextParamStr (&TextDeviceNode);\r
+ LocalIPStr = GetNextParamStr (&TextDeviceNode);\r
+ IPv6 = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_IPv6_DP,\r
+ sizeof (IPv6_DEVICE_PATH)\r
+ );\r
+\r
+ StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
+ IPv6->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
+ if (StrCmp (TypeStr, L"Static") == 0) {\r
+ IPv6->StaticIpAddress = TRUE;\r
+ } else {\r
+ IPv6->StaticIpAddress = FALSE;\r
+ }\r
+\r
+ StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+\r
+ IPv6->LocalPort = 0;\r
+ IPv6->RemotePort = 0;\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUart (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *BaudStr;\r
+ CHAR16 *DataBitsStr;\r
+ CHAR16 *ParityStr;\r
+ CHAR16 *StopBitsStr;\r
+ UART_DEVICE_PATH *Uart;\r
+\r
+ BaudStr = GetNextParamStr (&TextDeviceNode);\r
+ DataBitsStr = GetNextParamStr (&TextDeviceNode);\r
+ ParityStr = GetNextParamStr (&TextDeviceNode);\r
+ StopBitsStr = GetNextParamStr (&TextDeviceNode);\r
+ Uart = (UART_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_UART_DP,\r
+ sizeof (UART_DEVICE_PATH)\r
+ );\r
+\r
+ Uart->BaudRate = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Atoi (BaudStr);\r
+ Uart->DataBits = (StrCmp (DataBitsStr, L"DEFAULT") == 0) ? (UINT8) 8 : (UINT8) Atoi (DataBitsStr);\r
+ switch (*ParityStr) {\r
+ case L'D':\r
+ Uart->Parity = 0;\r
+ break;\r
+\r
+ case L'N':\r
+ Uart->Parity = 1;\r
+ break;\r
+\r
+ case L'E':\r
+ Uart->Parity = 2;\r
+ break;\r
+\r
+ case L'O':\r
+ Uart->Parity = 3;\r
+ break;\r
+\r
+ case L'M':\r
+ Uart->Parity = 4;\r
+ break;\r
+\r
+ case L'S':\r
+ Uart->Parity = 5;\r
+\r
+ default:\r
+ Uart->Parity = 0xff;\r
+ }\r
+\r
+ if (StrCmp (StopBitsStr, L"D") == 0) {\r
+ Uart->StopBits = (UINT8) 0;\r
+ } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
+ Uart->StopBits = (UINT8) 1;\r
+ } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
+ Uart->StopBits = (UINT8) 2;\r
+ } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
+ Uart->StopBits = (UINT8) 3;\r
+ } else {\r
+ Uart->StopBits = 0xff;\r
+ }\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextUsbClass (\r
+ IN CHAR16 *TextDeviceNode,\r
+ IN USB_CLASS_TEXT *UsbClassText\r
+ )\r
+{\r
+ CHAR16 *VIDStr;\r
+ CHAR16 *PIDStr;\r
+ CHAR16 *ClassStr;\r
+ CHAR16 *SubClassStr;\r
+ CHAR16 *ProtocolStr;\r
+ USB_CLASS_DEVICE_PATH *UsbClass;\r
+\r
+ UsbClass = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_USB_CLASS_DP,\r
+ sizeof (USB_CLASS_DEVICE_PATH)\r
+ );\r
+\r
+ VIDStr = GetNextParamStr (&TextDeviceNode);\r
+ PIDStr = GetNextParamStr (&TextDeviceNode);\r
+ if (UsbClassText->ClassExist) {\r
+ ClassStr = GetNextParamStr (&TextDeviceNode);\r
+ UsbClass->DeviceClass = (UINT8) Xtoi (ClassStr);\r
+ } else {\r
+ UsbClass->DeviceClass = UsbClassText->Class;\r
+ }\r
+ if (UsbClassText->SubClassExist) {\r
+ SubClassStr = GetNextParamStr (&TextDeviceNode);\r
+ UsbClass->DeviceSubClass = (UINT8) Xtoi (SubClassStr);\r
+ } else {\r
+ UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
+ } \r
+\r
+ ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
+\r
+ UsbClass->VendorId = (UINT16) Xtoi (VIDStr);\r
+ UsbClass->ProductId = (UINT16) Xtoi (PIDStr);\r
+ UsbClass->DeviceProtocol = (UINT8) Xtoi (ProtocolStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
+}\r
+\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbClass (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = TRUE;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbAudio (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_AUDIO;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbCDCControl (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_CDCCONTROL;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbHID (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_HID;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbImage (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_IMAGE;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbPrinter (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_PRINTER;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbMassStorage (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_MASS_STORAGE;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbHub (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_HUB;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbCDCData (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_CDCDATA;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbSmartCard (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_SMART_CARD;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbVideo (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_VIDEO;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbDiagnostic (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_DIAGNOSTIC;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbWireless (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_WIRELESS;\r
+ UsbClassText.SubClassExist = TRUE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbDeviceFirmwareUpdate (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_RESERVE;\r
+ UsbClassText.SubClassExist = FALSE;\r
+ UsbClassText.SubClass = USB_SUBCLASS_FW_UPDATE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbIrdaBridge (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_RESERVE;\r
+ UsbClassText.SubClassExist = FALSE;\r
+ UsbClassText.SubClass = USB_SUBCLASS_IRDA_BRIDGE;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbTestAndMeasurement (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ USB_CLASS_TEXT UsbClassText;\r
+\r
+ UsbClassText.ClassExist = FALSE;\r
+ UsbClassText.Class = USB_CLASS_RESERVE;\r
+ UsbClassText.SubClassExist = FALSE;\r
+ UsbClassText.SubClass = USB_SUBCLASS_TEST;\r
+\r
+ return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbWwid (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *VIDStr;\r
+ CHAR16 *PIDStr;\r
+ CHAR16 *InterfaceNumStr;\r
+ USB_WWID_DEVICE_PATH *UsbWwid;\r
+\r
+ VIDStr = GetNextParamStr (&TextDeviceNode);\r
+ PIDStr = GetNextParamStr (&TextDeviceNode);\r
+ InterfaceNumStr = GetNextParamStr (&TextDeviceNode);\r
+ UsbWwid = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_USB_WWID_DP,\r
+ sizeof (USB_WWID_DEVICE_PATH)\r
+ );\r
+\r
+ UsbWwid->VendorId = (UINT16) Xtoi (VIDStr);\r
+ UsbWwid->ProductId = (UINT16) Xtoi (PIDStr);\r
+ UsbWwid->InterfaceNumber = (UINT16) Xtoi (InterfaceNumStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUnit (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *LunStr;\r
+ DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
+\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_DEVICE_LOGICAL_UNIT_DP,\r
+ sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
+ );\r
+\r
+ LogicalUnit->Lun = (UINT8) Xtoi (LunStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextiSCSI (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ UINT16 Options;\r
+ CHAR16 *NameStr;\r
+ CHAR16 *PortalGroupStr;\r
+ CHAR16 *LunStr;\r
+ CHAR16 *HeaderDigestStr;\r
+ CHAR16 *DataDigestStr;\r
+ CHAR16 *AuthenticationStr;\r
+ CHAR16 *ProtocolStr;\r
+ ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;\r
+\r
+ NameStr = GetNextParamStr (&TextDeviceNode);\r
+ PortalGroupStr = GetNextParamStr (&TextDeviceNode);\r
+ LunStr = GetNextParamStr (&TextDeviceNode);\r
+ HeaderDigestStr = GetNextParamStr (&TextDeviceNode);\r
+ DataDigestStr = GetNextParamStr (&TextDeviceNode);\r
+ AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
+ ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
+ iSCSI = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
+ MESSAGING_DEVICE_PATH,\r
+ MSG_ISCSI_DP,\r
+ sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + (UINT16) (StrLen (NameStr) * 2)\r
+ );\r
+\r
+ StrCpy (iSCSI->iSCSITargetName, NameStr);\r
+ iSCSI->TargetPortalGroupTag = (UINT16) Xtoi (PortalGroupStr);\r
+ Xtoi64 (LunStr, &iSCSI->Lun);\r
+\r
+ Options = 0x0000;\r
+ if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
+ Options |= 0x0002;\r
+ }\r
+\r
+ if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
+ Options |= 0x0008;\r
+ }\r
+\r
+ if (StrCmp (AuthenticationStr, L"None") == 0) {\r
+ Options |= 0x0800;\r
+ }\r
+\r
+ if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
+ Options |= 0x1000;\r
+ }\r
+\r
+ iSCSI->LoginOption = (UINT16) Options;\r
+\r
+ iSCSI->NetworkProtocol = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+ iSCSI->Reserved = (UINT16) 0;\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextHD (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *PartitionStr;\r
+ CHAR16 *TypeStr;\r
+ CHAR16 *SignatureStr;\r
+ CHAR16 *StartStr;\r
+ CHAR16 *SizeStr;\r
+ UINT32 Signature32;\r
+ EFI_GUID SignatureGuid;\r
+ HARDDRIVE_DEVICE_PATH *Hd;\r
+\r
+ PartitionStr = GetNextParamStr (&TextDeviceNode);\r
+ TypeStr = GetNextParamStr (&TextDeviceNode);\r
+ SignatureStr = GetNextParamStr (&TextDeviceNode);\r
+ StartStr = GetNextParamStr (&TextDeviceNode);\r
+ SizeStr = GetNextParamStr (&TextDeviceNode);\r
+ Hd = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_HARDDRIVE_DP,\r
+ sizeof (HARDDRIVE_DEVICE_PATH)\r
+ );\r
+\r
+ Hd->PartitionNumber = (UINT32) Atoi (PartitionStr);\r
+\r
+ ZeroMem (Hd->Signature, 16);\r
+ Hd->MBRType = (UINT8) 0;\r
+\r
+ if (StrCmp (TypeStr, L"None") == 0) {\r
+ Hd->SignatureType = (UINT8) 0;\r
+ } else if (StrCmp (TypeStr, L"MBR") == 0) {\r
+ Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
+ Hd->MBRType = 0x01;\r
+\r
+ Signature32 = (UINT32) Xtoi (SignatureStr);\r
+ CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
+ } else if (StrCmp (TypeStr, L"GUID") == 0) {\r
+ Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
+ Hd->MBRType = 0x02;\r
+\r
+ StrToGuid (SignatureStr, &SignatureGuid);\r
+ CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
+ } else {\r
+ Hd->SignatureType = 0xff;\r
+\r
+ }\r
+\r
+ Xtoi64 (StartStr, &Hd->PartitionStart);\r
+ Xtoi64 (SizeStr, &Hd->PartitionSize);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextCDROM (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *EntryStr;\r
+ CHAR16 *StartStr;\r
+ CHAR16 *SizeStr;\r
+ CDROM_DEVICE_PATH *CDROM;\r
+\r
+ EntryStr = GetNextParamStr (&TextDeviceNode);\r
+ StartStr = GetNextParamStr (&TextDeviceNode);\r
+ SizeStr = GetNextParamStr (&TextDeviceNode);\r
+ CDROM = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_CDROM_DP,\r
+ sizeof (CDROM_DEVICE_PATH)\r
+ );\r
+\r
+ CDROM->BootEntry = (UINT32) Xtoi (EntryStr);\r
+ Xtoi64 (StartStr, &CDROM->PartitionStart);\r
+ Xtoi64 (SizeStr, &CDROM->PartitionSize);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenMEDIA (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ return ConvertFromTextVendor (\r
+ TextDeviceNode,\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_VENDOR_DP\r
+ );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFilePath (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ FILEPATH_DEVICE_PATH *File;\r
+\r
+ File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_FILEPATH_DP,\r
+ sizeof (FILEPATH_DEVICE_PATH) + (UINT16) (StrLen (TextDeviceNode) * 2)\r
+ );\r
+\r
+ StrCpy (File->PathName, TextDeviceNode);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMedia (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *GuidStr;\r
+ MEDIA_PROTOCOL_DEVICE_PATH *Media;\r
+\r
+ GuidStr = GetNextParamStr (&TextDeviceNode);\r
+ Media = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
+ MEDIA_DEVICE_PATH,\r
+ MEDIA_PROTOCOL_DP,\r
+ sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
+ );\r
+\r
+ StrToGuid (GuidStr, &Media->Protocol);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBBS (\r
+ IN CHAR16 *TextDeviceNode\r
+ )\r
+{\r
+ CHAR16 *TypeStr;\r
+ CHAR16 *IdStr;\r
+ CHAR16 *FlagsStr;\r
+ UINT8 *AsciiStr;\r
+ BBS_BBS_DEVICE_PATH *Bbs;\r
+\r
+ TypeStr = GetNextParamStr (&TextDeviceNode);\r
+ IdStr = GetNextParamStr (&TextDeviceNode);\r
+ FlagsStr = GetNextParamStr (&TextDeviceNode);\r
+ Bbs = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
+ BBS_DEVICE_PATH,\r
+ BBS_BBS_DP,\r
+ sizeof (BBS_BBS_DEVICE_PATH) + (UINT16) (StrLen (IdStr))\r
+ );\r
+\r
+ if (StrCmp (TypeStr, L"Floppy") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
+ } else if (StrCmp (TypeStr, L"HD") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
+ } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_CDROM;\r
+ } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
+ } else if (StrCmp (TypeStr, L"USB") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_USB;\r
+ } else if (StrCmp (TypeStr, L"Network") == 0) {\r
+ Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
+ } else {\r
+ Bbs->DeviceType = BBS_TYPE_UNKNOWN;\r
+ }\r
+\r
+ AsciiStr = (UINT8 *) Bbs->String;\r
+ StrToAscii (IdStr, (CHAR8 **) &AsciiStr);\r
+\r
+ Bbs->StatusFlag = (UINT16) Xtoi (FlagsStr);\r
+\r
+ return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
+}\r
+\r
+GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
+ {L"Pci", DevPathFromTextPci},\r
+ {L"PcCard", DevPathFromTextPcCard},\r
+ {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
+ {L"VenHw", DevPathFromTextVenHw},\r
+ {L"Ctrl", DevPathFromTextCtrl},\r
+ {L"Acpi", DevPathFromTextAcpi},\r
+ {L"PciRoot", DevPathFromTextPciRoot},\r
+ {L"Floppy", DevPathFromTextFloppy},\r
+ {L"Keyboard", DevPathFromTextKeyboard},\r
+ {L"Serial", DevPathFromTextSerial},\r
+ {L"ParallelPort", DevPathFromTextParallelPort},\r
+ {L"AcpiEx", DevPathFromTextAcpiEx},\r
+ {L"AcpiExp", DevPathFromTextAcpiExp},\r
+ {L"Ata", DevPathFromTextAta},\r
+ {L"Scsi", DevPathFromTextScsi},\r
+ {L"Fibre", DevPathFromTextFibre},\r
+ {L"I1394", DevPathFromText1394},\r
+ {L"USB", DevPathFromTextUsb},\r
+ {L"I2O", DevPathFromTextI2O},\r
+ {L"Infiniband", DevPathFromTextInfiniband},\r
+ {L"VenMsg", DevPathFromTextVenMsg},\r
+ {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
+ {L"VenVt100", DevPathFromTextVenVt100},\r
+ {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
+ {L"VenUtf8", DevPathFromTextVenUtf8},\r
+ {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
+ {L"SAS", DevPathFromTextSAS},\r
+ {L"DebugPort", DevPathFromTextDebugPort},\r
+ {L"MAC", DevPathFromTextMAC},\r
+ {L"IPv4", DevPathFromTextIPv4},\r
+ {L"IPv6", DevPathFromTextIPv6},\r
+ {L"Uart", DevPathFromTextUart},\r
+ {L"UsbClass", DevPathFromTextUsbClass},\r
+ {L"UsbAudio", DevPathFromTextUsbAudio},\r
+ {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
+ {L"UsbHID", DevPathFromTextUsbHID},\r
+ {L"UsbImage", DevPathFromTextUsbImage},\r
+ {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
+ {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
+ {L"UsbHub", DevPathFromTextUsbHub},\r
+ {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
+ {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
+ {L"UsbVideo", DevPathFromTextUsbVideo},\r
+ {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
+ {L"UsbWireless", DevPathFromTextUsbWireless},\r
+ {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
+ {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
+ {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
+ {L"UsbWwid", DevPathFromTextUsbWwid},\r
+ {L"Unit", DevPathFromTextUnit},\r
+ {L"iSCSI", DevPathFromTextiSCSI},\r
+ {L"HD", DevPathFromTextHD},\r
+ {L"CDROM", DevPathFromTextCDROM},\r
+ {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
+ {L"Media", DevPathFromTextMedia},\r
+ {L"BBS", DevPathFromTextBBS},\r
+ {NULL, NULL}\r
+};\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertTextToDeviceNode (\r
+ IN CONST CHAR16 *TextDeviceNode\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Convert text to the binary representation of a device node.\r
+\r
+ Arguments:\r
+ TextDeviceNode - TextDeviceNode points to the text representation of a device\r
+ node. Conversion starts with the first character and continues\r
+ until the first non-device node character.\r
+\r
+ Returns:\r
+ A pointer - Pointer to the EFI device node.\r
+ NULL - If TextDeviceNode is NULL or there was insufficient memory or text unsupported.\r
+\r
+--*/\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+ CHAR16 *ParamStr;\r
+ EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
+ CHAR16 *DeviceNodeStr;\r
+ UINTN Index;\r
+\r
+ if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
+ return NULL;\r
+ }\r
+\r
+ ParamStr = NULL;\r
+ DumpNode = NULL;\r
+ DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
+\r
+ for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+ ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
+ if (ParamStr != NULL) {\r
+ DumpNode = DevPathFromTextTable[Index].Function;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (DumpNode == NULL) {\r
+ //\r
+ // A file path\r
+ //\r
+ DumpNode = DevPathFromTextFilePath;\r
+ DeviceNode = DumpNode (DeviceNodeStr);\r
+ } else {\r
+ DeviceNode = DumpNode (ParamStr);\r
+ gBS->FreePool (ParamStr);\r
+ }\r
+\r
+ gBS->FreePool (DeviceNodeStr);\r
+\r
+ return DeviceNode;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertTextToDevicePath (\r
+ IN CONST CHAR16 *TextDevicePath\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Convert text to the binary representation of a device path.\r
+\r
+ Arguments:\r
+ TextDevicePath - TextDevicePath points to the text representation of a device\r
+ path. Conversion starts with the first character and continues\r
+ until the first non-device node character.\r
+\r
+ Returns:\r
+ A pointer - Pointer to the allocated device path.\r
+ NULL - If TextDeviceNode is NULL or there was insufficient memory.\r
+\r
+--*/\r
+{\r
+ EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+ CHAR16 *ParamStr;\r
+ EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
+ UINTN Index;\r
+ EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
+ CHAR16 *DevicePathStr;\r
+ CHAR16 *Str;\r
+ CHAR16 *DeviceNodeStr;\r
+ UINT8 IsInstanceEnd;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+\r
+ if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
+ return NULL;\r
+ }\r
+\r
+ DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
+ SetDevicePathEndNode (DevicePath);\r
+\r
+ ParamStr = NULL;\r
+ DeviceNodeStr = NULL;\r
+ DevicePathStr = StrDuplicate (TextDevicePath);\r
+\r
+ Str = DevicePathStr;\r
+ while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
+ DumpNode = NULL;\r
+ for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+ ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
+ if (ParamStr != NULL) {\r
+ DumpNode = DevPathFromTextTable[Index].Function;\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (DumpNode == NULL) {\r
+ //\r
+ // A file path\r
+ //\r
+ DumpNode = DevPathFromTextFilePath;\r
+ DeviceNode = DumpNode (DeviceNodeStr);\r
+ } else {\r
+ DeviceNode = DumpNode (ParamStr);\r
+ gBS->FreePool (ParamStr);\r
+ }\r
+\r
+ NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
+ gBS->FreePool (DevicePath);\r
+ gBS->FreePool (DeviceNode);\r
+ DevicePath = NewDevicePath;\r
+\r
+ if (IsInstanceEnd) {\r
+ DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
+ SetDevicePathInstanceEndNode (DeviceNode);\r
+\r
+ NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
+ gBS->FreePool (DevicePath);\r
+ gBS->FreePool (DeviceNode);\r
+ DevicePath = NewDevicePath;\r
+ }\r
+ }\r
+\r
+ gBS->FreePool (DevicePathStr);\r
+ return DevicePath;\r
+}\r
-/*++
-
-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:
-
- DiskIo.c
-
-Abstract:
-
- DiskIo driver that layers it's self on every Block IO protocol in the system.
- DiskIo converts a block oriented device to a byte oriented device.
-
- ReadDisk may have to do reads that are not aligned on sector boundaries.
- There are three cases:
-
- UnderRun - The first byte is not on a sector boundary or the read request is
- less than a sector in length.
-
- Aligned - A read of N contiguous sectors.
-
- OverRun - The last byte is not on a sector boundary.
-
---*/
-
-#include "DiskIo.h"
-
-//
-// Prototypes
-// Driver model protocol interface
-//
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
-
-//
-// Disk I/O Protocol Interface
-//
-EFI_STATUS
-EFIAPI
-DiskIoReadDisk (
- IN EFI_DISK_IO_PROTOCOL *This,
- IN UINT32 MediaId,
- IN UINT64 Offset,
- IN UINTN BufferSize,
- OUT VOID *Buffer
- );
-
-EFI_STATUS
-EFIAPI
-DiskIoWriteDisk (
- IN EFI_DISK_IO_PROTOCOL *This,
- IN UINT32 MediaId,
- IN UINT64 Offset,
- IN UINTN BufferSize,
- IN VOID *Buffer
- );
-
-EFI_DRIVER_BINDING_PROTOCOL gDiskIoDriverBinding = {
- DiskIoDriverBindingSupported,
- DiskIoDriverBindingStart,
- DiskIoDriverBindingStop,
- 0x10,
- NULL,
- NULL
-};
-
-DISK_IO_PRIVATE_DATA gDiskIoPrivateDataTemplate = {
- DISK_IO_PRIVATE_DATA_SIGNATURE,
- {
- EFI_DISK_IO_PROTOCOL_REVISION,
- DiskIoReadDisk,
- DiskIoWriteDisk
- },
- NULL
-};
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-/*++
-
- Routine Description:
- Test to see if this driver supports ControllerHandle. Any ControllerHandle
- than contains a BlockIo protocol can be supported.
-
- Arguments:
- This - Protocol instance pointer.
- ControllerHandle - Handle of device to test.
- RemainingDevicePath - Not used.
-
- Returns:
- EFI_SUCCESS - This driver supports this device.
- EFI_ALREADY_STARTED - This driver is already running on this device.
- other - This driver does not support this device.
-
---*/
-{
- EFI_STATUS Status;
- EFI_BLOCK_IO_PROTOCOL *BlockIo;
-
- //
- // Open the IO Abstraction(s) needed to perform the supported test.
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiBlockIoProtocolGuid,
- (VOID **) &BlockIo,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Close the I/O Abstraction(s) used to perform the supported test.
- //
- gBS->CloseProtocol (
- ControllerHandle,
- &gEfiBlockIoProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
- )
-/*++
-
- Routine Description:
- Start this driver on ControllerHandle by opening a Block IO protocol and
- installing a Disk IO protocol on ControllerHandle.
-
- Arguments:
- This - Protocol instance pointer.
- ControllerHandle - Handle of device to bind driver to.
- RemainingDevicePath - Not used, always produce all possible children.
-
- Returns:
- EFI_SUCCESS - This driver is added to ControllerHandle.
- EFI_ALREADY_STARTED - This driver is already running on ControllerHandle.
- other - This driver does not support this device.
-
---*/
-{
- EFI_STATUS Status;
- DISK_IO_PRIVATE_DATA *Private;
-
- Private = NULL;
-
- //
- // Connect to the Block IO interface on ControllerHandle.
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiBlockIoProtocolGuid,
- (VOID **) &gDiskIoPrivateDataTemplate.BlockIo,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_BY_DRIVER
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Initialize the Disk IO device instance.
- //
- Private = AllocateCopyPool (sizeof (DISK_IO_PRIVATE_DATA), &gDiskIoPrivateDataTemplate);
- if (Private == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto ErrorExit;
- }
- //
- // Install protocol interfaces for the Disk IO device.
- //
- Status = gBS->InstallProtocolInterface (
- &ControllerHandle,
- &gEfiDiskIoProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &Private->DiskIo
- );
-
-ErrorExit:
- if (EFI_ERROR (Status)) {
-
- if (Private != NULL) {
- gBS->FreePool (Private);
- }
-
- gBS->CloseProtocol (
- ControllerHandle,
- &gEfiBlockIoProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-/*++
-
- Routine Description:
- Stop this driver on ControllerHandle by removing Disk IO protocol and closing
- the Block IO protocol on ControllerHandle.
-
- Arguments:
- This - Protocol instance pointer.
- ControllerHandle - Handle of device to stop driver on.
- NumberOfChildren - Not used.
- ChildHandleBuffer - Not used.
-
- Returns:
- EFI_SUCCESS - This driver is removed ControllerHandle.
- other - This driver was not removed from this device.
- EFI_UNSUPPORTED
-
---*/
-{
- EFI_STATUS Status;
- EFI_DISK_IO_PROTOCOL *DiskIo;
- DISK_IO_PRIVATE_DATA *Private;
-
- //
- // Get our context back.
- //
- Status = gBS->OpenProtocol (
- ControllerHandle,
- &gEfiDiskIoProtocolGuid,
- (VOID **) &DiskIo,
- This->DriverBindingHandle,
- ControllerHandle,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
-
- Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);
-
- Status = gBS->UninstallProtocolInterface (
- ControllerHandle,
- &gEfiDiskIoProtocolGuid,
- &Private->DiskIo
- );
- if (!EFI_ERROR (Status)) {
-
- Status = gBS->CloseProtocol (
- ControllerHandle,
- &gEfiBlockIoProtocolGuid,
- This->DriverBindingHandle,
- ControllerHandle
- );
- }
-
- if (!EFI_ERROR (Status)) {
- gBS->FreePool (Private);
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoReadDisk (
- IN EFI_DISK_IO_PROTOCOL *This,
- IN UINT32 MediaId,
- IN UINT64 Offset,
- IN UINTN BufferSize,
- OUT VOID *Buffer
- )
-/*++
-
- Routine Description:
- Read BufferSize bytes from Offset into Buffer.
-
- Reads may support reads that are not aligned on
- sector boundaries. There are three cases:
-
- UnderRun - The first byte is not on a sector boundary or the read request is
- less than a sector in length.
-
- Aligned - A read of N contiguous sectors.
-
- OverRun - The last byte is not on a sector boundary.
-
-
- Arguments:
- This - Protocol instance pointer.
- MediaId - Id of the media, changes every time the media is replaced.
- Offset - The starting byte offset to read from.
- BufferSize - Size of Buffer.
- Buffer - Buffer containing read data.
-
- Returns:
- EFI_SUCCESS - The data was read correctly from the device.
- EFI_DEVICE_ERROR - The device reported an error while performing the read.
- EFI_NO_MEDIA - There is no media in the device.
- EFI_MEDIA_CHNAGED - The MediaId does not matched the current device.
- EFI_INVALID_PARAMETER - The read request contains device addresses that are not
- valid for the device.
- EFI_OUT_OF_RESOURCES
-
---*/
-{
- EFI_STATUS Status;
- DISK_IO_PRIVATE_DATA *Private;
- EFI_BLOCK_IO_PROTOCOL *BlockIo;
- EFI_BLOCK_IO_MEDIA *Media;
- UINT32 BlockSize;
- UINT64 Lba;
- UINT64 OverRunLba;
- UINT32 UnderRun;
- UINT32 OverRun;
- BOOLEAN TransactionComplete;
- UINTN WorkingBufferSize;
- UINT8 *WorkingBuffer;
- UINTN Length;
- UINT8 *Data;
- UINT8 *PreData;
- UINTN IsBufferAligned;
- UINTN DataBufferSize;
- BOOLEAN LastRead;
-
- Private = DISK_IO_PRIVATE_DATA_FROM_THIS (This);
-
- BlockIo = Private->BlockIo;
- Media = BlockIo->Media;
- BlockSize = Media->BlockSize;
-
- if (Media->MediaId != MediaId) {
- return EFI_MEDIA_CHANGED;
- }
-
- WorkingBuffer = Buffer;
- WorkingBufferSize = BufferSize;
-
- //
- // Allocate a temporary buffer for operation
- //
- DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;
-
- if (Media->IoAlign > 1) {
- PreData = AllocatePool (DataBufferSize + Media->IoAlign);
- Data = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;
- } else {
- PreData = AllocatePool (DataBufferSize);
- Data = PreData;
- }
-
- if (PreData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Lba = DivU64x32Remainder (Offset, BlockSize, &UnderRun);
-
- Length = BlockSize - UnderRun;
- TransactionComplete = FALSE;
-
- Status = EFI_SUCCESS;
- if (UnderRun != 0) {
- //
- // Offset starts in the middle of an Lba, so read the entire block.
- //
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- Lba,
- BlockSize,
- Data
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- if (Length > BufferSize) {
- Length = BufferSize;
- TransactionComplete = TRUE;
- }
-
- CopyMem (WorkingBuffer, Data + UnderRun, Length);
-
- WorkingBuffer += Length;
-
- WorkingBufferSize -= Length;
- if (WorkingBufferSize == 0) {
- goto Done;
- }
-
- Lba += 1;
- }
-
- OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);
-
- if (!TransactionComplete && WorkingBufferSize >= BlockSize) {
- //
- // If the DiskIo maps directly to a BlockIo device do the read.
- //
- if (OverRun != 0) {
- WorkingBufferSize -= OverRun;
- }
- //
- // Check buffer alignment
- //
- IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);
-
- if (Media->IoAlign <= 1 || IsBufferAligned == 0) {
- //
- // Alignment is satisfied, so read them together
- //
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- Lba,
- WorkingBufferSize,
- WorkingBuffer
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- WorkingBuffer += WorkingBufferSize;
-
- } else {
- //
- // Use the allocated buffer instead of the original buffer
- // to avoid alignment issue.
- // Here, the allocated buffer (8-byte align) can satisfy the alignment
- //
- LastRead = FALSE;
- do {
- if (WorkingBufferSize <= DataBufferSize) {
- //
- // It is the last calling to readblocks in this loop
- //
- DataBufferSize = WorkingBufferSize;
- LastRead = TRUE;
- }
-
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- Lba,
- DataBufferSize,
- Data
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- CopyMem (WorkingBuffer, Data, DataBufferSize);
- WorkingBufferSize -= DataBufferSize;
- WorkingBuffer += DataBufferSize;
- Lba += DATA_BUFFER_BLOCK_NUM;
- } while (!LastRead);
- }
- }
-
- if (!TransactionComplete && OverRun != 0) {
- //
- // Last read is not a complete block.
- //
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- OverRunLba,
- BlockSize,
- Data
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- CopyMem (WorkingBuffer, Data, OverRun);
- }
-
-Done:
- if (PreData != NULL) {
- gBS->FreePool (PreData);
- }
-
- return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoWriteDisk (
- IN EFI_DISK_IO_PROTOCOL *This,
- IN UINT32 MediaId,
- IN UINT64 Offset,
- IN UINTN BufferSize,
- IN VOID *Buffer
- )
-/*++
-
- Routine Description:
- Read BufferSize bytes from Offset into Buffer.
-
- Writes may require a read modify write to support writes that are not
- aligned on sector boundaries. There are three cases:
-
- UnderRun - The first byte is not on a sector boundary or the write request
- is less than a sector in length. Read modify write is required.
-
- Aligned - A write of N contiguous sectors.
-
- OverRun - The last byte is not on a sector boundary. Read modified write
- required.
-
- Arguments:
- This - Protocol instance pointer.
- MediaId - Id of the media, changes every time the media is replaced.
- Offset - The starting byte offset to read from.
- BufferSize - Size of Buffer.
- Buffer - Buffer containing read data.
-
- Returns:
- EFI_SUCCESS - The data was written correctly to the device.
- EFI_WRITE_PROTECTED - The device can not be written to.
- EFI_DEVICE_ERROR - The device reported an error while performing the write.
- EFI_NO_MEDIA - There is no media in the device.
- EFI_MEDIA_CHNAGED - The MediaId does not matched the current device.
- EFI_INVALID_PARAMETER - The write request contains device addresses that are not
- valid for the device.
- EFI_OUT_OF_RESOURCES
-
---*/
-{
- EFI_STATUS Status;
- DISK_IO_PRIVATE_DATA *Private;
- EFI_BLOCK_IO_PROTOCOL *BlockIo;
- EFI_BLOCK_IO_MEDIA *Media;
- UINT32 BlockSize;
- UINT64 Lba;
- UINT64 OverRunLba;
- UINT32 UnderRun;
- UINT32 OverRun;
- BOOLEAN TransactionComplete;
- UINTN WorkingBufferSize;
- UINT8 *WorkingBuffer;
- UINTN Length;
- UINT8 *Data;
- UINT8 *PreData;
- UINTN IsBufferAligned;
- UINTN DataBufferSize;
- BOOLEAN LastWrite;
-
- Private = DISK_IO_PRIVATE_DATA_FROM_THIS (This);
-
- BlockIo = Private->BlockIo;
- Media = BlockIo->Media;
- BlockSize = Media->BlockSize;
-
- if (Media->ReadOnly) {
- return EFI_WRITE_PROTECTED;
- }
-
- if (Media->MediaId != MediaId) {
- return EFI_MEDIA_CHANGED;
- }
-
- DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;
-
- if (Media->IoAlign > 1) {
- PreData = AllocatePool (DataBufferSize + Media->IoAlign);
- Data = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;
- } else {
- PreData = AllocatePool (DataBufferSize);
- Data = PreData;
- }
-
- if (PreData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- WorkingBuffer = Buffer;
- WorkingBufferSize = BufferSize;
-
- Lba = DivU64x32Remainder (Offset, BlockSize, &UnderRun);
-
- Length = BlockSize - UnderRun;
- TransactionComplete = FALSE;
-
- Status = EFI_SUCCESS;
- if (UnderRun != 0) {
- //
- // Offset starts in the middle of an Lba, so do read modify write.
- //
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- Lba,
- BlockSize,
- Data
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- if (Length > BufferSize) {
- Length = BufferSize;
- TransactionComplete = TRUE;
- }
-
- CopyMem (Data + UnderRun, WorkingBuffer, Length);
-
- Status = BlockIo->WriteBlocks (
- BlockIo,
- MediaId,
- Lba,
- BlockSize,
- Data
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- WorkingBuffer += Length;
- WorkingBufferSize -= Length;
- if (WorkingBufferSize == 0) {
- goto Done;
- }
-
- Lba += 1;
- }
-
- OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);
-
- if (!TransactionComplete && WorkingBufferSize >= BlockSize) {
- //
- // If the DiskIo maps directly to a BlockIo device do the write.
- //
- if (OverRun != 0) {
- WorkingBufferSize -= OverRun;
- }
- //
- // Check buffer alignment
- //
- IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);
-
- if (Media->IoAlign <= 1 || IsBufferAligned == 0) {
- //
- // Alignment is satisfied, so write them together
- //
- Status = BlockIo->WriteBlocks (
- BlockIo,
- MediaId,
- Lba,
- WorkingBufferSize,
- WorkingBuffer
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- WorkingBuffer += WorkingBufferSize;
-
- } else {
- //
- // The buffer parameter is not aligned with the request
- // So use the allocated instead.
- // It can fit almost all the cases.
- //
- LastWrite = FALSE;
- do {
- if (WorkingBufferSize <= DataBufferSize) {
- //
- // It is the last calling to writeblocks in this loop
- //
- DataBufferSize = WorkingBufferSize;
- LastWrite = TRUE;
- }
-
- CopyMem (Data, WorkingBuffer, DataBufferSize);
- Status = BlockIo->WriteBlocks (
- BlockIo,
- MediaId,
- Lba,
- DataBufferSize,
- Data
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- WorkingBufferSize -= DataBufferSize;
- WorkingBuffer += DataBufferSize;
- Lba += DATA_BUFFER_BLOCK_NUM;
- } while (!LastWrite);
- }
- }
-
- if (!TransactionComplete && OverRun != 0) {
- //
- // Last bit is not a complete block, so do a read modify write.
- //
- Status = BlockIo->ReadBlocks (
- BlockIo,
- MediaId,
- OverRunLba,
- BlockSize,
- Data
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- CopyMem (Data, WorkingBuffer, OverRun);
-
- Status = BlockIo->WriteBlocks (
- BlockIo,
- MediaId,
- OverRunLba,
- BlockSize,
- Data
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
- }
-
-Done:
- if (PreData != NULL) {
- gBS->FreePool (PreData);
- }
-
- return Status;
-}
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+ DiskIo.c\r
+\r
+Abstract:\r
+\r
+ DiskIo driver that layers it's self on every Block IO protocol in the system.\r
+ DiskIo converts a block oriented device to a byte oriented device.\r
+\r
+ ReadDisk may have to do reads that are not aligned on sector boundaries.\r
+ There are three cases:\r
+\r
+ UnderRun - The first byte is not on a sector boundary or the read request is\r
+ less than a sector in length.\r
+\r
+ Aligned - A read of N contiguous sectors.\r
+\r
+ OverRun - The last byte is not on a sector boundary.\r
+\r
+--*/\r
+\r
+#include "DiskIo.h"\r
+\r
+//\r
+// Prototypes\r
+// Driver model protocol interface\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ );\r
+\r
+//\r
+// Disk I/O Protocol Interface\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+ IN EFI_DISK_IO_PROTOCOL *This,\r
+ IN UINT32 MediaId,\r
+ IN UINT64 Offset,\r
+ IN UINTN BufferSize,\r
+ OUT VOID *Buffer\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+ IN EFI_DISK_IO_PROTOCOL *This,\r
+ IN UINT32 MediaId,\r
+ IN UINT64 Offset,\r
+ IN UINTN BufferSize,\r
+ IN VOID *Buffer\r
+ );\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gDiskIoDriverBinding = {\r
+ DiskIoDriverBindingSupported,\r
+ DiskIoDriverBindingStart,\r
+ DiskIoDriverBindingStop,\r
+ 0x10,\r
+ NULL,\r
+ NULL\r
+};\r
+\r
+DISK_IO_PRIVATE_DATA gDiskIoPrivateDataTemplate = {\r
+ DISK_IO_PRIVATE_DATA_SIGNATURE,\r
+ {\r
+ EFI_DISK_IO_PROTOCOL_REVISION,\r
+ DiskIoReadDisk,\r
+ DiskIoWriteDisk\r
+ },\r
+ NULL\r
+};\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
+ than contains a BlockIo protocol can be supported.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ ControllerHandle - Handle of device to test.\r
+ RemainingDevicePath - Not used.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - This driver supports this device.\r
+ EFI_ALREADY_STARTED - This driver is already running on this device.\r
+ other - This driver does not support this device.\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+\r
+ //\r
+ // Open the IO Abstraction(s) needed to perform the supported test.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ (VOID **) &BlockIo,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ //\r
+ // Close the I/O Abstraction(s) used to perform the supported test.\r
+ //\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Start this driver on ControllerHandle by opening a Block IO protocol and\r
+ installing a Disk IO protocol on ControllerHandle.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ ControllerHandle - Handle of device to bind driver to.\r
+ RemainingDevicePath - Not used, always produce all possible children.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - This driver is added to ControllerHandle.\r
+ EFI_ALREADY_STARTED - This driver is already running on ControllerHandle.\r
+ other - This driver does not support this device.\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ DISK_IO_PRIVATE_DATA *Private;\r
+\r
+ Private = NULL;\r
+\r
+ //\r
+ // Connect to the Block IO interface on ControllerHandle.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ (VOID **) &gDiskIoPrivateDataTemplate.BlockIo,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ //\r
+ // Initialize the Disk IO device instance.\r
+ //\r
+ Private = AllocateCopyPool (sizeof (DISK_IO_PRIVATE_DATA), &gDiskIoPrivateDataTemplate);\r
+ if (Private == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto ErrorExit;\r
+ }\r
+ //\r
+ // Install protocol interfaces for the Disk IO device.\r
+ //\r
+ Status = gBS->InstallProtocolInterface (\r
+ &ControllerHandle,\r
+ &gEfiDiskIoProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ &Private->DiskIo\r
+ );\r
+\r
+ErrorExit:\r
+ if (EFI_ERROR (Status)) {\r
+\r
+ if (Private != NULL) {\r
+ gBS->FreePool (Private);\r
+ }\r
+\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Stop this driver on ControllerHandle by removing Disk IO protocol and closing\r
+ the Block IO protocol on ControllerHandle.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ ControllerHandle - Handle of device to stop driver on.\r
+ NumberOfChildren - Not used.\r
+ ChildHandleBuffer - Not used.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - This driver is removed ControllerHandle.\r
+ other - This driver was not removed from this device.\r
+ EFI_UNSUPPORTED\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DISK_IO_PROTOCOL *DiskIo;\r
+ DISK_IO_PRIVATE_DATA *Private;\r
+\r
+ //\r
+ // Get our context back.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ &gEfiDiskIoProtocolGuid,\r
+ (VOID **) &DiskIo,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+ Status = gBS->UninstallProtocolInterface (\r
+ ControllerHandle,\r
+ &gEfiDiskIoProtocolGuid,\r
+ &Private->DiskIo\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+\r
+ Status = gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ &gEfiBlockIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+ }\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->FreePool (Private);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+ IN EFI_DISK_IO_PROTOCOL *This,\r
+ IN UINT32 MediaId,\r
+ IN UINT64 Offset,\r
+ IN UINTN BufferSize,\r
+ OUT VOID *Buffer\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Read BufferSize bytes from Offset into Buffer.\r
+\r
+ Reads may support reads that are not aligned on\r
+ sector boundaries. There are three cases:\r
+\r
+ UnderRun - The first byte is not on a sector boundary or the read request is\r
+ less than a sector in length.\r
+\r
+ Aligned - A read of N contiguous sectors.\r
+\r
+ OverRun - The last byte is not on a sector boundary.\r
+\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ MediaId - Id of the media, changes every time the media is replaced.\r
+ Offset - The starting byte offset to read from.\r
+ BufferSize - Size of Buffer.\r
+ Buffer - Buffer containing read data.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - The data was read correctly from the device.\r
+ EFI_DEVICE_ERROR - The device reported an error while performing the read.\r
+ EFI_NO_MEDIA - There is no media in the device.\r
+ EFI_MEDIA_CHNAGED - The MediaId does not matched the current device.\r
+ EFI_INVALID_PARAMETER - The read request contains device addresses that are not\r
+ valid for the device.\r
+ EFI_OUT_OF_RESOURCES\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ DISK_IO_PRIVATE_DATA *Private;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+ EFI_BLOCK_IO_MEDIA *Media;\r
+ UINT32 BlockSize;\r
+ UINT64 Lba;\r
+ UINT64 OverRunLba;\r
+ UINT32 UnderRun;\r
+ UINT32 OverRun;\r
+ BOOLEAN TransactionComplete;\r
+ UINTN WorkingBufferSize;\r
+ UINT8 *WorkingBuffer;\r
+ UINTN Length;\r
+ UINT8 *Data;\r
+ UINT8 *PreData;\r
+ UINTN IsBufferAligned;\r
+ UINTN DataBufferSize;\r
+ BOOLEAN LastRead;\r
+\r
+ Private = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ BlockIo = Private->BlockIo;\r
+ Media = BlockIo->Media;\r
+ BlockSize = Media->BlockSize;\r
+\r
+ if (Media->MediaId != MediaId) {\r
+ return EFI_MEDIA_CHANGED;\r
+ }\r
+\r
+ WorkingBuffer = Buffer;\r
+ WorkingBufferSize = BufferSize;\r
+\r
+ //\r
+ // Allocate a temporary buffer for operation\r
+ //\r
+ DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+ if (Media->IoAlign > 1) {\r
+ PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+ Data = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+ } else {\r
+ PreData = AllocatePool (DataBufferSize);\r
+ Data = PreData;\r
+ }\r
+\r
+ if (PreData == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ Lba = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+ Length = BlockSize - UnderRun;\r
+ TransactionComplete = FALSE;\r
+\r
+ Status = EFI_SUCCESS;\r
+ if (UnderRun != 0) {\r
+ //\r
+ // Offset starts in the middle of an Lba, so read the entire block.\r
+ //\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ if (Length > BufferSize) {\r
+ Length = BufferSize;\r
+ TransactionComplete = TRUE;\r
+ }\r
+\r
+ CopyMem (WorkingBuffer, Data + UnderRun, Length);\r
+\r
+ WorkingBuffer += Length;\r
+\r
+ WorkingBufferSize -= Length;\r
+ if (WorkingBufferSize == 0) {\r
+ goto Done;\r
+ }\r
+\r
+ Lba += 1;\r
+ }\r
+\r
+ OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+ if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+ //\r
+ // If the DiskIo maps directly to a BlockIo device do the read.\r
+ //\r
+ if (OverRun != 0) {\r
+ WorkingBufferSize -= OverRun;\r
+ }\r
+ //\r
+ // Check buffer alignment\r
+ //\r
+ IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+ if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+ //\r
+ // Alignment is satisfied, so read them together\r
+ //\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ WorkingBufferSize,\r
+ WorkingBuffer\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ WorkingBuffer += WorkingBufferSize;\r
+\r
+ } else {\r
+ //\r
+ // Use the allocated buffer instead of the original buffer\r
+ // to avoid alignment issue.\r
+ // Here, the allocated buffer (8-byte align) can satisfy the alignment\r
+ //\r
+ LastRead = FALSE;\r
+ do {\r
+ if (WorkingBufferSize <= DataBufferSize) {\r
+ //\r
+ // It is the last calling to readblocks in this loop\r
+ //\r
+ DataBufferSize = WorkingBufferSize;\r
+ LastRead = TRUE;\r
+ }\r
+\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ DataBufferSize,\r
+ Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ CopyMem (WorkingBuffer, Data, DataBufferSize);\r
+ WorkingBufferSize -= DataBufferSize;\r
+ WorkingBuffer += DataBufferSize;\r
+ Lba += DATA_BUFFER_BLOCK_NUM;\r
+ } while (!LastRead);\r
+ }\r
+ }\r
+\r
+ if (!TransactionComplete && OverRun != 0) {\r
+ //\r
+ // Last read is not a complete block.\r
+ //\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ OverRunLba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ CopyMem (WorkingBuffer, Data, OverRun);\r
+ }\r
+\r
+Done:\r
+ if (PreData != NULL) {\r
+ gBS->FreePool (PreData);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+ IN EFI_DISK_IO_PROTOCOL *This,\r
+ IN UINT32 MediaId,\r
+ IN UINT64 Offset,\r
+ IN UINTN BufferSize,\r
+ IN VOID *Buffer\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Read BufferSize bytes from Offset into Buffer.\r
+\r
+ Writes may require a read modify write to support writes that are not\r
+ aligned on sector boundaries. There are three cases:\r
+\r
+ UnderRun - The first byte is not on a sector boundary or the write request\r
+ is less than a sector in length. Read modify write is required.\r
+\r
+ Aligned - A write of N contiguous sectors.\r
+\r
+ OverRun - The last byte is not on a sector boundary. Read modified write\r
+ required.\r
+\r
+ Arguments:\r
+ This - Protocol instance pointer.\r
+ MediaId - Id of the media, changes every time the media is replaced.\r
+ Offset - The starting byte offset to read from.\r
+ BufferSize - Size of Buffer.\r
+ Buffer - Buffer containing read data.\r
+\r
+ Returns:\r
+ EFI_SUCCESS - The data was written correctly to the device.\r
+ EFI_WRITE_PROTECTED - The device can not be written to.\r
+ EFI_DEVICE_ERROR - The device reported an error while performing the write.\r
+ EFI_NO_MEDIA - There is no media in the device.\r
+ EFI_MEDIA_CHNAGED - The MediaId does not matched the current device.\r
+ EFI_INVALID_PARAMETER - The write request contains device addresses that are not\r
+ valid for the device.\r
+ EFI_OUT_OF_RESOURCES\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ DISK_IO_PRIVATE_DATA *Private;\r
+ EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+ EFI_BLOCK_IO_MEDIA *Media;\r
+ UINT32 BlockSize;\r
+ UINT64 Lba;\r
+ UINT64 OverRunLba;\r
+ UINT32 UnderRun;\r
+ UINT32 OverRun;\r
+ BOOLEAN TransactionComplete;\r
+ UINTN WorkingBufferSize;\r
+ UINT8 *WorkingBuffer;\r
+ UINTN Length;\r
+ UINT8 *Data;\r
+ UINT8 *PreData;\r
+ UINTN IsBufferAligned;\r
+ UINTN DataBufferSize;\r
+ BOOLEAN LastWrite;\r
+\r
+ Private = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+ BlockIo = Private->BlockIo;\r
+ Media = BlockIo->Media;\r
+ BlockSize = Media->BlockSize;\r
+\r
+ if (Media->ReadOnly) {\r
+ return EFI_WRITE_PROTECTED;\r
+ }\r
+\r
+ if (Media->MediaId != MediaId) {\r
+ return EFI_MEDIA_CHANGED;\r
+ }\r
+\r
+ DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+ if (Media->IoAlign > 1) {\r
+ PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+ Data = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+ } else {\r
+ PreData = AllocatePool (DataBufferSize);\r
+ Data = PreData;\r
+ }\r
+\r
+ if (PreData == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ WorkingBuffer = Buffer;\r
+ WorkingBufferSize = BufferSize;\r
+\r
+ Lba = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+ Length = BlockSize - UnderRun;\r
+ TransactionComplete = FALSE;\r
+\r
+ Status = EFI_SUCCESS;\r
+ if (UnderRun != 0) {\r
+ //\r
+ // Offset starts in the middle of an Lba, so do read modify write.\r
+ //\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ if (Length > BufferSize) {\r
+ Length = BufferSize;\r
+ TransactionComplete = TRUE;\r
+ }\r
+\r
+ CopyMem (Data + UnderRun, WorkingBuffer, Length);\r
+\r
+ Status = BlockIo->WriteBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ WorkingBuffer += Length;\r
+ WorkingBufferSize -= Length;\r
+ if (WorkingBufferSize == 0) {\r
+ goto Done;\r
+ }\r
+\r
+ Lba += 1;\r
+ }\r
+\r
+ OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+ if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+ //\r
+ // If the DiskIo maps directly to a BlockIo device do the write.\r
+ //\r
+ if (OverRun != 0) {\r
+ WorkingBufferSize -= OverRun;\r
+ }\r
+ //\r
+ // Check buffer alignment\r
+ //\r
+ IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+ if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+ //\r
+ // Alignment is satisfied, so write them together\r
+ //\r
+ Status = BlockIo->WriteBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ WorkingBufferSize,\r
+ WorkingBuffer\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ WorkingBuffer += WorkingBufferSize;\r
+\r
+ } else {\r
+ //\r
+ // The buffer parameter is not aligned with the request\r
+ // So use the allocated instead.\r
+ // It can fit almost all the cases.\r
+ //\r
+ LastWrite = FALSE;\r
+ do {\r
+ if (WorkingBufferSize <= DataBufferSize) {\r
+ //\r
+ // It is the last calling to writeblocks in this loop\r
+ //\r
+ DataBufferSize = WorkingBufferSize;\r
+ LastWrite = TRUE;\r
+ }\r
+\r
+ CopyMem (Data, WorkingBuffer, DataBufferSize);\r
+ Status = BlockIo->WriteBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ Lba,\r
+ DataBufferSize,\r
+ Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ WorkingBufferSize -= DataBufferSize;\r
+ WorkingBuffer += DataBufferSize;\r
+ Lba += DATA_BUFFER_BLOCK_NUM;\r
+ } while (!LastWrite);\r
+ }\r
+ }\r
+\r
+ if (!TransactionComplete && OverRun != 0) {\r
+ //\r
+ // Last bit is not a complete block, so do a read modify write.\r
+ //\r
+ Status = BlockIo->ReadBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ OverRunLba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ CopyMem (Data, WorkingBuffer, OverRun);\r
+\r
+ Status = BlockIo->WriteBlocks (\r
+ BlockIo,\r
+ MediaId,\r
+ OverRunLba,\r
+ BlockSize,\r
+ Data\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ }\r
+\r
+Done:\r
+ if (PreData != NULL) {\r
+ gBS->FreePool (PreData);\r
+ }\r
+\r
+ return Status;\r
+}\r