diff options
author | qwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-10-10 02:08:22 +0000 |
---|---|---|
committer | qwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524> | 2007-10-10 02:08:22 +0000 |
commit | 166152e85cd99bf4d3d9158b5c3455e4e0f7bb12 (patch) | |
tree | 78cbdee059c1802f73e3d6a90ffd56153b014816 /MdePkg/Library/DxePiLib | |
parent | 10dde96f9548bc11d01b46750293aba336d5d1c6 (diff) | |
download | edk2-platforms-166152e85cd99bf4d3d9158b5c3455e4e0f7bb12.tar.xz |
0) Change the PEI core behavior to not install FV HOB for each FV INFO PPI installed. This allows more freedom to platform developer to choose to expose which FV to PEI core or DXE core.
1) Split MdePkg/Include/Library/PiLib.h to DxePiLib.h and PeiPiLib.h. These two library classes are for DXE phase and PEI phase.
2) Update the API names in DxePiLib and PeiPiLib to be longer ones to be more meaningfull and to avoid name collisions.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4067 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library/DxePiLib')
-rw-r--r-- | MdePkg/Library/DxePiLib/DxePiLib.c | 384 | ||||
-rw-r--r-- | MdePkg/Library/DxePiLib/DxePiLib.inf | 2 |
2 files changed, 105 insertions, 281 deletions
diff --git a/MdePkg/Library/DxePiLib/DxePiLib.c b/MdePkg/Library/DxePiLib/DxePiLib.c index 32e0337c19..d35937a1b5 100644 --- a/MdePkg/Library/DxePiLib/DxePiLib.c +++ b/MdePkg/Library/DxePiLib/DxePiLib.c @@ -16,43 +16,115 @@ #include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
-#include <Library/PiLib.h>
+#include <Library/DxePiLib.h>
#include <Protocol/FirmwareVolume2.h>
#include <Protocol/LoadedImage.h>
/**
- Internal function which read the image specified by Firmware File GUID name and
- the Firmware Section tyep from a specified Firmware Volume
+ Identify the device handle from which the Image is loaded from. As this device handle is passed to
+ GetSectionFromFv as the identifier for a Firmware Volume, an EFI_FIRMWARE_VOLUME2_PROTOCOL
+ protocol instance should be located succesfully by calling gBS->HandleProtocol ().
+ This function locates the EFI_LOADED_IMAGE_PROTOCOL instance installed
+ on ImageHandle. It then returns EFI_LOADED_IMAGE_PROTOCOL.DeviceHandle.
+
+ If ImageHandle is NULL, then ASSERT ();
+ If failed to locate a EFI_LOADED_IMAGE_PROTOCOL on ImageHandle, then ASSERT ();
+
+ @param ImageHandle The firmware allocated handle for UEFI image.
- @param Fv The Firmware Volume Protocol instance.
- @param NameGuid The GUID name of a Firmware File.
- @param SectionType The Firmware Section type.
- @param Buffer On output, Buffer contains the the data read from the section in the Firmware File found.
- @param Size On output, the size of Buffer.
-
- @retval EFI_SUCCESS The image is found and data and size is returned.
- @retval EFI_NOT_FOUND The image specified by NameGuid and SectionType can't be found.
- @retval EFI_OUT_OF_RESOURCES There were not enough resources to allocate the output data buffer or complete the operations.
- @retval EFI_DEVICE_ERROR A hardware error occurs during reading from the Firmware Volume.
- @retval EFI_ACCESS_DENIED The firmware volume containing the searched Firmware File is configured to disallow reads.
+ @retval EFI_HANDLE The device handle from which the Image is loaded from.
**/
-STATIC
+EFI_HANDLE
+InternalImageHandleToFvHandle (
+ EFI_HANDLE ImageHandle
+ )
+{
+ EFI_STATUS Status;
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
+
+ ASSERT (ImageHandle != NULL);
+
+ Status = gBS->HandleProtocol (
+ (EFI_HANDLE *) ImageHandle,
+ &gEfiLoadedImageProtocolGuid,
+ (VOID **) &LoadedImage
+ );
+
+ ASSERT_EFI_ERROR (Status);
+
+ return LoadedImage->DeviceHandle;
+
+}
+
+/**
+ Allocate and fill a buffer from a Firmware Section identified by a Firmware File GUID name, a Firmware
+ Section type and instance number from the specified Firmware Volume.
+
+ This functions first locate the EFI_FIRMWARE_VOLUME2_PROTOCOL protocol instance on FvHandle in order to
+ carry out the Firmware Volume read operation. The function then reads the Firmware Section found sepcifed
+ by NameGuid, SectionType and Instance.
+
+ The search order for the section specified by SectionType within a Firmware File is defined by
+ EFI_FIRMWARE_VOLUME2_PROTOCOL.ReadSection (). Please check Section 2.4 of Volume 3: Platform Initialization
+ Shared Architectural Elements for detailes.
+
+ If SectionType is EFI_SECTION_TE, EFI_SECTION_TE will be used as Firmware Section type to read Firmware Section
+ data from the Firmware File. If no such section exists, EFI_SECTION_PE32 will be used as Firmware Section type to
+ read Firmware Section data from the Firmware File. If no such section specified is found to match ,
+ EFI_NOT_FOUND is returned.
+
+ The data and size is returned by Buffer and Size. The caller is responsible to free the Buffer allocated
+ by this function. This function can be only called at TPL_NOTIFY and below.
+
+ If FvHandle is NULL, then ASSERT ();
+ If NameGuid is NULL, then ASSERT();
+ If Buffer is NULL, then ASSERT();
+ If Size is NULL, then ASSERT().
+
+ @param FvHandle The device handle that contains a instance of EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
+ @param NameGuid The GUID name of a Firmware File.
+ @param SectionType The Firmware Section type.
+ @param Instance The instance number of Firmware Section to read from starting from 0.
+ @param Buffer On output, Buffer contains the the data read from the section in the Firmware File found.
+ @param Size On output, the size of Buffer.
+
+ @retval EFI_SUCCESS The image is found and data and size is returned.
+ @retval EFI_UNSUPPORTED FvHandle does not support EFI_FIRMWARE_VOLUME2_PROTOCOL.
+ @retval EFI_NOT_FOUND The image specified by NameGuid and SectionType can't be found.
+ @retval EFI_OUT_OF_RESOURCES There were not enough resources to allocate the output data buffer or complete the operations.
+ @retval EFI_DEVICE_ERROR A hardware error occurs during reading from the Firmware Volume.
+ @retval EFI_ACCESS_DENIED The firmware volume containing the searched Firmware File is configured to disallow reads.
+
+ **/
+
+
EFI_STATUS
-InternalGetImageFromFv (
- IN EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv,
- IN CONST EFI_GUID *NameGuid,
- IN EFI_SECTION_TYPE SectionType,
- OUT VOID **Buffer,
- OUT UINTN *Size
+GetSectionFromFv (
+ IN EFI_HANDLE FvHandle,
+ IN CONST EFI_GUID *NameGuid,
+ IN EFI_SECTION_TYPE SectionType,
+ IN UINTN Instance,
+ OUT VOID **Buffer,
+ OUT UINTN *Size
)
{
- EFI_STATUS Status;
- EFI_FV_FILETYPE FileType;
- EFI_FV_FILE_ATTRIBUTES Attributes;
- UINT32 AuthenticationStatus;
+ EFI_STATUS Status;
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
+ UINT32 AuthenticationStatus;
+
+ ASSERT (FvHandle != NULL);
+
+ Status = gBS->HandleProtocol (
+ FvHandle,
+ &gEfiFirmwareVolume2ProtocolGuid,
+ (VOID **) &Fv
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
//
// Read desired section content in NameGuid file
@@ -71,7 +143,7 @@ InternalGetImageFromFv ( if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) {
//
- // Try reading PE32 section, since the TE section does not exist
+ // Try reading PE32 section, if the required section is TE type
//
*Buffer = NULL;
*Size = 0;
@@ -86,201 +158,14 @@ InternalGetImageFromFv ( );
}
- if (EFI_ERROR (Status) &&
- ((SectionType == EFI_SECTION_TE) || (SectionType == EFI_SECTION_PE32))) {
- //
- // Try reading raw file, since the desired section does not exist
- //
- *Buffer = NULL;
- *Size = 0;
- Status = Fv->ReadFile (
- Fv,
- NameGuid,
- Buffer,
- Size,
- &FileType,
- &Attributes,
- &AuthenticationStatus
- );
- }
-
- return Status;
-}
-
-/**
- Allocate and fill a buffer with an image identified by a Firmware File GUID name and a Firmware Section type.
- The Firmware Volumes to search for the Firmware File can be specified to be either all Firmware Volumes
- in the system, or the Firmware Volume which contains the Firmware File specified by an image handle.
-
- If ImageHandle is NULL, all Firmware Volumes in the system will be searched. If ImageHandle is not NULL,
- ImageHandle is interpreted as EFI_PEI_FILE_HANDLE for the implementation of this function for PEI phase.
- The input parameter ImageHandle is interpreted as EFI_HANDLE, on which an EFI_LOADED_IMAGE_PROTOCOL
- is installed, for the implementation of this function for DXE phase. The search always starts from the FV
- identified by ImageHandle. If WithinImageFv is TRUE, search will only be performed on the first FV. If WithinImageFv
- is FALSE, search will continue on other FVs if it fails on the first FV. The search order of Firmware Volumes is
- deterministic but arbitrary if no new firmware volume is added into the system between each search.
-
- The search order for the section type specified by SectionType in the Firmware File is using a depth-first
- and left-to-right algorithm through all sections. The first section found to match SectionType will be returned.
-
- If SectionType is EFI_SECTION_PE32, EFI_SECTION_PE32 will be used as Firmware Section type
- to read Firmware Section data from the Firmware File. If no such section exists, the function will try
- to read a Firmware File named with NameGuid. If no such file exists, EFI_NOT_FOUND is returned.
-
- If SectionType is EFI_SECTION_TE, EFI_SECTION_TE will be used as Firmware Section type to read Firmware Section
- data from the Firmware File. If no such section exists, EFI_SECTION_PE32 will be used as Firmware Section type to
- read Firmware Section data from the Firmware File. If no such section exists, the function will try to read a Firmware
- File named with NameGuid. If no such file exists, EFI_NOT_FOUND is returned.
-
- The data and size is returned by Buffer and Size. The caller is responsible to free the Buffer allocated
- by this function. This function can only be called at TPL_NOTIFY and below.
-
- If ImageHandle is NULL and WithinImage is TRUE, then ASSERT ();
- If NameGuid is NULL, then ASSERT();
- If Buffer is NULL, then ASSERT();
- If Size is NULL, then ASSERT().
-
- @param NameGuid The GUID name of a Firmware File.
- @param SectionType The Firmware Section type.
- @param Buffer On output, Buffer contains the the data read from the section in the Firmware File found.
- @param Size On output, the size of Buffer.
-
- @retval EFI_SUCCESS The image is found and data and size is returned.
- @retval EFI_NOT_FOUND The image specified by NameGuid and SectionType can't be found.
- @retval EFI_OUT_OF_RESOURCES There were not enough resources to allocate the output data buffer or complete the operations.
- @retval EFI_DEVICE_ERROR A hardware error occurs during reading from the Firmware Volume.
- @retval EFI_ACCESS_DENIED The firmware volume containing the searched Firmware File is configured to disallow reads.
-
-**/
-
-EFI_STATUS
-EFIAPI
-GetSectionFromFvFile (
- IN CONST VOID *ImageHandle,
- IN CONST EFI_GUID *NameGuid,
- IN EFI_SECTION_TYPE SectionType,
- OUT VOID **Buffer,
- OUT UINTN *Size,
- IN BOOLEAN WithinImageFv
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE *HandleBuffer;
- UINTN HandleCount;
- UINTN Index;
- EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
- EFI_FIRMWARE_VOLUME2_PROTOCOL *ImageFv;
- EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
-
- ASSERT (NameGuid != NULL);
- ASSERT (Buffer != NULL);
- ASSERT (Size != NULL);
- ASSERT (!(ImageHandle == NULL && WithinImageFv));
-
- Status = EFI_NOT_FOUND;
- ImageFv = NULL;
- if (ImageHandle != NULL) {
- Status = gBS->HandleProtocol (
- (EFI_HANDLE *) ImageHandle,
- &gEfiLoadedImageProtocolGuid,
- (VOID **) &LoadedImage
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = gBS->HandleProtocol (
- LoadedImage->DeviceHandle,
- &gEfiFirmwareVolume2ProtocolGuid,
- (VOID **) &ImageFv
- );
- if (!EFI_ERROR (Status)) {
- Status = InternalGetImageFromFv (ImageFv, NameGuid, SectionType, Buffer, Size);
- }
- }
-
- if (Status == EFI_SUCCESS || WithinImageFv) {
- return Status;
- }
-
- HandleBuffer = NULL;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiFirmwareVolume2ProtocolGuid,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- //
- // Find desired image in all Fvs
- //
- for (Index = 0; Index < HandleCount; ++Index) {
- Status = gBS->HandleProtocol (
- HandleBuffer[Index],
- &gEfiFirmwareVolume2ProtocolGuid,
- (VOID**)&Fv
- );
-
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- if (ImageFv != NULL && Fv == ImageFv) {
- continue;
- }
-
- Status = InternalGetImageFromFv (Fv, NameGuid, SectionType, Buffer, Size);
-
- if (!EFI_ERROR (Status)) {
- goto Done;
- }
- }
-
- //
- // Not found image
- //
- if (Index == HandleCount) {
- Status = EFI_NOT_FOUND;
- }
-
-Done:
-
- if (HandleBuffer != NULL) {
- FreePool(HandleBuffer);
- }
-
return Status;
}
-EFI_HANDLE
-EFIAPI
-ImageHandleToFvHandle (
- EFI_HANDLE ImageHandle
- )
-{
- EFI_STATUS Status;
- EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
-
- ASSERT (ImageHandle != NULL);
-
- Status = gBS->HandleProtocol (
- (EFI_HANDLE *) ImageHandle,
- &gEfiLoadedImageProtocolGuid,
- (VOID **) &LoadedImage
- );
-
- ASSERT_EFI_ERROR (Status);
-
- return LoadedImage->DeviceHandle;
-}
EFI_STATUS
EFIAPI
-GetSectionFromAnyFv (
+PiLibGetSectionFromAnyFv (
IN CONST EFI_GUID *NameGuid,
IN EFI_SECTION_TYPE SectionType,
IN UINTN Instance,
@@ -301,7 +186,7 @@ GetSectionFromAnyFv ( // so that this implementation of GetSectionFromAnyFv
// will locate the FFS faster.
//
- FvHandle = ImageHandleToFvHandle (gImageHandle);
+ FvHandle = InternalImageHandleToFvHandle (gImageHandle);
Status = GetSectionFromFv (
FvHandle,
NameGuid,
@@ -365,71 +250,10 @@ Done: }
-EFI_STATUS
-EFIAPI
-GetSectionFromFv (
- IN EFI_HANDLE FvHandle,
- IN CONST EFI_GUID *NameGuid,
- IN EFI_SECTION_TYPE SectionType,
- IN UINTN Instance,
- OUT VOID **Buffer,
- OUT UINTN *Size
- )
-{
- EFI_STATUS Status;
- EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;
- UINT32 AuthenticationStatus;
-
- ASSERT (FvHandle != NULL);
-
- Status = gBS->HandleProtocol (
- FvHandle,
- &gEfiFirmwareVolume2ProtocolGuid,
- (VOID **) &Fv
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Read desired section content in NameGuid file
- //
- *Buffer = NULL;
- *Size = 0;
- Status = Fv->ReadSection (
- Fv,
- NameGuid,
- SectionType,
- 0,
- Buffer,
- Size,
- &AuthenticationStatus
- );
-
- if (EFI_ERROR (Status) && (SectionType == EFI_SECTION_TE)) {
- //
- // Try reading PE32 section, if the required section is TE type
- //
- *Buffer = NULL;
- *Size = 0;
- Status = Fv->ReadSection (
- Fv,
- NameGuid,
- EFI_SECTION_PE32,
- 0,
- Buffer,
- Size,
- &AuthenticationStatus
- );
- }
-
- return Status;
-}
-
EFI_STATUS
EFIAPI
-GetSectionFromCurrentFv (
+PiLibGetSectionFromCurrentFv (
IN CONST EFI_GUID *NameGuid,
IN EFI_SECTION_TYPE SectionType,
IN UINTN Instance,
@@ -438,7 +262,7 @@ GetSectionFromCurrentFv ( )
{
return GetSectionFromFv(
- ImageHandleToFvHandle(gImageHandle),
+ InternalImageHandleToFvHandle(gImageHandle),
NameGuid,
SectionType,
Instance,
@@ -451,7 +275,7 @@ GetSectionFromCurrentFv ( EFI_STATUS
EFIAPI
-GetSectionFromCurrentFfs (
+PiLibGetSectionFromCurrentFfs (
IN EFI_SECTION_TYPE SectionType,
IN UINTN Instance,
OUT VOID **Buffer,
@@ -459,7 +283,7 @@ GetSectionFromCurrentFfs ( )
{
return GetSectionFromFv(
- ImageHandleToFvHandle(gImageHandle),
+ InternalImageHandleToFvHandle(gImageHandle),
&gEfiCallerIdGuid,
SectionType,
Instance,
diff --git a/MdePkg/Library/DxePiLib/DxePiLib.inf b/MdePkg/Library/DxePiLib/DxePiLib.inf index e459e046a1..c1d0a716d2 100644 --- a/MdePkg/Library/DxePiLib/DxePiLib.inf +++ b/MdePkg/Library/DxePiLib/DxePiLib.inf @@ -21,7 +21,7 @@ FILE_GUID = EE680C58-FFC0-4a5d-858F-66FF9C84BC9F
MODULE_TYPE = DXE_DRIVER
VERSION_STRING = 1.0
- LIBRARY_CLASS = PiLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
+ LIBRARY_CLASS = DxePiLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER
EDK_RELEASE_VERSION = 0x00020000
EFI_SPECIFICATION_VERSION = 0x00020000
|