]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add new API GetSectionFromAnyFvByFileType() into MdePkg DxeServicesLib.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 5 May 2010 01:56:41 +0000 (01:56 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 5 May 2010 01:56:41 +0000 (01:56 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10456 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Include/Library/DxeServicesLib.h
MdePkg/Library/DxeServicesLib/DxeServicesLib.c
MdePkg/Library/DxeServicesLib/DxeServicesLib.inf

index e3536687e18bc1a425140b3fddfdd447c9bc09a2..596487da57deba72a495f8a3a5df054b0d2677e0 100644 (file)
@@ -16,6 +16,56 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #ifndef __DXE_SERVICES_LIB_H__\r
 #define __DXE_SERVICES_LIB_H__\r
 \r
+/**\r
+  Searches all the available firmware volumes and returns the first matching FFS section. \r
+\r
+  This function searches all the firmware volumes for FFS files with FV file type specified by FileType\r
+  The order that the firmware volumes is searched is not deterministic. For each available FV a search \r
+  is made for FFS file of type FileType. If the FV contains more than one FFS file with the same FileType, \r
+  the FileInstance instance will be the matched FFS file. For each FFS file found a search \r
+  is made for FFS sections of type SectionType. If the FFS file contains at least SectionInstance instances \r
+  of the FFS section specified by SectionType, then the SectionInstance instance is returned in Buffer. \r
+  Buffer is allocated using AllocatePool(), and the size of the allocated buffer is returned in Size. \r
+  It is the caller's responsibility to use FreePool() to free the allocated buffer.  \r
+  See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections \r
+  are retrieved from an FFS file based on SectionType and SectionInstance.\r
+\r
+  If SectionType is EFI_SECTION_TE, and the search with an FFS file fails, \r
+  the search will be retried with a section type of EFI_SECTION_PE32.\r
+  This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Size is NULL, then ASSERT().\r
+\r
+  @param  FileType             Indicates the FV file type to search for within all available FVs.\r
+  @param  FileInstance         Indicates which file instance within all available FVs specified by FileType.\r
+                               FileInstance starts from zero.\r
+  @param  SectionType          Indicates the FFS section type to search for within the FFS file \r
+                               specified by FileType with FileInstance.\r
+  @param  SectionInstance      Indicates which section instance within the FFS file \r
+                               specified by FileType with FileInstance to retrieve. SectionInstance starts from zero.\r
+  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.\r
+                               Is it the caller's responsibility to free this buffer using FreePool().\r
+  @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
+\r
+  @retval  EFI_SUCCESS          The specified FFS section was returned.\r
+  @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
+                                contains the matching FFS section does not allow reads.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSectionFromAnyFvByFileType  (\r
+  IN  EFI_FV_FILETYPE               FileType,\r
+  IN  UINTN                         FileInstance,\r
+  IN  EFI_SECTION_TYPE              SectionType,\r
+  IN  UINTN                         SectionInstance,\r
+  OUT VOID                          **Buffer,\r
+  OUT UINTN                         *Size\r
+  );\r
+\r
 /**\r
   Searches all the available firmware volumes and returns the first matching FFS section. \r
 \r
index 49c9ad492ed9874eddd7d1bd11ca52005456530b..9588008cdc1c826835c02f123d9618745d23d6d8 100644 (file)
@@ -166,7 +166,141 @@ InternalGetSectionFromFv (
   return Status;\r
 }\r
 \r
+/**\r
+  Searches all the available firmware volumes and returns the first matching FFS section. \r
+\r
+  This function searches all the firmware volumes for FFS files with FV file type specified by FileType\r
+  The order that the firmware volumes is searched is not deterministic. For each available FV a search \r
+  is made for FFS file of type FileType. If the FV contains more than one FFS file with the same FileType, \r
+  the FileInstance instance will be the matched FFS file. For each FFS file found a search \r
+  is made for FFS sections of type SectionType. If the FFS file contains at least SectionInstance instances \r
+  of the FFS section specified by SectionType, then the SectionInstance instance is returned in Buffer. \r
+  Buffer is allocated using AllocatePool(), and the size of the allocated buffer is returned in Size. \r
+  It is the caller's responsibility to use FreePool() to free the allocated buffer.  \r
+  See EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection() for details on how sections \r
+  are retrieved from an FFS file based on SectionType and SectionInstance.\r
+\r
+  If SectionType is EFI_SECTION_TE, and the search with an FFS file fails, \r
+  the search will be retried with a section type of EFI_SECTION_PE32.\r
+  This function must be called with a TPL <= TPL_NOTIFY.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Size is NULL, then ASSERT().\r
+\r
+  @param  FileType             Indicates the FV file type to search for within all available FVs.\r
+  @param  FileInstance         Indicates which file instance within all available FVs specified by FileType.\r
+                               FileInstance starts from zero.\r
+  @param  SectionType          Indicates the FFS section type to search for within the FFS file \r
+                               specified by FileType with FileInstance.\r
+  @param  SectionInstance      Indicates which section instance within the FFS file \r
+                               specified by FileType with FileInstance to retrieve. SectionInstance starts from zero.\r
+  @param  Buffer               On output, a pointer to a callee allocated buffer containing the FFS file section that was found.\r
+                               Is it the caller's responsibility to free this buffer using FreePool().\r
+  @param  Size                 On output, a pointer to the size, in bytes, of Buffer.\r
+\r
+  @retval  EFI_SUCCESS          The specified FFS section was returned.\r
+  @retval  EFI_NOT_FOUND        The specified FFS section could not be found.\r
+  @retval  EFI_OUT_OF_RESOURCES There are not enough resources available to retrieve the matching FFS section.\r
+  @retval  EFI_DEVICE_ERROR     The FFS section could not be retrieves due to a device error.\r
+  @retval  EFI_ACCESS_DENIED    The FFS section could not be retrieves because the firmware volume that \r
+                                contains the matching FFS section does not allow reads.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetSectionFromAnyFvByFileType  (\r
+  IN  EFI_FV_FILETYPE               FileType,\r
+  IN  UINTN                         FileInstance,\r
+  IN  EFI_SECTION_TYPE              SectionType,\r
+  IN  UINTN                         SectionInstance,\r
+  OUT VOID                          **Buffer,\r
+  OUT UINTN                         *Size\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_HANDLE                    *HandleBuffer;\r
+  UINTN                         HandleCount;\r
+  UINTN                         IndexFv;\r
+  UINTN                         IndexFile;\r
+  UINTN                         Key;\r
+  EFI_GUID                      NameGuid;\r
+  EFI_FV_FILE_ATTRIBUTES        Attributes;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
+\r
+  //\r
+  // Locate all available FVs.\r
+  //\r
+  HandleBuffer = NULL;\r
+  Status = gBS->LocateHandleBuffer (\r
+                  ByProtocol,\r
+                  &gEfiFirmwareVolume2ProtocolGuid,\r
+                  NULL,\r
+                  &HandleCount,\r
+                  &HandleBuffer\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Go through FVs one by one to find the required section data.\r
+  //\r
+  for (IndexFv = 0; IndexFv < HandleCount; IndexFv++) {\r
+    Status = gBS->HandleProtocol (\r
+                    HandleBuffer[IndexFv],\r
+                    &gEfiFirmwareVolume2ProtocolGuid,\r
+                    (VOID **)&Fv\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
 \r
+    //\r
+    // Use Firmware Volume 2 Protocol to search for a file of type FileType in all FVs.\r
+    //\r
+    IndexFile = FileInstance + 1;\r
+    Key = 0;\r
+    do {\r
+      Status = Fv->GetNextFile (Fv, &Key, &FileType, &NameGuid, &Attributes, Size);\r
+      if (EFI_ERROR (Status)) {\r
+        break;\r
+      }\r
+      IndexFile --;\r
+    } while (IndexFile > 0);\r
+\r
+    //\r
+    // Fv File with the required FV file type is found.\r
+    // Search the section file in the found FV file.\r
+    //\r
+    if (IndexFile == 0) {\r
+      Status = InternalGetSectionFromFv (\r
+                 HandleBuffer[IndexFv], \r
+                 &NameGuid,\r
+                 SectionType,\r
+                 SectionInstance,\r
+                 Buffer,\r
+                 Size\r
+                 );\r
+\r
+      if (!EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // The required FFS section file is not found. \r
+  //\r
+  if (IndexFv == HandleCount) {\r
+    Status = EFI_NOT_FOUND;\r
+  }\r
+\r
+Done:\r
+  if (HandleBuffer != NULL) {  \r
+    FreePool(HandleBuffer);\r
+  }\r
+\r
+  return Status;\r
+}\r
 \r
 /**\r
   Searches all the availables firmware volumes and returns the first matching FFS section. \r
index 2941816fb55ef81a3fa82b1b0a562565f4759029..4db553b54aae408f0f2b02bdc5db9fbee43d2bb5 100644 (file)
@@ -21,7 +21,7 @@
   FILE_GUID                      = EE680C58-FFC0-4a5d-858F-66FF9C84BC9F\r
   MODULE_TYPE                    = DXE_DRIVER\r
   VERSION_STRING                 = 1.0\r
-  LIBRARY_CLASS                  = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
+  LIBRARY_CLASS                  = DxeServicesLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER\r
 \r
 #\r
 #  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r