]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c
MdeModulePkg/PartitionDxe: Skip the MBR that add for CD-ROM
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / PartitionDxe / Mbr.c
index f0c92aa09a596c235050688705db4fc51433922e..3830af1ea767036fbbc4c66c1deb15053d9f138c 100644 (file)
@@ -39,6 +39,7 @@ PartitionValidMbr (
   UINT32  StartingLBA;\r
   UINT32  EndingLBA;\r
   UINT32  NewEndingLBA;\r
+  UINT32  SizeInLBA;\r
   INTN    Index1;\r
   INTN    Index2;\r
   BOOLEAN MbrValid;\r
@@ -51,13 +52,34 @@ PartitionValidMbr (
   //\r
   MbrValid = FALSE;\r
   for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) {\r
-    if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) == 0) {\r
+    StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);\r
+    SizeInLBA   = UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA);\r
+\r
+    //\r
+    // If the MBR with partition entry covering the ENTIRE disk, i.e. start at LBA0\r
+    // with whole disk size, we treat it as an invalid MBR partition.\r
+    //\r
+    if ((StartingLBA == 0) &&\r
+        (SizeInLBA == (LastLba + 1))) {\r
+      //\r
+      // Refer to the http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html\r
+      // "WHOLE DISK VS PARTITION"\r
+      // Some linux ISOs may put the MBR table in the first 512 bytes for compatibility reasons with Windows.\r
+      // Linux  kernel  ignores MBR table if contains partition which starts at sector 0.\r
+      // Skip it because we don't have the partition check for UDF(El Torito compatible).\r
+      // It would continue to do the whole disk check in the UDF routine.\r
+      //\r
+      DEBUG ((DEBUG_INFO, "PartitionValidMbr: MBR table has partition entry covering the ENTIRE disk. Don't treat it as a valid MBR.\n"));\r
+\r
+      return FALSE;\r
+    }\r
+\r
+    if (Mbr->Partition[Index1].OSIndicator == 0x00 || SizeInLBA == 0) {\r
       continue;\r
     }\r
 \r
     MbrValid    = TRUE;\r
-    StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA);\r
-    EndingLBA   = StartingLBA + UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA) - 1;\r
+    EndingLBA   = StartingLBA + SizeInLBA - 1;\r
     if (EndingLBA > LastLba) {\r
       //\r
       // Compatibility Errata:\r
@@ -77,12 +99,15 @@ PartitionValidMbr (
     }\r
 \r
     for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) {\r
-      if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) == 0) {\r
+      StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA);\r
+      SizeInLBA   = UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA);\r
+\r
+      if (Mbr->Partition[Index2].OSIndicator == 0x00 || SizeInLBA == 0) {\r
         continue;\r
       }\r
 \r
-      NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1;\r
-      if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) <= EndingLBA) {\r
+      NewEndingLBA = StartingLBA + SizeInLBA - 1;\r
+      if (NewEndingLBA >= StartingLBA && StartingLBA <= EndingLBA) {\r
         //\r
         // This region overlaps with the Index1'th region\r
         //\r