Reviewed-by: Ray Ni <ray...@intel.com> > -----Original Message----- > From: Gao, Zhichao <zhichao....@intel.com> > Sent: Tuesday, July 14, 2020 9:23 AM > To: devel@edk2.groups.io > Cc: Wu, Hao A <hao.a...@intel.com>; Ni, Ray <ray...@intel.com> > Subject: [PATCH V3 2/3] MdeModulePkg/PartitionDxe: Skip the MBR that add > for CD-ROM > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2823 > > Refer to > http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html. > Some Linux ISOs may have the MBR table for compatibility reasons > for Windows. The MBR tale would contain the partition entry with > start LBA0 and whole media size. There are two methods to check > the filesystem in the CD-ROM: > 1. MBR partition check (Windows) > 2. Whole disk check (MAC OS) > > UEFI doesn't have the MBR check for UDF and Eltorito. But it may > pass the MBR check for such table and fail to detect the filesystem > of UDF. Skip the MBR check if the MBR is added for Windows > compatiblity so that the partition driver can continue UDF and > ElTorito check. > > Cc: Hao A Wu <hao.a...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Signed-off-by: Zhichao Gao <zhichao....@intel.com> > --- > .../Universal/Disk/PartitionDxe/Mbr.c | 37 ++++++++++++++++--- > 1 file changed, 31 insertions(+), 6 deletions(-) > > diff --git a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c > b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c > index f0c92aa09a..3830af1ea7 100644 > --- a/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c > +++ b/MdeModulePkg/Universal/Disk/PartitionDxe/Mbr.c > @@ -39,6 +39,7 @@ PartitionValidMbr ( > UINT32 StartingLBA; > UINT32 EndingLBA; > UINT32 NewEndingLBA; > + UINT32 SizeInLBA; > INTN Index1; > INTN Index2; > BOOLEAN MbrValid; > @@ -51,13 +52,34 @@ PartitionValidMbr ( > // > MbrValid = FALSE; > for (Index1 = 0; Index1 < MAX_MBR_PARTITIONS; Index1++) { > - if (Mbr->Partition[Index1].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr- > >Partition[Index1].SizeInLBA) == 0) { > + StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA); > + SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index1].SizeInLBA); > + > + // > + // If the MBR with partition entry covering the ENTIRE disk, i.e. start > at > LBA0 > + // with whole disk size, we treat it as an invalid MBR partition. > + // > + if ((StartingLBA == 0) && > + (SizeInLBA == (LastLba + 1))) { > + // > + // Refer to the > http://manpages.ubuntu.com/manpages/bionic/man8/mkudffs.8.html > + // "WHOLE DISK VS PARTITION" > + // Some linux ISOs may put the MBR table in the first 512 bytes for > compatibility reasons with Windows. > + // Linux kernel ignores MBR table if contains partition which starts > at > sector 0. > + // Skip it because we don't have the partition check for UDF(El Torito > compatible). > + // It would continue to do the whole disk check in the UDF routine. > + // > + DEBUG ((DEBUG_INFO, "PartitionValidMbr: MBR table has partition entry > covering the ENTIRE disk. Don't treat it as a valid MBR.\n")); > + > + return FALSE; > + } > + > + if (Mbr->Partition[Index1].OSIndicator == 0x00 || SizeInLBA == 0) { > continue; > } > > MbrValid = TRUE; > - StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index1].StartingLBA); > - EndingLBA = StartingLBA + UNPACK_UINT32 (Mbr- > >Partition[Index1].SizeInLBA) - 1; > + EndingLBA = StartingLBA + SizeInLBA - 1; > if (EndingLBA > LastLba) { > // > // Compatibility Errata: > @@ -77,12 +99,15 @@ PartitionValidMbr ( > } > > for (Index2 = Index1 + 1; Index2 < MAX_MBR_PARTITIONS; Index2++) { > - if (Mbr->Partition[Index2].OSIndicator == 0x00 || UNPACK_UINT32 (Mbr- > >Partition[Index2].SizeInLBA) == 0) { > + StartingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA); > + SizeInLBA = UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA); > + > + if (Mbr->Partition[Index2].OSIndicator == 0x00 || SizeInLBA == 0) { > continue; > } > > - NewEndingLBA = UNPACK_UINT32 (Mbr->Partition[Index2].StartingLBA) + > UNPACK_UINT32 (Mbr->Partition[Index2].SizeInLBA) - 1; > - if (NewEndingLBA >= StartingLBA && UNPACK_UINT32 (Mbr- > >Partition[Index2].StartingLBA) <= EndingLBA) { > + NewEndingLBA = StartingLBA + SizeInLBA - 1; > + if (NewEndingLBA >= StartingLBA && StartingLBA <= EndingLBA) { > // > // This region overlaps with the Index1'th region > // > -- > 2.21.0.windows.1
-=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#62464): https://edk2.groups.io/g/devel/message/62464 Mute This Topic: https://groups.io/mt/75490641/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-