]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Get BlockIo mapping interfaces working. Still need to work on detecting block size...
authorandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 03:31:32 +0000 (03:31 +0000)
committerandrewfish <andrewfish@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 03:31:32 +0000 (03:31 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11724 6f19259b-4bc3-4df7-8a09-765794883524

14 files changed:
InOsEmuPkg/EmuBlockIoDxe/EmuBlockIo.c
InOsEmuPkg/EmuBlockIoDxe/EmuBlockIoDxe.inf
InOsEmuPkg/InOsEmuPkg.dec
InOsEmuPkg/Include/Protocol/EmuBlockIo.h
InOsEmuPkg/Unix/Sec/BlockIo.c
InOsEmuPkg/Unix/Sec/Gasket.h
InOsEmuPkg/Unix/Sec/PosixFileSystem.c
InOsEmuPkg/Unix/Sec/SecMain.c
InOsEmuPkg/Unix/Sec/SecMain.h
InOsEmuPkg/Unix/Sec/SecMain.inf
InOsEmuPkg/Unix/Sec/X64/Gasket.S
InOsEmuPkg/Unix/UnixX64.dsc
InOsEmuPkg/Unix/UnixX64.fdf
InOsEmuPkg/Unix/build64.sh

index 999445bae24a8322cee5a34e53130746a9e95fb7..9f3aa28b9eb1b896bcbc07c2456b0fd1567b5ec2 100644 (file)
@@ -232,7 +232,7 @@ EmuBlockIoReset (
   EMU_BLOCK_IO_PRIVATE    *Private;\r
   EFI_TPL                 OldTpl;\r
 \r
   EMU_BLOCK_IO_PRIVATE    *Private;\r
   EFI_TPL                 OldTpl;\r
 \r
-  Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -264,8 +264,7 @@ EmuBlockIoReset (
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-EmuBlockIoReadBlocks\r
-(\r
+EmuBlockIoReadBlocks (\r
   IN EFI_BLOCK_IO_PROTOCOL          *This,\r
   IN UINT32                         MediaId,\r
   IN EFI_LBA                        Lba,\r
   IN EFI_BLOCK_IO_PROTOCOL          *This,\r
   IN UINT32                         MediaId,\r
   IN EFI_LBA                        Lba,\r
@@ -278,7 +277,7 @@ EmuBlockIoReadBlocks
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
-  Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -325,7 +324,7 @@ EmuBlockIoWriteBlocks (
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
-  Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -357,7 +356,7 @@ EmuBlockIoFlushBlocks (
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
   EFI_TPL                 OldTpl;\r
   EFI_BLOCK_IO2_TOKEN     Token;\r
 \r
-  Private = EMU_BLOCK_IO2_PRIVATE_DATA_FROM_THIS (This);\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -442,7 +441,7 @@ EmuBlockIoDriverBindingSupported (
   // Make sure GUID is for a File System handle.\r
   //\r
   Status = EFI_UNSUPPORTED;\r
   // Make sure GUID is for a File System handle.\r
   //\r
   Status = EFI_UNSUPPORTED;\r
-  if (CompareGuid (EmuIoThunk->Protocol, &gEmuVirtualDisksGuid)) {\r
+  if (CompareGuid (EmuIoThunk->Protocol, &gEmuBlockIoProtocolGuid)) {\r
     Status = EFI_SUCCESS;\r
   }\r
 \r
     Status = EFI_SUCCESS;\r
   }\r
 \r
@@ -524,7 +523,7 @@ EmuBlockIoDriverBindingStart (
   //\r
   // Set DiskType\r
   //\r
   //\r
   // Set DiskType\r
   //\r
-  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuVirtualDisksGuid)) {\r
+  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuBlockIoProtocolGuid)) {\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
   }\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
   }\r
@@ -542,6 +541,7 @@ EmuBlockIoDriverBindingStart (
   Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;\r
   Private->IoThunk   = EmuIoThunk;\r
   Private->Io        = EmuIoThunk->Interface;\r
   Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;\r
   Private->IoThunk   = EmuIoThunk;\r
   Private->Io        = EmuIoThunk->Interface;\r
+  Private->EfiHandle = Handle;\r
   \r
   Private->BlockIo.Revision    = EFI_BLOCK_IO_PROTOCOL_REVISION2;\r
   Private->BlockIo.Media       = &Private->Media;\r
   \r
   Private->BlockIo.Revision    = EFI_BLOCK_IO_PROTOCOL_REVISION2;\r
   Private->BlockIo.Media       = &Private->Media;\r
index 24f4759d6654c5500be48334484b7f6a6d0cdea8..82460e40ecb08425d5b4549f4d165c54cc5878a1 100644 (file)
@@ -66,4 +66,4 @@
   gEfiBlockIoProtocolGuid                     # PROTOCOL BY_START\r
   gEfiBlockIo2ProtocolGuid                    # PROTOCOL BY_START\r
   gEmuIoThunkProtocolGuid                     # PROTOCOL TO_START\r
   gEfiBlockIoProtocolGuid                     # PROTOCOL BY_START\r
   gEfiBlockIo2ProtocolGuid                    # PROTOCOL BY_START\r
   gEmuIoThunkProtocolGuid                     # PROTOCOL TO_START\r
-\r
+  gEmuBlockIoProtocolGuid                     # PROTOCOL BY_START\r
index 3a7417fd970c293e01edc585d85b4239edc2b4b5..7cbed7f573efdbc675451212b71ce9a090bbcf8b 100644 (file)
@@ -36,6 +36,7 @@
   gEmuIoThunkProtocolGuid        = { 0x453368F6, 0x7C85, 0x434A, { 0xA9, 0x8A, 0x72, 0xD1, 0xB7, 0xFF, 0xA9, 0x26 } }\r
   gEmuGraphicsWindowProtocolGuid = { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
   gEmuThreadThunkProtocolGuid    = { 0x3B1E4B7C, 0x09D8, 0x944F, { 0xA4, 0x08, 0x13, 0x09, 0xEB, 0x8B, 0x44, 0x27 } }\r
   gEmuIoThunkProtocolGuid        = { 0x453368F6, 0x7C85, 0x434A, { 0xA9, 0x8A, 0x72, 0xD1, 0xB7, 0xFF, 0xA9, 0x26 } }\r
   gEmuGraphicsWindowProtocolGuid = { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
   gEmuThreadThunkProtocolGuid    = { 0x3B1E4B7C, 0x09D8, 0x944F, { 0xA4, 0x08, 0x13, 0x09, 0xEB, 0x8B, 0x44, 0x27 } }\r
+  gEmuBlockIoProtocolGuid        = { 0x6888A4AE, 0xAFCE, 0xE84B, { 0x91, 0x02, 0xF7, 0xB9, 0xDA, 0xE6, 0xA0, 0x30 } }\r
 \r
 [Ppis]\r
   gEmuThunkPpiGuid                  = { 0xE113F896, 0x75CF, 0xF640, { 0x81, 0x7F, 0xC8, 0x5A, 0x79, 0xE8, 0xAE, 0x67 } }\r
 \r
 [Ppis]\r
   gEmuThunkPpiGuid                  = { 0xE113F896, 0x75CF, 0xF640, { 0x81, 0x7F, 0xC8, 0x5A, 0x79, 0xE8, 0xAE, 0x67 } }\r
index f31124dc019ed69308ce4a50caf621dd444ca877..26d6bb851854c7059fe4b0e2222a8959b78ff33f 100644 (file)
@@ -23,7 +23,7 @@
 #include <Protocol/BlockIo2.h>\r
 \r
 #define EMU_BLOCK_IO_PROTOCOL_GUID \\r
 #include <Protocol/BlockIo2.h>\r
 \r
 #define EMU_BLOCK_IO_PROTOCOL_GUID \\r
- { 0x3EC5F7E0, 0x1124, 0xDF45, { 0x9F, 0x96, 0x7D, 0xD6, 0x63, 0xC0, 0xAF, 0xE7 } }\r
+{ 0x6888A4AE, 0xAFCE, 0xE84B, { 0x91, 0x02, 0xF7, 0xB9, 0xDA, 0xE6, 0xA0, 0x30 } }\r
 \r
 typedef struct _EMU_BLOCK_IO_PROTOCOL   EMU_BLOCK_IO_PROTOCOL;\r
 \r
 \r
 typedef struct _EMU_BLOCK_IO_PROTOCOL   EMU_BLOCK_IO_PROTOCOL;\r
 \r
@@ -90,7 +90,7 @@ EFI_STATUS
   IN     EFI_LBA                LBA,\r
   IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
   IN     UINTN                  BufferSize,\r
   IN     EFI_LBA                LBA,\r
   IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
   IN     UINTN                  BufferSize,\r
-     OUT VOID                  *Buffer\r
+     OUT VOID                   *Buffer\r
   );\r
 \r
 /**\r
   );\r
 \r
 /**\r
@@ -127,7 +127,7 @@ EFI_STATUS
 typedef\r
 EFI_STATUS\r
 (EFIAPI *EMU_BLOCK_WRITE) (\r
 typedef\r
 EFI_STATUS\r
 (EFIAPI *EMU_BLOCK_WRITE) (\r
-  IN     EMU_BLOCK_IO_PROTOCOL   *This,\r
+  IN     EMU_BLOCK_IO_PROTOCOL  *This,\r
   IN     UINT32                 MediaId,\r
   IN     EFI_LBA                LBA,\r
   IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
   IN     UINT32                 MediaId,\r
   IN     EFI_LBA                LBA,\r
   IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
index 3fc1d3f9aaeb8669b4e5425b1976408a36b69f4e..1636d9508c4c501234c14ca4df8e57d60309d383 100644 (file)
@@ -9,598 +9,111 @@ http://opensource.org/licenses/bsd-license.php
 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
 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_EMU_VIRTUAL_DISKS = \r
-    <F | R><O | W>;<block count>;<block size>[!...]\r
-\r
-  EFI_EMU_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_EMU_VIRTUAL_DISKS=FW;40960;512\r
-\r
-    A 1.44MB emulated floppy with a block size of 1024 would look like:\r
-    EFI_EMU_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_EMU_PHYSICAL_DISKS=B:RW;245760;512\r
-\r
-    Thus a standard CD-ROM floppy would look like:\r
-    EFI_EMU_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
 **/\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
-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
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoFlushBlocks (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This\r
-  );\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoResetBlock (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN BOOLEAN                ExtendedVerification\r
-  );\r
-\r
-//\r
-// Private Worker functions\r
-//\r
-EFI_STATUS\r
-UnixBlockIoCreateMapping (\r
-  IN EMU_IO_THUNK_PROTOCOL             *EmuIoThunk,\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
-EFI_STATUS\r
-UnixBlockIoReadWriteCommon (\r
-  IN  EMU_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
+//#include <fcntl.h>\r
+//#include <unistd.h>\r
+#include "SecMain.h"\r
 \r
 \r
-EFI_STATUS\r
-UnixBlockIoError (\r
-  IN EMU_BLOCK_IO_PRIVATE      *Private\r
-  );\r
+#define EMU_BLOCK_IO_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'M', 'b', 'k')\r
+typedef struct {\r
+  UINTN                       Signature;\r
 \r
 \r
-EFI_STATUS\r
-UnixBlockIoOpenDevice (\r
-  EMU_BLOCK_IO_PRIVATE         *Private\r
-  );\r
+  EMU_IO_THUNK_PROTOCOL       *Thunk;\r
 \r
 \r
-CHAR16                                    *\r
-GetNextElementPastTerminator (\r
-  IN  CHAR16  *EnvironmentVariable,\r
-  IN  CHAR16  Terminator\r
-  );\r
+  char                        *Filename;\r
+  UINTN                       ReadMode;\r
+  UINTN                       Mode;\r
 \r
 \r
+  int                         fd;\r
 \r
 \r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gUnixBlockIoDriverBinding = {\r
-  UnixBlockIoDriverBindingSupported,\r
-  UnixBlockIoDriverBindingStart,\r
-  UnixBlockIoDriverBindingStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-/**\r
-  The user Entry Point for module UnixBlockIo. The user code starts with this function.\r
-\r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
-  @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
-  @retval EFI_SUCCESS       The entry point is executed successfully.\r
-  @retval other             Some error occurs when executing this entry point.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-InitializeUnixBlockIo(\r
-  IN EFI_HANDLE           ImageHandle,\r
-  IN EFI_SYSTEM_TABLE     *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-\r
-  Status = EfiLibInstallAllDriverProtocols2 (\r
-             ImageHandle,\r
-             SystemTable,\r
-             &gUnixBlockIoDriverBinding,\r
-             ImageHandle,\r
-             &gUnixBlockIoComponentName,\r
-             &gUnixBlockIoComponentName2,\r
-             NULL,\r
-             &gUnixBlockIoDriverDiagnostics,\r
-             &gUnixBlockIoDriverDiagnostics2\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-\r
-  return Status;\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
-{\r
-  EFI_STATUS              Status;\r
-  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk;\r
-\r
-  //\r
-  // Open the IO Abstraction(s) needed to perform the supported test\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  Handle,\r
-                  &gEmuIoThunkProtocolGuid,\r
-                  (VOID **)&EmuIoThunk,\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 (EmuIoThunk->UnixThunk->Signature == EFI_EMU_THUNK_PROTOCOL_SIGNATURE) {\r
-\r
-    //\r
-    // Check the GUID to see if this is a handle type the driver supports\r
-    //\r
-    if (CompareGuid (EmuIoThunk->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
-        &gEmuIoThunkProtocolGuid,\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
-{\r
-  EFI_STATUS                  Status;\r
-  EMU_IO_THUNK_PROTOCOL       *EmuIoThunk;\r
-  CHAR16                      Buffer[FILENAME_BUFFER_SIZE];\r
-  CHAR16                      *Str;\r
   BOOLEAN                     RemovableMedia;\r
   BOOLEAN                     WriteProtected;\r
   BOOLEAN                     RemovableMedia;\r
   BOOLEAN                     WriteProtected;\r
-  UINTN                       NumberOfBlocks;\r
-  UINTN                       BlockSize;\r
-  INTN                        i;\r
 \r
 \r
-  //\r
-  // Grab the protocols we need\r
-  //\r
-  \r
-  Status = gBS->OpenProtocol (\r
-                  Handle,\r
-                  &gEmuIoThunkProtocolGuid,\r
-                  (void *)&EmuIoThunk,\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 (EmuIoThunk->TypeGuid, &gEfiUnixVirtualDisksGuid)) {\r
-    Status = EFI_UNSUPPORTED;\r
-    goto Done;\r
-  }\r
+  UINTN                       BlockSize;\r
+  UINT64                      NumberOfBlocks;\r
+  UINT64                      LastBlock;\r
 \r
 \r
-  Status  = EFI_NOT_FOUND;\r
-  //  Extract filename.\r
-  Str     = EmuIoThunk->EnvString;\r
-  i = 0;\r
-  while (*Str && *Str != ':')\r
-    Buffer[i++] = *Str++;\r
-  Buffer[i] = 0;\r
-  if (*Str != ':') {\r
-    goto Done;\r
-  }\r
+  EMU_BLOCK_IO_PROTOCOL       EmuBlockIo;\r
+  EFI_BLOCK_IO_MEDIA          *Media;\r
 \r
 \r
-  Str++;\r
+} EMU_BLOCK_IO_PRIVATE;\r
 \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
+#define EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS(a) \\r
+         CR(a, EMU_BLOCK_IO_PRIVATE, EmuBlockIo, EMU_BLOCK_IO_PRIVATE_SIGNATURE)\r
 \r
 \r
-  //\r
-  // If we get here the variable is valid so do the work.\r
-  //\r
-  Status = UnixBlockIoCreateMapping (\r
-              EmuIoThunk,\r
-              Handle,\r
-              Buffer,\r
-              WriteProtected,\r
-              RemovableMedia,\r
-              NumberOfBlocks,\r
-              BlockSize\r
-              );\r
 \r
 \r
-Done:\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-          Handle,\r
-          &gEmuIoThunkProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Handle\r
-          );\r
-  }\r
-\r
-  return Status;\r
-}\r
 \r
 EFI_STATUS\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
-  EFI_BLOCK_IO_PROTOCOL   *BlockIo;\r
-  EFI_STATUS              Status;\r
-  EMU_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 = EMU_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
-                    &gEmuIoThunkProtocolGuid,\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
+EmuBlockIoReset (\r
+  IN EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN BOOLEAN                  ExtendedVerification\r
+  );\r
 \r
 \r
-    gBS->FreePool (Private);\r
-  }\r
 \r
 \r
-  return Status;\r
-}\r
-\r
-CHAR16 *\r
-GetNextElementPastTerminator (\r
-  IN  CHAR16  *EnvironmentVariable,\r
-  IN  CHAR16  Terminator\r
-  )\r
 /*++\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
+This function extends the capability of SetFilePointer to accept 64 bit parameters\r
 \r
 **/\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
 EFI_STATUS\r
-UnixBlockIoCreateMapping (\r
-  IN EMU_IO_THUNK_PROTOCOL             *EmuIoThunk,\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
+SetFilePointer64 (\r
+  IN  EMU_BLOCK_IO_PRIVATE        *Private,\r
+  IN  INT64                      DistanceToMove,\r
+  OUT UINT64                     *NewFilePointer,\r
+  IN  INT32                      MoveMethod\r
   )\r
 {\r
   )\r
 {\r
-  EFI_STATUS              Status;\r
-  EFI_BLOCK_IO_PROTOCOL   *BlockIo;\r
-  EMU_BLOCK_IO_PRIVATE *Private;\r
-  UINTN                   Index;\r
-\r
-  Status = gBS->AllocatePool (\r
-                  EfiBootServicesData,\r
-                  sizeof (EMU_BLOCK_IO_PRIVATE),\r
-                  (void *)&Private\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  EfiInitializeLock (&Private->Lock, TPL_NOTIFY);\r
-\r
-  Private->UnixThunk = EmuIoThunk->UnixThunk;\r
-\r
-  Private->Signature  = EMU_BLOCK_IO_PRIVATE_SIGNATURE;\r
-  Private->LastBlock  = NumberOfBlocks - 1;\r
-  Private->BlockSize  = BlockSize;\r
+  EFI_STATUS    Status;\r
+  off_t         res;\r
 \r
 \r
-  for (Index = 0; Filename[Index] != 0; Index++) {\r
-    Private->Filename[Index] = Filename[Index];\r
+  Status = EFI_SUCCESS;\r
+  res = lseek (Private->fd, DistanceToMove, MoveMethod);\r
+  if (res == -1) {\r
+    Status = EFI_INVALID_PARAMETER;\r
   }\r
 \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
+  if (NewFilePointer != NULL) {\r
+    *NewFilePointer = res;\r
   }\r
 \r
   return Status;\r
 }\r
 \r
   }\r
 \r
   return Status;\r
 }\r
 \r
+\r
 EFI_STATUS\r
 EFI_STATUS\r
-UnixBlockIoOpenDevice (\r
-  EMU_BLOCK_IO_PRIVATE                 *Private\r
+EmuBlockIoOpenDevice (\r
+  IN EMU_BLOCK_IO_PRIVATE   *Private\r
   )\r
 {\r
   EFI_STATUS            Status;\r
   UINT64                FileSize;\r
   UINT64                EndOfFile;\r
   )\r
 {\r
   EFI_STATUS            Status;\r
   UINT64                FileSize;\r
   UINT64                EndOfFile;\r
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
 \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
 \r
   //\r
   // If the device is already opened, close it\r
   //\r
   if (Private->fd >= 0) {\r
-    BlockIo->Reset (BlockIo, FALSE);\r
+    EmuBlockIoReset (&Private->EmuBlockIo, FALSE);\r
   }\r
 \r
   //\r
   // Open the device\r
   //\r
   }\r
 \r
   //\r
   // Open the device\r
   //\r
-  Private->fd = Private->UnixThunk->Open (Private->Filename, Private->Mode, 0644);\r
+  Private->fd = open (Private->Filename, Private->Mode, 0644);\r
   if (Private->fd < 0) {\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
+    DEBUG ((EFI_D_INFO, "EmuOpenBlock: Could not open %a\n", Private->Filename));\r
+    Private->Media->MediaPresent  = FALSE;\r
+    Status                          = EFI_NO_MEDIA;\r
     goto Done;\r
   }\r
 \r
     goto Done;\r
   }\r
 \r
-  if (!BlockIo->Media->MediaPresent) {\r
+  if (!Private->Media->MediaPresent) {\r
     //\r
     // BugBug: try to emulate if a CD appears - notify drivers to check it out\r
     //\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
+    Private->Media->MediaPresent = TRUE;\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
@@ -609,7 +122,7 @@ UnixBlockIoOpenDevice (
   Status = SetFilePointer64 (Private, 0, &FileSize, SEEK_END);\r
   if (EFI_ERROR (Status)) {\r
     FileSize = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\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
+    DEBUG ((EFI_D_ERROR, "EmuOpenBlock: Could not get filesize of %a\n", Private->Filename));\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
   }\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
   }\r
@@ -617,7 +130,7 @@ UnixBlockIoOpenDevice (
   if (Private->NumberOfBlocks == 0) {\r
     Private->NumberOfBlocks = DivU64x32 (FileSize, Private->BlockSize);\r
     Private->LastBlock = Private->NumberOfBlocks - 1;\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
+    Private->Media->LastBlock = Private->LastBlock;\r
   }\r
 \r
   EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
   }\r
 \r
   EndOfFile = MultU64x32 (Private->NumberOfBlocks, Private->BlockSize);\r
@@ -626,67 +139,97 @@ UnixBlockIoOpenDevice (
     //\r
     // file is not the proper size, change it\r
     //\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
+    DEBUG ((EFI_D_INIT, "EmuOpenBlock: Initializing block device: %a\n", Private->Filename));\r
 \r
     //\r
     // first set it to 0\r
     //\r
 \r
     //\r
     // first set it to 0\r
     //\r
-    Private->UnixThunk->FTruncate (Private->fd, 0);\r
+    ftruncate (Private->fd, 0);\r
 \r
     //\r
     // then set it to the needed file size (OS will zero fill it)\r
     //\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
+    ftruncate (Private->fd, EndOfFile);\r
   }\r
 \r
   }\r
 \r
-  DEBUG ((EFI_D_INIT, "%HPlOpenBlock: opened %a%N\n", Private->Filename));\r
+  DEBUG ((EFI_D_INIT, "%HEmuOpenBlock: opened %a%N\n", Private->Filename));\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
   if (EFI_ERROR (Status)) {\r
     if (Private->fd >= 0) {\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
   if (EFI_ERROR (Status)) {\r
     if (Private->fd >= 0) {\r
-      BlockIo->Reset (BlockIo, FALSE);\r
+      EmuBlockIoReset (&Private->EmuBlockIo, FALSE);\r
     }\r
   }\r
 \r
     }\r
   }\r
 \r
-  EfiReleaseLock (&Private->Lock);\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
+\r
 EFI_STATUS\r
 EFI_STATUS\r
-UnixBlockIoError (\r
-  IN EMU_BLOCK_IO_PRIVATE      *Private\r
+EmuBlockIoCreateMapping (\r
+  IN     EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN     EFI_BLOCK_IO_MEDIA       *Media\r
   )\r
 {\r
   )\r
 {\r
-  return EFI_DEVICE_ERROR;\r
+  EFI_STATUS              Status;\r
+  EMU_BLOCK_IO_PRIVATE    *Private;\r
+\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  Private->Media = Media;\r
+  \r
+  Media->MediaId          = 0;\r
+  Media->RemovableMedia   = Private->RemovableMedia;\r
+  Media->MediaPresent     = TRUE;\r
+  Media->LogicalPartition = FALSE;\r
+  Media->ReadOnly         = Private->WriteProtected;\r
+  Media->WriteCaching     = FALSE;\r
+  Media->BlockSize        = Private->BlockSize;\r
+  Media->IoAlign          = 1;\r
+  Media->LastBlock        = 0; // Filled in by OpenDevice\r
+  \r
+  // EFI_BLOCK_IO_PROTOCOL_REVISION2\r
+  Media->LowestAlignedLba              = 0;\r
+  Media->LogicalBlocksPerPhysicalBlock = 0; \r
+  \r
+  // EFI_BLOCK_IO_PROTOCOL_REVISION3\r
+  Media->OptimalTransferLengthGranularity = 0;\r
+\r
+  Status = EmuBlockIoOpenDevice (Private);\r
+\r
+  return Status;\r
+}\r
+\r
 \r
 \r
-#if 0\r
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+EFI_STATUS\r
+EmuBlockIoError (\r
+  IN EMU_BLOCK_IO_PRIVATE      *Private\r
+  )\r
+{\r
   EFI_STATUS            Status;\r
   BOOLEAN               ReinstallBlockIoFlag;\r
 \r
 \r
   EFI_STATUS            Status;\r
   BOOLEAN               ReinstallBlockIoFlag;\r
 \r
 \r
-  BlockIo = &Private->BlockIo;\r
-\r
-  switch (Private->UnixThunk->GetLastError ()) {\r
+  switch (errno) {\r
 \r
 \r
-  case ERROR_NOT_READY:\r
+  case EAGAIN:\r
     Status                        = EFI_NO_MEDIA;\r
     Status                        = EFI_NO_MEDIA;\r
-    BlockIo->Media->ReadOnly      = FALSE;\r
-    BlockIo->Media->MediaPresent  = FALSE;\r
+    Private->Media->ReadOnly      = FALSE;\r
+    Private->Media->MediaPresent  = FALSE;\r
     ReinstallBlockIoFlag          = FALSE;\r
     break;\r
 \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
+  case EACCES:\r
+    Private->Media->ReadOnly      = FALSE;\r
+    Private->Media->MediaPresent  = TRUE;\r
+    Private->Media->MediaId += 1;\r
     ReinstallBlockIoFlag  = TRUE;\r
     Status                = EFI_MEDIA_CHANGED;\r
     break;\r
 \r
     ReinstallBlockIoFlag  = TRUE;\r
     Status                = EFI_MEDIA_CHANGED;\r
     break;\r
 \r
-  case ERROR_WRITE_PROTECT:\r
-    BlockIo->Media->ReadOnly  = TRUE;\r
+  case EROFS:\r
+    Private->Media->ReadOnly  = TRUE;\r
     ReinstallBlockIoFlag      = FALSE;\r
     Status                    = EFI_WRITE_PROTECTED;\r
     break;\r
     ReinstallBlockIoFlag      = FALSE;\r
     Status                    = EFI_WRITE_PROTECTED;\r
     break;\r
@@ -696,9 +239,9 @@ UnixBlockIoError (
     Status                = EFI_DEVICE_ERROR;\r
     break;\r
   }\r
     Status                = EFI_DEVICE_ERROR;\r
     break;\r
   }\r
-\r
+/*\r
   if (ReinstallBlockIoFlag) {\r
   if (ReinstallBlockIoFlag) {\r
-    BlockIo->Reset (BlockIo, FALSE);\r
+    Private->EmuBlockIo->Reset (&Private->EmuBlockIo, FALSE);\r
 \r
     gBS->ReinstallProtocolInterface (\r
           Private->EfiHandle,\r
 \r
     gBS->ReinstallProtocolInterface (\r
           Private->EfiHandle,\r
@@ -707,14 +250,13 @@ UnixBlockIoError (
           BlockIo\r
           );\r
   }\r
           BlockIo\r
           );\r
   }\r
-\r
+*/\r
   return Status;\r
   return Status;\r
-#endif\r
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
-UnixBlockIoReadWriteCommon (\r
-  IN  EMU_BLOCK_IO_PRIVATE     *Private,\r
+EmuBlockIoReadWriteCommon (\r
+  IN  EMU_BLOCK_IO_PRIVATE        *Private,\r
   IN UINT32                       MediaId,\r
   IN EFI_LBA                      Lba,\r
   IN UINTN                        BufferSize,\r
   IN UINT32                       MediaId,\r
   IN EFI_LBA                      Lba,\r
   IN UINTN                        BufferSize,\r
@@ -729,22 +271,22 @@ UnixBlockIoReadWriteCommon (
   UINT64      DistanceMoved;\r
 \r
   if (Private->fd < 0) {\r
   UINT64      DistanceMoved;\r
 \r
   if (Private->fd < 0) {\r
-    Status = UnixBlockIoOpenDevice (Private);\r
+    Status = EmuBlockIoOpenDevice (Private);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
   }\r
 \r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
   }\r
 \r
-  if (!Private->Media.MediaPresent) {\r
+  if (!Private->Media->MediaPresent) {\r
     DEBUG ((EFI_D_INIT, "%s: No Media\n", CallerName));\r
     return EFI_NO_MEDIA;\r
   }\r
 \r
     DEBUG ((EFI_D_INIT, "%s: No Media\n", CallerName));\r
     return EFI_NO_MEDIA;\r
   }\r
 \r
-  if (Private->Media.MediaId != MediaId) {\r
+  if (Private->Media->MediaId != MediaId) {\r
     return EFI_MEDIA_CHANGED;\r
   }\r
 \r
     return EFI_MEDIA_CHANGED;\r
   }\r
 \r
-  if ((UINTN) Buffer % Private->Media.IoAlign != 0) {\r
+  if ((UINTN) Buffer % Private->Media->IoAlign != 0) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
@@ -775,172 +317,238 @@ UnixBlockIoReadWriteCommon (
 \r
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_INIT, "WriteBlocks: SetFilePointer failed\n"));\r
 \r
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_INIT, "WriteBlocks: SetFilePointer failed\n"));\r
-    return UnixBlockIoError (Private);\r
+    return EmuBlockIoError (Private);\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \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
+  Read BufferSize bytes from Lba into Buffer.\r
+  \r
+  This function reads the requested number of blocks from the device. All the\r
+  blocks are read, or an error is returned.\r
+  If EFI_DEVICE_ERROR, EFI_NO_MEDIA,_or EFI_MEDIA_CHANGED is returned and\r
+  non-blocking I/O is being used, the Event associated with this request will\r
+  not be signaled.\r
+\r
+  @param[in]       This       Indicates a pointer to the calling context.\r
+  @param[in]       MediaId    Id of the media, changes every time the media is \r
+                              replaced.\r
+  @param[in]       Lba        The starting Logical Block Address to read from.\r
+  @param[in, out]  Token           A pointer to the token associated with the transaction.\r
+  @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.  \r
+  @param[out]      Buffer     A pointer to the destination buffer for the data. The \r
+                              caller is responsible for either having implicit or \r
+                              explicit ownership of the buffer.\r
+\r
+  @retval EFI_SUCCESS           The read request was queued if Token->Event is\r
+                                not NULL.The data was read correctly from the\r
+                                device if the Token->Event is NULL.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing\r
+                                the read.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.\r
+  @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of the\r
+                                intrinsic block size of the device.\r
+  @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid, \r
+                                or the buffer is not on proper alignment.\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack\r
+                                of resources.\r
 **/\r
 **/\r
+EFI_STATUS\r
+EmuBlockIoReadBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL  *This,\r
+  IN     UINT32                 MediaId,\r
+  IN     EFI_LBA                LBA,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
+  IN     UINTN                  BufferSize,\r
+     OUT VOID                   *Buffer\r
+  )\r
 {\r
 {\r
-  EMU_BLOCK_IO_PRIVATE *Private;\r
-  ssize_t                 len;\r
   EFI_STATUS              Status;\r
   EFI_STATUS              Status;\r
-  EFI_TPL                 OldTpl;\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
+  EMU_BLOCK_IO_PRIVATE    *Private;\r
+  ssize_t                 len;\r
 \r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
 \r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixReadBlocks");\r
+  Status  = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixReadBlocks");\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
-  len = Private->UnixThunk->Read (Private->fd, Buffer, BufferSize);\r
+  len = read (Private->fd, Buffer, BufferSize);\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed.\n"));\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: ReadFile failed.\n"));\r
-    Status = UnixBlockIoError (Private);\r
+    Status = EmuBlockIoError (Private);\r
     goto Done;\r
   }\r
 \r
   //\r
     goto Done;\r
   }\r
 \r
   //\r
-  // If we wrote then media is present.\r
+  // If we read then media is present.\r
   //\r
   //\r
-  This->Media->MediaPresent = TRUE;\r
+  Private->Media->MediaPresent = TRUE;\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
-  gBS->RestoreTPL (OldTpl);\r
+  if (Token != NULL) {\r
+    if (Token->Event != NULL) {\r
+      // Caller is responcible for signaling EFI Event\r
+      Token->TransactionStatus = Status;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
   return Status;\r
 }\r
 \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
 \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
+  Write BufferSize bytes from Lba into Buffer.\r
+\r
+  This function writes the requested number of blocks to the device. All blocks\r
+  are written, or an error is returned.If EFI_DEVICE_ERROR, EFI_NO_MEDIA,\r
+  EFI_WRITE_PROTECTED or EFI_MEDIA_CHANGED is returned and non-blocking I/O is\r
+  being used, the Event associated with this request will not be signaled.\r
+\r
+  @param[in]       This       Indicates a pointer to the calling context.\r
+  @param[in]       MediaId    The media ID that the write request is for.\r
+  @param[in]       Lba        The starting logical block address to be written. The\r
+                              caller is responsible for writing to only legitimate\r
+                              locations.\r
+  @param[in, out]  Token      A pointer to the token associated with the transaction.\r
+  @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.\r
+  @param[in]       Buffer     A pointer to the source buffer for the data.\r
+\r
+  @retval EFI_SUCCESS           The write request was queued if Event is not NULL.\r
+                                The data was written correctly to the device if\r
+                                the Event is NULL.\r
+  @retval EFI_WRITE_PROTECTED   The device can not be written to.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHNAGED     The MediaId does not matched the current device.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while performing the write.\r
+  @retval EFI_BAD_BUFFER_SIZE   The Buffer was not a multiple of the block size of the device.\r
+  @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid, \r
+                                or the buffer is not on proper alignment.\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack\r
+                                of resources.\r
 \r
 **/\r
 \r
 **/\r
+EFI_STATUS\r
+EmuBlockIoWriteBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL  *This,\r
+  IN     UINT32                 MediaId,\r
+  IN     EFI_LBA                LBA,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
+  IN     UINTN                  BufferSize,\r
+  IN     VOID                   *Buffer\r
+  )\r
 {\r
 {\r
-  EMU_BLOCK_IO_PRIVATE *Private;\r
+  EMU_BLOCK_IO_PRIVATE    *Private;\r
   ssize_t                 len;\r
   EFI_STATUS              Status;\r
   ssize_t                 len;\r
   EFI_STATUS              Status;\r
-  EFI_TPL                 OldTpl;\r
 \r
 \r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
 \r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
-  Status  = UnixBlockIoReadWriteCommon (Private, MediaId, Lba, BufferSize, Buffer, "UnixWriteBlocks");\r
+  Status  = EmuBlockIoReadWriteCommon (Private, MediaId, LBA, BufferSize, Buffer, "UnixWriteBlocks");\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
-  len = Private->UnixThunk->Write (Private->fd, Buffer, BufferSize);\r
+  len = write (Private->fd, Buffer, BufferSize);\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed.\n"));\r
   if (len != BufferSize) {\r
     DEBUG ((EFI_D_INIT, "ReadBlocks: WriteFile failed.\n"));\r
-    Status = UnixBlockIoError (Private);\r
+    Status = EmuBlockIoError (Private);\r
     goto Done;\r
   }\r
 \r
   //\r
   // If the write succeeded, we are not write protected and media is present.\r
   //\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
+  Private->Media->MediaPresent = TRUE;\r
+  Private->Media->ReadOnly     = FALSE;\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
   Status = EFI_SUCCESS;\r
 \r
 Done:\r
-  gBS->RestoreTPL (OldTpl);\r
+  if (Token != NULL) {\r
+    if (Token->Event != NULL) {\r
+      // Caller is responcible for signaling EFI Event\r
+      Token->TransactionStatus = Status;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
   return Status;\r
 }\r
 \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
 \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
+  Flush the Block Device.\r
\r
+  If EFI_DEVICE_ERROR, EFI_NO_MEDIA,_EFI_WRITE_PROTECTED or EFI_MEDIA_CHANGED\r
+  is returned and non-blocking I/O is being used, the Event associated with\r
+  this request will not be signaled.  \r
+\r
+  @param[in]      This     Indicates a pointer to the calling context.\r
+  @param[in,out]  Token    A pointer to the token associated with the transaction\r
+\r
+  @retval EFI_SUCCESS          The flush request was queued if Event is not NULL.\r
+                               All outstanding data was written correctly to the\r
+                               device if the Event is NULL.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error while writting back\r
+                               the data.\r
+  @retval EFI_WRITE_PROTECTED  The device cannot be written to.\r
+  @retval EFI_NO_MEDIA         There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED    The MediaId is not for the current media.\r
+  @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack\r
+                               of resources.\r
 \r
 **/\r
 \r
 **/\r
+EFI_STATUS\r
+EmuBlockIoFlushBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN      *Token\r
+  )\r
 {\r
 {\r
+  EMU_BLOCK_IO_PRIVATE *Private;\r
+\r
+  Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (Private->fd >= 0) {\r
+    close (Private->fd);\r
+    Private->fd = open (Private->Filename, Private->Mode, 0644);\r
+  }\r
+  \r
+  if (Token != NULL) {\r
+    if (Token->Event != NULL) {\r
+      // Caller is responcible for signaling EFI Event\r
+      Token->TransactionStatus = EFI_SUCCESS;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+  \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+/**\r
+  Reset the block device hardware.\r
+\r
+  @param[in]  This                 Indicates a pointer to the calling context.\r
+  @param[in]  ExtendedVerification Indicates that the driver may perform a more\r
+                                   exhausive verfication operation of the device\r
+                                   during reset.\r
+\r
+  @retval EFI_SUCCESS          The device was reset.\r
+  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could\r
+                               not be reset.\r
+\r
+**/\r
 EFI_STATUS\r
 EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoResetBlock (\r
-  IN EFI_BLOCK_IO_PROTOCOL  *This,\r
-  IN BOOLEAN                ExtendedVerification\r
+EmuBlockIoReset (\r
+  IN EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN BOOLEAN                  ExtendedVerification\r
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
@@ -959,95 +567,138 @@ UnixBlockIoResetBlock (
 **/\r
 {\r
   EMU_BLOCK_IO_PRIVATE *Private;\r
 **/\r
 {\r
   EMU_BLOCK_IO_PRIVATE *Private;\r
-  EFI_TPL               OldTpl;\r
 \r
 \r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-  \r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (Private->fd >= 0) {\r
   Private = EMU_BLOCK_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   if (Private->fd >= 0) {\r
-    Private->UnixThunk->Close (Private->fd);\r
+    close (Private->fd);\r
     Private->fd = -1;\r
   }\r
 \r
     Private->fd = -1;\r
   }\r
 \r
-  gBS->RestoreTPL (OldTpl);\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-UINTN\r
-Atoi (\r
-  CHAR16  *String\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
 \r
 \r
-  Convert a unicode string to a UINTN\r
-\r
-Arguments:\r
-\r
-  String - Unicode string.\r
+char *\r
+StdDupUnicodeToAscii (\r
+  IN  CHAR16 *Str\r
+  )\r
+{\r
+  UINTN   Size;\r
+  char    *Ascii;\r
+  char    *Ptr;\r
+  \r
+  Size = StrLen (Str) + 1;\r
+  Ascii = malloc (Size);\r
+  if (Ascii == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  for (Ptr = Ascii; *Str != '\0'; Ptr++, Str++) {\r
+    *Ptr = *Str;\r
+  }\r
+  *Ptr = 0;\r
+  \r
+  return Ascii;\r
+}\r
 \r
 \r
-Returns: \r
 \r
 \r
-  UINTN of the number represented by String.  \r
+EMU_BLOCK_IO_PROTOCOL gEmuBlockIoProtocol = {\r
+  GasketEmuBlockIoReset,\r
+  GasketEmuBlockIoReadBlocks,\r
+  GasketEmuBlockIoWriteBlocks,\r
+  GasketEmuBlockIoFlushBlocks,\r
+  GasketEmuBlockIoCreateMapping\r
+};\r
 \r
 \r
-**/\r
+EFI_STATUS\r
+EmuBlockIoThunkOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\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
+  EMU_BLOCK_IO_PRIVATE  *Private;\r
+  char                  *Str;\r
+  \r
+  if (This->Private != NULL) {\r
+    return EFI_ALREADY_STARTED;\r
   }\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
+  if (!CompareGuid (This->Protocol, &gEmuBlockIoProtocolGuid)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  \r
+  Private = malloc (sizeof (EMU_BLOCK_IO_PRIVATE));\r
+  if (Private == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   }\r
 \r
-  return Number;\r
+  \r
+  Private->Signature = EMU_BLOCK_IO_PRIVATE_SIGNATURE;\r
+  Private->Thunk     = This;\r
+  CopyMem (&Private->EmuBlockIo, &gEmuBlockIoProtocol, sizeof (gEmuBlockIoProtocol));\r
+  Private->fd = -1;\r
\r
+  Private->Filename = StdDupUnicodeToAscii (This->ConfigString);\r
+  if (Private->Filename == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
\r
+  Str = strstr (Private->Filename, ":");\r
+  if (Str == NULL) {\r
+    Private->RemovableMedia = FALSE;\r
+    Private->WriteProtected = FALSE;\r
+  } else {\r
+    for (*Str++ = '\0'; *Str != 0; Str++) {\r
+      if (*Str == 'R' || *Str == 'F') {\r
+        Private->RemovableMedia = (BOOLEAN) (*Str == 'R');\r
+      }\r
+      if (*Str == 'O' || *Str == 'W') {\r
+        Private->WriteProtected  = (BOOLEAN) (*Str == 'O');\r
+      }\r
+    }\r
+  }\r
+  \r
+  Private->BlockSize = 512;\r
\r
+  This->Interface = &Private->EmuBlockIo;\r
+  This->Private   = Private;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
 }\r
 \r
 \r
-/*++\r
-\r
-This function extends the capability of SetFilePointer to accept 64 bit parameters\r
-\r
-**/\r
 EFI_STATUS\r
 EFI_STATUS\r
-SetFilePointer64 (\r
-  IN  EMU_BLOCK_IO_PRIVATE    *Private,\r
-  IN  INT64                      DistanceToMove,\r
-  OUT UINT64                     *NewFilePointer,\r
-  IN  INT32                      MoveMethod\r
+EmuBlockIoThunkClose (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
   )\r
 {\r
   )\r
 {\r
-  EFI_STATUS    Status;\r
-  off_t         res;\r
+  EMU_BLOCK_IO_PRIVATE  *Private;\r
 \r
 \r
-  Status = EFI_SUCCESS;\r
-  res = Private->UnixThunk->Lseek(Private->fd, DistanceToMove, MoveMethod);\r
-  if (res == -1) {\r
-    Status = EFI_INVALID_PARAMETER;\r
+  if (!CompareGuid (This->Protocol, &gEmuBlockIoProtocolGuid)) {\r
+    return EFI_UNSUPPORTED;\r
   }\r
   }\r
-\r
-  if (NewFilePointer != NULL) {\r
-    *NewFilePointer = res;\r
+  \r
+  Private = This->Private;\r
+  \r
+  if (This->Private != NULL) {\r
+    if (Private->Filename != NULL) {\r
+      free (Private->Filename);\r
+    }   \r
+    free (This->Private);\r
   }\r
   }\r
-\r
-  return Status;\r
+  \r
+  return EFI_SUCCESS;\r
 }\r
 }\r
+\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo = {\r
+  &gEmuBlockIoProtocolGuid,\r
+  NULL,\r
+  NULL,\r
+  0,\r
+  GasketBlockIoThunkOpen,\r
+  GasketBlockIoThunkClose,\r
+  NULL\r
+};\r
+\r
+\r
index 61297b575ae132ab9a86630d4c03b91b8a02098c..e506e774b6d20da2ca3d8e25c3135b3bdf77eecf 100644 (file)
@@ -405,8 +405,58 @@ GasketPosixFileSystmeThunkClose (
   IN  EMU_IO_THUNK_PROTOCOL   *This\r
   );\r
 \r
   IN  EMU_IO_THUNK_PROTOCOL   *This\r
   );\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+GasketEmuBlockIoReset (\r
+  IN EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN BOOLEAN                  ExtendedVerification\r
+  );\r
 \r
 \r
+EFI_STATUS\r
+GasketEmuBlockIoReadBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL  *This,\r
+  IN     UINT32                 MediaId,\r
+  IN     EFI_LBA                LBA,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
+  IN     UINTN                  BufferSize,\r
+     OUT VOID                   *Buffer\r
+  );\r
 \r
 \r
+EFI_STATUS\r
+EFIAPI\r
+GasketEmuBlockIoWriteBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL  *This,\r
+  IN     UINT32                 MediaId,\r
+  IN     EFI_LBA                LBA,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
+  IN     UINTN                  BufferSize,\r
+  IN     VOID                   *Buffer\r
+  );\r
+  \r
+EFI_STATUS\r
+GasketEmuBlockIoFlushBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN      *Token\r
+  );\r
+  \r
+EFI_STATUS\r
+GasketEmuBlockIoCreateMapping (\r
+  IN     EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN     EFI_BLOCK_IO_MEDIA       *Media\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+GasketBlockIoThunkOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+GasketBlockIoThunkClose (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  );\r
+  \r
 #endif\r
 \r
 \r
 #endif\r
 \r
 \r
index 855825627fffeeb3394ce2cc2e43c193ae513442..720f10218afece110f13bc69fc51da2df4f8faf5 100644 (file)
@@ -1533,7 +1533,7 @@ PosixFileSystmeThunkClose (
   }
 
   if (This->Private != NULL) {
   }
 
   if (This->Private != NULL) {
-    if (Private->VolumeLabel == NULL) {
+    if (Private->VolumeLabel != NULL) {
       free (Private->VolumeLabel);
     }   
     free (This->Private);
       free (Private->VolumeLabel);
     }   
     free (This->Private);
index 9c0990b2cdf173765175b0b686df07e15414bf92..ff5eff0c07fe8e437e033ffbb7a2ecd885e21930 100644 (file)
@@ -116,7 +116,10 @@ main (
   //
   AddThunkProtocol (&gX11ThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuGop), TRUE); 
   AddThunkProtocol (&gPosixFileSystemThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuFileSystem), TRUE); 
   //
   AddThunkProtocol (&gX11ThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuGop), TRUE); 
   AddThunkProtocol (&gPosixFileSystemThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuFileSystem), TRUE); 
+  AddThunkProtocol (&gBlockIoThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuVirtualDisk), TRUE); 
   
   
+
+
   //
   // Emulator other Thunks
   //
   //
   // Emulator other Thunks
   //
index 19e5f17147644825d83bad4e208173d87b1b4569..f2487b913393037c8d864c6c9714b5b1f0529794 100644 (file)
@@ -46,6 +46,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Protocol/EmuIoThunk.h>\r
 #include <Protocol/EmuGraphicsWindow.h>\r
 #include <Protocol/EmuThread.h>\r
 #include <Protocol/EmuIoThunk.h>\r
 #include <Protocol/EmuGraphicsWindow.h>\r
 #include <Protocol/EmuThread.h>\r
+#include <Protocol/EmuBlockIo.h>\r
 \r
 #include <Guid/FileInfo.h>\r
 #include <Guid/FileSystemInfo.h>\r
 \r
 #include <Guid/FileInfo.h>\r
 #include <Guid/FileSystemInfo.h>\r
@@ -318,6 +319,6 @@ extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;
 extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL gX11ThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL gPthreadThunkIo;\r
-\r
+extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;\r
 \r
 #endif\r
 \r
 #endif\r
index 7939fbfa8363db7c52638d9ed40a10e0e9360c41..763fd1e6a1cefba3ed05808af24f0a4650b74095 100644 (file)
@@ -35,6 +35,7 @@
   X11GraphicsWindow.c\r
   Pthreads.c\r
   PosixFileSystem.c\r
   X11GraphicsWindow.c\r
   Pthreads.c\r
   PosixFileSystem.c\r
+  BlockIo.c\r
 \r
 [Sources.X64]\r
   X64/Gasket.S        # convert between Emu x86_64 ABI and EFI X64 ABI\r
 \r
 [Sources.X64]\r
   X64/Gasket.S        # convert between Emu x86_64 ABI and EFI X64 ABI\r
@@ -68,8 +69,8 @@
   gEmuIoThunkProtocolGuid\r
   gEmuGraphicsWindowProtocolGuid\r
   gEmuThreadThunkProtocolGuid\r
   gEmuIoThunkProtocolGuid\r
   gEmuGraphicsWindowProtocolGuid\r
   gEmuThreadThunkProtocolGuid\r
+  gEmuBlockIoProtocolGuid\r
   gEfiSimpleFileSystemProtocolGuid\r
   gEfiSimpleFileSystemProtocolGuid\r
-  \r
 \r
 [Guids]\r
   gEfiFileSystemVolumeLabelInfoIdGuid           # SOMETIMES_CONSUMED\r
 \r
 [Guids]\r
   gEfiFileSystemVolumeLabelInfoIdGuid           # SOMETIMES_CONSUMED\r
index 3dc0fa1f2829aa7fed446c0c660f202bd9bc1b9d..e5515e259b47c02567d086812de8dae2e58383d9 100644 (file)
@@ -1022,9 +1022,143 @@ ASM_PFX(GasketPosixFileSystmeThunkClose):
   popq    %rbp
   ret
 
   popq    %rbp
   ret
 
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
+ASM_PFX(GasketEmuBlockIoReset):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+  movq    %rdx, %rsi     
+
+  call    ASM_PFX(EmuBlockIoReset)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
+ASM_PFX(GasketEmuBlockIoReadBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+  movq    %rdx, %rsi     
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    0x30(%rbp), %r8   
+  movq    0x38(%rbp), %r9   
+
+  call    ASM_PFX(EmuBlockIoReadBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
+ASM_PFX(GasketEmuBlockIoWriteBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+  movq    %rdx, %rsi     
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    0x30(%rbp), %r8   
+  movq    0x38(%rbp), %r9   
+
+  call    ASM_PFX(EmuBlockIoWriteBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
+ASM_PFX(GasketEmuBlockIoFlushBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+  movq    %rdx, %rsi    
+
+  call    ASM_PFX(EmuBlockIoFlushBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
+ASM_PFX(GasketEmuBlockIoCreateMapping):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+  movq    %rdx, %rsi     
+
+  call    ASM_PFX(EmuBlockIoCreateMapping)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
 
 
 
 
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
+ASM_PFX(GasketBlockIoThunkOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+
+  call    ASM_PFX(EmuBlockIoThunkOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
 
 
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
+ASM_PFX(GasketBlockIoThunkClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args 
+
+  call    ASM_PFX(EmuBlockIoThunkClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
 
 
 
 
 
 
index 06b7b343228989ce0dc5b665be122b4e0934555f..b58f6011f226db4375bec6c11e1d020f128a362f 100644 (file)
   \r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuApCount|L"1"\r
 \r
   \r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuApCount|L"1"\r
 \r
-  gInOsEmuPkgTokenSpaceGuid.PcdEmuPhysicalDisk|L"E:RW;245760;512"\r
-  gInOsEmuPkgTokenSpaceGuid.PcdEmuVirtualDisk|L"FW;40960;512"\r
+  gInOsEmuPkgTokenSpaceGuid.PcdEmuVirtualDisk|L"disk.dmg:FW"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuFileSystem|L".!../../../../EdkShellBinPkg/Bin"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuSerialPort|L"/dev/ttyS0"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuGop|L"GOP Window"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuFileSystem|L".!../../../../EdkShellBinPkg/Bin"\r
   gInOsEmuPkgTokenSpaceGuid.PcdEmuSerialPort|L"/dev/ttyS0"\r
   InOsEmuPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystemDxe.inf\r
   InOsEmuPkg/EmuBlockIoDxe/EmuBlockIoDxe.inf\r
 \r
   InOsEmuPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystemDxe.inf\r
   InOsEmuPkg/EmuBlockIoDxe/EmuBlockIoDxe.inf\r
 \r
-!if $(0)\r
-  UnixPkg/UnixSerialIoDxe/UnixSerialIo.inf\r
-  UnixPkg/UnixConsoleDxe/UnixConsole.inf\r
-  UnixPkg/UnixSimpleFileSystemDxe/UnixSimpleFileSystem.inf\r
-!endif\r
-\r
   MdeModulePkg/Application/HelloWorld/HelloWorld.inf\r
 \r
   #\r
   # Network stack drivers\r
   #\r
   MdeModulePkg/Application/HelloWorld/HelloWorld.inf\r
 \r
   #\r
   # Network stack drivers\r
   #\r
-##!if $(NETWORK_SUPPORT) & $(0)\r
-!if $(0)\r
-  UnixPkg/UnixSnpDxe/UnixSnpDxe.inf\r
+!if $(NETWORK_SUPPORT) \r
+  InOsEmuPkg/EmuSnpDxe/EmuSnpDxe.inf\r
 !endif\r
   MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf\r
   MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf\r
 !endif\r
   MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf\r
   MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf\r
index 14e5b6022a7d5bbd2588147d855712b525ee9531..d3696927ee0df72599a619cca443912af9975d5a 100644 (file)
@@ -221,9 +221,8 @@ INF  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
 INF  InOsEmuPkg/EmuBusDriverDxe/EmuBusDriverDxe.inf \r
 INF  InOsEmuPkg/EmuGopDxe/EmuGopDxe.inf\r
 INF  InOsEmuPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystemDxe.inf\r
 INF  InOsEmuPkg/EmuBusDriverDxe/EmuBusDriverDxe.inf \r
 INF  InOsEmuPkg/EmuGopDxe/EmuGopDxe.inf\r
 INF  InOsEmuPkg/EmuSimpleFileSystemDxe/EmuSimpleFileSystemDxe.inf\r
+INF  InOsEmuPkg/EmuBlockIoDxe/EmuBlockIoDxe.inf\r
 \r
 \r
-#INF  UnixPkg/UnixBlockIoDxe/UnixBlockIo.inf\r
-#INF  UnixPkg/UnixSerialIoDxe/UnixSerialIo.inf\r
 INF  MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
 INF  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
 INF  MdeModulePkg/Universal/PrintDxe/PrintDxe.inf\r
 INF  MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf\r
 INF  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf\r
 INF  MdeModulePkg/Universal/PrintDxe/PrintDxe.inf\r
@@ -235,7 +234,7 @@ INF  MdeModulePkg/Application/HelloWorld/HelloWorld.inf
 # Network stack drivers\r
 #\r
 !if $(NETWORK_SUPPORT)\r
 # Network stack drivers\r
 #\r
 !if $(NETWORK_SUPPORT)\r
-#INF  UnixPkg/UnixSnpDxe/UnixSnpDxe.inf\r
+INF  InOsEmuPkg/EmuSnpDxe/EmuSnpDxe.inf\r
 !endif\r
 INF  MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf\r
 INF  MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf\r
 !endif\r
 INF  MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf\r
 INF  MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf\r
index a9294be02e77d0dc09cceee3d405a447e440a91c..8742b3f7f4a0c1646f60ba34ba36959e6010e18e 100755 (executable)
@@ -58,8 +58,8 @@ case `uname` in
         UNIXPKG_TOOLS=XCLANG
       fi
 #      NETWORK_SUPPORT="-D NETWORK_SUPPORT"
         UNIXPKG_TOOLS=XCLANG
       fi
 #      NETWORK_SUPPORT="-D NETWORK_SUPPORT"
-#      BUILD_NEW_SHELL="-D BUILD_NEW_SHELL"
-#      BUILD_FAT="-D BUILD_FAT"
+      BUILD_NEW_SHELL="-D BUILD_NEW_SHELL"
+      BUILD_FAT="-D BUILD_FAT"
       ;;
   Linux*) TARGET_TOOLS=ELFGCC ;;
 
       ;;
   Linux*) TARGET_TOOLS=ELFGCC ;;