diff mbox

[edk2,RFC,1/4] Add "LinuxTerm" terminal type to TerminalDxe

Message ID 1431561241-1411-2-git-send-email-roy.franz@linaro.org
State New
Headers show

Commit Message

Roy Franz May 13, 2015, 11:53 p.m. UTC
This patch adds new terminal type, LinuxTerm, to TerminalDxe.  This terminal
type provides a place to add support for various Linux terminals that don't
behave like standard VT terminals.

Signed-off-by: Roy Franz <roy.franz@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
---
 BaseTools/Source/C/Include/Guid/PcAnsi.h           |  6 +++
 .../Foundation/Efi/Guid/PcAnsi/PcAnsi.c            |  2 +
 .../Foundation/Efi/Guid/PcAnsi/PcAnsi.h            |  6 +++
 .../Universal/BdsDxe/BootMaint/BootMaint.h         |  2 +-
 .../Universal/BdsDxe/BootMaint/Data.c              |  5 ++-
 .../Universal/Console/TerminalDxe/Terminal.c       | 44 ++++++++++++++++++----
 .../Universal/Console/TerminalDxe/Terminal.h       |  1 +
 .../Universal/Console/TerminalDxe/TerminalConIn.c  |  4 +-
 .../Universal/Console/TerminalDxe/TerminalConOut.c |  2 +
 .../Universal/Console/TerminalDxe/TerminalDxe.inf  |  1 +
 MdePkg/Include/Guid/PcAnsi.h                       |  6 +++
 MdePkg/Include/Protocol/DevicePath.h               |  1 +
 .../Library/UefiDevicePathLib/DevicePathFromText.c | 27 +++++++++++++
 .../Library/UefiDevicePathLib/DevicePathToText.c   |  3 ++
 .../UefiDevicePathLib/UefiDevicePathLib.inf        |  2 +
 ...UefiDevicePathLibOptionalDevicePathProtocol.inf |  4 +-
 MdePkg/MdePkg.dec                                  |  3 ++
 .../UefiHandleParsingLib/UefiHandleParsingLib.c    |  1 +
 .../UefiHandleParsingLib/UefiHandleParsingLib.inf  |  1 +
 19 files changed, 109 insertions(+), 12 deletions(-)
diff mbox

Patch

diff --git a/BaseTools/Source/C/Include/Guid/PcAnsi.h b/BaseTools/Source/C/Include/Guid/PcAnsi.h
index 9f12ca2..188a9b1 100644
--- a/BaseTools/Source/C/Include/Guid/PcAnsi.h
+++ b/BaseTools/Source/C/Include/Guid/PcAnsi.h
@@ -38,6 +38,11 @@ 
     0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88 } \
   }
 
+#define EFI_LINUX_TERM_GUID \
+  { \
+    0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 } \
+  }
+
 #define EFI_UART_DEVICE_PATH_GUID \
   { \
     0x37499a9d, 0x542f, 0x4c89, {0xa0, 0x26, 0x35, 0xda, 0x14, 0x20, 0x94, 0xe4 } \
@@ -52,6 +57,7 @@  extern EFI_GUID gEfiPcAnsiGuid;
 extern EFI_GUID gEfiVT100Guid;
 extern EFI_GUID gEfiVT100PlusGuid;
 extern EFI_GUID gEfiVTUTF8Guid;
+extern EFI_GUID gEfiLinuxTermGuid;
 extern EFI_GUID gEfiUartDevicePathGuid;
 extern EFI_GUID gEfiSasDevicePathGuid;
 
diff --git a/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.c b/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.c
index 1f184e6..c6852b1 100644
--- a/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.c
+++ b/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.c
@@ -27,8 +27,10 @@  EFI_GUID  gEfiPcAnsiGuid    = EFI_PC_ANSI_GUID;
 EFI_GUID  gEfiVT100Guid     = EFI_VT_100_GUID;
 EFI_GUID  gEfiVT100PlusGuid = EFI_VT_100_PLUS_GUID;
 EFI_GUID  gEfiVTUTF8Guid    = EFI_VT_UTF8_GUID;
+EFI_GUID  gEfiLinuxTermGuid = EFI_LINUX_TERM_GUID;
 
 EFI_GUID_STRING(&gEfiPcAnsiGuid, "Efi", "Efi PC ANSI Device Path Vendor GUID")
 EFI_GUID_STRING(&gEfiVT100Guid, "Efi", "Efi VT100 Device Path Vendor GUID")
 EFI_GUID_STRING(&gEfiVT100PlusGuid, "Efi", "Efi VT100Plus Device Path Vendor GUID")
 EFI_GUID_STRING(&gEfiVTUTF8Guid, "Efi", "Efi VTUTF8 Device Path Vendor GUID")
+EFI_GUID_STRING(&gEfiLinuxTermGuid, "Efi", "Efi Linux Terminal Device Path Vendor GUID")
diff --git a/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.h b/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.h
index 7181020..9461a35 100644
--- a/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.h
+++ b/EdkCompatibilityPkg/Foundation/Efi/Guid/PcAnsi/PcAnsi.h
@@ -42,9 +42,15 @@  Abstract:
     0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88} \
   }
 
+#define EFI_LINUX_TERM_GUID \
+  { \
+    0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 } \
+  }
+
 extern EFI_GUID gEfiPcAnsiGuid;
 extern EFI_GUID gEfiVT100Guid;
 extern EFI_GUID gEfiVT100PlusGuid;
 extern EFI_GUID gEfiVTUTF8Guid;
+extern EFI_GUID gEfiLinuxTermGuid;
 
 #endif
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h
index 098692f..bfa9b63 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h
@@ -1657,7 +1657,7 @@  extern COM_ATTR                   BaudRateList[19];
 extern COM_ATTR                   DataBitsList[4];
 extern COM_ATTR                   ParityList[5];
 extern COM_ATTR                   StopBitsList[3];
-extern EFI_GUID                   TerminalTypeGuid[4];
+extern EFI_GUID                   TerminalTypeGuid[5];
 extern STRING_DEPOSITORY          *FileOptionStrDepository;
 extern STRING_DEPOSITORY          *ConsoleOptionStrDepository;
 extern STRING_DEPOSITORY          *BootOptionStrDepository;
diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Data.c b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Data.c
index 0a3ffbc..3f22efa 100644
--- a/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Data.c
+++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BootMaint/Data.c
@@ -324,9 +324,10 @@  COM_ATTR            StopBitsList[3] = {
 ///
 /// Guid for messaging path, used in Serial port setting.
 ///
-EFI_GUID            TerminalTypeGuid[4] = {
+EFI_GUID            TerminalTypeGuid[5] = {
   DEVICE_PATH_MESSAGING_PC_ANSI,
   DEVICE_PATH_MESSAGING_VT_100,
   DEVICE_PATH_MESSAGING_VT_100_PLUS,
-  DEVICE_PATH_MESSAGING_VT_UTF8
+  DEVICE_PATH_MESSAGING_VT_UTF8,
+  DEVICE_PATH_MESSAGING_LINUX_TERM
 };
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
index 966fb79..3371dcc 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
@@ -33,7 +33,8 @@  EFI_GUID  *gTerminalType[] = {
   &gEfiPcAnsiGuid,
   &gEfiVT100Guid,
   &gEfiVT100PlusGuid,
-  &gEfiVTUTF8Guid
+  &gEfiVTUTF8Guid,
+  &gEfiLinuxTermGuid
 };
 
 
@@ -152,12 +153,13 @@  TerminalDriverBindingSupported (
 
       }
       //
-      // only supports PC ANSI, VT100, VT100+ and VT-UTF8 terminal types
+      // only supports PC ANSI, VT100, VT100+, VT-UTF8, and Linux terminal types
       //
       if (!CompareGuid (&Node->Guid, &gEfiPcAnsiGuid) &&
           !CompareGuid (&Node->Guid, &gEfiVT100Guid) &&
           !CompareGuid (&Node->Guid, &gEfiVT100PlusGuid) &&
-          !CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {
+          !CompareGuid (&Node->Guid, &gEfiVTUTF8Guid) &&
+          !CompareGuid (&Node->Guid, &gEfiLinuxTermGuid)) {
 
         return EFI_UNSUPPORTED;
       }
@@ -275,6 +277,10 @@  BuildTerminalDevpath  (
 
     TerminalType = VTUTF8TYPE;
 
+  } else if (CompareGuid (&Node->Guid, &gEfiLinuxTermGuid)) {
+
+    TerminalType = LINUXTERMTYPE;
+
   } else {
     return NULL;
   }
@@ -708,9 +714,9 @@  TerminalDriverBindingStart (
 
       TerminalType = PcdGet8 (PcdDefaultTerminalType);
       //
-      // Must be between PCANSITYPE (0) and VTUTF8TYPE (3)
+      // Must be between PCANSITYPE (0) and LINUXTERMTYPE (4)
       //
-      ASSERT (TerminalType <= VTUTF8TYPE);
+      ASSERT (TerminalType <= LINUXTERMTYPE);
 
       CopyMem (&DefaultNode->Guid, gTerminalType[TerminalType], sizeof (EFI_GUID));
       RemainingDevicePath = (EFI_DEVICE_PATH_PROTOCOL *) DefaultNode;
@@ -728,6 +734,8 @@  TerminalDriverBindingStart (
         TerminalType = VT100PLUSTYPE;
       } else if (CompareGuid (&Node->Guid, &gEfiVTUTF8Guid)) {
         TerminalType = VTUTF8TYPE;
+      } else if (CompareGuid (&Node->Guid, &gEfiLinuxTermGuid)) {
+        TerminalType = LINUXTERMTYPE;
       } else {
         goto Error;
       }
@@ -926,6 +934,24 @@  TerminalDriverBindingStart (
         );
 
       break;
+
+    case LINUXTERMTYPE:
+      AddUnicodeString2 (
+        "eng",
+        gTerminalComponentName.SupportedLanguages,
+        &TerminalDevice->ControllerNameTable,
+        (CHAR16 *)L"Linux Terminal Serial Console",
+        TRUE
+        );
+      AddUnicodeString2 (
+        "en",
+        gTerminalComponentName2.SupportedLanguages,
+        &TerminalDevice->ControllerNameTable,
+        (CHAR16 *)L"Linux Terminal Serial Console",
+        FALSE
+        );
+
+      break;
     }
 
     //
@@ -1441,7 +1467,7 @@  TerminalUpdateConsoleDevVariable (
   //
   // Append terminal device path onto the variable.
   //
-  for (TerminalType = PCANSITYPE; TerminalType <= VTUTF8TYPE; TerminalType++) {
+  for (TerminalType = PCANSITYPE; TerminalType <= LINUXTERMTYPE; TerminalType++) {
     SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);
     NewVariable = AppendDevicePathInstance (Variable, TempDevicePath);
     ASSERT (NewVariable != NULL);
@@ -1554,7 +1580,7 @@  TerminalRemoveConsoleDevVariable (
     // Loop through all the terminal types that this driver supports
     //
     Match = FALSE;
-    for (TerminalType = PCANSITYPE; TerminalType <= VTUTF8TYPE; TerminalType++) {
+    for (TerminalType = PCANSITYPE; TerminalType <= LINUXTERMTYPE; TerminalType++) {
 
       SetTerminalDevicePath (TerminalType, ParentDevicePath, &TempDevicePath);
 
@@ -1658,6 +1684,10 @@  SetTerminalDevicePath (
     CopyGuid (&Node.Guid, &gEfiVTUTF8Guid);
     break;
 
+  case LINUXTERMTYPE:
+    CopyGuid (&Node.Guid, &gEfiLinuxTermGuid);
+    break;
+
   default:
     return EFI_UNSUPPORTED;
   }
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
index d393acb..e0335db 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
@@ -136,6 +136,7 @@  typedef union {
 #define VT100TYPE                 1
 #define VT100PLUSTYPE             2
 #define VTUTF8TYPE                3
+#define LINUXTERMTYPE             4
 
 #define LEFTOPENBRACKET           0x5b  // '['
 #define ACAP                      0x41
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
index 4a008c9..51492f3 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConIn.c
@@ -454,6 +454,7 @@  TranslateRawDataToEfiKey (
   case PCANSITYPE:
   case VT100TYPE:
   case VT100PLUSTYPE:
+  case LINUXTERMTYPE:
     AnsiRawDataToUnicode (TerminalDevice);
     UnicodeToEfiKey (TerminalDevice);
     break;
@@ -1393,7 +1394,8 @@  UnicodeToEfiKey (
       if (TerminalDevice->TerminalType == PCANSITYPE    ||
           TerminalDevice->TerminalType == VT100TYPE     ||
           TerminalDevice->TerminalType == VT100PLUSTYPE ||
-          TerminalDevice->TerminalType == VTUTF8TYPE) {
+          TerminalDevice->TerminalType == VTUTF8TYPE    ||
+          TerminalDevice->TerminalType == LINUXTERMTYPE) {
         switch (UnicodeChar) {
         case 'A':
           Key.ScanCode = SCAN_UP;
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
index affb3ae..868a014 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c
@@ -223,6 +223,7 @@  TerminalConOutOutputString (
     case PCANSITYPE:
     case VT100TYPE:
     case VT100PLUSTYPE:
+    case LINUXTERMTYPE:
 
       if (!TerminalIsValidTextGraphics (*WString, &GraphicChar, &AsciiChar)) {
         //
@@ -371,6 +372,7 @@  TerminalConOutTestString (
   case PCANSITYPE:
   case VT100TYPE:
   case VT100PLUSTYPE:
+  case LINUXTERMTYPE:
     Status = AnsiTestString (TerminalDevice, WString);
     break;
 
diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
index 1d86388..7c6e3d3 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
@@ -73,6 +73,7 @@ 
   gEfiVT100Guid                                 ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path
   gEfiVT100PlusGuid                             ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path
   gEfiPcAnsiGuid                                ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path
+  gEfiLinuxTermGuid                             ## SOMETIMES_CONSUMES ## GUID # used with a Vendor-Defined Messaging Device Path
   gEdkiiStatusCodeDataTypeVariableGuid          ## SOMETIMES_CONSUMES ## GUID
 
 [Protocols]
diff --git a/MdePkg/Include/Guid/PcAnsi.h b/MdePkg/Include/Guid/PcAnsi.h
index e576fd3..61759f8 100644
--- a/MdePkg/Include/Guid/PcAnsi.h
+++ b/MdePkg/Include/Guid/PcAnsi.h
@@ -38,6 +38,11 @@ 
     0xad15a0d6, 0x8bec, 0x4acf, {0xa0, 0x73, 0xd0, 0x1d, 0xe7, 0x7e, 0x2d, 0x88 } \
   }
 
+#define EFI_LINUX_TERM_GUID \
+  { \
+    0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 } \
+  }
+
 #define DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL \
   { \
     0x37499a9d, 0x542f, 0x4c89, {0xa0, 0x26, 0x35, 0xda, 0x14, 0x20, 0x94, 0xe4 } \
@@ -52,6 +57,7 @@  extern EFI_GUID gEfiPcAnsiGuid;
 extern EFI_GUID gEfiVT100Guid;
 extern EFI_GUID gEfiVT100PlusGuid;
 extern EFI_GUID gEfiVTUTF8Guid;
+extern EFI_GUID gEfiLinuxTermGuid;
 extern EFI_GUID gEfiUartDevicePathGuid;
 extern EFI_GUID gEfiSasDevicePathGuid;
 
diff --git a/MdePkg/Include/Protocol/DevicePath.h b/MdePkg/Include/Protocol/DevicePath.h
index 7cf7113..a718bd4 100644
--- a/MdePkg/Include/Protocol/DevicePath.h
+++ b/MdePkg/Include/Protocol/DevicePath.h
@@ -706,6 +706,7 @@  typedef VENDOR_DEVICE_PATH        VENDOR_DEFINED_DEVICE_PATH;
 #define DEVICE_PATH_MESSAGING_VT_100      EFI_VT_100_GUID
 #define DEVICE_PATH_MESSAGING_VT_100_PLUS EFI_VT_100_PLUS_GUID
 #define DEVICE_PATH_MESSAGING_VT_UTF8     EFI_VT_UTF8_GUID
+#define DEVICE_PATH_MESSAGING_LINUX_TERM  EFI_LINUX_TERM_GUID
 
 ///
 /// A new device path node is defined to declare flow control characteristics.
diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
index 6ec0a4c..f473b39 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
@@ -1545,6 +1545,32 @@  DevPathFromTextVenUtf8 (
 }
 
 /**
+  Converts a text device path node to Vendor defined Linux terminal device
+  path structure.
+
+  @param TextDeviceNode  The input Text device path node.
+
+  @return A pointer to the newly-created Vendor defined Linux terminal
+          device path structure.
+
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+DevPathFromTextVenLinuxTerm (
+  IN CHAR16 *TextDeviceNode
+  )
+{
+  VENDOR_DEVICE_PATH  *Vendor;
+
+  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
+                                    MESSAGING_DEVICE_PATH,
+                                    MSG_VENDOR_DP,
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));
+  CopyGuid (&Vendor->Guid, &gEfiLinuxTermGuid);
+
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
+}
+
+/**
   Converts a text device path node to UART Flow Control device path structure.
 
   @param TextDeviceNode  The input Text device path node.
@@ -3075,6 +3101,7 @@  GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"VenVt100",                DevPathFromTextVenVt100                },
   {L"VenVt100Plus",            DevPathFromTextVenVt100Plus            },
   {L"VenUtf8",                 DevPathFromTextVenUtf8                 },
+  {L"VenLinuxTerm",            DevPathFromTextVenLinuxTerm            },
   {L"UartFlowCtrl",            DevPathFromTextUartFlowCtrl            },
   {L"SAS",                     DevPathFromTextSAS                     },
   {L"SasEx",                   DevPathFromTextSasEx                   },
diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
index 0300019..f7df807 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
@@ -194,6 +194,9 @@  DevPathToTextVendor (
       } else if (CompareGuid (&Vendor->Guid, &gEfiVTUTF8Guid)) {
         UefiDevicePathLibCatPrint (Str, L"VenUft8()");
         return ;
+      } else if (CompareGuid (&Vendor->Guid, &gEfiLinuxTermGuid)) {
+        UefiDevicePathLibCatPrint (Str, L"VenLinuxTerm()");
+        return ;
       } else if (CompareGuid (&Vendor->Guid, &gEfiUartDevicePathGuid)) {
         FlowControlMap = (((UART_FLOW_CONTROL_DEVICE_PATH *) Vendor)->FlowControlMap);
         switch (FlowControlMap & 0x00000003) {
diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
index f4ae91f..a1bad14 100644
--- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
+++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf
@@ -58,6 +58,8 @@ 
   ## SOMETIMES_CONSUMES  ## GUID
   gEfiPcAnsiGuid
   ## SOMETIMES_CONSUMES  ## GUID
+  gEfiLinuxTermGuid
+  ## SOMETIMES_CONSUMES  ## GUID
   gEfiUartDevicePathGuid
   ## SOMETIMES_CONSUMES  ## GUID
   gEfiSasDevicePathGuid
diff --git a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
index 943ba2d..b529400 100644
--- a/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
+++ b/MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibOptionalDevicePathProtocol.inf
@@ -62,6 +62,8 @@ 
   ## SOMETIMES_CONSUMES  ## GUID
   gEfiPcAnsiGuid
   ## SOMETIMES_CONSUMES  ## GUID
+  gEfiLinuxTermGuid
+  ## SOMETIMES_CONSUMES  ## GUID
   gEfiUartDevicePathGuid
   ## SOMETIMES_CONSUMES  ## GUID
   gEfiSasDevicePathGuid
@@ -78,4 +80,4 @@ 
 
 [Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER]
   gEfiDevicePathUtilitiesProtocolGuid
-  
\ No newline at end of file
+  
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index f9c9d5f..b1b0038 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -269,6 +269,9 @@ 
   gEfiVTUTF8Guid                 = { 0xAD15A0D6, 0x8BEC, 0x4ACF, { 0xA0, 0x73, 0xD0, 0x1D, 0xE7, 0x7E, 0x2D, 0x88 }}
 
   ## Include/Guid/PcAnsi.h
+  gEfiLinuxTermGuid              = { 0x7d916d80, 0x5bb1, 0x458c, {0xa4, 0x8f, 0xe2, 0x5f, 0xdd, 0x51, 0xef, 0x94 }}
+
+  ## Include/Guid/PcAnsi.h
   gEfiUartDevicePathGuid         = { 0x37499a9d, 0x542f, 0x4c89, { 0xa0, 0x26, 0x35, 0xda, 0x14, 0x20, 0x94, 0xe4 }}
 
   ## Include/Guid/PcAnsi.h
diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
index 9a2daa9..9baaed7 100644
--- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
+++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
@@ -848,6 +848,7 @@  STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_DEVICE_PATH_VT100),     &gEfiVT100Guid,                                   NULL},
   {STRING_TOKEN(STR_DEVICE_PATH_VT100P),    &gEfiVT100PlusGuid,                               NULL},
   {STRING_TOKEN(STR_DEVICE_PATH_VTUTF8),    &gEfiVTUTF8Guid,                                  NULL},
+  {STRING_TOKEN(STR_DEVICE_PATH_LINUXTERM), &gEfiLinuxTermGuid,                               NULL},
   {STRING_TOKEN(STR_DRIVER_BINDING),        &gEfiDriverBindingProtocolGuid,                   NULL},
   {STRING_TOKEN(STR_PLATFORM_OVERRIDE),     &gEfiPlatformDriverOverrideProtocolGuid,          NULL},
   {STRING_TOKEN(STR_BUS_OVERRIDE),          &gEfiBusSpecificDriverOverrideProtocolGuid,       NULL},
diff --git a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
index c95f41b..716dbd7 100644
--- a/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+++ b/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
@@ -181,6 +181,7 @@ 
   gEfiVT100Guid                                           ##UNDEFINED
   gEfiVT100PlusGuid                                       ##UNDEFINED
   gEfiVTUTF8Guid                                          ##UNDEFINED
+  gEfiLinuxTermGuid                                       ##UNDEFINED
   gEfiStandardErrorDeviceGuid                             ##UNDEFINED
   gEfiConsoleInDeviceGuid                                 ##UNDEFINED
   gEfiConsoleOutDeviceGuid                                ##UNDEFINED