]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add emulated serialIo device driver for EdkUnixPkg
authorklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2007 07:22:41 +0000 (07:22 +0000)
committerklu2 <klu2@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2007 07:22:41 +0000 (07:22 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2605 6f19259b-4bc3-4df7-8a09-765794883524

EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/ComponentName.c [new file with mode: 0644]
EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.c [new file with mode: 0644]
EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.h [new file with mode: 0644]
EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.msa [new file with mode: 0644]
EdkUnixPkg/Dxe/UnixThunk/Bus/UnixBusDriver/UnixBusDriver.c
EdkUnixPkg/Dxe/UnixThunk/Bus/UnixBusDriver/UnixBusDriver.msa
EdkUnixPkg/EdkUnixPkg.spd
EdkUnixPkg/Include/Protocol/UnixIo.h
EdkUnixPkg/Include/Protocol/UnixThunk.h
EdkUnixPkg/Sec/UnixThunk.c
EdkUnixPkg/Unix.fpd

diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/ComponentName.c b/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/ComponentName.c
new file mode 100644 (file)
index 0000000..2b7cb92
--- /dev/null
@@ -0,0 +1,208 @@
+/*++\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
+  ComponentName.c\r
+\r
+Abstract:\r
+\r
+--*/\r
+\r
+#include "UnixSerialIo.h"\r
+\r
+//\r
+// EFI Component Name Functions\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoComponentNameGetDriverName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
+  IN  CHAR8                        *Language,\r
+  OUT CHAR16                       **DriverName\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoComponentNameGetControllerName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
+  IN  EFI_HANDLE                                      ControllerHandle,\r
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
+  IN  CHAR8                                           *Language,\r
+  OUT CHAR16                                          **ControllerName\r
+  );\r
+\r
+//\r
+// EFI Component Name Protocol\r
+//\r
+EFI_COMPONENT_NAME_PROTOCOL     gUnixSerialIoComponentName = {\r
+  UnixSerialIoComponentNameGetDriverName,\r
+  UnixSerialIoComponentNameGetControllerName,\r
+  "eng"\r
+};\r
+\r
+static EFI_UNICODE_STRING_TABLE mUnixSerialIoDriverNameTable[] = {\r
+  { "eng", L"Unix Serial I/O Driver" },\r
+  { NULL , NULL }\r
+};\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoComponentNameGetDriverName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL  *This,\r
+  IN  CHAR8                        *Language,\r
+  OUT CHAR16                       **DriverName\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Retrieves a Unicode string that is the user readable name of the EFI Driver.\r
+\r
+  Arguments:\r
+    This       - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.\r
+    Language   - A pointer to a three character ISO 639-2 language identifier.\r
+                 This is the language of the driver name that that the caller \r
+                 is requesting, and it must match one of the languages specified\r
+                 in SupportedLanguages.  The number of languages supported by a \r
+                 driver is up to the driver writer.\r
+    DriverName - A pointer to the Unicode string to return.  This Unicode string\r
+                 is the name of the driver specified by This in the language \r
+                 specified by Language.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The Unicode string for the Driver specified by This\r
+                            and the language specified by Language was returned \r
+                            in DriverName.\r
+    EFI_INVALID_PARAMETER - Language is NULL.\r
+    EFI_INVALID_PARAMETER - DriverName is NULL.\r
+    EFI_UNSUPPORTED       - The driver specified by This does not support the \r
+                            language specified by Language.\r
+\r
+--*/\r
+{\r
+  return LookupUnicodeString (\r
+          Language,\r
+          gUnixSerialIoComponentName.SupportedLanguages,\r
+          mUnixSerialIoDriverNameTable,\r
+          DriverName\r
+          );\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoComponentNameGetControllerName (\r
+  IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,\r
+  IN  EFI_HANDLE                                      ControllerHandle,\r
+  IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,\r
+  IN  CHAR8                                           *Language,\r
+  OUT CHAR16                                          **ControllerName\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Retrieves a Unicode string that is the user readable name of the controller\r
+    that is being managed by an EFI Driver.\r
+\r
+  Arguments:\r
+    This             - A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.\r
+    ControllerHandle - The handle of a controller that the driver specified by \r
+                       This is managing.  This handle specifies the controller \r
+                       whose name is to be returned.\r
+    ChildHandle      - The handle of the child controller to retrieve the name \r
+                       of.  This is an optional parameter that may be NULL.  It \r
+                       will be NULL for device drivers.  It will also be NULL \r
+                       for a bus drivers that wish to retrieve the name of the \r
+                       bus controller.  It will not be NULL for a bus driver \r
+                       that wishes to retrieve the name of a child controller.\r
+    Language         - A pointer to a three character ISO 639-2 language \r
+                       identifier.  This is the language of the controller name \r
+                       that that the caller is requesting, and it must match one\r
+                       of the languages specified in SupportedLanguages.  The \r
+                       number of languages supported by a driver is up to the \r
+                       driver writer.\r
+    ControllerName   - A pointer to the Unicode string to return.  This Unicode\r
+                       string is the name of the controller specified by \r
+                       ControllerHandle and ChildHandle in the language specified\r
+                       by Language from the point of view of the driver specified\r
+                       by This. \r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The Unicode string for the user readable name in the \r
+                            language specified by Language for the driver \r
+                            specified by This was returned in DriverName.\r
+    EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.\r
+    EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid EFI_HANDLE.\r
+    EFI_INVALID_PARAMETER - Language is NULL.\r
+    EFI_INVALID_PARAMETER - ControllerName is NULL.\r
+    EFI_UNSUPPORTED       - The driver specified by This is not currently managing \r
+                            the controller specified by ControllerHandle and \r
+                            ChildHandle.\r
+    EFI_UNSUPPORTED       - The driver specified by This does not support the \r
+                            language specified by Language.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_SERIAL_IO_PROTOCOL        *SerialIo;\r
+  UNIX_SERIAL_IO_PRIVATE_DATA *Private;\r
+\r
+  //\r
+  // Make sure this driver is currently managing ControllHandle\r
+  //\r
+  Status = EfiTestManagedDevice (\r
+             ControllerHandle,\r
+             gUnixSerialIoDriverBinding.DriverBindingHandle,\r
+             &gEfiUnixIoProtocolGuid\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // This is a bus driver, so ChildHandle must not be NULL.\r
+  //\r
+  if (ChildHandle == NULL) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Status = EfiTestChildHandle (\r
+             ControllerHandle,\r
+             ChildHandle,\r
+             &gEfiUnixIoProtocolGuid\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Get our context back\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ChildHandle,\r
+                  &gEfiSerialIoProtocolGuid,\r
+                  (VOID**)&SerialIo,\r
+                  gUnixSerialIoDriverBinding.DriverBindingHandle,\r
+                  ChildHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (SerialIo);\r
+\r
+  return LookupUnicodeString (\r
+          Language,\r
+          gUnixSerialIoComponentName.SupportedLanguages,\r
+          Private->ControllerNameTable,\r
+          ControllerName\r
+          );\r
+}\r
diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.c b/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.c
new file mode 100644 (file)
index 0000000..58cc689
--- /dev/null
@@ -0,0 +1,1507 @@
+/*++\r
+\r
+Copyright (c) 2006 - 2007, 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
+  UnixSerialIo.c\r
+\r
+Abstract:\r
+\r
+  Our DriverBinding member functions operate on the handles\r
+  created by the NT Bus driver.\r
+\r
+  Handle(1) - UnixIo - DevicePath(1)\r
+\r
+  If a serial port is added to the system this driver creates a new handle.\r
+  The new handle is required, since the serial device must add an UART device\r
+  pathnode.\r
+\r
+  Handle(2) - SerialIo - DevicePath(1)\UART\r
+\r
+  The driver then adds a gEfiUnixSerialPortGuid as a protocol to Handle(1).\r
+  The instance data for this protocol is the private data used to create\r
+  Handle(2).\r
+\r
+  Handle(1) - UnixIo - DevicePath(1) - UnixSerialPort\r
+\r
+  If the driver is unloaded Handle(2) is removed from the system and\r
+  gEfiUnixSerialPortGuid is removed from Handle(1).\r
+\r
+  Note: Handle(1) is any handle created by the Win NT Bus driver that is passed\r
+  into the DriverBinding member functions of this driver. This driver requires\r
+  a Handle(1) to contain a UnixIo protocol, a DevicePath protocol, and\r
+  the TypeGuid in the UnixIo must be gEfiUnixSerialPortGuid.\r
+\r
+  If Handle(1) contains a gEfiUnixSerialPortGuid protocol then the driver is\r
+  loaded on the device.\r
+\r
+--*/\r
+\r
+#include "UnixSerialIo.h"\r
+#include <termio.h>\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gUnixSerialIoDriverBinding = {\r
+  UnixSerialIoDriverBindingSupported,\r
+  UnixSerialIoDriverBindingStart,\r
+  UnixSerialIoDriverBindingStop,\r
+  0xa,\r
+  NULL,\r
+  NULL\r
+};\r
+\r
+STATIC\r
+VOID\r
+PrintSerialParameter(\r
+  UNIX_SERIAL_IO_PRIVATE_DATA *Private\r
+  )\r
+{\r
+  struct termios Options;\r
+\r
+  if (Private->UnixThunk->Tcgetattr (Private->UnixHandle, &Options) == 0) {\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Input mode: 0x%x\r\n", Private->UnixHandle, Options.c_iflag));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Output mode: 0x%x\r\n", Private->UnixHandle, Options.c_oflag));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Control flag: 0x%x\r\n", Private->UnixHandle, Options.c_cflag));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Local mode flag: 0x%x\r\n", Private->UnixHandle, Options.c_lflag));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Line discipline: 0x%x\r\n", Private->UnixHandle, Options.c_line));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Input Speed: 0x%x\r\n", Private->UnixHandle, Options.c_ispeed));\r
+    DEBUG ((EFI_D_INFO, "Serial[0x%x]:Output Speed: 0x%x\r\n", Private->UnixHandle, Options.c_ospeed));\r
+  }\r
+}\r
+\r
+STATIC\r
+UINTN\r
+ConvertBaud2Unix (\r
+  UINT64 BaudRate\r
+  )\r
+{\r
+  switch (BaudRate) {\r
+  case 0:\r
+    return B0;\r
+  case 50:\r
+    return B50;\r
+  case 75:\r
+    return B75;\r
+  case 110:\r
+    return B110;\r
+  case 134:\r
+    return B134;\r
+  case 150:\r
+    return B150;\r
+  case 200:\r
+    return B200;\r
+  case 300:\r
+    return B300;\r
+  case 600:\r
+    return B600;\r
+  case 1200:\r
+    return B1200;\r
+  case 1800:\r
+    return B1800;\r
+  case 2400:\r
+    return B2400;\r
+  case 4800:\r
+    return B4800;\r
+  case 9600:\r
+    return B9600;\r
+  case 19200:\r
+    return B19200;\r
+  case 38400:\r
+    return B38400;\r
+  case 57600:\r
+    return B57600;\r
+  case 115200:\r
+    return B115200;\r
+  case 230400:\r
+    return B230400;\r
+  case 460800:\r
+    return B460800;\r
+  case 500000:\r
+    return B500000;\r
+  case 576000:\r
+    return B576000;\r
+  case 921600:\r
+    return B921600;\r
+  case 1000000:\r
+    return B1000000;\r
+  case 1152000:\r
+    return B1152000;\r
+  case 1500000:\r
+    return B1500000;\r
+  case 2000000:\r
+    return B2000000;\r
+  case 2500000:\r
+    return B2500000;\r
+  case 3000000:\r
+    return B3000000;\r
+  case 3500000:\r
+    return B3500000;\r
+  case 4000000:\r
+    return B4000000;\r
+  case __MAX_BAUD:\r
+  default:\r
+    DEBUG ((EFI_D_ERROR, "Invalid Baud Rate Parameter!\r\n"));\r
+  }\r
+  return -1;\r
+}\r
+\r
+STATIC\r
+UINTN\r
+ConvertByteSize2Unix (\r
+  UINT8 DataBit\r
+  )\r
+{\r
+  switch (DataBit) {\r
+  case 5:\r
+    return CS5;\r
+  case 6:\r
+    return CS6;\r
+  case 7:\r
+    return CS7;\r
+  case 8:\r
+    return CS8;\r
+  default:\r
+    DEBUG ((EFI_D_ERROR, "Invalid Data Size Parameter!\r\n"));\r
+  }\r
+  return -1;\r
+}\r
+\r
+STATIC\r
+VOID\r
+ConvertParity2Unix (\r
+  struct termios    *Options,\r
+  EFI_PARITY_TYPE   Parity\r
+  )\r
+{\r
+  switch (Parity) {\r
+  case NoParity:\r
+    Options->c_cflag &= ~PARENB;\r
+    break;\r
+  case EvenParity:\r
+    Options->c_cflag |= PARENB;\r
+    break;\r
+  case OddParity:\r
+    Options->c_cflag |= PARENB;\r
+    Options->c_cflag |= PARODD;\r
+    break;\r
+  case MarkParity:\r
+    Options->c_cflag = PARENB | CMSPAR | PARODD;\r
+    break;\r
+  case SpaceParity:\r
+    Options->c_cflag |= PARENB | CMSPAR;\r
+    Options->c_cflag &= ~PARODD;\r
+    break;\r
+  default:\r
+    DEBUG ((EFI_D_ERROR, "Invalid Parity Parameter!\r\n"));\r
+  }\r
+}\r
+\r
+STATIC \r
+VOID\r
+ConvertStopBit2Unix (\r
+  struct termios      *Options,\r
+  EFI_STOP_BITS_TYPE  StopBits\r
+  )\r
+{\r
+  switch (StopBits) {\r
+  case TwoStopBits:\r
+    Options->c_cflag |= CSTOPB;\r
+    break;\r
+  case OneStopBit:\r
+  case OneFiveStopBits:\r
+  case DefaultStopBits:\r
+    Options->c_cflag &= ~CSTOPB;\r
+  }\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingSupported (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Handle,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL      *RemainingDevicePath\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  The implementation of EFI_DRIVER_BINDING_PROTOCOL.EFI_DRIVER_BINDING_SUPPORTED.\r
+\r
+Arguments:\r
+  \r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  EFI_UNIX_IO_PROTOCOL      *UnixIo;\r
+  UART_DEVICE_PATH          *UartNode;\r
+\r
+  //\r
+  // Open the IO Abstraction(s) needed to perform the supported test\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID**)&ParentDevicePath,\r
+                  This->DriverBindingHandle,\r
+                  Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (Status == EFI_ALREADY_STARTED) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  gBS->CloseProtocol (\r
+        Handle,\r
+        &gEfiDevicePathProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        Handle\r
+        );\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiUnixIoProtocolGuid,\r
+                  (VOID**)&UnixIo,\r
+                  This->DriverBindingHandle,\r
+                  Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (Status == EFI_ALREADY_STARTED) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Make sure that the Unix Thunk Protocol is valid\r
+  //\r
+  if (UnixIo->UnixThunk->Signature != EFI_UNIX_THUNK_PROTOCOL_SIGNATURE) {\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Error;\r
+  }\r
+\r
+  //\r
+  // Check the GUID to see if this is a handle type the driver supports\r
+  //\r
+  if (!CompareGuid (UnixIo->TypeGuid, &gEfiUnixSerialPortGuid)) {\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Error;\r
+  }\r
+\r
+  if (RemainingDevicePath != NULL) {\r
+    Status    = EFI_UNSUPPORTED;\r
+    UartNode  = (UART_DEVICE_PATH *) RemainingDevicePath;\r
+    if (UartNode->Header.Type != MESSAGING_DEVICE_PATH ||\r
+        UartNode->Header.SubType != MSG_UART_DP ||\r
+        DevicePathNodeLength((EFI_DEVICE_PATH_PROTOCOL *)UartNode) != sizeof(UART_DEVICE_PATH)) {\r
+      goto Error;\r
+    }\r
+    if (UartNode->BaudRate < 0 || UartNode->BaudRate > SERIAL_PORT_MAX_BAUD_RATE) {\r
+      goto Error;\r
+    }\r
+    if (UartNode->Parity < NoParity || UartNode->Parity > SpaceParity) {\r
+      goto Error;\r
+    }\r
+    if (UartNode->DataBits < 5 || UartNode->DataBits > 8) {\r
+      goto Error;\r
+    }\r
+    if (UartNode->StopBits < OneStopBit || UartNode->StopBits > TwoStopBits) {\r
+      goto Error;\r
+    }\r
+    if ((UartNode->DataBits == 5) && (UartNode->StopBits == TwoStopBits)) {\r
+      goto Error;\r
+    }\r
+    if ((UartNode->DataBits >= 6) && (UartNode->DataBits <= 8) && (UartNode->StopBits == OneFiveStopBits)) {\r
+      goto Error;\r
+    }\r
+    Status = EFI_SUCCESS;\r
+  }\r
+\r
+Error:\r
+  //\r
+  // Close the I/O Abstraction(s) used to perform the supported test\r
+  //\r
+  gBS->CloseProtocol (\r
+        Handle,\r
+        &gEfiUnixIoProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        Handle\r
+        );\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingStart (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Handle,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL      *RemainingDevicePath\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                          Status;\r
+  EFI_UNIX_IO_PROTOCOL                *UnixIo;\r
+  UNIX_SERIAL_IO_PRIVATE_DATA         *Private;\r
+  UINTN                               UnixHandle;\r
+  UART_DEVICE_PATH                    Node;\r
+  EFI_DEVICE_PATH_PROTOCOL            *ParentDevicePath;\r
+  EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
+  UINTN                               EntryCount;\r
+  UINTN                               Index;\r
+  EFI_SERIAL_IO_PROTOCOL              *SerialIo;\r
+  CHAR8                               AsciiDevName[1024];\r
+\r
+  DEBUG ((EFI_D_INFO, "SerialIo drive binding start!\r\n"));\r
+  Private   = NULL;\r
+  UnixHandle  = -1;\r
+\r
+  //\r
+  // Grab the protocols we need\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID**)&ParentDevicePath,\r
+                  This->DriverBindingHandle,\r
+                  Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Grab the IO abstraction we need to get any work done\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiUnixIoProtocolGuid,\r
+                  (VOID**)&UnixIo,\r
+                  This->DriverBindingHandle,\r
+                  Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
+    gBS->CloseProtocol (\r
+          Handle,\r
+          &gEfiDevicePathProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          Handle\r
+          );\r
+    return Status;\r
+  }\r
+\r
+  if (Status == EFI_ALREADY_STARTED) {\r
+\r
+    if (RemainingDevicePath == NULL) {\r
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    //\r
+    // Make sure a child handle does not already exist.  This driver can only\r
+    // produce one child per serial port.\r
+    //\r
+    Status = gBS->OpenProtocolInformation (\r
+                    Handle,\r
+                    &gEfiUnixIoProtocolGuid,\r
+                    &OpenInfoBuffer,\r
+                    &EntryCount\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+\r
+    Status = EFI_ALREADY_STARTED;\r
+    for (Index = 0; Index < EntryCount; Index++) {\r
+      if (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
+        Status = gBS->OpenProtocol (\r
+                        OpenInfoBuffer[Index].ControllerHandle,\r
+                        &gEfiSerialIoProtocolGuid,\r
+                        (VOID**)&SerialIo,\r
+                        This->DriverBindingHandle,\r
+                        Handle,\r
+                        EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                        );\r
+        if (!EFI_ERROR (Status)) {\r
+          CopyMem (&Node, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
+          Status = SerialIo->SetAttributes (\r
+                              SerialIo,\r
+                              Node.BaudRate,\r
+                              SerialIo->Mode->ReceiveFifoDepth,\r
+                              SerialIo->Mode->Timeout,\r
+                              Node.Parity,\r
+                              Node.DataBits,\r
+                              Node.StopBits\r
+                              );\r
+        }\r
+        break;\r
+      }\r
+    }\r
+\r
+    FreePool (OpenInfoBuffer);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Check to see if we can access the hardware device. If it's Open in Unix we\r
+  // will not get access.\r
+  //\r
+  UnicodeStrToAsciiStr(UnixIo->EnvString, AsciiDevName);\r
+  UnixHandle = UnixIo->UnixThunk->Open (AsciiDevName, O_RDWR | O_NOCTTY, 0);\r
+  \r
+  if (UnixHandle == -1) {\r
+    DEBUG ((EFI_D_INFO, "Faile to open serial device, %s!\r\n", UnixIo->EnvString ));\r
+    UnixIo->UnixThunk->Perror (AsciiDevName);\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Error;\r
+  }\r
+  DEBUG ((EFI_D_INFO, "Success to open serial device %s, Hanle = 0x%x \r\n", UnixIo->EnvString, UnixHandle));\r
+\r
+  //\r
+  // Construct Private data\r
+  //\r
+  Private = AllocatePool (sizeof (UNIX_SERIAL_IO_PRIVATE_DATA));\r
+  if (Private == NULL) {\r
+    goto Error;\r
+  }\r
+\r
+  //\r
+  // This signature must be valid before any member function is called\r
+  //\r
+  Private->Signature              = UNIX_SERIAL_IO_PRIVATE_DATA_SIGNATURE;\r
+  Private->UnixHandle             = UnixHandle;\r
+  Private->ControllerHandle       = Handle;\r
+  Private->Handle                 = NULL;\r
+  Private->UnixThunk              = UnixIo->UnixThunk;\r
+  Private->ParentDevicePath       = ParentDevicePath;\r
+  Private->ControllerNameTable    = NULL;\r
+\r
+  Private->SoftwareLoopbackEnable = FALSE;\r
+  Private->HardwareLoopbackEnable = FALSE;\r
+  Private->HardwareFlowControl    = FALSE;\r
+  Private->Fifo.First             = 0;\r
+  Private->Fifo.Last              = 0;\r
+  Private->Fifo.Surplus           = SERIAL_MAX_BUFFER_SIZE;\r
+\r
+  AddUnicodeString (\r
+    "eng",\r
+    gUnixSerialIoComponentName.SupportedLanguages,\r
+    &Private->ControllerNameTable,\r
+    UnixIo->EnvString\r
+    );\r
+\r
+  Private->SerialIo.Revision      = SERIAL_IO_INTERFACE_REVISION;\r
+  Private->SerialIo.Reset         = UnixSerialIoReset;\r
+  Private->SerialIo.SetAttributes = UnixSerialIoSetAttributes;\r
+  Private->SerialIo.SetControl    = UnixSerialIoSetControl;\r
+  Private->SerialIo.GetControl    = UnixSerialIoGetControl;\r
+  Private->SerialIo.Write         = UnixSerialIoWrite;\r
+  Private->SerialIo.Read          = UnixSerialIoRead;\r
+  Private->SerialIo.Mode          = &Private->SerialIoMode;\r
+\r
+  if (RemainingDevicePath != NULL) {\r
+    //\r
+    // Match the configuration of the RemainingDevicePath. IsHandleSupported()\r
+    // already checked to make sure the RemainingDevicePath contains settings\r
+    // that we can support.\r
+    //\r
+    CopyMem (&Private->UartDevicePath, RemainingDevicePath, sizeof (UART_DEVICE_PATH));\r
+  } else {\r
+    //\r
+    // Build the device path by appending the UART node to the ParentDevicePath\r
+    // from the UnixIo handle. The Uart setings are zero here, since\r
+    // SetAttribute() will update them to match the default setings.\r
+    //\r
+    ZeroMem (&Private->UartDevicePath, sizeof (UART_DEVICE_PATH));\r
+    Private->UartDevicePath.Header.Type     = MESSAGING_DEVICE_PATH;\r
+    Private->UartDevicePath.Header.SubType  = MSG_UART_DP;\r
+    SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL *) &Private->UartDevicePath, sizeof (UART_DEVICE_PATH));\r
+  }\r
+\r
+  //\r
+  // Build the device path by appending the UART node to the ParentDevicePath\r
+  // from the UnixIo handle. The Uart setings are zero here, since\r
+  // SetAttribute() will update them to match the current setings.\r
+  //\r
+  Private->DevicePath = AppendDevicePathNode (\r
+                          ParentDevicePath,\r
+                          (EFI_DEVICE_PATH_PROTOCOL *) &Private->UartDevicePath\r
+                          );\r
+  if (Private->DevicePath == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Error;\r
+  }\r
+\r
+  //\r
+  // Fill in Serial I/O Mode structure based on either the RemainingDevicePath or defaults.\r
+  //\r
+  Private->SerialIoMode.ControlMask       = SERIAL_CONTROL_MASK;\r
+  Private->SerialIoMode.Timeout           = SERIAL_TIMEOUT_DEFAULT;\r
+  Private->SerialIoMode.BaudRate          = Private->UartDevicePath.BaudRate;\r
+  Private->SerialIoMode.ReceiveFifoDepth  = SERIAL_FIFO_DEFAULT;\r
+  Private->SerialIoMode.DataBits          = Private->UartDevicePath.DataBits;\r
+  Private->SerialIoMode.Parity            = Private->UartDevicePath.Parity;\r
+  Private->SerialIoMode.StopBits          = Private->UartDevicePath.StopBits;\r
+\r
+  //\r
+  // Issue a reset to initialize the COM port\r
+  //\r
+  Status = Private->SerialIo.Reset (&Private->SerialIo);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
+  //\r
+  // Create new child handle\r
+  //\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &Private->Handle,\r
+                  &gEfiSerialIoProtocolGuid,\r
+                  &Private->SerialIo,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  Private->DevicePath,\r
+                  NULL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
+  //\r
+  // Open For Child Device\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  Handle,\r
+                  &gEfiUnixIoProtocolGuid,\r
+                  (VOID**)&UnixIo,\r
+                  This->DriverBindingHandle,\r
+                  Private->Handle,\r
+                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+\r
+Error:\r
+  //\r
+  // Use the Stop() function to free all resources allocated in Start()\r
+  //\r
+  if (Private != NULL) {\r
+    if (Private->Handle != NULL) {\r
+      This->Stop (This, Handle, 1, &Private->Handle);\r
+    } else {\r
+      if (UnixHandle != -1) {\r
+        Private->UnixThunk->Close (UnixHandle);\r
+      }\r
+\r
+      if (Private->DevicePath != NULL) {\r
+        FreePool (Private->DevicePath);\r
+      }\r
+\r
+      FreeUnicodeStringTable (Private->ControllerNameTable);\r
+\r
+      FreePool (Private);\r
+    }\r
+  }\r
+\r
+  This->Stop (This, Handle, 0, NULL);\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Handle,\r
+  IN  UINTN                         NumberOfChildren,\r
+  IN  EFI_HANDLE                    *ChildHandleBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This              - TODO: add argument description\r
+  Handle            - TODO: add argument description\r
+  NumberOfChildren  - TODO: add argument description\r
+  ChildHandleBuffer - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                    Status;\r
+  UINTN                         Index;\r
+  BOOLEAN                       AllChildrenStopped;\r
+  EFI_SERIAL_IO_PROTOCOL        *SerialIo;\r
+  UNIX_SERIAL_IO_PRIVATE_DATA   *Private;\r
+  EFI_UNIX_IO_PROTOCOL          *UnixIo;\r
+\r
+  //\r
+  // Complete all outstanding transactions to Controller.\r
+  // Don't allow any new transaction to Controller to be started.\r
+  //\r
+\r
+  if (NumberOfChildren == 0) {\r
+    //\r
+    // Close the bus driver\r
+    //\r
+    Status = gBS->CloseProtocol (\r
+                    Handle,\r
+                    &gEfiUnixIoProtocolGuid,\r
+                    This->DriverBindingHandle,\r
+                    Handle\r
+                    );\r
+    Status = gBS->CloseProtocol (\r
+                    Handle,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    This->DriverBindingHandle,\r
+                    Handle\r
+                    );\r
+    return Status;\r
+  }\r
+\r
+  AllChildrenStopped = TRUE;\r
+\r
+  for (Index = 0; Index < NumberOfChildren; Index++) {\r
+    Status = gBS->OpenProtocol (\r
+                    ChildHandleBuffer[Index],\r
+                    &gEfiSerialIoProtocolGuid,\r
+                    (VOID**)&SerialIo,\r
+                    This->DriverBindingHandle,\r
+                    Handle,\r
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                    );\r
+    if (!EFI_ERROR (Status)) {\r
+      Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (SerialIo);\r
+\r
+      ASSERT (Private->Handle == ChildHandleBuffer[Index]);\r
+\r
+      Status = gBS->CloseProtocol (\r
+                      Handle,\r
+                      &gEfiUnixIoProtocolGuid,\r
+                      This->DriverBindingHandle,\r
+                      ChildHandleBuffer[Index]\r
+                      );\r
+\r
+      Status = gBS->UninstallMultipleProtocolInterfaces (\r
+                      ChildHandleBuffer[Index],\r
+                      &gEfiSerialIoProtocolGuid,\r
+                      &Private->SerialIo,\r
+                      &gEfiDevicePathProtocolGuid,\r
+                      Private->DevicePath,\r
+                      NULL\r
+                      );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        gBS->OpenProtocol (\r
+              Handle,\r
+              &gEfiUnixIoProtocolGuid,\r
+              (VOID **) &UnixIo,\r
+              This->DriverBindingHandle,\r
+              ChildHandleBuffer[Index],\r
+              EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
+              );\r
+      } else {\r
+        Private->UnixThunk->Close (Private->UnixHandle);\r
+\r
+        FreePool (Private->DevicePath);\r
+\r
+        FreeUnicodeStringTable (Private->ControllerNameTable);\r
+\r
+        FreePool (Private);\r
+      }\r
+    }\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      AllChildrenStopped = FALSE;\r
+    }\r
+  }\r
+\r
+  if (!AllChildrenStopped) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+//\r
+// Serial IO Protocol member functions\r
+//\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoReset (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+{\r
+  UNIX_SERIAL_IO_PRIVATE_DATA *Private;\r
+  EFI_TPL                      Tpl;\r
+  UINTN                        UnixStatus;\r
+\r
+  Tpl         = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
+  Private     = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  UnixStatus  = Private->UnixThunk->Tcflush (\r
+                                    Private->UnixHandle, \r
+                                    TCIOFLUSH\r
+                                    );\r
+  switch (UnixStatus) {\r
+  case EBADF:\r
+    DEBUG ((EFI_D_ERROR, "Invalid handle of serial device!\r\n"));\r
+    return EFI_DEVICE_ERROR;\r
+  case EINVAL:\r
+    DEBUG ((EFI_D_ERROR, "Invalid queue selector!\r\n"));\r
+    return EFI_DEVICE_ERROR;\r
+  case ENOTTY:\r
+    DEBUG ((EFI_D_ERROR, "The file associated with serial's handle is not a terminal!\r\n"));\r
+    return EFI_DEVICE_ERROR;\r
+  default:\r
+    DEBUG ((EFI_D_ERROR, "The serial IO device is reset successfully!\r\n"));\r
+  }\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return This->SetAttributes (\r
+                This,\r
+                This->Mode->BaudRate,\r
+                This->Mode->ReceiveFifoDepth,\r
+                This->Mode->Timeout,\r
+                This->Mode->Parity,\r
+                (UINT8) This->Mode->DataBits,\r
+                This->Mode->StopBits\r
+                );\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoSetAttributes (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This,\r
+  IN UINT64                 BaudRate,\r
+  IN UINT32                 ReceiveFifoDepth,\r
+  IN UINT32                 Timeout,\r
+  IN EFI_PARITY_TYPE        Parity,\r
+  IN UINT8                  DataBits,\r
+  IN EFI_STOP_BITS_TYPE     StopBits\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function is used to set the attributes.\r
+\r
+Arguments:\r
+\r
+  This              - A pointer to the EFI_SERIAL_IO_PROTOCOL structrue.\r
+  BaudRate          - The Baud rate of the serial device.\r
+  ReceiveFifoDepth  - The request depth of fifo on receive side.\r
+  Timeout           - the request timeout for a single charact.\r
+  Parity            - The type of parity used in serial device.\r
+  DataBits          - Number of deata bits used in serial device.\r
+  StopBits          - Number of stop bits used in serial device.\r
+\r
+Returns:\r
+  Status code\r
+\r
+  None\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                    Status;\r
+  UNIX_SERIAL_IO_PRIVATE_DATA   *Private;\r
+  EFI_TPL                       Tpl;\r
+  EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;\r
+\r
+  Tpl     = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+  Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  //\r
+  //  Some of our arguments have defaults if a null value is passed in, and\r
+  //   we must set the default values if a null argument is passed in.\r
+  //\r
+  if (BaudRate == 0) {\r
+    BaudRate = SERIAL_BAUD_DEFAULT;\r
+  }\r
+\r
+  if (ReceiveFifoDepth == 0) {\r
+    ReceiveFifoDepth = SERIAL_FIFO_DEFAULT;\r
+  }\r
+\r
+  if (Timeout == 0) {\r
+    Timeout = SERIAL_TIMEOUT_DEFAULT;\r
+  }\r
+\r
+  if (Parity == DefaultParity) {\r
+    Parity = NoParity;\r
+  }\r
+\r
+  if (DataBits == 0) {\r
+    DataBits = SERIAL_DATABITS_DEFAULT;\r
+  }\r
+\r
+  if (StopBits == DefaultStopBits) {\r
+    StopBits = OneStopBit;\r
+  }\r
+\r
+  //\r
+  // See if the new attributes already match the current attributes\r
+  //\r
+  if (Private->UartDevicePath.BaudRate       == BaudRate         &&\r
+      Private->UartDevicePath.DataBits       == DataBits         &&\r
+      Private->UartDevicePath.Parity         == Parity           &&\r
+      Private->UartDevicePath.StopBits       == StopBits         &&\r
+      Private->SerialIoMode.ReceiveFifoDepth == ReceiveFifoDepth &&\r
+      Private->SerialIoMode.Timeout          == Timeout             ) {\r
+    gBS->RestoreTPL(Tpl);\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // Try to get options from serial device.\r
+  // \r
+  if (Private->UnixThunk->Tcgetattr (Private->UnixHandle, &Private->UnixTermios) == -1) {\r
+    Private->UnixThunk->Perror ("IoSetAttributes");\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  //\r
+  // Setting Baud Rate\r
+  // \r
+  Private->UnixThunk->Cfsetispeed (&Private->UnixTermios, ConvertBaud2Unix(BaudRate));\r
+  Private->UnixThunk->Cfsetospeed (&Private->UnixTermios, ConvertBaud2Unix(BaudRate));\r
+  //\r
+  // Setting DataBits \r
+  // \r
+  Private->UnixTermios.c_cflag &= ~CSIZE;\r
+  Private->UnixTermios.c_cflag |= ConvertByteSize2Unix (DataBits);\r
+  //\r
+  // Setting Parity\r
+  // \r
+  ConvertParity2Unix (&Private->UnixTermios, Parity);\r
+  //\r
+  // Setting StopBits\r
+  // \r
+  ConvertStopBit2Unix (&Private->UnixTermios, StopBits);\r
+  //\r
+  // Raw input\r
+  // \r
+  Private->UnixTermios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);\r
+  //\r
+  // Raw output\r
+  // \r
+  Private->UnixTermios.c_oflag &= ~OPOST;\r
+  //\r
+  // Support hardware flow control \r
+  // \r
+  Private->UnixTermios.c_cflag &= ~CRTSCTS;;\r
+  //\r
+  // Time out\r
+  // \r
+  Private->UnixTermios.c_cc[VMIN]  = 0;\r
+  Private->UnixTermios.c_cc[VTIME] = (Timeout/1000000) * 10;\r
+\r
+  //\r
+  // Set the options\r
+  // \r
+  if (-1 == Private->UnixThunk->Tcsetattr (\r
+                        Private->UnixHandle, \r
+                        TCSANOW, \r
+                        &Private->UnixTermios\r
+                        )) {\r
+    DEBUG ((EFI_D_INFO, "Fail to set options for serial device!\r\n"));\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+  \r
+  //\r
+  //  Update mode\r
+  //\r
+  Private->SerialIoMode.BaudRate          = BaudRate;\r
+  Private->SerialIoMode.ReceiveFifoDepth  = ReceiveFifoDepth;\r
+  Private->SerialIoMode.Timeout           = Timeout;\r
+  Private->SerialIoMode.Parity            = Parity;\r
+  Private->SerialIoMode.DataBits          = DataBits;\r
+  Private->SerialIoMode.StopBits          = StopBits;\r
+  //\r
+  // See if Device Path Node has actually changed\r
+  //\r
+  if (Private->UartDevicePath.BaudRate     == BaudRate &&\r
+      Private->UartDevicePath.DataBits     == DataBits &&\r
+      Private->UartDevicePath.Parity       == Parity   &&\r
+      Private->UartDevicePath.StopBits     == StopBits    ) {\r
+    gBS->RestoreTPL(Tpl);\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // Update the device path\r
+  //\r
+  Private->UartDevicePath.BaudRate  = BaudRate;\r
+  Private->UartDevicePath.DataBits  = DataBits;\r
+  Private->UartDevicePath.Parity    = (UINT8) Parity;\r
+  Private->UartDevicePath.StopBits  = (UINT8) StopBits;\r
+\r
+  NewDevicePath = AppendDevicePathNode (\r
+                    Private->ParentDevicePath,\r
+                    (EFI_DEVICE_PATH_PROTOCOL *) &Private->UartDevicePath\r
+                    );\r
+  if (NewDevicePath == NULL) {\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (Private->Handle != NULL) {\r
+    Status = gBS->ReinstallProtocolInterface (\r
+                    Private->Handle,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    Private->DevicePath,\r
+                    NewDevicePath\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      gBS->RestoreTPL (Tpl);\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  if (Private->DevicePath != NULL) {\r
+    FreePool (Private->DevicePath);\r
+  }\r
+\r
+  Private->DevicePath = NewDevicePath;\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoSetControl (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This,\r
+  IN UINT32                 Control\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This    - TODO: add argument description\r
+  Control - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+  UNIX_SERIAL_IO_PRIVATE_DATA *Private;\r
+  UINTN                       Result;\r
+  UINTN                       Status;\r
+  struct termios              Options;\r
+  EFI_TPL                     Tpl;\r
+\r
+  Tpl     = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
+  Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  Result  = Private->UnixThunk->IoCtl (Private->UnixHandle, TIOCMGET, &Status);\r
+\r
+  if (Result == -1) {\r
+    Private->UnixThunk->Perror ("SerialSetControl");\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  Private->HardwareFlowControl    = FALSE;\r
+  Private->SoftwareLoopbackEnable = FALSE;\r
+  Private->HardwareLoopbackEnable = FALSE;\r
+\r
+  if (Control & EFI_SERIAL_REQUEST_TO_SEND) {\r
+    Options.c_cflag |= TIOCM_RTS;\r
+  }\r
+\r
+  if (Control & EFI_SERIAL_DATA_TERMINAL_READY) {\r
+    Options.c_cflag |= TIOCM_DTR;\r
+  }\r
+\r
+  if (Control & EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE) {\r
+    Private->HardwareFlowControl = TRUE;\r
+  }\r
+\r
+  if (Control & EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE) {\r
+    Private->SoftwareLoopbackEnable = TRUE;\r
+  }\r
+\r
+  if (Control & EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE) {\r
+    Private->HardwareLoopbackEnable = TRUE;\r
+  }\r
+\r
+  Result  = Private->UnixThunk->IoCtl (Private->UnixHandle, TIOCMSET, &Status);\r
+\r
+  if (Result == -1) {\r
+    Private->UnixThunk->Perror ("SerialSetControl");\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoGetControl (\r
+  IN  EFI_SERIAL_IO_PROTOCOL  *This,\r
+  OUT UINT32                  *Control\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This    - TODO: add argument description\r
+  Control - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+  UNIX_SERIAL_IO_PRIVATE_DATA *Private;\r
+  UINTN                       Result;\r
+  UINTN                       Status;\r
+  struct termios              Options;\r
+  UINT32                      Bits;\r
+  EFI_TPL                     Tpl;\r
+  UINTN                       Bytes;\r
+\r
+  Tpl     = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
+  Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
+  Result  = Private->UnixThunk->IoCtl (Private->UnixHandle, TIOCMGET, &Status);\r
+  if (Result == -1) {\r
+    Private->UnixThunk->Perror ("SerialGetControl");\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if ((Status & TIOCM_CTS) == TIOCM_CTS) {\r
+    Bits |= EFI_SERIAL_CLEAR_TO_SEND;\r
+  }\r
+\r
+  if ((Status & TIOCM_DSR) == TIOCM_DSR) {\r
+    Bits |= EFI_SERIAL_DATA_SET_READY;\r
+  }\r
+\r
+  if ((Status & TIOCM_DTR) == TIOCM_DTR) {\r
+    Bits |= EFI_SERIAL_DATA_TERMINAL_READY;\r
+  }\r
+\r
+  if ((Status & TIOCM_RTS) == TIOCM_RTS) {\r
+    Bits |= EFI_SERIAL_REQUEST_TO_SEND;\r
+  }\r
+\r
+  if ((Status & TIOCM_RNG) == TIOCM_RNG) {\r
+    Bits |= EFI_SERIAL_RING_INDICATE;\r
+  }\r
+\r
+  if ((Status & TIOCM_CAR) == TIOCM_CAR) {\r
+    Bits |= EFI_SERIAL_CARRIER_DETECT;\r
+  }\r
+\r
+  if (Private->HardwareFlowControl) {\r
+    Bits |= EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE;\r
+  }\r
+\r
+  if (Private->SoftwareLoopbackEnable) {\r
+    Bits |= EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE;\r
+  }\r
+\r
+  if (Private->HardwareLoopbackEnable) {\r
+    Bits |= EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE;\r
+  }\r
+\r
+  Result = Private->UnixThunk->IoCtl (Private->UnixHandle, FIONREAD, &Bytes);\r
+  if (Result == -1) {\r
+    Private->UnixThunk->Perror ("SerialGetControl");\r
+    gBS->RestoreTPL (Tpl);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (Bytes == 0) {\r
+    Bits |= EFI_SERIAL_INPUT_BUFFER_EMPTY;\r
+  }\r
+\r
+  *Control = Bits;\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoWrite (\r
+  IN EFI_SERIAL_IO_PROTOCOL   *This,\r
+  IN OUT UINTN                *BufferSize,\r
+  IN VOID                     *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This        - TODO: add argument description\r
+  BufferSize  - TODO: add argument description\r
+  Buffer      - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_SUCCESS - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+  UNIX_SERIAL_IO_PRIVATE_DATA   *Private;\r
+  UINT8                         *ByteBuffer;\r
+  UINT32                        TotalBytesWritten;\r
+  UINT32                        BytesToGo;\r
+  UINT32                        BytesWritten;\r
+  UINT32                        Index;\r
+  UINT32                        Control;\r
+  EFI_TPL                       Tpl;\r
+\r
+  Tpl               = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
+  Private           = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This); \r
+\r
+  ByteBuffer        = (UINT8 *) Buffer;\r
+  TotalBytesWritten = 0;\r
+\r
+  if (Private->SoftwareLoopbackEnable || Private->HardwareLoopbackEnable) {\r
+    for (Index = 0; Index < *BufferSize; Index++) {\r
+      if (IsaSerialFifoAdd (&Private->Fifo, ByteBuffer[Index]) == EFI_SUCCESS) {\r
+        TotalBytesWritten++;\r
+      } else {\r
+        break;\r
+      }\r
+    }\r
+  } else {\r
+    BytesToGo = (*BufferSize);\r
+\r
+    do {\r
+      if (Private->HardwareFlowControl) {\r
+        //\r
+        // Send RTS\r
+        //\r
+        UnixSerialIoGetControl (&Private->SerialIo, &Control);\r
+        Control |= EFI_SERIAL_REQUEST_TO_SEND;\r
+        UnixSerialIoSetControl (&Private->SerialIo, Control);\r
+      }\r
+\r
+      //\r
+      //  Do the write\r
+      //\r
+      BytesWritten = Private->UnixThunk->Write ( \r
+                                           Private->UnixHandle,\r
+                                           &ByteBuffer[TotalBytesWritten],\r
+                                           BytesToGo\r
+                                           );\r
+\r
+      if (Private->HardwareFlowControl) {\r
+        //\r
+        // Assert RTS\r
+        //\r
+        UnixSerialIoGetControl (&Private->SerialIo, &Control);\r
+        Control &= ~ (UINT32) EFI_SERIAL_REQUEST_TO_SEND;\r
+        UnixSerialIoSetControl (&Private->SerialIo, Control);\r
+      }\r
+\r
+      TotalBytesWritten += BytesWritten;\r
+      BytesToGo -= BytesWritten;\r
+    } while (BytesToGo > 0);\r
+  }\r
+\r
+  *BufferSize = TotalBytesWritten;\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoRead (\r
+  IN  EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN  OUT UINTN               *BufferSize,\r
+  OUT VOID                    *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This        - TODO: add argument description\r
+  BufferSize  - TODO: add argument description\r
+  Buffer      - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+  UNIX_SERIAL_IO_PRIVATE_DATA   *Private;\r
+  UINT32                        BytesRead;\r
+  EFI_STATUS                    Status;\r
+  UINT32                        Index;\r
+  UINT8                         Data;\r
+  UINT32                        Control;\r
+  EFI_TPL                       Tpl;\r
+\r
+  Tpl     = gBS->RaiseTPL (EFI_TPL_NOTIFY);\r
+\r
+  Private = UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  //\r
+  //  Do the read\r
+  //\r
+  if (Private->SoftwareLoopbackEnable || Private->HardwareLoopbackEnable) {\r
+    for (Index = 0, BytesRead = 0; Index < *BufferSize; Index++) {\r
+      if (IsaSerialFifoRemove (&Private->Fifo, &Data) == EFI_SUCCESS) {\r
+        ((UINT8 *) Buffer)[Index] = Data;\r
+        BytesRead++;\r
+      } else {\r
+        break;\r
+      }\r
+    }\r
+  } else {\r
+    if (Private->HardwareFlowControl) {\r
+      UnixSerialIoGetControl (&Private->SerialIo, &Control);\r
+      Control |= EFI_SERIAL_DATA_TERMINAL_READY;\r
+      UnixSerialIoSetControl (&Private->SerialIo, Control);\r
+    }\r
+\r
+    BytesRead = Private->UnixThunk->Read (Private->UnixHandle, Buffer, *BufferSize);\r
+    if (Private->HardwareFlowControl) {\r
+      UnixSerialIoGetControl (&Private->SerialIo, &Control);\r
+      Control &= ~ (UINT32) EFI_SERIAL_DATA_TERMINAL_READY;\r
+      UnixSerialIoSetControl (&Private->SerialIo, Control);\r
+    }\r
+\r
+  }\r
+\r
+  if (BytesRead != *BufferSize) {\r
+    Status = EFI_TIMEOUT;\r
+  } else {\r
+    Status = EFI_SUCCESS;\r
+  }\r
+\r
+  *BufferSize = (UINTN) BytesRead;\r
+\r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return Status;\r
+}\r
+\r
+BOOLEAN\r
+IsaSerialFifoFull (\r
+  IN SERIAL_DEV_FIFO *Fifo\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+  Detect whether specific FIFO is full or not\r
+\r
+  Arguments:\r
+  Fifo  SERIAL_DEV_FIFO *: A pointer to the Data Structure SERIAL_DEV_FIFO\r
+\r
+  Returns:\r
+  TRUE:  the FIFO is full\r
+  FALSE: the FIFO is not full\r
+\r
+--*/\r
+{\r
+  if (Fifo->Surplus == 0) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+BOOLEAN\r
+IsaSerialFifoEmpty (\r
+  IN SERIAL_DEV_FIFO *Fifo\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+  Detect whether specific FIFO is empty or not\r
+\r
+  Arguments:\r
+    Fifo  SERIAL_DEV_FIFO *: A pointer to the Data Structure SERIAL_DEV_FIFO\r
+\r
+  Returns:\r
+    TRUE:  the FIFO is empty\r
+    FALSE: the FIFO is not empty\r
+\r
+--*/\r
+{\r
+  if (Fifo->Surplus == SERIAL_MAX_BUFFER_SIZE) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+EFI_STATUS\r
+IsaSerialFifoAdd (\r
+  IN SERIAL_DEV_FIFO *Fifo,\r
+  IN UINT8           Data\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+  Add data to specific FIFO\r
+\r
+  Arguments:\r
+    Fifo  SERIAL_DEV_FIFO *: A pointer to the Data Structure SERIAL_DEV_FIFO\r
+    Data  UINT8: the data added to FIFO\r
+\r
+  Returns:\r
+    EFI_SUCCESS:  Add data to specific FIFO successfully\r
+    EFI_OUT_RESOURCE: Failed to add data because FIFO is already full\r
+\r
+--*/\r
+// TODO:    EFI_OUT_OF_RESOURCES - add return value to function comment\r
+{\r
+  //\r
+  // if FIFO full can not add data\r
+  //\r
+  if (IsaSerialFifoFull (Fifo)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  //\r
+  // FIFO is not full can add data\r
+  //\r
+  Fifo->Data[Fifo->Last] = Data;\r
+  Fifo->Surplus--;\r
+  Fifo->Last++;\r
+  if (Fifo->Last >= SERIAL_MAX_BUFFER_SIZE) {\r
+    Fifo->Last = 0;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+IsaSerialFifoRemove (\r
+  IN  SERIAL_DEV_FIFO *Fifo,\r
+  OUT UINT8           *Data\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+  Remove data from specific FIFO\r
+\r
+  Arguments:\r
+    Fifo  SERIAL_DEV_FIFO *: A pointer to the Data Structure SERIAL_DEV_FIFO\r
+    Data  UINT8*: the data removed from FIFO\r
+\r
+  Returns:\r
+    EFI_SUCCESS:  Remove data from specific FIFO successfully\r
+    EFI_OUT_RESOURCE: Failed to remove data because FIFO is empty\r
+\r
+--*/\r
+// TODO:    EFI_OUT_OF_RESOURCES - add return value to function comment\r
+{\r
+  //\r
+  // if FIFO is empty, no data can remove\r
+  //\r
+  if (IsaSerialFifoEmpty (Fifo)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  //\r
+  // FIFO is not empty, can remove data\r
+  //\r
+  *Data = Fifo->Data[Fifo->First];\r
+  Fifo->Surplus++;\r
+  Fifo->First++;\r
+  if (Fifo->First >= SERIAL_MAX_BUFFER_SIZE) {\r
+    Fifo->First = 0;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.h b/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.h
new file mode 100644 (file)
index 0000000..30109e2
--- /dev/null
@@ -0,0 +1,507 @@
+/*++\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
+  UnixSerialIo.h\r
+\r
+Abstract:\r
+\r
+\r
+--*/\r
+\r
+#ifndef _UNIXPKG_SERIAL_IO_\r
+#define _UNIXPKG_SERIAL_IO_\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <termio.h>\r
+#include <fcntl.h>\r
+#include <errno.h>\r
+\r
+#define SERIAL_MAX_BUFFER_SIZE  256\r
+#define TIMEOUT_STALL_INTERVAL  10\r
+\r
+typedef struct {\r
+  UINT32  First;\r
+  UINT32  Last;\r
+  UINT32  Surplus;\r
+  UINT8   Data[SERIAL_MAX_BUFFER_SIZE];\r
+} SERIAL_DEV_FIFO;\r
+\r
+#define UNIX_SERIAL_IO_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('U', 'N', 's', 'i')\r
+typedef struct {\r
+  UINT64                    Signature;\r
+\r
+  //\r
+  // Protocol data for the new handle we are going to add\r
+  //\r
+  EFI_HANDLE                Handle;\r
+  EFI_SERIAL_IO_PROTOCOL    SerialIo;\r
+  EFI_SERIAL_IO_MODE        SerialIoMode;\r
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;\r
+\r
+  //\r
+  // Private Data\r
+  //\r
+  EFI_HANDLE                ControllerHandle;\r
+  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;\r
+  UART_DEVICE_PATH          UartDevicePath;\r
+  EFI_UNIX_THUNK_PROTOCOL   *UnixThunk;\r
+\r
+  EFI_UNICODE_STRING_TABLE  *ControllerNameTable;\r
+\r
+  //\r
+  // Private NT type Data;\r
+  //\r
+  UINTN                       UnixHandle;\r
+  struct termios              UnixTermios;\r
+\r
+  BOOLEAN                   SoftwareLoopbackEnable;\r
+  BOOLEAN                   HardwareFlowControl;\r
+  BOOLEAN                   HardwareLoopbackEnable;\r
+\r
+  SERIAL_DEV_FIFO           Fifo;\r
+\r
+} UNIX_SERIAL_IO_PRIVATE_DATA;\r
+\r
+#define UNIX_SERIAL_IO_PRIVATE_DATA_FROM_THIS(a) \\r
+         CR(a, UNIX_SERIAL_IO_PRIVATE_DATA, SerialIo, UNIX_SERIAL_IO_PRIVATE_DATA_SIGNATURE)\r
+\r
+//\r
+// Global Protocol Variables\r
+//\r
+extern EFI_DRIVER_BINDING_PROTOCOL  gUnixSerialIoDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL  gUnixSerialIoComponentName;\r
+\r
+//\r
+// Macros to convert EFI serial types to NT serial types.\r
+//\r
+\r
+//\r
+// one second\r
+//\r
+#define SERIAL_TIMEOUT_DEFAULT  (1000 * 1000) \r
+#define SERIAL_BAUD_DEFAULT     115200\r
+#define SERIAL_FIFO_DEFAULT     14\r
+#define SERIAL_DATABITS_DEFAULT 8\r
+#define SERIAL_PARITY_DEFAULT   DefaultParity\r
+#define SERIAL_STOPBITS_DEFAULT DefaultStopBits\r
+\r
+#define SERIAL_CONTROL_MASK     (EFI_SERIAL_CLEAR_TO_SEND       | \\r
+                                 EFI_SERIAL_DATA_SET_READY      | \\r
+                                 EFI_SERIAL_RING_INDICATE       | \\r
+                                 EFI_SERIAL_CARRIER_DETECT      | \\r
+                                 EFI_SERIAL_REQUEST_TO_SEND     | \\r
+                                 EFI_SERIAL_DATA_TERMINAL_READY | \\r
+                                 EFI_SERIAL_INPUT_BUFFER_EMPTY)\r
+\r
+#define ConvertBaud2Nt(x)       (DWORD) x\r
+#define ConvertData2Nt(x)       (BYTE) x\r
+\r
+#define ConvertParity2Nt(x)              \\r
+    (BYTE) (                             \\r
+    x == DefaultParity ? NOPARITY    :   \\r
+    x == NoParity      ? NOPARITY    :   \\r
+    x == EvenParity    ? EVENPARITY  :   \\r
+    x == OddParity     ? ODDPARITY   :   \\r
+    x == MarkParity    ? MARKPARITY  :   \\r
+    x == SpaceParity   ? SPACEPARITY : 0 \\r
+    )\r
+\r
+#define ConvertStop2Nt(x)                 \\r
+    (BYTE) (                                \\r
+    x == DefaultParity   ? ONESTOPBIT   :   \\r
+    x == OneFiveStopBits ? ONE5STOPBITS :   \\r
+    x == TwoStopBits     ? TWOSTOPBITS  : 0 \\r
+    )\r
+\r
+#define ConvertTime2Nt(x) ((x) / 1000)\r
+\r
+//\r
+// 115400 baud with rounding errors\r
+//\r
+#define SERIAL_PORT_MAX_BAUD_RATE 115400  \r
+\r
+//\r
+// Function Prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeUnixSerialIo (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  ImageHandle - TODO: add argument description\r
+  SystemTable - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingSupported (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,\r
+  IN  EFI_HANDLE                      Handle,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This                - TODO: add argument description\r
+  Handle              - TODO: add argument description\r
+  RemainingDevicePath - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingStart (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL     *This,\r
+  IN  EFI_HANDLE                      Handle,\r
+  IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This                - TODO: add argument description\r
+  Handle              - TODO: add argument description\r
+  RemainingDevicePath - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
+  IN  EFI_HANDLE                    Handle,\r
+  IN  UINTN                         NumberOfChildren,\r
+  IN  EFI_HANDLE                    *ChildHandleBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This              - TODO: add argument description\r
+  Handle            - TODO: add argument description\r
+  NumberOfChildren  - TODO: add argument description\r
+  ChildHandleBuffer - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoReset (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoSetAttributes (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This,\r
+  IN UINT64                 BaudRate,\r
+  IN UINT32                 ReceiveFifoDepth,\r
+  IN UINT32                 Timeout,\r
+  IN EFI_PARITY_TYPE        Parity,\r
+  IN UINT8                  DataBits,\r
+  IN EFI_STOP_BITS_TYPE     StopBits\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This              - TODO: add argument description\r
+  BaudRate          - TODO: add argument description\r
+  ReceiveFifoDepth  - TODO: add argument description\r
+  Timeout           - TODO: add argument description\r
+  Parity            - TODO: add argument description\r
+  DataBits          - TODO: add argument description\r
+  StopBits          - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoSetControl (\r
+  IN EFI_SERIAL_IO_PROTOCOL *This,\r
+  IN UINT32                 Control\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This    - TODO: add argument description\r
+  Control - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoGetControl (\r
+  IN  EFI_SERIAL_IO_PROTOCOL  *This,\r
+  OUT UINT32                  *Control\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This    - TODO: add argument description\r
+  Control - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoWrite (\r
+  IN EFI_SERIAL_IO_PROTOCOL   *This,\r
+  IN OUT UINTN                *BufferSize,\r
+  IN VOID                     *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This        - TODO: add argument description\r
+  BufferSize  - TODO: add argument description\r
+  Buffer      - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixSerialIoRead (\r
+  IN  EFI_SERIAL_IO_PROTOCOL  *This,\r
+  IN  OUT UINTN               *BufferSize,\r
+  OUT VOID                    *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  This        - TODO: add argument description\r
+  BufferSize  - TODO: add argument description\r
+  Buffer      - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+IsaSerialFifoFull (\r
+  IN SERIAL_DEV_FIFO *Fifo\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  Fifo  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+IsaSerialFifoEmpty (\r
+  IN SERIAL_DEV_FIFO *Fifo\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  Fifo  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+IsaSerialFifoAdd (\r
+  IN SERIAL_DEV_FIFO *Fifo,\r
+  IN UINT8           Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  Fifo  - TODO: add argument description\r
+  Data  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+IsaSerialFifoRemove (\r
+  IN  SERIAL_DEV_FIFO *Fifo,\r
+  OUT UINT8           *Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  Fifo  - TODO: add argument description\r
+  Data  - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+IsaSerialReceiveTransmit (\r
+  UNIX_SERIAL_IO_PRIVATE_DATA     *Private\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  Private - TODO: add argument description\r
+\r
+Returns:\r
+\r
+  TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+#endif\r
diff --git a/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.msa b/EdkUnixPkg/Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.msa
new file mode 100644 (file)
index 0000000..793d24a
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
+  <MsaHeader>\r
+    <ModuleName>UnixSerialIo</ModuleName>\r
+    <ModuleType>UEFI_DRIVER</ModuleType>\r
+    <GuidValue>600F2BF2-63A7-48ca-9FD0-A3450B87EE05</GuidValue>\r
+    <Version>1.0</Version>\r
+    <Abstract>Serial I/O driver</Abstract>\r
+    <Description>Our DriverBinding member functions operate on the handles\r
+      created by the Unix Bus driver</Description>\r
+    <Copyright>Copyright (c) 2006 - 2007, Intel Corporation</Copyright>\r
+    <License>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
+      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.</License>\r
+    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
+  </MsaHeader>\r
+  <ModuleDefinitions>\r
+    <SupportedArchitectures>IA32</SupportedArchitectures>\r
+    <BinaryModule>false</BinaryModule>\r
+    <OutputFileBasename>UnixSerialIo</OutputFileBasename>\r
+  </ModuleDefinitions>\r
+  <LibraryClassDefinitions>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>DebugLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiDriverModelLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiDriverEntryPoint</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>BaseMemoryLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>UefiBootServicesTableLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>DevicePathLib</Keyword>\r
+    </LibraryClass>\r
+    <LibraryClass Usage="ALWAYS_CONSUMED">\r
+      <Keyword>MemoryAllocationLib</Keyword>\r
+    </LibraryClass>\r
+  </LibraryClassDefinitions>\r
+  <SourceFiles>\r
+    <Filename>UnixSerialIo.h</Filename>\r
+    <Filename>UnixSerialIo.c</Filename>\r
+    <Filename>ComponentName.c</Filename>\r
+  </SourceFiles>\r
+  <PackageDependencies>\r
+    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
+    <Package PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835"/>\r
+  </PackageDependencies>\r
+  <Protocols>\r
+    <Protocol Usage="TO_START">\r
+      <ProtocolCName>gEfiUnixIoProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+    <Protocol Usage="TO_START">\r
+      <ProtocolCName>gEfiDevicePathProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+    <Protocol Usage="BY_START">\r
+      <ProtocolCName>gEfiSerialIoProtocolGuid</ProtocolCName>\r
+    </Protocol>\r
+  </Protocols>\r
+  <Guids>\r
+    <GuidCNames Usage="ALWAYS_CONSUMED">\r
+      <GuidCName>gEfiUnixSerialPortGuid</GuidCName>\r
+    </GuidCNames>\r
+  </Guids>\r
+  <Externs>\r
+    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
+    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
+    <Extern>\r
+      <DriverBinding>gUnixSerialIoDriverBinding</DriverBinding>\r
+      <ComponentName>gUnixSerialIoComponentName</ComponentName>\r
+    </Extern>\r
+  </Externs>\r
+</ModuleSurfaceArea>
\ No newline at end of file
index efa66abeeb2f365d3ea8fb9567bd4d10bdfd5129..b8611f66d2b0f7790e5ac38e3e435cca89af853f 100644 (file)
@@ -122,6 +122,7 @@ static UNIX_PCD_ENTRY  mPcdEnvironment[] = {
   {PcdToken(PcdUnixConsole),       &gEfiUnixConsoleGuid},\r
   {PcdToken(PcdUnixUga),           &gEfiUnixUgaGuid},\r
   {PcdToken(PcdUnixFileSystem),    &gEfiUnixFileSystemGuid},\r
+  {PcdToken(PcdUnixSerialPort),    &gEfiUnixSerialPortGuid},\r
   {PcdToken(PcdUnixVirtualDisk),   &gEfiUnixVirtualDisksGuid},\r
   {PcdToken(PcdUnixPhysicalDisk),  &gEfiUnixPhysicalDisksGuid},\r
   {PcdToken(PcdUnixCpuModel),      &gEfiUnixCPUModelGuid},\r
@@ -293,10 +294,10 @@ Returns:
 {\r
   EFI_STATUS                      Status;\r
   EFI_STATUS                      InstallStatus;\r
-  EFI_UNIX_THUNK_PROTOCOL       *UnixThunk;\r
+  EFI_UNIX_THUNK_PROTOCOL         *UnixThunk;\r
   EFI_DEVICE_PATH_PROTOCOL        *ParentDevicePath;\r
-  UNIX_BUS_DEVICE               *UnixBusDevice;\r
-  UNIX_IO_DEVICE                *UnixDevice;\r
+  UNIX_BUS_DEVICE                 *UnixBusDevice;\r
+  UNIX_IO_DEVICE                  *UnixDevice;\r
   UINTN                           Index;\r
   CHAR16                          *StartString;\r
   CHAR16                          *SubString;\r
@@ -428,7 +429,6 @@ Returns:
       }\r
 \r
       if (CreateDevice) {\r
-\r
         //\r
         // Allocate instance structure, and fill in parent information.\r
         //\r
@@ -441,7 +441,7 @@ Returns:
         UnixDevice->ControllerHandle   = ControllerHandle;\r
         UnixDevice->ParentDevicePath   = ParentDevicePath;\r
 \r
-        UnixDevice->UnixIo.UnixThunk = UnixThunk;\r
+        UnixDevice->UnixIo.UnixThunk   = UnixThunk;\r
 \r
         //\r
         // Plus 2 to account for the NULL at the end of the Unicode string\r
index b64a8216de97b94c8c9d941c1e0e0a273ae06c85..6422c062f5c66cd2b6e339eab64d3857bb072f47 100644 (file)
@@ -1,22 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <MsaHeader>\r
     <ModuleName>UnixBusDriver</ModuleName>\r
     <ModuleType>UEFI_DRIVER</ModuleType>\r
     <GuidValue>f320d656-8985-11db-90e0-0040d02b1835</GuidValue>\r
     <Version>1.0</Version>\r
     <Abstract>Unix Bus driver</Abstract>\r
-    <Description>\r
-      This following section documents the envirnoment variables for the Win NT\r
-      build.  These variables are used to define the (virtual) hardware\r
-      configuration of the NT environment\r
-    </Description>\r
+    <Description>This following section documents the envirnoment variables for the Win NT
+      build.  These variables are used to define the (virtual) hardware
+      configuration of the NT environment</Description>\r
     <Copyright>Copyright (c) 2006, Intel Corporation</Copyright>\r
-    <License>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
-      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+    <License>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.</License>\r
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </MsaHeader>\r
     <GuidCNames Usage="ALWAYS_CONSUMED">\r
       <GuidCName>gEfiUnixCPUSpeedGuid</GuidCName>\r
     </GuidCNames>\r
+    <GuidCNames Usage="ALWAYS_CONSUMED">\r
+      <GuidCName>gEfiUnixSerialPortGuid</GuidCName>\r
+    </GuidCNames>\r
   </Guids>\r
   <Externs>\r
     <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixConsole</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD declares the title string of the text console window.\r
-        such as "My EFI Console".\r
+      <HelpText>This PCD declares the title string of the text console window.
+        such as "My EFI Console".
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixUga</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD declares the resolutions for the UGA windows.\r
+      <HelpText>This PCD declares the resolutions for the UGA windows.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixFileSystem</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD defines the unix directory who will be mounted as\r
-        harddisk in simulator.\r
+      <HelpText>This PCD defines the unix directory who will be mounted as
+        harddisk in simulator.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixVirtualDisk</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD defines the devices which use a file to emulate a hard disk or\r
-        removable media device\r
+      <HelpText>This PCD defines the devices which use a file to emulate a hard disk or
+        removable media device
         The item type if this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixPhysicalDisk</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD defines physical disk which will be simualted as a\r
-        harddisk in simulator.\r
+      <HelpText>This PCD defines physical disk which will be simualted as a
+        harddisk in simulator.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixCpuModel</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD defines simulated CPU model string.\r
+      <HelpText>This PCD defines simulated CPU model string.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry PcdItemType="DYNAMIC">\r
     <PcdEntry PcdItemType="DYNAMIC">\r
       <C_Name>PcdUnixMemorySize</C_Name>\r
       <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>This PCD defines the size of simulated memory size.\r
+      <HelpText>This PCD defines the size of simulated memory size.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
+    <PcdEntry PcdItemType="DYNAMIC" Usage="ALWAYS_CONSUMED">\r
+      <C_Name>PcdUnixSerialPort</C_Name>\r
+      <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <HelpText>Simulation serial IO port</HelpText>\r
+    </PcdEntry>\r
   </PcdCoded>\r
-</ModuleSurfaceArea>
+</ModuleSurfaceArea>
\ No newline at end of file
index c4360e89f2e9255d91da34e3eeb054d3bd1cc679..a9622dd4bb115f57734bf1bbc969f8c37473ddfd 100644 (file)
@@ -1,15 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-Copyright (c) 2006 - 2007, 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
-<PackageSurfaceArea  xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<PackageSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\r
   <SpdHeader>\r
     <PackageName>EdkUnixPkg</PackageName>\r
     <GuidValue>f2805c44-8985-11db-9e98-0040d02b1835</GuidValue>\r
@@ -26,7 +16,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </SpdHeader>\r
   <PackageDefinitions>\r
-    <ReadOnly>true</ReadOnly>\r
+    <ReadOnly>false</ReadOnly>\r
     <RePackage>false</RePackage>\r
   </PackageDefinitions>\r
   <LibraryClassDeclarations>\r
@@ -92,6 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     <Filename>Dxe/UnixThunk/Bus/Console/UnixConsole.msa</Filename>\r
     <Filename>Dxe/UnixThunk/Bus/SimpleFileSystem/UnixSimpleFileSystem.msa</Filename>\r
     <Filename>Dxe/UnixThunk/Bus/Uga/UnixUga.msa</Filename>\r
+    <Filename>Dxe/UnixThunk/Bus/SerialIo/UnixSerialIo.msa</Filename>\r
     <Filename>Dxe/UnixThunk/Bus/UnixBusDriver/UnixBusDriver.msa</Filename>\r
     <Filename>Dxe/UnixThunk/Chipset/Metronome/Metronome.msa</Filename>\r
     <Filename>Dxe/UnixThunk/Chipset/RealTimeClock/RealTimeClock.msa</Filename>\r
@@ -172,6 +163,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <GuidValue>f2de8f12-8985-11db-aabc-0040d02b1835</GuidValue>\r
       <HelpText/>\r
     </Entry>\r
+    <Entry Name="UnixSerialPort">\r
+      <C_Name>gEfiUnixSerialPortGuid</C_Name>\r
+      <GuidValue>6d3a727d-66c8-4d19-87e6-0215861490f3</GuidValue>\r
+      <HelpText/>\r
+    </Entry>\r
   </GuidDeclarations>\r
   <ProtocolDeclarations>\r
     <Entry Name="UnixIo">\r
@@ -220,7 +216,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"E:RW;245760;512"</DefaultValue>\r
-      <HelpText>This PCD defines physical disk which will be simualted as a \r
+      <HelpText>This PCD defines physical disk which will be simualted as a 
         harddisk in simulator. The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -230,7 +226,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"FW;40960;512"</DefaultValue>\r
-      <HelpText>This PCD defines the devices which use a file to emulate a hard disk or \r
+      <HelpText>This PCD defines the devices which use a file to emulate a hard disk or 
         removable media device.The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -240,7 +236,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"UGA Window"</DefaultValue>\r
-      <HelpText>This PCD declares the resolutions for the UGA windows.\r
+      <HelpText>This PCD declares the resolutions for the UGA windows.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -250,8 +246,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L".!..\\..\\..\\..\\..\\EdkShellBinPkg\\bin\\ia32\\Apps"</DefaultValue>\r
-      <HelpText>This PCD defines the host directory who will be mounted as \r
-        harddisk in simulator.\r
+      <HelpText>This PCD defines the host directory who will be mounted as 
+        harddisk in simulator.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -261,8 +257,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"64!64"</DefaultValue>\r
-      <HelpText>This PCD defines the memory size of simulated machine. Simulator will allocate\r
-        the size of PcdUnixMemorySize in host platform.\r
+      <HelpText>This PCD defines the memory size of simulated machine. Simulator will allocate
+        the size of PcdUnixMemorySize in host platform.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -272,18 +268,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>UINT32</DatumType>\r
       <ValidUsage>FIXED_AT_BUILD PATCHABLE_IN_MODULE</ValidUsage>\r
       <DefaultValue>1</DefaultValue>\r
-      <HelpText>This PCD defines the boot mode for simualtor. \r
-        The boot mode can be set as following value:\r
-          0x0:  Boot with full configuration.\r
-          0x1:  Boot with minimal configuration.\r
-          0x2:  Boot assume no configuration changes.\r
-          0x3:  Boot with full configuration plus diagnostics.\r
-          0x4:  Boot with default settings.\r
-          0x5:  Boot on S4 resume.\r
-          0x6:  Boot on S5 resume.\r
-          0x10: Boot on S2 resume. \r
-          0x11: Boot on S3 resume.\r
-          0x12: Boot on flash update.\r
+      <HelpText>This PCD defines the boot mode for simualtor. 
+        The boot mode can be set as following value:
+          0x0:  Boot with full configuration.
+          0x1:  Boot with minimal configuration.
+          0x2:  Boot assume no configuration changes.
+          0x3:  Boot with full configuration plus diagnostics.
+          0x4:  Boot with default settings.
+          0x5:  Boot on S4 resume.
+          0x6:  Boot on S5 resume.
+          0x10: Boot on S2 resume. 
+          0x11: Boot on S3 resume.
+          0x12: Boot on flash update.
           0x20: Boot in reovery mode.</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -293,7 +289,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"Intel(R) Processor Model"</DefaultValue>\r
-      <HelpText>This PCD defines simulated CPU model string.\r
+      <HelpText>This PCD defines simulated CPU model string.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -303,7 +299,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"3000"</DefaultValue>\r
-      <HelpText>This PCD defines simulated CPU speed string.\r
+      <HelpText>This PCD defines simulated CPU speed string.
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -322,8 +318,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>DYNAMIC</ValidUsage>\r
       <DefaultValue>L"Bus Driver Console Window"</DefaultValue>\r
-      <HelpText>This PCD declares the title string of the text console window. \r
-        such as "My EFI Console".\r
+      <HelpText>This PCD declares the title string of the text console window. 
+        such as "My EFI Console".
         The item type of this PCD can only be "DYNAMIC".</HelpText>\r
     </PcdEntry>\r
     <PcdEntry>\r
@@ -333,8 +329,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
       <DatumType>VOID*</DatumType>\r
       <ValidUsage>FIXED_AT_BUILD PATCHABLE_IN_MODULE</ValidUsage>\r
       <DefaultValue>L"64!64"</DefaultValue>\r
-      <HelpText>This PCD defines the memory size of simulated machine. Simulator will allocate\r
+      <HelpText>This PCD defines the memory size of simulated machine. Simulator will allocate
         the size of PcdUnixMemorySizeForSecMain in host platform.</HelpText>\r
     </PcdEntry>\r
+    <PcdEntry>\r
+      <C_Name>PcdUnixSerialPort</C_Name>\r
+      <Token>0x00001002</Token>\r
+      <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DatumType>VOID*</DatumType>\r
+      <ValidUsage>DYNAMIC</ValidUsage>\r
+      <DefaultValue>L"/dev/ttyS0"</DefaultValue>\r
+      <HelpText>Simulation serial IO port</HelpText>\r
+    </PcdEntry>\r
   </PcdDeclarations>\r
-</PackageSurfaceArea>
+</PackageSurfaceArea>
\ No newline at end of file
index 2d8e9fab7dac61b460ba3c9a67e28b25a4fbf9a9..1758ecb7c4b25d64d4bad4c9dd02fe9316c87360 100644 (file)
@@ -69,6 +69,16 @@ extern EFI_GUID gEfiUnixPhysicalDisksGuid;
 \r
 extern EFI_GUID gEfiUnixFileSystemGuid;\r
 \r
+//\r
+// EFI_WIN_NT_SERIAL_PORT\r
+//\r
+#define EFI_UNIX_SERIAL_PORT_GUID \\r
+  { \\r
+    0x6d3a727d, 0x66c8, 0x4d19, {0x87, 0xe6, 0x2, 0x15, 0x86, 0x14, 0x90, 0xf3} \\r
+  }\r
+\r
+extern EFI_GUID gEfiUnixSerialPortGuid;\r
+\r
 //\r
 // EFI_UNIX_UGA\r
 //\r
index aabb9b130dc2dd363851effd82518f91a7886e0a..1fa4e902048660db52f8bcad0acd818d1547e32d 100644 (file)
@@ -28,6 +28,7 @@ Abstract:
 #ifndef _UNIX_THUNK_H_\r
 #define _UNIX_THUNK_H_\r
 \r
+#include <sys/termios.h>\r
 
 #define EFI_UNIX_THUNK_PROTOCOL_GUID \\r
   { \\r
@@ -137,6 +138,43 @@ typedef
 EFI_STATUS
 (*UnixUgaCreate)(struct _EFI_UNIX_UGA_IO_PROTOCOL **UgaIo,
                 CONST CHAR16 *Title);
+\r
+typedef\r
+int\r
+(*UnixTcflush) (int fildes, int queue_selector);\r
+\r
+typedef\r
+void\r
+(*UnixPerror) (__const char *__s);\r
+\r
+typedef\r
+void\r
+(*UnixPrintf) (const char* format, ...);\r
+\r
+typedef \r
+int \r
+(*UnixIoCtl) (int fd, unsigned long int __request, ...);\r
+\r
+typedef \r
+int \r
+(*UnixFcntl) (int __fd, int __cmd, ...);\r
+\r
+typedef\r
+int \r
+(*UnixCfsetispeed) (struct termios *__termios_p, speed_t __speed);\r
+\r
+typedef \r
+int \r
+(*UnixCfsetospeed) (struct termios *__termios_p, speed_t __speed);\r
+\r
+typedef\r
+int \r
+(*UnixTcgetattr) (int __fd, struct termios *__termios_p);\r
+\r
+typedef \r
+int \r
+(*UnixTcsetattr) (int __fd, int __optional_actions,\r
+                     __const struct termios *__termios_p);\r
 
 //\r
 //\r
@@ -147,14 +185,14 @@ EFI_STATUS
 typedef struct _EFI_UNIX_THUNK_PROTOCOL {\r
   UINT64                              Signature;\r
 
-  UnixSleep                          Sleep;\r
+  UnixSleep                           Sleep;\r
   UnixExit                           Exit;\r
-  UnixSetTimer                       SetTimer;
-  UnixGetLocalTime                   GetLocalTime;
+  UnixSetTimer                        SetTimer;
+  UnixGetLocalTime                             GetLocalTime;
   UnixGmTime                          GmTime;
   UnixGetTimeZone                     GetTimeZone;
   UnixGetDayLight                     GetDayLight;
-  UnixPoll                           Poll;
+  UnixPoll                               Poll;
   UnixRead                           Read;
   UnixWrite                          Write;
   UnixGetenv                         Getenv;
@@ -177,9 +215,16 @@ typedef struct _EFI_UNIX_THUNK_PROTOCOL {
   UnixFSync                           FSync;
   UnixChmod                           Chmod;
   UnixUTime                           UTime;
-
-  UnixUgaCreate                              UgaCreate;
-
+  UnixTcflush                         Tcflush;
+  UnixUgaCreate                                          UgaCreate;
+  UnixPerror                          Perror;\r
+  UnixPrintf                          Printf;\r
+  UnixIoCtl                           IoCtl;\r
+  UnixFcntl                           Fcntl;\r
+  UnixCfsetispeed                     Cfsetispeed;\r
+  UnixCfsetospeed                     Cfsetospeed;\r
+  UnixTcgetattr                       Tcgetattr;\r
+  UnixTcsetattr                       Tcsetattr;\r
 } EFI_UNIX_THUNK_PROTOCOL;
 \r
 extern EFI_GUID gEfiUnixThunkProtocolGuid;\r
index c1988faf591095da13a1f24bc54c0103c80cd5b5..9d74b5b8c30b10ac811398d7dd686c5810bb5a20 100644 (file)
@@ -37,7 +37,8 @@ Abstract:
 #include <time.h>
 #include <signal.h>
 #include <string.h>
-#include <stdlib.h>
+#include <stdlib.h>\r
+#include <termio.h>
 
 static int settimer_initialized;
 static struct timeval settimer_timeval;
@@ -187,8 +188,16 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = {
   fsync,
   chmod,
   utime,
-
-  UgaCreate,
+  tcflush,
+  UgaCreate,\r
+  perror,\r
+  printf,\r
+  ioctl,\r
+  fcntl,\r
+  cfsetispeed,\r
+  cfsetospeed,\r
+  tcgetattr,\r
+  tcsetattr
 };\r
 \r
 \r
index c48a5e78c65cb2bbe3f4fa888a0d107a3ccb6518..012b70b1c5e986e6860b6eb90710909d744261c8 100644 (file)
           <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
           <DatumType>UINT32</DatumType>\r
           <MaxDatumSize>4</MaxDatumSize>\r
-          <Value>0x80000000</Value>\r
+          <Value>0x80000040</Value>\r
         </PcdData>\r
         <PcdData ItemType="FEATURE_FLAG">\r
           <C_Name>PcdComponentNameDisable</C_Name>\r
           <MaxDatumSize>4</MaxDatumSize>\r
           <Value>320</Value>\r
         </PcdData>\r
+        <PcdData ItemType="DYNAMIC">\r
+          <C_Name>PcdUnixSerialPort</C_Name>\r
+          <Token>0x00001002</Token>\r
+          <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>VOID*</DatumType>\r
+          <MaxDatumSize>20</MaxDatumSize>\r
+          <Value>L"/dev/ttyS0"</Value>\r
+        </PcdData>\r
       </PcdBuildDefinition>\r
       <ModuleSaBuildOptions>\r
         <FvBinding>FV_RECOVERY</FvBinding>\r
         <FfsFormatKey>Logo</FfsFormatKey>\r
       </ModuleSaBuildOptions>\r
     </ModuleSA>\r
+    <!--Mod: UnixSerialIo Type: UEFI_DRIVER Path: EdkUnixPkg\Dxe\UnixThunk\Bus\SerialIo\UnixSerialIo.msa-->\r
+    <ModuleSA ModuleGuid="600F2BF2-63A7-48ca-9FD0-A3450B87EE05" ModuleVersion="1.0" PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835" PackageVersion="0.3" SupArchList="IA32">\r
+      <Libraries>\r
+        <!--Pkg: MdePkg Mod: BaseLib Path: MdePkg\Library\BaseLib\BaseLib.msa-->\r
+        <Instance ModuleGuid="27d67720-ea68-48ae-93da-a3a074c90e30" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: DxeMemoryAllocationLib Path: MdePkg\Library\DxeMemoryAllocationLib\DxeMemoryAllocationLib.msa-->\r
+        <Instance ModuleGuid="4674739d-3195-4fb2-8094-ac1d22d00194" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: UefiDriverEntryPoint Path: MdePkg\Library\UefiDriverEntryPoint\UefiDriverEntryPoint.msa-->\r
+        <Instance ModuleGuid="331deb15-454b-48d8-9b74-70d01f3f3556" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: UefiLib Path: MdePkg\Library\UefiLib\UefiLib.msa-->\r
+        <Instance ModuleGuid="3a004ba5-efe0-4a61-9f1a-267a46ae5ba9" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: UefiDriverModelLib Path: MdePkg\Library\UefiDriverModelLib\UefiDriverModelLib.msa-->\r
+        <Instance ModuleGuid="52af22ae-9901-4484-8cdc-622dd5838b09" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: UefiBootServicesTableLib Path: MdePkg\Library\UefiBootServicesTableLib\UefiBootServicesTableLib.msa-->\r
+        <Instance ModuleGuid="ff5c7a2c-ab7a-4366-8616-11c6e53247b6" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: BaseMemoryLib Path: MdePkg\Library\BaseMemoryLib\BaseMemoryLib.msa-->\r
+        <Instance ModuleGuid="fd44e603-002a-4b29-9f5f-529e815b6165" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: BaseTimerLibNullTemplate Path: MdePkg\Library\BaseTimerLibNullTemplate\BaseTimerLibNullTemplate.msa-->\r
+        <Instance ModuleGuid="f4731d79-537e-4505-bd52-c03f9b1f6b89" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: PeiDxeDebugLibReportStatusCode Path: MdePkg\Library\PeiDxeDebugLibReportStatusCode\PeiDxeDebugLibReportStatusCode.msa-->\r
+        <Instance ModuleGuid="bda39d3a-451b-4350-8266-81ab10fa0523" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: DxeReportStatusCodeLib Path: MdePkg\Library\DxeReportStatusCodeLib\DxeReportStatusCodeLib.msa-->\r
+        <Instance ModuleGuid="3ddc3b12-99ea-4364-b315-6310a2050be5" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: BasePrintLib Path: MdePkg\Library\BasePrintLib\BasePrintLib.msa-->\r
+        <Instance ModuleGuid="a86fbfca-0183-4eeb-aa8a-762e3b7da1f3" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: UefiDevicePathLib Path: MdePkg\Library\UefiDevicePathLib\UefiDevicePathLib.msa-->\r
+        <Instance ModuleGuid="91c1677a-e57f-4191-8b8e-eb7711a716e0" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+        <!--Pkg: MdePkg Mod: DxePcdLib Path: MdePkg\Library\DxePcdLib\DxePcdLib.msa-->\r
+        <Instance ModuleGuid="af97eb89-4cc6-45f8-a514-ca025b346480" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3"/>\r
+      </Libraries>\r
+      <PcdBuildDefinition>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdMaximumUnicodeStringLength</C_Name>\r
+          <Token>0x00000001</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>1000000</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdMaximumAsciiStringLength</C_Name>\r
+          <Token>0x00000002</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>1000000</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdMaximumLinkedListLength</C_Name>\r
+          <Token>0x00000003</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>1000000</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdSpinLockTimeout</C_Name>\r
+          <Token>0x00000004</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>10000000</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdUefiLibMaxPrintBufferSize</C_Name>\r
+          <Token>0x101</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>320</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdComponentNameDisable</C_Name>\r
+          <Token>0x0000000d</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FEATURE_FLAG">\r
+          <C_Name>PcdDriverDiagnosticsDisable</C_Name>\r
+          <Token>0x0000000e</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>BOOLEAN</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>FALSE</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdDebugPropertyMask</C_Name>\r
+          <Token>0x00000005</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT8</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>0x0f</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdDebugClearMemoryValue</C_Name>\r
+          <Token>0x00000008</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT8</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>0xAF</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdDebugPrintErrorLevel</C_Name>\r
+          <Token>0x00000006</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT32</DatumType>\r
+          <MaxDatumSize>4</MaxDatumSize>\r
+          <Value>0x80000040</Value>\r
+        </PcdData>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdReportStatusCodePropertyMask</C_Name>\r
+          <Token>0x00000007</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT8</DatumType>\r
+          <MaxDatumSize>1</MaxDatumSize>\r
+          <Value>0x06</Value>\r
+        </PcdData>\r
+      </PcdBuildDefinition>\r
+      <ModuleSaBuildOptions>\r
+        <FvBinding>FV_RECOVERY</FvBinding>\r
+        <FfsFormatKey>BS_DRIVER</FfsFormatKey>\r
+      </ModuleSaBuildOptions>\r
+    </ModuleSA>\r
   </FrameworkModules>\r
   <DynamicPcdBuildDefinitions>\r
     <PcdBuildData ItemType="DYNAMIC">\r
         <Value>L"64!64"</Value>\r
       </SkuInfo>\r
     </PcdBuildData>\r
+    <PcdBuildData ItemType="DYNAMIC">\r
+      <C_Name>PcdUnixSerialPort</C_Name>\r
+      <Token>0x00001002</Token>\r
+      <TokenSpaceGuidCName>gEfiEdkUnixPkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+      <DatumType>VOID*</DatumType>\r
+      <MaxDatumSize>20</MaxDatumSize>\r
+      <SkuInfo>\r
+        <SkuId>0</SkuId>\r
+        <Value>L"/dev/ttyS0"</Value>\r
+      </SkuInfo>\r
+    </PcdBuildData>\r
   </DynamicPcdBuildDefinitions>\r
   <BuildOptions>\r
     <Options>\r
         <Module ModuleGuid="961578FE-B6B7-44c3-AF35-6BC705CD2B1F" PackageGuid="0fd7197b-9bde-44fe-a7e4-d2177a9922e5" Arch="IA32"/>\r
         <Module ModuleGuid="6987936E-ED34-44db-AE97-1FA5E4ED2116" PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d" Arch="IA32"/>\r
         <Module ModuleGuid="f330834e-8985-11db-a295-0040d02b1835" ModuleVersion="1.0" PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835" PackageVersion="0.3" Arch="IA32"/>\r
+        <Module ModuleGuid="600F2BF2-63A7-48ca-9FD0-A3450B87EE05" ModuleVersion="1.0" PackageGuid="f2805c44-8985-11db-9e98-0040d02b1835" PackageVersion="0.3" Arch="IA32"/>\r
       </IncludeModules>\r
     </UserExtensions>\r
     <Ffs FfsKey="APPLICATION">\r