Use PartitionHeader->SizeOfPartitionEntry instead of sizeof (EFI_PARTITION_ENTRY).

Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13296 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
niruiyu
2012-05-09 05:21:43 +00:00
parent d2c243e199
commit d0e9c3caeb

View File

@ -187,6 +187,7 @@ PartitionInstallGptChildHandles (
EFI_PARTITION_TABLE_HEADER *PrimaryHeader; EFI_PARTITION_TABLE_HEADER *PrimaryHeader;
EFI_PARTITION_TABLE_HEADER *BackupHeader; EFI_PARTITION_TABLE_HEADER *BackupHeader;
EFI_PARTITION_ENTRY *PartEntry; EFI_PARTITION_ENTRY *PartEntry;
EFI_PARTITION_ENTRY *Entry;
EFI_PARTITION_ENTRY_STATUS *PEntryStatus; EFI_PARTITION_ENTRY_STATUS *PEntryStatus;
UINTN Index; UINTN Index;
EFI_STATUS GptValidStatus; EFI_STATUS GptValidStatus;
@ -297,7 +298,7 @@ PartitionInstallGptChildHandles (
// //
// Read the EFI Partition Entries // Read the EFI Partition Entries
// //
PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * sizeof (EFI_PARTITION_ENTRY)); PartEntry = AllocatePool (PrimaryHeader->NumberOfPartitionEntries * PrimaryHeader->SizeOfPartitionEntry);
if (PartEntry == NULL) { if (PartEntry == NULL) {
DEBUG ((EFI_D_ERROR, "Allocate pool error\n")); DEBUG ((EFI_D_ERROR, "Allocate pool error\n"));
goto Done; goto Done;
@ -340,7 +341,8 @@ PartitionInstallGptChildHandles (
// Create child device handles // Create child device handles
// //
for (Index = 0; Index < PrimaryHeader->NumberOfPartitionEntries; Index++) { for (Index = 0; Index < PrimaryHeader->NumberOfPartitionEntries; Index++) {
if (CompareGuid (&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeUnusedGuid) || Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index * PrimaryHeader->SizeOfPartitionEntry);
if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid) ||
PEntryStatus[Index].OutOfRange || PEntryStatus[Index].OutOfRange ||
PEntryStatus[Index].Overlap || PEntryStatus[Index].Overlap ||
PEntryStatus[Index].OsSpecific PEntryStatus[Index].OsSpecific
@ -360,16 +362,16 @@ PartitionInstallGptChildHandles (
HdDev.PartitionNumber = (UINT32) Index + 1; HdDev.PartitionNumber = (UINT32) Index + 1;
HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER; HdDev.MBRType = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;
HdDev.SignatureType = SIGNATURE_TYPE_GUID; HdDev.SignatureType = SIGNATURE_TYPE_GUID;
HdDev.PartitionStart = PartEntry[Index].StartingLBA; HdDev.PartitionStart = Entry->StartingLBA;
HdDev.PartitionSize = PartEntry[Index].EndingLBA - PartEntry[Index].StartingLBA + 1; HdDev.PartitionSize = Entry->EndingLBA - Entry->StartingLBA + 1;
CopyMem (HdDev.Signature, &PartEntry[Index].UniquePartitionGUID, sizeof (EFI_GUID)); CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));
DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32) Index)); DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32) Index));
DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64) HdDev.PartitionStart)); DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64) HdDev.PartitionStart));
DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) PartEntry[Index].EndingLBA)); DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) Entry->EndingLBA));
DEBUG ((EFI_D_INFO, " Partition size: %lx\n", (UINT64) HdDev.PartitionSize)); DEBUG ((EFI_D_INFO, " Partition size: %lx\n", (UINT64) HdDev.PartitionSize));
DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (PartEntry[Index].StartingLBA, BlockSize))); DEBUG ((EFI_D_INFO, " Start : %lx", MultU64x32 (Entry->StartingLBA, BlockSize)));
DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (PartEntry[Index].EndingLBA, BlockSize))); DEBUG ((EFI_D_INFO, " End : %lx\n", MultU64x32 (Entry->EndingLBA, BlockSize)));
Status = PartitionInstallChildHandle ( Status = PartitionInstallChildHandle (
This, This,
@ -379,10 +381,10 @@ PartitionInstallGptChildHandles (
BlockIo2, BlockIo2,
DevicePath, DevicePath,
(EFI_DEVICE_PATH_PROTOCOL *) &HdDev, (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,
PartEntry[Index].StartingLBA, Entry->StartingLBA,
PartEntry[Index].EndingLBA, Entry->EndingLBA,
BlockSize, BlockSize,
CompareGuid(&PartEntry[Index].PartitionTypeGUID, &gEfiPartTypeSystemPartGuid) CompareGuid(&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)
); );
} }
@ -637,7 +639,6 @@ Done:
return TRUE; return TRUE;
} }
/** /**
Restore Partition Table to its alternate place. Restore Partition Table to its alternate place.
(Primary -> Backup or Backup -> Primary) (Primary -> Backup or Backup -> Primary)
@ -655,20 +656,21 @@ PartitionCheckGptEntry (
OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus OUT EFI_PARTITION_ENTRY_STATUS *PEntryStatus
) )
{ {
EFI_LBA StartingLBA; EFI_LBA StartingLBA;
EFI_LBA EndingLBA; EFI_LBA EndingLBA;
UINTN Index1; EFI_PARTITION_ENTRY *Entry;
UINTN Index2; UINTN Index1;
UINT64 Attributes; UINTN Index2;
DEBUG ((EFI_D_INFO, " start check partition entries\n")); DEBUG ((EFI_D_INFO, " start check partition entries\n"));
for (Index1 = 0; Index1 < PartHeader->NumberOfPartitionEntries; Index1++) { for (Index1 = 0; Index1 < PartHeader->NumberOfPartitionEntries; Index1++) {
if (CompareGuid (&PartEntry[Index1].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) { Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index1 * PartHeader->SizeOfPartitionEntry);
if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {
continue; continue;
} }
StartingLBA = PartEntry[Index1].StartingLBA; StartingLBA = Entry->StartingLBA;
EndingLBA = PartEntry[Index1].EndingLBA; EndingLBA = Entry->EndingLBA;
if (StartingLBA > EndingLBA || if (StartingLBA > EndingLBA ||
StartingLBA < PartHeader->FirstUsableLBA || StartingLBA < PartHeader->FirstUsableLBA ||
StartingLBA > PartHeader->LastUsableLBA || StartingLBA > PartHeader->LastUsableLBA ||
@ -679,30 +681,28 @@ PartitionCheckGptEntry (
continue; continue;
} }
for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) { if ((Entry->Attributes & BIT1) != 0) {
//
// If Bit 1 is set, this indicate that this is an OS specific GUID partition.
//
PEntryStatus[Index1].OsSpecific = TRUE;
}
if (CompareGuid (&PartEntry[Index2].PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) { for (Index2 = Index1 + 1; Index2 < PartHeader->NumberOfPartitionEntries; Index2++) {
Entry = (EFI_PARTITION_ENTRY *) ((UINT8 *) PartEntry + Index2 * PartHeader->SizeOfPartitionEntry);
if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeUnusedGuid)) {
continue; continue;
} }
if (PartEntry[Index2].EndingLBA >= StartingLBA && PartEntry[Index2].StartingLBA <= EndingLBA) { if (Entry->EndingLBA >= StartingLBA && Entry->StartingLBA <= EndingLBA) {
// //
// This region overlaps with the Index1'th region // This region overlaps with the Index1'th region
// //
PEntryStatus[Index1].Overlap = TRUE; PEntryStatus[Index1].Overlap = TRUE;
PEntryStatus[Index2].Overlap = TRUE; PEntryStatus[Index2].Overlap = TRUE;
continue; continue;
} }
} }
Attributes = PartEntry[Index1].Attributes;
if ((Attributes & BIT1) != 0) {
//
// If Bit 1 is set, this indicate that this is an OS specific GUID partition.
//
PEntryStatus[Index1].OsSpecific = TRUE;
}
} }
DEBUG ((EFI_D_INFO, " End check partition entries\n")); DEBUG ((EFI_D_INFO, " End check partition entries\n"));