]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.c
OvmfPkg/XenPvBlkDxe: fix VS2010 build failures
[mirror_edk2.git] / OvmfPkg / XenPvBlkDxe / XenPvBlkDxe.c
index e755a43dd687d9d1c023544de76b5c95cd02eca4..caaa9b4ff42413aa6248f8f3056051fa21b65415 100644 (file)
@@ -261,6 +261,7 @@ XenPvBlkDxeDriverBindingStart (
   EFI_STATUS Status;\r
   XENBUS_PROTOCOL *XenBusIo;\r
   XEN_BLOCK_FRONT_DEVICE *Dev;\r
+  EFI_BLOCK_IO_MEDIA *Media;\r
 \r
   Status = gBS->OpenProtocol (\r
                 ControllerHandle,\r
@@ -279,8 +280,45 @@ XenPvBlkDxeDriverBindingStart (
     goto CloseProtocol;\r
   }\r
 \r
+  CopyMem (&Dev->BlockIo, &gXenPvBlkDxeBlockIo, sizeof (EFI_BLOCK_IO_PROTOCOL));\r
+  Media = AllocateCopyPool (sizeof (EFI_BLOCK_IO_MEDIA),\r
+                            &gXenPvBlkDxeBlockIoMedia);\r
+  if (Dev->MediaInfo.VDiskInfo & VDISK_REMOVABLE) {\r
+    Media->RemovableMedia = TRUE;\r
+  }\r
+  Media->MediaPresent = TRUE;\r
+  Media->ReadOnly = !Dev->MediaInfo.ReadWrite;\r
+  if (Dev->MediaInfo.CdRom) {\r
+    //\r
+    // If it's a cdrom, the blocksize value need to be 2048 for OVMF to\r
+    // recognize it as a cdrom:\r
+    //    MdeModulePkg/Universal/Disk/PartitionDxe/ElTorito.c\r
+    //\r
+    Media->BlockSize = 2048;\r
+    Media->LastBlock = DivU64x32 (Dev->MediaInfo.Sectors,\r
+                                  Media->BlockSize / Dev->MediaInfo.SectorSize) - 1;\r
+  } else {\r
+    Media->BlockSize = Dev->MediaInfo.SectorSize;\r
+    Media->LastBlock = Dev->MediaInfo.Sectors - 1;\r
+  }\r
+  ASSERT (Media->BlockSize % 512 == 0);\r
+  Dev->BlockIo.Media = Media;\r
+\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &ControllerHandle,\r
+                    &gEfiBlockIoProtocolGuid, &Dev->BlockIo,\r
+                    NULL\r
+                    );\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "XenPvBlk: install protocol fail: %r\n", Status));\r
+    goto UninitBlockFront;\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 \r
+UninitBlockFront:\r
+  FreePool (Media);\r
+  XenPvBlockFrontShutdown (Dev);\r
 CloseProtocol:\r
   gBS->CloseProtocol (ControllerHandle, &gXenBusProtocolGuid,\r
                       This->DriverBindingHandle, ControllerHandle);\r
@@ -322,6 +360,33 @@ XenPvBlkDxeDriverBindingStop (
   IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL\r
   )\r
 {\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  XEN_BLOCK_FRONT_DEVICE *Dev;\r
+  EFI_BLOCK_IO_MEDIA *Media;\r
+  EFI_STATUS Status;\r
+\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle, &gEfiBlockIoProtocolGuid,\r
+                  (VOID **)&BlockIo,\r
+                  This->DriverBindingHandle, ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = gBS->UninstallProtocolInterface (ControllerHandle,\r
+                  &gEfiBlockIoProtocolGuid, BlockIo);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Media = BlockIo->Media;\r
+  Dev = XEN_BLOCK_FRONT_FROM_BLOCK_IO (BlockIo);\r
+  XenPvBlockFrontShutdown (Dev);\r
+\r
+  FreePool (Media);\r
+\r
   gBS->CloseProtocol (ControllerHandle, &gXenBusProtocolGuid,\r
          This->DriverBindingHandle, ControllerHandle);\r
 \r