]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
Add DiskIo2 protocol definition to MdePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / PartitionDxe / Mbr.c
index f89f3e190e68a39d0ea969fb031884db65cd2097..a35b4f2d0de86a8ab43971dac032943121704ebf 100644 (file)
@@ -1,20 +1,4 @@
-/*++\r
-\r
-Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-\r
-Module Name:\r
-\r
-  Mbr.c\r
-  \r
-Abstract:\r
-\r
+/** @file\r
   Decode a hard disk partitioned with the legacy MBR found on most PC's\r
 \r
   MBR - Master Boot Record is in the first sector of a partitioned hard disk.\r
@@ -22,35 +6,39 @@ Abstract:
         code that is not run on an EFI system. The legacy code reads the \r
         first sector of the active partition into memory and \r
 \r
-  BPB - Boot(?) Parameter Block is in the first sector of a FAT file system. \r
+  BPB - BIOS Parameter Block is in the first sector of a FAT file system. \r
         The BPB contains information about the FAT file system. The BPB is \r
         always on the first sector of a media. The first sector also contains\r
         the legacy boot strap code.\r
 \r
---*/\r
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
 \r
 #include "Partition.h"\r
 \r
-STATIC\r
+/**\r
+  Test to see if the Mbr buffer is a valid MBR.\r
+\r
+  @param  Mbr         Parent Handle.\r
+  @param  LastLba     Last Lba address on the device.\r
+   \r
+  @retval TRUE        Mbr is a Valid MBR.\r
+  @retval FALSE       Mbr is not a Valid MBR.\r
+\r
+**/\r
 BOOLEAN\r
 PartitionValidMbr (\r
   IN  MASTER_BOOT_RECORD      *Mbr,\r
   IN  EFI_LBA                 LastLba\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Test to see if the Mbr buffer is a valid MBR\r
-\r
-Arguments:       \r
-  Mbr     - Parent Handle \r
-  LastLba - Last Lba address on the device.\r
-\r
-Returns:\r
-  TRUE  - Mbr is a Valid MBR\r
-  FALSE - Mbr is not a Valid MBR\r
-\r
---*/\r
 {\r
   UINT32  StartingLBA;\r
   UINT32  EndingLBA;\r
@@ -104,37 +92,38 @@ Returns:
     }\r
   }\r
   //\r
-  // Non of the regions overlapped so MBR is O.K.\r
+  // None of the regions overlapped so MBR is O.K.\r
   //\r
   return MbrValid;\r
 }\r
 \r
+\r
+/**\r
+  Install child handles if the Handle supports MBR format.\r
+\r
+  @param[in]  This              Calling context.\r
+  @param[in]  Handle            Parent Handle.\r
+  @param[in]  DiskIo            Parent DiskIo interface.\r
+  @param[in]  DiskIo2           Parent DiskIo2 interface.\r
+  @param[in]  BlockIo           Parent BlockIo interface.\r
+  @param[in]  BlockIo2          Parent BlockIo2 interface.\r
+  @param[in]  DevicePath        Parent Device Path.\r
+   \r
+  @retval EFI_SUCCESS       A child handle was added.\r
+  @retval EFI_MEDIA_CHANGED Media change was detected.\r
+  @retval Others            MBR partition was not found.\r
+\r
+**/\r
 EFI_STATUS\r
 PartitionInstallMbrChildHandles (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN  EFI_HANDLE                   Handle,\r
   IN  EFI_DISK_IO_PROTOCOL         *DiskIo,\r
+  IN  EFI_DISK_IO2_PROTOCOL        *DiskIo2,\r
   IN  EFI_BLOCK_IO_PROTOCOL        *BlockIo,\r
+  IN  EFI_BLOCK_IO2_PROTOCOL       *BlockIo2,\r
   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Install child handles if the Handle supports MBR format.\r
-\r
-Arguments:       \r
-  This       - Calling context.\r
-  Handle     - Parent Handle \r
-  DiskIo     - Parent DiskIo interface\r
-  BlockIo    - Parent BlockIo interface\r
-  DevicePath - Parent Device Path\r
-\r
-Returns:\r
-  EFI_SUCCESS       - If a child handle was added\r
-  EFI_MEDIA_CHANGED - Media changed Detected\r
-       !EFI_SUCCESS      - Not found MBR partition.\r
-\r
---*/\r
 {\r
   EFI_STATUS                Status;\r
   MASTER_BOOT_RECORD        *Mbr;\r
@@ -146,27 +135,33 @@ Returns:
   UINT32                    PartitionNumber;\r
   EFI_DEVICE_PATH_PROTOCOL  *DevicePathNode;\r
   EFI_DEVICE_PATH_PROTOCOL  *LastDevicePathNode;\r
+  UINT32                    BlockSize;\r
+  UINT32                    MediaId;\r
+  EFI_LBA                   LastBlock;\r
 \r
-  Mbr             = NULL;\r
   Found           = EFI_NOT_FOUND;\r
 \r
-  Mbr             = AllocatePool (BlockIo->Media->BlockSize);\r
+  BlockSize = BlockIo->Media->BlockSize;\r
+  MediaId   = BlockIo->Media->MediaId;\r
+  LastBlock = BlockIo->Media->LastBlock;\r
+\r
+  Mbr = AllocatePool (BlockSize);\r
   if (Mbr == NULL) {\r
-    goto Done;\r
+    return Found;\r
   }\r
 \r
-  Status = BlockIo->ReadBlocks (\r
-                      BlockIo,\r
-                      BlockIo->Media->MediaId,\r
-                      0,\r
-                      BlockIo->Media->BlockSize,\r
-                      Mbr\r
-                      );\r
+  Status = DiskIo->ReadDisk (\r
+                     DiskIo,\r
+                     MediaId,\r
+                     0,\r
+                     BlockSize,\r
+                     Mbr\r
+                     );\r
   if (EFI_ERROR (Status)) {\r
     Found = Status;\r
     goto Done;\r
   }\r
-  if (!PartitionValidMbr (Mbr, BlockIo->Media->LastBlock)) {\r
+  if (!PartitionValidMbr (Mbr, LastBlock)) {\r
     goto Done;\r
   }\r
   //\r
@@ -178,9 +173,9 @@ Returns:
   LastDevicePathNode = NULL;\r
   ZeroMem (&ParentHdDev, sizeof (ParentHdDev));\r
   DevicePathNode = DevicePath;\r
-  while (!EfiIsDevicePathEnd (DevicePathNode)) {\r
+  while (!IsDevicePathEnd (DevicePathNode)) {\r
     LastDevicePathNode  = DevicePathNode;\r
-    DevicePathNode      = EfiNextDevicePathNode (DevicePathNode);\r
+    DevicePathNode      = NextDevicePathNode (DevicePathNode);\r
   }\r
 \r
   if (LastDevicePathNode != NULL) {\r
@@ -227,13 +222,15 @@ Returns:
       HdDev.PartitionNumber = PartitionNumber ++;\r
       HdDev.PartitionStart  = UNPACK_UINT32 (Mbr->Partition[Index].StartingLBA);\r
       HdDev.PartitionSize   = UNPACK_UINT32 (Mbr->Partition[Index].SizeInLBA);\r
-      CopyMem (HdDev.Signature, &(Mbr->UniqueMbrSignature[0]), sizeof (UINT32));\r
+      CopyMem (HdDev.Signature, &(Mbr->UniqueMbrSignature[0]), sizeof (Mbr->UniqueMbrSignature));\r
 \r
       Status = PartitionInstallChildHandle (\r
                 This,\r
                 Handle,\r
                 DiskIo,\r
+                DiskIo2,\r
                 BlockIo,\r
+                BlockIo2,\r
                 DevicePath,\r
                 (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
                 HdDev.PartitionStart,\r
@@ -255,13 +252,13 @@ Returns:
 \r
     do {\r
 \r
-      Status = BlockIo->ReadBlocks (\r
-                          BlockIo,\r
-                          BlockIo->Media->MediaId,\r
-                          ExtMbrStartingLba,\r
-                          BlockIo->Media->BlockSize,\r
-                          Mbr\r
-                          );\r
+      Status = DiskIo->ReadDisk (\r
+                         DiskIo,\r
+                         MediaId,\r
+                         MultU64x32 (ExtMbrStartingLba, BlockSize),\r
+                         BlockSize,\r
+                         Mbr\r
+                         );\r
       if (EFI_ERROR (Status)) {\r
         Found = Status;\r
         goto Done;\r
@@ -290,17 +287,19 @@ Returns:
       *((UINT32 *) &HdDev.Signature[0]) = 0;\r
 \r
       Status = PartitionInstallChildHandle (\r
-                This,\r
-                Handle,\r
-                DiskIo,\r
-                BlockIo,\r
-                DevicePath,\r
-                (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
-                HdDev.PartitionStart - ParentHdDev.PartitionStart,\r
-                HdDev.PartitionStart - ParentHdDev.PartitionStart + HdDev.PartitionSize - 1,\r
-                MBR_SIZE,\r
-                (BOOLEAN) (Mbr->Partition[0].OSIndicator == EFI_PARTITION)\r
-                );\r
+                 This,\r
+                 Handle,\r
+                 DiskIo,\r
+                 DiskIo2,\r
+                 BlockIo,\r
+                 BlockIo2,\r
+                 DevicePath,\r
+                 (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+                 HdDev.PartitionStart - ParentHdDev.PartitionStart,\r
+                 HdDev.PartitionStart - ParentHdDev.PartitionStart + HdDev.PartitionSize - 1,\r
+                 MBR_SIZE,\r
+                 (BOOLEAN) (Mbr->Partition[0].OSIndicator == EFI_PARTITION)\r
+                 );\r
       if (!EFI_ERROR (Status)) {\r
         Found = EFI_SUCCESS;\r
       }\r