]> 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
-  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
@@ -264,8 +264,7 @@ EmuBlockIoReset (
 **/\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
@@ -278,7 +277,7 @@ EmuBlockIoReadBlocks
   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
@@ -325,7 +324,7 @@ EmuBlockIoWriteBlocks (
   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
@@ -357,7 +356,7 @@ EmuBlockIoFlushBlocks (
   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
@@ -442,7 +441,7 @@ EmuBlockIoDriverBindingSupported (
   // 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
@@ -524,7 +523,7 @@ EmuBlockIoDriverBindingStart (
   //\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
@@ -542,6 +541,7 @@ EmuBlockIoDriverBindingStart (
   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
index 24f4759d6654c5500be48334484b7f6a6d0cdea8..82460e40ecb08425d5b4549f4d165c54cc5878a1 100644 (file)
@@ -66,4 +66,4 @@
   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
+  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
index f31124dc019ed69308ce4a50caf621dd444ca877..26d6bb851854c7059fe4b0e2222a8959b78ff33f 100644 (file)
@@ -23,7 +23,7 @@
 #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
@@ -90,7 +90,7 @@ EFI_STATUS
   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
@@ -127,7 +127,7 @@ EFI_STATUS
 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
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
-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
-#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
-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
-EFI_STATUS\r
-UnixBlockIoOpenDevice (\r
-  EMU_BLOCK_IO_PRIVATE         *Private\r
-  );\r
+  EMU_IO_THUNK_PROTOCOL       *Thunk;\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
+  int                         fd;\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
-  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
-                  &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
-  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
-  Str++;\r
+} EMU_BLOCK_IO_PRIVATE;\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
-  // 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
-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
-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
-    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
+This function extends the capability of SetFilePointer to accept 64 bit parameters\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 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
-  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
-  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
-  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
 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
-  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
+    EmuBlockIoReset (&Private->EmuBlockIo, FALSE);\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
-    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
-  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
-    BlockIo->Media->MediaPresent = TRUE;\r
-    EfiReleaseLock (&Private->Lock);\r
-    EfiAcquireLock (&Private->Lock);\r
+    Private->Media->MediaPresent = TRUE;\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
-    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
@@ -617,7 +130,7 @@ UnixBlockIoOpenDevice (
   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
@@ -626,67 +139,97 @@ UnixBlockIoOpenDevice (
     //\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
-    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
-    Private->UnixThunk->FTruncate (Private->fd, EndOfFile);\r
+    ftruncate (Private->fd, EndOfFile);\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
-      BlockIo->Reset (BlockIo, FALSE);\r
+      EmuBlockIoReset (&Private->EmuBlockIo, FALSE);\r
     }\r
   }\r
 \r
-  EfiReleaseLock (&Private->Lock);\r
   return Status;\r
 }\r
 \r
+\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
-  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
-#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
-  BlockIo = &Private->BlockIo;\r
-\r
-  switch (Private->UnixThunk->GetLastError ()) {\r
+  switch (errno) {\r
 \r
-  case ERROR_NOT_READY:\r
+  case EAGAIN:\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
-  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
-  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
@@ -696,9 +239,9 @@ UnixBlockIoError (
     Status                = EFI_DEVICE_ERROR;\r
     break;\r
   }\r
-\r
+/*\r
   if (ReinstallBlockIoFlag) {\r
-    BlockIo->Reset (BlockIo, FALSE);\r
+    Private->EmuBlockIo->Reset (&Private->EmuBlockIo, FALSE);\r
 \r
     gBS->ReinstallProtocolInterface (\r
           Private->EfiHandle,\r
@@ -707,14 +250,13 @@ UnixBlockIoError (
           BlockIo\r
           );\r
   }\r
-\r
+*/\r
   return Status;\r
-#endif\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
@@ -729,22 +271,22 @@ UnixBlockIoReadWriteCommon (
   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 (!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
-  if (Private->Media.MediaId != MediaId) {\r
+  if (Private->Media->MediaId != MediaId) {\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
@@ -775,172 +317,238 @@ UnixBlockIoReadWriteCommon (
 \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
-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
+  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
+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
-  EMU_BLOCK_IO_PRIVATE *Private;\r
-  ssize_t                 len;\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
-  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
-  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
-    Status = UnixBlockIoError (Private);\r
+    Status = EmuBlockIoError (Private);\r
     goto Done;\r
   }\r
 \r
   //\r
-  // If we wrote then media is present.\r
+  // If we read then media is present.\r
   //\r
-  This->Media->MediaPresent = TRUE;\r
+  Private->Media->MediaPresent = TRUE;\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
-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
+  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
+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
-  EMU_BLOCK_IO_PRIVATE *Private;\r
+  EMU_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 = 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
-  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
-    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
-  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
-  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
-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
+  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
+EFI_STATUS\r
+EmuBlockIoFlushBlocks (\r
+  IN     EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN      *Token\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
+\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
-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
@@ -959,95 +567,138 @@ UnixBlockIoResetBlock (
 **/\r
 {\r
   EMU_BLOCK_IO_PRIVATE *Private;\r
-  EFI_TPL               OldTpl;\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->UnixThunk->Close (Private->fd);\r
+    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
+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
-Returns: \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
+EFI_STATUS\r
+EmuBlockIoThunkOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\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
-  // 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
-  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
-This function extends the capability of SetFilePointer to accept 64 bit parameters\r
-\r
-**/\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
-  EFI_STATUS    Status;\r
-  off_t         res;\r
+  EMU_BLOCK_IO_PRIVATE  *Private;\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
-  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
-  return Status;\r
+  \r
+  return EFI_SUCCESS;\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
+EFI_STATUS\r
+EFIAPI\r
+GasketEmuBlockIoReset (\r
+  IN EMU_BLOCK_IO_PROTOCOL    *This,\r
+  IN BOOLEAN                  ExtendedVerification\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
+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
index 855825627fffeeb3394ce2cc2e43c193ae513442..720f10218afece110f13bc69fc51da2df4f8faf5 100644 (file)
@@ -1533,7 +1533,7 @@ PosixFileSystmeThunkClose (
   }
 
   if (This->Private != NULL) {
-    if (Private->VolumeLabel == NULL) {
+    if (Private->VolumeLabel != NULL) {
       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 (&gBlockIoThunkIo, (CHAR16 *)PcdGetPtr (PcdEmuVirtualDisk), TRUE); 
   
+
+
   //
   // 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/EmuBlockIo.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
-\r
+extern EMU_IO_THUNK_PROTOCOL gBlockIoThunkIo;\r
 \r
 #endif\r
index 7939fbfa8363db7c52638d9ed40a10e0e9360c41..763fd1e6a1cefba3ed05808af24f0a4650b74095 100644 (file)
@@ -35,6 +35,7 @@
   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
@@ -68,8 +69,8 @@
   gEmuIoThunkProtocolGuid\r
   gEmuGraphicsWindowProtocolGuid\r
   gEmuThreadThunkProtocolGuid\r
+  gEmuBlockIoProtocolGuid\r
   gEfiSimpleFileSystemProtocolGuid\r
-  \r
 \r
 [Guids]\r
   gEfiFileSystemVolumeLabelInfoIdGuid           # SOMETIMES_CONSUMED\r
index 3dc0fa1f2829aa7fed446c0c660f202bd9bc1b9d..e5515e259b47c02567d086812de8dae2e58383d9 100644 (file)
@@ -1022,9 +1022,143 @@ ASM_PFX(GasketPosixFileSystmeThunkClose):
   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
-  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
   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
-##!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
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/EmuBlockIoDxe/EmuBlockIoDxe.inf\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
@@ -235,7 +234,7 @@ INF  MdeModulePkg/Application/HelloWorld/HelloWorld.inf
 # 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
index a9294be02e77d0dc09cceee3d405a447e440a91c..8742b3f7f4a0c1646f60ba34ba36959e6010e18e 100755 (executable)
@@ -58,8 +58,8 @@ case `uname` in
         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 ;;