]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkPkg/Library/PeiHobLibFramework/HobLib.c
MdePkg/IntelFrameworkPkg HobLib: Add BuildResourceDescriptorWithOwnerHob() API.
[mirror_edk2.git] / IntelFrameworkPkg / Library / PeiHobLibFramework / HobLib.c
index 3ce955a88c44ad4175f7cbce862e56ce48865360..c4c14f9ae3f983da79bb855acd54e4e6ea3fca28 100644 (file)
@@ -5,7 +5,7 @@
  This library instance uses EFI_HOB_TYPE_CV defined in Intel framework HOB specification v0.9\r
  to implement HobLib BuildCvHob() API. \r
 \r
-Copyright (c) 2007 - 2009, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2014, 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
@@ -230,7 +230,8 @@ GetBootModeHob (
   @param  Type          Type of the new HOB.\r
   @param  Length        Length of the new HOB to allocate.\r
 \r
-  @return The address of new HOB.\r
+  @retval  NULL         The HOB could not be allocated.\r
+  @retval  others       The address of new HOB.\r
 \r
 **/\r
 VOID *\r
@@ -244,10 +245,13 @@ InternalPeiCreateHob (
   VOID              *Hob;\r
 \r
   Status = PeiServicesCreateHob (Type, Length, &Hob);\r
+  if (EFI_ERROR (Status)) {\r
+    Hob = NULL;\r
+  }\r
   //\r
   // Assume the process of HOB building is always successful.\r
   //\r
-  ASSERT_EFI_ERROR (Status);\r
+  ASSERT (Hob != NULL);\r
   return Hob;\r
 }\r
 \r
@@ -281,7 +285,10 @@ BuildModuleHob (
   ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&\r
           ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   CopyGuid (&(Hob->MemoryAllocationHeader.Name), &gEfiHobMemoryAllocModuleGuid);\r
   Hob->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule;\r
@@ -297,6 +304,46 @@ BuildModuleHob (
   Hob->EntryPoint = EntryPoint;\r
 }\r
 \r
+/**
+  Builds a HOB that describes a chunk of system memory with Owner GUID.\r
+
+  This function builds a HOB that describes a chunk of system memory.
+  It can only be invoked during PEI phase;
+  for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
+  
+  If there is no additional space for HOB creation, then ASSERT().
+
+  @param  ResourceType        The type of resource described by this HOB.
+  @param  ResourceAttribute   The resource attributes of the memory described by this HOB.
+  @param  PhysicalStart       The 64 bit physical address of memory described by this HOB.
+  @param  NumberOfBytes       The length of the memory described by this HOB in bytes.
+  @param  OwnerGUID           GUID for the owner of this resource.\r
+
+**/
+VOID
+EFIAPI
+BuildResourceDescriptorWithOwnerHob (
+  IN EFI_RESOURCE_TYPE            ResourceType,
+  IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
+  IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
+  IN UINT64                       NumberOfBytes,
+  IN EFI_GUID                     *OwnerGUID
+  )
+{
+  EFI_HOB_RESOURCE_DESCRIPTOR  *Hob;
+  EFI_STATUS                    Status;
+
+  Status = PeiServicesCreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR), (void **)&Hob);
+  ASSERT_EFI_ERROR (Status);
+
+  Hob->ResourceType      = ResourceType;
+  Hob->ResourceAttribute = ResourceAttribute;
+  Hob->PhysicalStart     = PhysicalStart;
+  Hob->ResourceLength    = NumberOfBytes;
+
+  CopyGuid (&Hob->Owner, OwnerGUID);
+}\r
+\r
 /**\r
   Builds a HOB that describes a chunk of system memory.\r
 \r
@@ -323,12 +370,16 @@ BuildResourceDescriptorHob (
 {\r
   EFI_HOB_RESOURCE_DESCRIPTOR  *Hob;\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (UINT16) sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   Hob->ResourceType      = ResourceType;\r
   Hob->ResourceAttribute = ResourceAttribute;\r
   Hob->PhysicalStart     = PhysicalStart;\r
   Hob->ResourceLength    = NumberOfBytes;\r
+  ZeroMem (&(Hob->Owner), sizeof (EFI_GUID));\r
 }\r
 \r
 /**\r
@@ -348,7 +399,8 @@ BuildResourceDescriptorHob (
   @param  Guid          The GUID to tag the customized HOB.\r
   @param  DataLength    The size of the data payload for the GUID HOB.\r
 \r
-  @return The start address of GUID HOB data.\r
+  @retval  NULL         The GUID HOB could not be allocated.\r
+  @retval  others       The start address of GUID HOB data.\r
 \r
 **/\r
 VOID *\r
@@ -360,12 +412,20 @@ BuildGuidHob (
 {\r
   EFI_HOB_GUID_TYPE *Hob;\r
 \r
+  //\r
+  // Make sure Guid is valid\r
+  //\r
+  ASSERT (Guid != NULL);\r
+  \r
   //\r
   // Make sure that data length is not too long.\r
   //\r
   ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));\r
 \r
   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));\r
+  if (Hob == NULL) {\r
+    return Hob;\r
+  }\r
   CopyGuid (&Hob->Name, Guid);\r
   return Hob + 1;\r
 }\r
@@ -390,7 +450,8 @@ BuildGuidHob (
   @param  Data          The data to be copied into the data field of the GUID HOB.\r
   @param  DataLength    The size of the data payload for the GUID HOB.\r
 \r
-  @return The start address of GUID HOB data.\r
+  @retval  NULL         The GUID HOB could not be allocated.\r
+  @retval  others       The start address of GUID HOB data.\r
 \r
 **/\r
 VOID *\r
@@ -406,6 +467,9 @@ BuildGuidDataHob (
   ASSERT (Data != NULL || DataLength == 0);\r
 \r
   HobData = BuildGuidHob (Guid, DataLength);\r
+  if (HobData == NULL) {\r
+    return HobData;\r
+  }\r
 \r
   return CopyMem (HobData, Data, DataLength);\r
 }\r
@@ -432,7 +496,10 @@ BuildFvHob (
 {\r
   EFI_HOB_FIRMWARE_VOLUME  *Hob;\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV, sizeof (EFI_HOB_FIRMWARE_VOLUME));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   Hob->BaseAddress = BaseAddress;\r
   Hob->Length      = Length;\r
@@ -464,7 +531,10 @@ BuildFv2Hob (
 {\r
   EFI_HOB_FIRMWARE_VOLUME2  *Hob;\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV2, sizeof (EFI_HOB_FIRMWARE_VOLUME2));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV2, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME2));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   Hob->BaseAddress = BaseAddress;\r
   Hob->Length      = Length;\r
@@ -495,7 +565,10 @@ BuildCvHob (
 {\r
   EFI_HOB_CAPSULE_VOLUME     *Hob;\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CV, sizeof (EFI_HOB_CAPSULE_VOLUME));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CV, (UINT16) sizeof (EFI_HOB_CAPSULE_VOLUME));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   Hob->BaseAddress = BaseAddress;\r
   Hob->Length      = Length;\r
@@ -523,7 +596,10 @@ BuildCpuHob (
 {\r
   EFI_HOB_CPU  *Hob;\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CPU, (UINT16) sizeof (EFI_HOB_CPU));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   Hob->SizeOfMemorySpace = SizeOfMemorySpace;\r
   Hob->SizeOfIoSpace     = SizeOfIoSpace;\r
@@ -559,7 +635,10 @@ BuildStackHob (
   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
           ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocStackGuid);\r
   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
@@ -599,7 +678,10 @@ BuildBspStoreHob (
   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
           ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
 \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_BSP_STORE));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_BSP_STORE));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
 \r
   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocBspStoreGuid);\r
   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
@@ -639,7 +721,10 @@ BuildMemoryAllocationHob (
   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
           ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
   \r
-  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));\r
+  Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION));\r
+  if (Hob == NULL) {\r
+    return;\r
+  }\r
   \r
   ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));\r
   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r