]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Disk/PartitionDxe/Gpt.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / PartitionDxe / Gpt.c
index 35860515c13b9da3284b2a5f0d5c57cad2032016..aefb2d6ecb3f74b12957c511f8d0be6ee2e84c07 100644 (file)
   PartitionValidGptTable(), PartitionCheckGptEntry() routine will accept disk\r
   partition content and validate the GPT table and GPT entry.\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
+Copyright (c) 2018 Qualcomm Datacenter Technologies, Inc.\r
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -100,7 +95,7 @@ PartitionRestoreGptTable (
 \r
   @param[in]    PartHeader    Partition table header structure\r
   @param[in]    PartEntry     The partition entry array\r
-  @param[out]   PEntryStatus  the partition entry status array \r
+  @param[out]   PEntryStatus  the partition entry status array\r
                               recording the status of each partition\r
 \r
 **/\r
@@ -205,19 +200,20 @@ PartitionInstallGptChildHandles (
   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
 {\r
-  EFI_STATUS                  Status;\r
-  UINT32                      BlockSize;\r
-  EFI_LBA                     LastBlock;\r
-  MASTER_BOOT_RECORD          *ProtectiveMbr;\r
-  EFI_PARTITION_TABLE_HEADER  *PrimaryHeader;\r
-  EFI_PARTITION_TABLE_HEADER  *BackupHeader;\r
-  EFI_PARTITION_ENTRY         *PartEntry;\r
-  EFI_PARTITION_ENTRY         *Entry;\r
-  EFI_PARTITION_ENTRY_STATUS  *PEntryStatus;\r
-  UINTN                       Index;\r
-  EFI_STATUS                  GptValidStatus;\r
-  HARDDRIVE_DEVICE_PATH       HdDev;\r
-  UINT32                      MediaId;\r
+  EFI_STATUS                   Status;\r
+  UINT32                       BlockSize;\r
+  EFI_LBA                      LastBlock;\r
+  MASTER_BOOT_RECORD           *ProtectiveMbr;\r
+  EFI_PARTITION_TABLE_HEADER   *PrimaryHeader;\r
+  EFI_PARTITION_TABLE_HEADER   *BackupHeader;\r
+  EFI_PARTITION_ENTRY          *PartEntry;\r
+  EFI_PARTITION_ENTRY          *Entry;\r
+  EFI_PARTITION_ENTRY_STATUS   *PEntryStatus;\r
+  UINTN                        Index;\r
+  EFI_STATUS                   GptValidStatus;\r
+  HARDDRIVE_DEVICE_PATH        HdDev;\r
+  UINT32                       MediaId;\r
+  EFI_PARTITION_INFO_PROTOCOL  PartitionInfo;\r
 \r
   ProtectiveMbr = NULL;\r
   PrimaryHeader = NULL;\r
@@ -234,6 +230,13 @@ PartitionInstallGptChildHandles (
 \r
   GptValidStatus = EFI_NOT_FOUND;\r
 \r
+  //\r
+  // Ensure the block size can hold the MBR\r
+  //\r
+  if (BlockSize < sizeof (MASTER_BOOT_RECORD)) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
   //\r
   // Allocate a buffer for the Protective MBR\r
   //\r
@@ -380,17 +383,25 @@ PartitionInstallGptChildHandles (
     }\r
 \r
     ZeroMem (&HdDev, sizeof (HdDev));\r
-    HdDev.Header.Type     = MEDIA_DEVICE_PATH;\r
-    HdDev.Header.SubType  = MEDIA_HARDDRIVE_DP;\r
+    HdDev.Header.Type      = MEDIA_DEVICE_PATH;\r
+    HdDev.Header.SubType   = MEDIA_HARDDRIVE_DP;\r
     SetDevicePathNodeLength (&HdDev.Header, sizeof (HdDev));\r
 \r
-    HdDev.PartitionNumber = (UINT32) Index + 1;\r
-    HdDev.MBRType         = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
-    HdDev.SignatureType   = SIGNATURE_TYPE_GUID;\r
-    HdDev.PartitionStart  = Entry->StartingLBA;\r
-    HdDev.PartitionSize   = Entry->EndingLBA - Entry->StartingLBA + 1;\r
+    HdDev.PartitionNumber  = (UINT32) Index + 1;\r
+    HdDev.MBRType          = MBR_TYPE_EFI_PARTITION_TABLE_HEADER;\r
+    HdDev.SignatureType    = SIGNATURE_TYPE_GUID;\r
+    HdDev.PartitionStart   = Entry->StartingLBA;\r
+    HdDev.PartitionSize    = Entry->EndingLBA - Entry->StartingLBA + 1;\r
     CopyMem (HdDev.Signature, &Entry->UniquePartitionGUID, sizeof (EFI_GUID));\r
 \r
+    ZeroMem (&PartitionInfo, sizeof (EFI_PARTITION_INFO_PROTOCOL));\r
+    PartitionInfo.Revision = EFI_PARTITION_INFO_PROTOCOL_REVISION;\r
+    PartitionInfo.Type     = PARTITION_TYPE_GPT;\r
+    if (CompareGuid (&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)) {\r
+      PartitionInfo.System = 1;\r
+    }\r
+    CopyMem (&PartitionInfo.Info.Gpt, Entry, sizeof (EFI_PARTITION_ENTRY));\r
+\r
     DEBUG ((EFI_D_INFO, " Index : %d\n", (UINT32) Index));\r
     DEBUG ((EFI_D_INFO, " Start LBA : %lx\n", (UINT64) HdDev.PartitionStart));\r
     DEBUG ((EFI_D_INFO, " End LBA : %lx\n", (UINT64) Entry->EndingLBA));\r
@@ -407,10 +418,11 @@ PartitionInstallGptChildHandles (
                BlockIo2,\r
                DevicePath,\r
                (EFI_DEVICE_PATH_PROTOCOL *) &HdDev,\r
+               &PartitionInfo,\r
                Entry->StartingLBA,\r
                Entry->EndingLBA,\r
                BlockSize,\r
-               CompareGuid(&Entry->PartitionTypeGUID, &gEfiPartTypeSystemPartGuid)\r
+               &Entry->PartitionTypeGUID\r
                );\r
   }\r
 \r
@@ -687,7 +699,7 @@ Done:
 \r
   @param[in]    PartHeader    Partition table header structure\r
   @param[in]    PartEntry     The partition entry array\r
-  @param[out]   PEntryStatus  the partition entry status array \r
+  @param[out]   PEntryStatus  the partition entry status array\r
                               recording the status of each partition\r
 \r
 **/\r
@@ -725,7 +737,7 @@ PartitionCheckGptEntry (
 \r
     if ((Entry->Attributes & BIT1) != 0) {\r
       //\r
-      // If Bit 1 is set, this indicate that this is an OS specific GUID partition. \r
+      // If Bit 1 is set, this indicate that this is an OS specific GUID partition.\r
       //\r
       PEntryStatus[Index1].OsSpecific = TRUE;\r
     }\r