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