]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
UnixPkg: Remove UnixPkg files (It is replaced by EmulatorPkg)
[mirror_edk2.git] / UnixPkg / UnixBlockIoDxe / UnixBlockIo.c
diff --git a/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c b/UnixPkg/UnixBlockIoDxe/UnixBlockIo.c
deleted file mode 100644 (file)
index 2de6cc6..0000000
+++ /dev/null
@@ -1,1288 +0,0 @@
-/*++\r
-\r
-Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>\r
-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
-  UnixBlockIo.c\r
-\r
-Abstract:\r
-\r
-  Produce block IO abstractions for real devices on your PC using Posix APIs.\r
-  The configuration of what devices to mount or emulate comes from UNIX \r
-  environment variables. The variables must be visible to the Microsoft* \r
-  Developer Studio for them to work.\r
-\r
-  <F>ixed       - Fixed disk like a hard drive.\r
-  <R>emovable   - Removable media like a floppy or CD-ROM.\r
-  Read <O>nly   - Write protected device.\r
-  Read <W>rite  - Read write device.\r
-  <block count> - Decimal number of blocks a device supports.\r
-  <block size>  - Decimal number of bytes per block.\r
-\r
-  UNIX envirnonment variable contents. '<' and '>' are not part of the variable, \r
-  they are just used to make this help more readable. There should be no \r
-  spaces between the ';'. Extra spaces will break the variable. A '!' is \r
-  used to seperate multiple devices in a variable.\r
-\r
-  EFI_UNIX_VIRTUAL_DISKS = \r
-    <F | R><O | W>;<block count>;<block size>[!...]\r
-\r
-  EFI_UNIX_PHYSICAL_DISKS =\r
-    <drive letter>:<F | R><O | W>;<block count>;<block size>[!...]\r
-\r
-  Virtual Disks: These devices use a file to emulate a hard disk or removable\r
-                 media device. \r
-                 \r
-    Thus a 20 MB emulated hard drive would look like:\r
-    EFI_UNIX_VIRTUAL_DISKS=FW;40960;512\r
-\r
-    A 1.44MB emulated floppy with a block size of 1024 would look like:\r
-    EFI_UNIX_VIRTUAL_DISKS=RW;1440;1024\r
-\r
-  Physical Disks: These devices use UNIX to open a real device in your system\r
-\r
-    Thus a 120 MB floppy would look like:\r
-    EFI_UNIX_PHYSICAL_DISKS=B:RW;245760;512\r
-\r
-    Thus a standard CD-ROM floppy would look like:\r
-    EFI_UNIX_PHYSICAL_DISKS=Z:RO;307200;2048\r
-\r
-\r
-  * Other names and brands may be claimed as the property of others.\r
-\r
---*/\r
-\r
-#include <fcntl.h>\r
-#include <unistd.h>\r
-#include "UnixBlockIo.h"\r
-\r
-//\r
-// Block IO protocol member functions\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoReadBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN UINT32                 MediaId,\r
-  IN EFI_LBA                Lba,\r
-  IN 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
-  MediaId     - TODO: add argument description\r
-  Lba         - 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
-UnixBlockIoWriteBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN UINT32                 MediaId,\r
-  IN EFI_LBA                Lba,\r
-  IN 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
-  MediaId     - TODO: add argument description\r
-  Lba         - 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
-UnixBlockIoFlushBlocks (\r
-  IN EFI_BLOCK_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
-UnixBlockIoResetBlock (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN BOOLEAN                ExtendedVerification\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  This                  - TODO: add argument description\r
-  ExtendedVerification  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-\r
-//\r
-// Private Worker functions\r
-//\r
-EFI_STATUS\r
-UnixBlockIoCreateMapping (\r
-  IN EFI_UNIX_IO_PROTOCOL             *UnixIo,\r
-  IN EFI_HANDLE                         EfiDeviceHandle,\r
-  IN CHAR16                             *Filename,\r
-  IN BOOLEAN                            ReadOnly,\r
-  IN BOOLEAN                            RemovableMedia,\r
-  IN UINTN                              NumberOfBlocks,\r
-  IN UINTN                              BlockSize\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  UnixIo         - TODO: add argument description\r
-  EfiDeviceHandle - TODO: add argument description\r
-  Filename        - TODO: add argument description\r
-  ReadOnly        - TODO: add argument description\r
-  RemovableMedia  - TODO: add argument description\r
-  NumberOfBlocks  - TODO: add argument description\r
-  BlockSize       - TODO: add argument description\r
-  DeviceType      - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-UnixBlockIoReadWriteCommon (\r
-  IN  UNIX_BLOCK_IO_PRIVATE *Private,\r
-  IN UINT32                   MediaId,\r
-  IN EFI_LBA                  Lba,\r
-  IN UINTN                    BufferSize,\r
-  IN VOID                     *Buffer,\r
-  IN CHAR8                    *CallerName\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  Private     - TODO: add argument description\r
-  MediaId     - TODO: add argument description\r
-  Lba         - TODO: add argument description\r
-  BufferSize  - TODO: add argument description\r
-  Buffer      - TODO: add argument description\r
-  CallerName  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-UnixBlockIoError (\r
-  IN UNIX_BLOCK_IO_PRIVATE      *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
-EFI_STATUS\r
-UnixBlockIoOpenDevice (\r
-  UNIX_BLOCK_IO_PRIVATE         *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
-CHAR16                                    *\r
-GetNextElementPastTerminator (\r
-  IN  CHAR16  *EnvironmentVariable,\r
-  IN  CHAR16  Terminator\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  EnvironmentVariable - TODO: add argument description\r
-  Terminator          - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-EFI_DRIVER_BINDING_PROTOCOL gUnixBlockIoDriverBinding = {\r
-  UnixBlockIoDriverBindingSupported,\r
-  UnixBlockIoDriverBindingStart,\r
-  UnixBlockIoDriverBindingStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoDriverBindingSupported (\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
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Handle - add argument and description to function comment\r
-// TODO:    RemainingDevicePath - add argument and description to function comment\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_UNIX_IO_PROTOCOL  *UnixIo;\r
-\r
-  //\r
-  // Open the IO Abstraction(s) needed to perform the supported test\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)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Make sure the UnixThunkProtocol is valid\r
-  //\r
-  Status = EFI_UNSUPPORTED;\r
-  if (UnixIo->UnixThunk->Signature == EFI_UNIX_THUNK_PROTOCOL_SIGNATURE) {\r
-\r
-    //\r
-    // Check the GUID to see if this is a handle type the driver supports\r
-    //\r
-    if (CompareGuid (UnixIo->TypeGuid, &gEfiUnixVirtualDisksGuid) ) {\r
-      Status = EFI_SUCCESS;\r
-    }\r
-  }\r
-\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
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoDriverBindingStart (\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
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Handle - add argument and description to function comment\r
-// TODO:    RemainingDevicePath - add argument and description to function comment\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_UNIX_IO_PROTOCOL       *UnixIo;\r
-  CHAR16                      Buffer[FILENAME_BUFFER_SIZE];\r
-  CHAR16                      *Str;\r
-  BOOLEAN                     RemovableMedia;\r
-  BOOLEAN                     WriteProtected;\r
-  UINTN                       NumberOfBlocks;\r
-  UINTN                       BlockSize;\r
-  INTN                        i;\r
-\r
-  //\r
-  // Grab the protocols we need\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 (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  //\r
-  // Set DiskType\r
-  //\r
-  if (!CompareGuid (UnixIo->TypeGuid, &gEfiUnixVirtualDisksGuid)) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-\r
-  Status  = EFI_NOT_FOUND;\r
-  //  Extract filename.\r
-  Str     = UnixIo->EnvString;\r
-  i = 0;\r
-  while (*Str && *Str != ':')\r
-    Buffer[i++] = *Str++;\r
-  Buffer[i] = 0;\r
-  if (*Str != ':') {\r
-    goto Done;\r
-  }\r
-\r
-  Str++;\r
-\r
-  RemovableMedia = FALSE;\r
-  WriteProtected = TRUE;\r
-  NumberOfBlocks = 0;\r
-  BlockSize = 512;\r
-  do {\r
-    if (*Str == 'R' || *Str == 'F') {\r
-      RemovableMedia = (BOOLEAN) (*Str == 'R');\r
-      Str++;\r
-    }\r
-    if (*Str == 'O' || *Str == 'W') {\r
-      WriteProtected  = (BOOLEAN) (*Str == 'O');\r
-      Str++;\r
-    }\r
-    if (*Str == 0)\r
-      break;\r
-    if (*Str != ';')\r
-      goto Done;\r
-    Str++;\r
-\r
-    NumberOfBlocks  = Atoi (Str);\r
-    Str       = GetNextElementPastTerminator (Str, ';');\r
-    if (NumberOfBlocks == 0)\r
-      break;\r
-\r
-    BlockSize = Atoi (Str);\r
-    if (BlockSize != 0)\r
-      Str       = GetNextElementPastTerminator (Str, ';');\r
-  } while (0);\r
-\r
-  //\r
-  // If we get here the variable is valid so do the work.\r
-  //\r
-  Status = UnixBlockIoCreateMapping (\r
-              UnixIo,\r
-              Handle,\r
-              Buffer,\r
-              WriteProtected,\r
-              RemovableMedia,\r
-              NumberOfBlocks,\r
-              BlockSize\r
-              );\r
-\r
-Done:\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-          Handle,\r
-          &gEfiUnixIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Handle\r
-          );\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoDriverBindingStop (\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_UNSUPPORTED - TODO: Add description for return value\r
-\r
---*/\r
-{\r
-  EFI_BLOCK_IO_PROTOCOL   *BlockIo;\r
-  EFI_STATUS              Status;\r
-  UNIX_BLOCK_IO_PRIVATE *Private;\r
-\r
-  //\r
-  // Get our context back\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Handle,\r
-                  &gEfiBlockIoProtocolGuid,\r
-                  (void *)&BlockIo,\r
-                  This->DriverBindingHandle,\r
-                  Handle,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (BlockIo);\r
-\r
-  //\r
-  // BugBug: If we need to kick people off, we need to make Uninstall Close the handles.\r
-  //         We could pass in our image handle or FLAG our open to be closed via\r
-  //         Unistall (== to saying any CloseProtocol will close our open)\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  Private->EfiHandle,\r
-                  &gEfiBlockIoProtocolGuid,\r
-                  &Private->BlockIo,\r
-                  NULL\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-\r
-    Status = gBS->CloseProtocol (\r
-                    Handle,\r
-                    &gEfiUnixIoProtocolGuid,\r
-                    This->DriverBindingHandle,\r
-                    Handle\r
-                    );\r
-\r
-    //\r
-    // Shut down our device\r
-    //\r
-    Private->UnixThunk->Close (Private->fd);\r
-\r
-    //\r
-    // Free our instance data\r
-    //\r
-    FreeUnicodeStringTable (Private->ControllerNameTable);\r
-\r
-    gBS->FreePool (Private);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-CHAR16 *\r
-GetNextElementPastTerminator (\r
-  IN  CHAR16  *EnvironmentVariable,\r
-  IN  CHAR16  Terminator\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Worker function to parse environment variables.\r
-\r
-Arguments:\r
-  EnvironmentVariable - Envirnment variable to parse.\r
-\r
-  Terminator          - Terminator to parse for.\r
-\r
-Returns: \r
-\r
-  Pointer to next eliment past the first occurence of Terminator or the '\0'\r
-  at the end of the string.\r
-\r
---*/\r
-{\r
-  CHAR16  *Ptr;\r
-\r
-  for (Ptr = EnvironmentVariable; *Ptr != '\0'; Ptr++) {\r
-    if (*Ptr == Terminator) {\r
-      Ptr++;\r
-      break;\r
-    }\r
-  }\r
-\r
-  return Ptr;\r
-}\r
-\r
-EFI_STATUS\r
-UnixBlockIoCreateMapping (\r
-  IN EFI_UNIX_IO_PROTOCOL             *UnixIo,\r
-  IN EFI_HANDLE                         EfiDeviceHandle,\r
-  IN CHAR16                             *Filename,\r
-  IN BOOLEAN                            ReadOnly,\r
-  IN BOOLEAN                            RemovableMedia,\r
-  IN UINTN                              NumberOfBlocks,\r
-  IN UINTN                              BlockSize\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  UnixIo         - TODO: add argument description\r
-  EfiDeviceHandle - TODO: add argument description\r
-  Filename        - TODO: add argument description\r
-  ReadOnly        - TODO: add argument description\r
-  RemovableMedia  - TODO: add argument description\r
-  NumberOfBlocks  - TODO: add argument description\r
-  BlockSize       - TODO: add argument description\r
-  DeviceType      - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_BLOCK_IO_PROTOCOL   *BlockIo;\r
-  UNIX_BLOCK_IO_PRIVATE *Private;\r
-  UINTN                   Index;\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (UNIX_BLOCK_IO_PRIVATE),\r
-                  (void *)&Private\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  EfiInitializeLock (&Private->Lock, TPL_NOTIFY);\r
-\r
-  Private->UnixThunk = UnixIo->UnixThunk;\r
-\r
-  Private->Signature  = UNIX_BLOCK_IO_PRIVATE_SIGNATURE;\r
-  Private->LastBlock  = NumberOfBlocks - 1;\r
-  Private->BlockSize  = BlockSize;\r
-\r
-  for (Index = 0; Filename[Index] != 0; Index++) {\r
-    Private->Filename[Index] = Filename[Index];\r
-  }\r
-\r
-  Private->Filename[Index]      = 0;\r
-\r
-  Private->Mode                 = (ReadOnly ? O_RDONLY : O_RDWR);\r
-\r
-  Private->NumberOfBlocks       = NumberOfBlocks;\r
-  Private->fd                   = -1;\r
-\r
-  Private->ControllerNameTable  = NULL;\r
-\r
-  AddUnicodeString (\r
-    "eng",\r
-    gUnixBlockIoComponentName.SupportedLanguages,\r
-    &Private->ControllerNameTable,\r
-    Filename\r
-    );\r
-\r
-  BlockIo = &Private->BlockIo;\r
-  BlockIo->Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;\r
-  BlockIo->Media = &Private->Media;\r
-  BlockIo->Media->BlockSize = Private->BlockSize;\r
-  BlockIo->Media->LastBlock = Private->NumberOfBlocks - 1;\r
-  BlockIo->Media->MediaId = 0;;\r
-\r
-  BlockIo->Reset = UnixBlockIoResetBlock;\r
-  BlockIo->ReadBlocks = UnixBlockIoReadBlocks;\r
-  BlockIo->WriteBlocks = UnixBlockIoWriteBlocks;\r
-  BlockIo->FlushBlocks = UnixBlockIoFlushBlocks;\r
-\r
-  BlockIo->Media->ReadOnly = ReadOnly;\r
-  BlockIo->Media->RemovableMedia = RemovableMedia;\r
-  BlockIo->Media->LogicalPartition = FALSE;\r
-  BlockIo->Media->MediaPresent = TRUE;\r
-  BlockIo->Media->WriteCaching = FALSE;\r
-\r
-  BlockIo->Media->IoAlign = 1;\r
-\r
-  Private->EfiHandle  = EfiDeviceHandle;\r
-  Status              = UnixBlockIoOpenDevice (Private);\r
-  if (!EFI_ERROR (Status)) {\r
-\r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &Private->EfiHandle,\r
-                    &gEfiBlockIoProtocolGuid,\r
-                    &Private->BlockIo,\r
-                    NULL\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      FreeUnicodeStringTable (Private->ControllerNameTable);\r
-      gBS->FreePool (Private);\r
-    }\r
-\r
-    DEBUG ((EFI_D_ERROR, "BlockDevice added: %s\n", Filename));\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-UnixBlockIoOpenDevice (\r
-  UNIX_BLOCK_IO_PRIVATE                 *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
-  EFI_STATUS            Status;\r
-  UINT64                FileSize;\r
-  UINT64                EndOfFile;\r
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
-\r
-  BlockIo = &Private->BlockIo;\r
-  EfiAcquireLock (&Private->Lock);\r
-\r
-  //\r
-  // If the device is already opened, close it\r
-  //\r
-  if (Private->fd >= 0) {\r
-    BlockIo->Reset (BlockIo, FALSE);\r
-  }\r
-\r
-  //\r
-  // Open the device\r
-  //\r
-  Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);\r
-  if (Private->fd < 0) {\r
-    DEBUG ((EFI_D_INFO, "PlOpenBlock: Could not open %a\n", Private->Filename));\r
-    BlockIo->Media->MediaPresent  = FALSE;\r
-    Status                        = EFI_NO_MEDIA;\r
-    goto Done;\r
-  }\r
-\r
-  if (!BlockIo->Media->MediaPresent) {\r
-    //\r
-    // BugBug: try to emulate if a CD appears - notify drivers to check it out\r
-    //\r
-    BlockIo->Media->MediaPresent = TRUE;\r
-    EfiReleaseLock (&Private->Lock);\r
-    EfiAcquireLock (&Private->Lock);\r
-  }\r
-\r
-  //\r
-  // get the size of the file\r
-  //\r
-  Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);\r
-  if (EFI_ERROR (Status)) {\r
-    FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
-    DEBUG ((EFI_D_ERROR, "PlOpenBlock: Could not get filesize of %a\n", Private->Filename));\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
-\r
-  if (Private->NumberOfBlocks == 0) {\r
-    Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);\r
-    Private->LastBlock = Private->NumberOfBlocks - 1;\r
-    Private->Media.LastBlock = Private->LastBlock;\r
-  }\r
-\r
-  EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
-\r
-  if (FileSize != EndOfFile) {\r
-    //\r
-    // file is not the proper size, change it\r
-    //\r
-    DEBUG ((EFI_D_INIT, "PlOpenBlock: Initializing block device: %a\n", Private->Filename));\r
-\r
-    //\r
-    // first set it to 0\r
-    //\r
-    Private->UnixThunk->FTruncate (Private->fd, 0);\r
-\r
-    //\r
-    // then set it to the needed file size (OS will zero fill it)\r
-    //\r
-    Private->UnixThunk->FTruncate (Private->fd, EndOfFile);\r
-  }\r
-\r
-  DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  if (EFI_ERROR (Status)) {\r
-    if (Private->fd >= 0) {\r
-      BlockIo->Reset (BlockIo, FALSE);\r
-    }\r
-  }\r
-\r
-  EfiReleaseLock (&Private->Lock);\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-UnixBlockIoError (\r
-  IN UNIX_BLOCK_IO_PRIVATE      *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
-  return EFI_DEVICE_ERROR;\r
-\r
-#if 0\r
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
-  EFI_STATUS            Status;\r
-  BOOLEAN               ReinstallBlockIoFlag;\r
-\r
-\r
-  BlockIo = &Private->BlockIo;\r
-\r
-  switch (Private->UnixThunk->GetLastError ()) {\r
-\r
-  case ERROR_NOT_READY:\r
-    Status                        = EFI_NO_MEDIA;\r
-    BlockIo->Media->ReadOnly      = FALSE;\r
-    BlockIo->Media->MediaPresent  = FALSE;\r
-    ReinstallBlockIoFlag          = FALSE;\r
-    break;\r
-\r
-  case ERROR_WRONG_DISK:\r
-    BlockIo->Media->ReadOnly      = FALSE;\r
-    BlockIo->Media->MediaPresent  = TRUE;\r
-    BlockIo->Media->MediaId += 1;\r
-    ReinstallBlockIoFlag  = TRUE;\r
-    Status                = EFI_MEDIA_CHANGED;\r
-    break;\r
-\r
-  case ERROR_WRITE_PROTECT:\r
-    BlockIo->Media->ReadOnly  = TRUE;\r
-    ReinstallBlockIoFlag      = FALSE;\r
-    Status                    = EFI_WRITE_PROTECTED;\r
-    break;\r
-\r
-  default:\r
-    ReinstallBlockIoFlag  = FALSE;\r
-    Status                = EFI_DEVICE_ERROR;\r
-    break;\r
-  }\r
-\r
-  if (ReinstallBlockIoFlag) {\r
-    BlockIo->Reset (BlockIo, FALSE);\r
-\r
-    gBS->ReinstallProtocolInterface (\r
-          Private->EfiHandle,\r
-          &gEfiBlockIoProtocolGuid,\r
-          BlockIo,\r
-          BlockIo\r
-          );\r
-  }\r
-\r
-  return Status;\r
-#endif\r
-}\r
-\r
-EFI_STATUS\r
-UnixBlockIoReadWriteCommon (\r
-  IN  UNIX_BLOCK_IO_PRIVATE     *Private,\r
-  IN UINT32                       MediaId,\r
-  IN EFI_LBA                      Lba,\r
-  IN UINTN                        BufferSize,\r
-  IN VOID                         *Buffer,\r
-  IN CHAR8                        *CallerName\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  Private     - TODO: add argument description\r
-  MediaId     - TODO: add argument description\r
-  Lba         - TODO: add argument description\r
-  BufferSize  - TODO: add argument description\r
-  Buffer      - TODO: add argument description\r
-  CallerName  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  EFI_NO_MEDIA - TODO: Add description for return value\r
-  EFI_MEDIA_CHANGED - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_BAD_BUFFER_SIZE - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-\r
---*/\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       BlockSize;\r
-  UINT64      LastBlock;\r
-  INT64       DistanceToMove;\r
-  UINT64      DistanceMoved;\r
-\r
-  if (Private->fd < 0) {\r
-    Status = UnixBlockIoOpenDevice (Private);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  if (!Private->Media.MediaPresent) {\r
-    DEBUG ((EFI_D_INIT, "%s: No Media\n", CallerName));\r
-    return EFI_NO_MEDIA;\r
-  }\r
-\r
-  if (Private->Media.MediaId != MediaId) {\r
-    return EFI_MEDIA_CHANGED;\r
-  }\r
-\r
-  if ((UINTN) Buffer % Private->Media.IoAlign != 0) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  \r
-  //\r
-  // Verify buffer size\r
-  //\r
-  BlockSize = Private->BlockSize;\r
-  if (BufferSize == 0) {\r
-    DEBUG ((EFI_D_INIT, "%s: Zero length read\n", CallerName));\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  if ((BufferSize % BlockSize) != 0) {\r
-    DEBUG ((EFI_D_INIT, "%s: Invalid read size\n", CallerName));\r
-    return EFI_BAD_BUFFER_SIZE;\r
-  }\r
-\r
-  LastBlock = Lba + (BufferSize / BlockSize) - 1;\r
-  if (LastBlock > Private->LastBlock) {\r
-    DEBUG ((EFI_D_INIT, "ReadBlocks: Attempted to read off end of device\n"));\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  //\r
-  // Seek to End of File\r
-  //\r
-  DistanceToMove = MultU64x32 (Lba, BlockSize);\r
-  Status = SetFilePointer64 (Private, DistanceToMove, &DistanceMoved, SEEK_SET);\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_INIT, "WriteBlocks: SetFilePointer failed\n"));\r
-    return UnixBlockIoError (Private);\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoReadBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN UINT32                 MediaId,\r
-  IN EFI_LBA                Lba,\r
-  IN UINTN                  BufferSize,\r
-  OUT VOID                  *Buffer\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Read BufferSize bytes from Lba into Buffer.\r
-\r
-  Arguments:\r
-    This       - Protocol instance pointer.\r
-    MediaId    - Id of the media, changes every time the media is replaced.\r
-    Lba        - The starting Logical Block Address to read from\r
-    BufferSize - Size of Buffer, must be a multiple of device block size.\r
-    Buffer     - Buffer containing read data\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - The data was read correctly from the device.\r
-    EFI_DEVICE_ERROR      - The device reported an error while performing the read.\r
-    EFI_NO_MEDIA          - There is no media in the device.\r
-    EFI_MEDIA_CHANGED     - The MediaId does not matched the current device.\r
-    EFI_BAD_BUFFER_SIZE   - The Buffer was not a multiple of the block size of the \r
-                            device.\r
-    EFI_INVALID_PARAMETER - The read request contains device addresses that are not \r
-                            valid for the device.\r
-\r
---*/\r
-{\r
-  UNIX_BLOCK_IO_PRIVATE *Private;\r
-  ssize_t                 len;\r
-  EFI_STATUS              Status;\r
-  EFI_TPL                 OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixReadBlocks");\r
-  if (EFI_ERROR (Status)) {\r
-    goto Done;\r
-  }\r
-\r
-  len = Private->UnixThunk->Read (Private->fd, Buffer, BufferSize);\r
-  if (len != BufferSize) {\r
-    DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed.\n"));\r
-    Status = UnixBlockIoError (Private);\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // If we wrote then media is present.\r
-  //\r
-  This->Media->MediaPresent = TRUE;\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  gBS->RestoreTPL (OldTpl);\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoWriteBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN UINT32                 MediaId,\r
-  IN EFI_LBA                Lba,\r
-  IN UINTN                  BufferSize,\r
-  IN VOID                   *Buffer\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Write BufferSize bytes from Lba into Buffer.\r
-\r
-  Arguments:\r
-    This       - Protocol instance pointer.\r
-    MediaId    - Id of the media, changes every time the media is replaced.\r
-    Lba        - The starting Logical Block Address to read from\r
-    BufferSize - Size of Buffer, must be a multiple of device block size.\r
-    Buffer     - Buffer containing read data\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - The data was written correctly to the device.\r
-    EFI_WRITE_PROTECTED   - The device can not be written to.\r
-    EFI_DEVICE_ERROR      - The device reported an error while performing the write.\r
-    EFI_NO_MEDIA          - There is no media in the device.\r
-    EFI_MEDIA_CHNAGED     - The MediaId does not matched the current device.\r
-    EFI_BAD_BUFFER_SIZE   - The Buffer was not a multiple of the block size of the \r
-                            device.\r
-    EFI_INVALID_PARAMETER - The write request contains a LBA that is not \r
-                            valid for the device.\r
-\r
---*/\r
-{\r
-  UNIX_BLOCK_IO_PRIVATE *Private;\r
-  ssize_t                 len;\r
-  EFI_STATUS              Status;\r
-  EFI_TPL                 OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixWriteBlocks");\r
-  if (EFI_ERROR (Status)) {\r
-    goto Done;\r
-  }\r
-\r
-  len = Private->UnixThunk->Write (Private->fd, Buffer, BufferSize);\r
-  if (len != BufferSize) {\r
-    DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed.\n"));\r
-    Status = UnixBlockIoError (Private);\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // If the write succeeded, we are not write protected and media is present.\r
-  //\r
-  This->Media->MediaPresent = TRUE;\r
-  This->Media->ReadOnly     = FALSE;\r
-  Status = EFI_SUCCESS;\r
-\r
-Done:\r
-  gBS->RestoreTPL (OldTpl);\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoFlushBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Flush the Block Device.\r
-\r
-  Arguments:\r
-    This             - Protocol instance pointer.\r
-\r
-  Returns:\r
-    EFI_SUCCESS      - All outstanding data was written to the device\r
-    EFI_DEVICE_ERROR - The device reported an error while writting back the data\r
-    EFI_NO_MEDIA     - There is no media in the device.\r
-\r
---*/\r
-{\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoResetBlock (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN BOOLEAN                ExtendedVerification\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
-    Reset the Block Device.\r
-\r
-  Arguments:\r
-    This                 - Protocol instance pointer.\r
-    ExtendedVerification - Driver may perform diagnostics on reset.\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - The device was reset.\r
-    EFI_DEVICE_ERROR      - The device is not functioning properly and could \r
-                            not be reset.\r
-\r
---*/\r
-{\r
-  UNIX_BLOCK_IO_PRIVATE *Private;\r
-  EFI_TPL               OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-  \r
-  Private = UNIX_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
-\r
-  if (Private->fd >= 0) {\r
-    Private->UnixThunk->Close (Private->fd);\r
-    Private->fd = -1;\r
-  }\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-UINTN\r
-Atoi (\r
-  CHAR16  *String\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  Convert a unicode string to a UINTN\r
-\r
-Arguments:\r
-\r
-  String - Unicode string.\r
-\r
-Returns: \r
-\r
-  UINTN of the number represented by String.  \r
-\r
---*/\r
-{\r
-  UINTN   Number;\r
-  CHAR16  *Str;\r
-\r
-  //\r
-  // skip preceeding white space\r
-  //\r
-  Str = String;\r
-  while ((*Str) && (*Str == ' ')) {\r
-    Str++;\r
-  }\r
-  //\r
-  // Convert ot a Number\r
-  //\r
-  Number = 0;\r
-  while (*Str != '\0') {\r
-    if ((*Str >= '0') && (*Str <= '9')) {\r
-      Number = (Number * 10) +*Str - '0';\r
-    } else {\r
-      break;\r
-    }\r
-\r
-    Str++;\r
-  }\r
-\r
-  return Number;\r
-}\r
-\r
-EFI_STATUS\r
-SetFilePointer64 (\r
-  IN  UNIX_BLOCK_IO_PRIVATE    *Private,\r
-  IN  INT64                      DistanceToMove,\r
-  OUT UINT64                     *NewFilePointer,\r
-  IN  INT32                      MoveMethod\r
-  )\r
-/*++\r
-\r
-This function extends the capability of SetFilePointer to accept 64 bit parameters\r
-\r
---*/\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: function comment is missing 'Returns:'\r
-// TODO:    Private - add argument and description to function comment\r
-// TODO:    DistanceToMove - add argument and description to function comment\r
-// TODO:    NewFilePointer - add argument and description to function comment\r
-// TODO:    MoveMethod - add argument and description to function comment\r
-{\r
-  EFI_STATUS    Status;\r
-  off_t         res;\r
-\r
-  Status = EFI_SUCCESS;\r
-  res = Private->UnixThunk->Lseek(Private->fd, DistanceToMove, MoveMethod);\r
-  if (res == -1) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (NewFilePointer != NULL) {\r
-    *NewFilePointer = res;\r
-  }\r
-\r
-  return Status;\r
-}\r