]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
MdeModulePkg/PartitionDxe: Add impl of Partition Information Protocol
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / PartitionDxe / Mbr.c
index a35b4f2d0de86a8ab43971dac032943121704ebf..55e9d26bae5c8bd0ccae1e005e5b8257f274ad9b 100644 (file)
@@ -11,7 +11,8 @@
         always on the first sector of a media. The first sector also contains\r
         the legacy boot strap code.\r
 \r
-Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2014, Hewlett-Packard Development Company, L.P.<BR>\r
+Copyright (c) 2006 - 2017, 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
@@ -74,6 +75,9 @@ PartitionValidMbr (
       // return FALSE since no block devices on a system are implemented\r
       // with INT 13h\r
       //\r
+    \r
+      DEBUG((EFI_D_INFO, "PartitionValidMbr: Bad MBR partition size EndingLBA(%1x) > LastLBA(%1x)\n", EndingLBA, LastLba));\r
+\r
       return FALSE;\r
     }\r
 \r
@@ -125,19 +129,19 @@ PartitionInstallMbrChildHandles (
   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  EFI_STATUS                Status;\r
-  MASTER_BOOT_RECORD        *Mbr;\r
-  UINT32                    ExtMbrStartingLba;\r
-  UINTN                     Index;\r
-  HARDDRIVE_DEVICE_PATH     HdDev;\r
-  HARDDRIVE_DEVICE_PATH     ParentHdDev;\r
-  EFI_STATUS                Found;\r
-  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
+  EFI_STATUS                   Status;\r
+  MASTER_BOOT_RECORD           *Mbr;\r
+  UINT32                       ExtMbrStartingLba;\r
+  UINT32                       Index;\r
+  HARDDRIVE_DEVICE_PATH        HdDev;\r
+  HARDDRIVE_DEVICE_PATH        ParentHdDev;\r
+  EFI_STATUS                   Found;\r
+  EFI_DEVICE_PATH_PROTOCOL     *DevicePathNode;\r
+  EFI_DEVICE_PATH_PROTOCOL     *LastDevicePathNode;\r
+  UINT32                       BlockSize;\r
+  UINT32                       MediaId;\r
+  EFI_LBA                      LastBlock;\r
+  EFI_PARTITION_INFO_PROTOCOL  PartitionInfo;\r
 \r
   Found           = EFI_NOT_FOUND;\r
 \r
@@ -188,8 +192,6 @@ PartitionInstallMbrChildHandles (
     }\r
   }\r
 \r
-  PartitionNumber = 1;\r
-\r
   ZeroMem (&HdDev, sizeof (HdDev));\r
   HdDev.Header.Type     = MEDIA_DEVICE_PATH;\r
   HdDev.Header.SubType  = MEDIA_HARDDRIVE_DP;\r
@@ -219,11 +221,19 @@ PartitionInstallMbrChildHandles (
         continue;\r
       }\r
 \r
-      HdDev.PartitionNumber = PartitionNumber ++;\r
+      HdDev.PartitionNumber = Index + 1;\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 (Mbr->UniqueMbrSignature));\r
 \r
+      ZeroMem (&PartitionInfo, sizeof (EFI_PARTITION_INFO_PROTOCOL));\r
+      PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;\r
+      PartitionInfo.Type     = PARTITION_TYPE_MBR;\r
+      if (Mbr->Partition[Index].OSIndicator == EFI_PARTITION) {\r
+        PartitionInfo.System = 1;\r
+      }\r
+      CopyMem (&PartitionInfo.Info.Mbr, &Mbr->Partition[Index], sizeof (MBR_PARTITION_RECORD));\r
+\r
       Status = PartitionInstallChildHandle (\r
                 This,\r
                 Handle,\r
@@ -233,10 +243,10 @@ PartitionInstallMbrChildHandles (
                 BlockIo2,\r
                 DevicePath,\r
                 (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+                &PartitionInfo,\r
                 HdDev.PartitionStart,\r
                 HdDev.PartitionStart + HdDev.PartitionSize - 1,\r
-                MBR_SIZE,\r
-                (BOOLEAN) (Mbr->Partition[Index].OSIndicator == EFI_PARTITION)\r
+                MBR_SIZE\r
                 );\r
 \r
       if (!EFI_ERROR (Status)) {\r
@@ -248,6 +258,7 @@ PartitionInstallMbrChildHandles (
     // It's an extended partition. Follow the extended partition\r
     // chain to get all the logical drives\r
     //\r
+    Index             = 0;\r
     ExtMbrStartingLba = 0;\r
 \r
     do {\r
@@ -273,7 +284,7 @@ PartitionInstallMbrChildHandles (
         ExtMbrStartingLba = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA);\r
         continue;\r
       }\r
-      HdDev.PartitionNumber = PartitionNumber ++;\r
+      HdDev.PartitionNumber = ++Index;\r
       HdDev.PartitionStart  = UNPACK_UINT32 (Mbr->Partition[0].StartingLBA) + ExtMbrStartingLba + ParentHdDev.PartitionStart;\r
       HdDev.PartitionSize   = UNPACK_UINT32 (Mbr->Partition[0].SizeInLBA);\r
       if ((HdDev.PartitionStart + HdDev.PartitionSize - 1 >= ParentHdDev.PartitionStart + ParentHdDev.PartitionSize) ||\r
@@ -286,6 +297,14 @@ PartitionInstallMbrChildHandles (
       //\r
       *((UINT32 *) &HdDev.Signature[0]) = 0;\r
 \r
+      ZeroMem (&PartitionInfo, sizeof (EFI_PARTITION_INFO_PROTOCOL));\r
+      PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;\r
+      PartitionInfo.Type     = PARTITION_TYPE_MBR;\r
+      if (Mbr->Partition[0].OSIndicator == EFI_PARTITION) {\r
+        PartitionInfo.System = 1;\r
+      }\r
+      CopyMem (&PartitionInfo.Info.Mbr, &Mbr->Partition[0], sizeof (MBR_PARTITION_RECORD));\r
+\r
       Status = PartitionInstallChildHandle (\r
                  This,\r
                  Handle,\r
@@ -295,10 +314,10 @@ PartitionInstallMbrChildHandles (
                  BlockIo2,\r
                  DevicePath,\r
                  (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+                 &PartitionInfo,\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
+                 MBR_SIZE\r
                  );\r
       if (!EFI_ERROR (Status)) {\r
         Found = EFI_SUCCESS;\r