diff --git a/MdePkg/Include/Library/ExtractGuidedSectionLib.h b/MdePkg/Include/Library/ExtractGuidedSectionLib.h index c3fcfe0947..193acc3280 100644 --- a/MdePkg/Include/Library/ExtractGuidedSectionLib.h +++ b/MdePkg/Include/Library/ExtractGuidedSectionLib.h @@ -87,7 +87,9 @@ ExtractGuidedSectionRegisterHandlers ( ); /** - Get the supported exract guided section Handler guid list. + Get the supported exract guided section Handler guid table, which is maintained + by library. The caller can directly get this guid table pointer + without responsibility to allocate or free this table buffer. It will ASSERT () if ExtractHandlerGuidTable = NULL. @param[in, out] ExtractHandlerGuidTable The extract Handler guid pointer list. diff --git a/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c new file mode 100644 index 0000000000..350aec59b7 --- /dev/null +++ b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c @@ -0,0 +1,275 @@ +/*++ + +Copyright (c) 2007, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + DxeExtractGuidedSectionLib.c + +Abstract: + + Provide generic extract guided section functions. + +--*/ + +#include + +#include +#include +#include +#include +#include + +STATIC GUID *mExtractHandlerGuidTable; +STATIC UINT32 mNumberOfExtractHandler; + +STATIC EXTRACT_GUIDED_SECTION_DECODE_HANDLER *mExtractDecodeHandlerTable; +STATIC EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *mExtractGetInfoHandlerTable; + +/** + Construtor allocates the global memory to store the registered guid and Handler list. + + @param ImageHandle The firmware allocated handle for the EFI image. + @param SystemTable A pointer to the EFI System Table. + + @retval RETURN_SUCCESS Allocate the global memory space to store guid and funciton tables. + @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated. +**/ +RETURN_STATUS +EFIAPI +DxeExtractGuidedSectionLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + // + // Allocate global pool space to store the registered handler and its guid value. + // + mExtractHandlerGuidTable = (GUID *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)); + if (mExtractHandlerGuidTable == NULL) { + return RETURN_OUT_OF_RESOURCES; + } + + mExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)); + if (mExtractDecodeHandlerTable == NULL) { + return RETURN_OUT_OF_RESOURCES; + } + + mExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER)); + if (mExtractGetInfoHandlerTable == NULL) { + return RETURN_OUT_OF_RESOURCES; + } + + // + // the initialized number is Zero. + // + mNumberOfExtractHandler = 0; + + return RETURN_SUCCESS; +} + +/** + Get the supported exract guided section Handler guid list. + If ExtractHandlerGuidTable = NULL, then ASSERT. + + @param[in, out] ExtractHandlerGuidTable The extract Handler guid pointer list. + + @retval return the number of the supported extract guided Handler. +**/ +UINTN +EFIAPI +ExtractGuidedSectionGetGuidList ( + IN OUT GUID **ExtractHandlerGuidTable + ) +{ + ASSERT (ExtractHandlerGuidTable != NULL); + + *ExtractHandlerGuidTable = mExtractHandlerGuidTable; + return mNumberOfExtractHandler; +} + +/** + Register Guided Section Extract and GetInfo handler. + + @param[in] SectionGuid The guid matches this Extraction function. + @param[in] GetInfoHandler Function to get info from guided section. + @param[in] DecodeHandler Function to extract guided section. + + @retval RETURN_SUCCESS Register Guided Section Extract function successfully. + @retval RETURN_OUT_OF_RESOURCES Resource is not enough to register new function. + @retval RETURN_INVALID_PARAMETER Input pointer to Guid value is not valid. +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionRegisterHandlers ( + IN CONST GUID *SectionGuid, + IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler, + IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler + ) +{ + // + // Check input paramter. + // + if (SectionGuid == NULL) { + return RETURN_INVALID_PARAMETER; + } + // + // Check the global table is enough to contain new Handler. + // + if (mNumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) { + return RETURN_OUT_OF_RESOURCES; + } + + // + // Register new Handler and guid value. + // + CopyGuid (&mExtractHandlerGuidTable [mNumberOfExtractHandler], SectionGuid); + mExtractDecodeHandlerTable [mNumberOfExtractHandler] = DecodeHandler; + mExtractGetInfoHandlerTable [mNumberOfExtractHandler++] = GetInfoHandler; + + return RETURN_SUCCESS; +} + +/** + Get information from the guided section. This function first gets the guid value + from guided section header, then match this guid in the registered extract Handler list + to its corresponding getinfo Handler. + If not found, RETURN_UNSUPPORTED will be return. + If found, it will call the getinfo Handler to get the required size and attribute. + + It will ASSERT () if the pointer to OutputBufferSize is NULL. + It will ASSERT () if the pointer to ScratchBufferSize is NULL. + It will ASSERT () if the pointer to SectionAttribute is NULL. + + @param[in] InputSection Buffer containing the input GUIDed section to be processed. + @param[out] OutputBufferSize The size of OutputBuffer. + @param[out] ScratchBufferSize The size of ScratchBuffer. + @param[out] SectionAttribute The attribute of the input guided section. + + @retval RETURN_SUCCESS Get the required information successfully. + @retval RETURN_UNSUPPORTED Guided section data is not supported. + @retval RETURN_INVALID_PARAMETER The input data can't be parsed correctly. + +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionGetInfo ( + IN CONST VOID *InputSection, + OUT UINT32 *OutputBufferSize, + OUT UINT32 *ScratchBufferSize, + OUT UINT16 *SectionAttribute + ) +{ + UINT32 Index; + + if (InputSection == NULL) { + return RETURN_INVALID_PARAMETER; + } + + ASSERT (OutputBufferSize != NULL); + ASSERT (ScratchBufferSize != NULL); + ASSERT (SectionAttribute != NULL); + + // + // Search the match registered GetInfo handler for the input guided section. + // + for (Index = 0; Index < mNumberOfExtractHandler; Index ++) { + if (CompareGuid (&mExtractHandlerGuidTable[Index], &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid))) { + break; + } + } + + // + // Not found, the input guided section is not supported. + // + if (Index == mNumberOfExtractHandler) { + return RETURN_UNSUPPORTED; + } + + // + // Call the match handler to getinfo for the input section data. + // + return mExtractGetInfoHandlerTable [Index] ( + InputSection, + OutputBufferSize, + ScratchBufferSize, + SectionAttribute + ); +} + +/** + Extract data from the guided section. This function first gets the guid value + from guided section header, then match this guid in the registered extract Handler list + to its corresponding extract Handler. + If not found, RETURN_UNSUPPORTED will be return. + If found, it will call this extract Handler to get output data and AuthenticationStatus. + + It will ASSERT () if the pointer to OutputBuffer is NULL. + It will ASSERT () if the pointer to AuthenticationStatus is NULL. + + @param[in] InputSection Buffer containing the input GUIDed section to be processed. + @param[out] OutputBuffer OutputBuffer to point the start of the section's contents + if guided data is not required prcessing. Otherwise, + OutputBuffer to contain the output data, which is + allocated by the caller. + @param[out] ScratchBuffer A pointer to a caller-allocated buffer for function internal use. + @param[out] AuthenticationStatus + A pointer to a caller-allocated UINT32 that indicates the + authentication status of the output buffer. + + @retval RETURN_SUCCESS Get the output data, size and AuthenticationStatus successfully. + @retval RETURN_UNSUPPORTED Guided section data is not supported to be decoded. + @retval RETURN_INVALID_PARAMETER The input data can't be parsed correctly. + +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionDecode ( + IN CONST VOID *InputSection, + OUT VOID **OutputBuffer, + OUT VOID *ScratchBuffer, OPTIONAL + OUT UINT32 *AuthenticationStatus + ) +{ + UINT32 Index; + + if (InputSection == NULL) { + return RETURN_INVALID_PARAMETER; + } + + ASSERT (OutputBuffer != NULL); + ASSERT (AuthenticationStatus != NULL); + + // + // Search the match registered GetInfo handler for the input guided section. + // + for (Index = 0; Index < mNumberOfExtractHandler; Index ++) { + if (CompareGuid (&mExtractHandlerGuidTable[Index], &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid))) { + break; + } + } + + // + // Not found, the input guided section is not supported. + // + if (Index == mNumberOfExtractHandler) { + return RETURN_UNSUPPORTED; + } + + // + // Call the match handler to getinfo for the input section data. + // + return mExtractDecodeHandlerTable [Index] ( + InputSection, + OutputBuffer, + ScratchBuffer, + AuthenticationStatus + ); +} diff --git a/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf new file mode 100644 index 0000000000..8da4c794bc --- /dev/null +++ b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf @@ -0,0 +1,50 @@ +#/** @file +# Component description file for DxeCore Performance Library +# +# This library provides intrastructure for DxeCore to log performance. +# Copyright (c) 2007, Intel Corporation. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeExtractGuidedSectionLib + FILE_GUID = f773469b-e265-4b0c-b0a6-2f971fbfe72b + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ExtractGuidedSectionLib + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + CONSTRUCTOR = DxeExtractGuidedSectionLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + DxeExtractGuidedSectionLib.c + +[Packages] + MdePkg/MdePkg.dec + + +[LibraryClasses] + MemoryAllocationLib + BaseMemoryLib + DebugLib + +[FixedPcd.common] + gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler + + diff --git a/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c b/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c new file mode 100644 index 0000000000..51cf29d1f4 --- /dev/null +++ b/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c @@ -0,0 +1,342 @@ +/*++ + +Copyright (c) 2007, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + PeiExtractGuidedSectionLib.c + +Abstract: + + Provide generic extract guided section functions. + +--*/ + +#include + +#include +#include +#include +#include +#include + +#define PEI_EXTRACT_HANDLER_INFO_SIGNATURE EFI_SIGNATURE_32 ('P', 'E', 'H', 'I') + +typedef struct { + UINT32 Signature; + UINT32 NumberOfExtractHandler; + GUID *ExtractHandlerGuidTable; + EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable; + EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable; +} PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO; + +/** + Build guid hob for the global memory to store the registered guid and Handler list. + If GuidHob exists, HandlerInfo will be directly got from Guid hob data. + + @param[in, out] InfoPointer Pointer to pei handler info structure. + + @retval RETURN_SUCCESS Build Guid hob for the global memory space to store guid and funciton tables. + @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated. +**/ +RETURN_STATUS +EFIAPI +PeiGetExtractGuidedSectionHandlerInfo ( + IN OUT PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO **InfoPointer + ) +{ + PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo; + EFI_PEI_HOB_POINTERS Hob; + + // + // First try to get handler info from guid hob specified by CallerId. + // + Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GetHobList ()); + while (Hob.Raw != NULL) { + if (CompareGuid (&(Hob.Guid->Name), &gEfiCallerIdGuid)) { + HandlerInfo = (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *) GET_GUID_HOB_DATA (Hob.Guid); + if (HandlerInfo->Signature == PEI_EXTRACT_HANDLER_INFO_SIGNATURE) { + *InfoPointer = HandlerInfo; + return EFI_SUCCESS; + } + } + Hob.Raw = GET_NEXT_HOB (Hob); + Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, Hob.Raw); + } + + // + // If Guid Hob is not found, Build CallerId Guid hob to store Handler Info + // + HandlerInfo = BuildGuidHob ( + &gEfiCallerIdGuid, + sizeof (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO) + + PcdGet32 (PcdMaximumGuidedExtractHandler) * + (sizeof (GUID) + sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER) + sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER)) + ); + if (HandlerInfo == NULL) { + // + // No enough resource to build guid hob. + // + return EFI_OUT_OF_RESOURCES; + } + HandlerInfo->Signature = PEI_EXTRACT_HANDLER_INFO_SIGNATURE; + HandlerInfo->NumberOfExtractHandler = 0; + HandlerInfo->ExtractHandlerGuidTable = (GUID *) (HandlerInfo + 1); + HandlerInfo->ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) ( + (UINT8 *)HandlerInfo->ExtractHandlerGuidTable + + PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID) + ); + HandlerInfo->ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) ( + (UINT8 *)HandlerInfo->ExtractDecodeHandlerTable + + PcdGet32 (PcdMaximumGuidedExtractHandler) * + sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER) + ); + + *InfoPointer = HandlerInfo; + return EFI_SUCCESS; +} + +/** + Get the supported exract guided section Handler guid list. + If ExtractHandlerGuidTable = NULL, then ASSERT. + + @param[in, out] ExtractHandlerGuidTable The extract Handler guid pointer list. + + @retval return the number of the supported extract guided Handler. +**/ +UINTN +EFIAPI +ExtractGuidedSectionGetGuidList ( + IN OUT GUID **ExtractHandlerGuidTable + ) +{ + EFI_STATUS Status; + PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo; + + ASSERT (ExtractHandlerGuidTable != NULL); + + Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + *ExtractHandlerGuidTable = HandlerInfo->ExtractHandlerGuidTable; + return HandlerInfo->NumberOfExtractHandler; +} + +/** + Register Guided Section Extract and GetInfo handler. + + @param[in] SectionGuid The guid matches this Extraction function. + @param[in] GetInfoHandler Function to get info from guided section. + @param[in] DecodeHandler Function to extract guided section. + + @retval RETURN_SUCCESS Register Guided Section Extract function successfully. + @retval RETURN_OUT_OF_RESOURCES Resource is not enough to register new function. + @retval RETURN_INVALID_PARAMETER Input pointer to Guid value is not valid. +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionRegisterHandlers ( + IN CONST GUID *SectionGuid, + IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler, + IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler + ) +{ + EFI_STATUS Status; + PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo; + + // + // Check input paramter. + // + if (SectionGuid == NULL) { + return RETURN_INVALID_PARAMETER; + } + + // + // Get the registered handler information + // + Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Check the global table is enough to contain new Handler. + // + if (HandlerInfo->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) { + return RETURN_OUT_OF_RESOURCES; + } + + // + // Register new Handler and guid value. + // + CopyGuid (&(HandlerInfo->ExtractHandlerGuidTable [HandlerInfo->NumberOfExtractHandler]), SectionGuid); + HandlerInfo->ExtractDecodeHandlerTable [HandlerInfo->NumberOfExtractHandler] = DecodeHandler; + HandlerInfo->ExtractGetInfoHandlerTable [HandlerInfo->NumberOfExtractHandler++] = GetInfoHandler; + + return RETURN_SUCCESS; +} + +/** + Get information from the guided section. This function first gets the guid value + from guided section header, then match this guid in the registered extract Handler list + to its corresponding getinfo Handler. + If not found, RETURN_UNSUPPORTED will be return. + If found, it will call the getinfo Handler to get the required size and attribute. + + It will ASSERT () if the pointer to OutputBufferSize is NULL. + It will ASSERT () if the pointer to ScratchBufferSize is NULL. + It will ASSERT () if the pointer to SectionAttribute is NULL. + + @param[in] InputSection Buffer containing the input GUIDed section to be processed. + @param[out] OutputBufferSize The size of OutputBuffer. + @param[out] ScratchBufferSize The size of ScratchBuffer. + @param[out] SectionAttribute The attribute of the input guided section. + + @retval RETURN_SUCCESS Get the required information successfully. + @retval RETURN_UNSUPPORTED Guided section data is not supported. + @retval RETURN_INVALID_PARAMETER The input data can't be parsed correctly. + +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionGetInfo ( + IN CONST VOID *InputSection, + OUT UINT32 *OutputBufferSize, + OUT UINT32 *ScratchBufferSize, + OUT UINT16 *SectionAttribute + ) +{ + UINT32 Index; + EFI_STATUS Status; + PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo; + + // + // Check input paramter + // + if (InputSection == NULL) { + return RETURN_INVALID_PARAMETER; + } + + ASSERT (OutputBufferSize != NULL); + ASSERT (ScratchBufferSize != NULL); + ASSERT (SectionAttribute != NULL); + + // + // Get the registered handler information. + // + Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Search the match registered GetInfo handler for the input guided section. + // + for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) { + if (CompareGuid (&(HandlerInfo->ExtractHandlerGuidTable[Index]), &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid))) { + break; + } + } + + // + // Not found, the input guided section is not supported. + // + if (Index == HandlerInfo->NumberOfExtractHandler) { + return RETURN_UNSUPPORTED; + } + + // + // Call the match handler to getinfo for the input section data. + // + return HandlerInfo->ExtractGetInfoHandlerTable [Index] ( + InputSection, + OutputBufferSize, + ScratchBufferSize, + SectionAttribute + ); +} + +/** + Extract data from the guided section. This function first gets the guid value + from guided section header, then match this guid in the registered extract Handler list + to its corresponding extract Handler. + If not found, RETURN_UNSUPPORTED will be return. + If found, it will call this extract Handler to get output data and AuthenticationStatus. + + It will ASSERT () if the pointer to OutputBuffer is NULL. + It will ASSERT () if the pointer to AuthenticationStatus is NULL. + + @param[in] InputSection Buffer containing the input GUIDed section to be processed. + @param[out] OutputBuffer OutputBuffer to point the start of the section's contents + if guided data is not required prcessing. Otherwise, + OutputBuffer to contain the output data, which is + allocated by the caller. + @param[out] ScratchBuffer A pointer to a caller-allocated buffer for function internal use. + @param[out] AuthenticationStatus + A pointer to a caller-allocated UINT32 that indicates the + authentication status of the output buffer. + + @retval RETURN_SUCCESS Get the output data, size and AuthenticationStatus successfully. + @retval RETURN_UNSUPPORTED Guided section data is not supported to be decoded. + @retval RETURN_INVALID_PARAMETER The input data can't be parsed correctly. + +**/ +RETURN_STATUS +EFIAPI +ExtractGuidedSectionDecode ( + IN CONST VOID *InputSection, + OUT VOID **OutputBuffer, + OUT VOID *ScratchBuffer, OPTIONAL + OUT UINT32 *AuthenticationStatus + ) +{ + UINT32 Index; + EFI_STATUS Status; + PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo; + + if (InputSection == NULL) { + return RETURN_INVALID_PARAMETER; + } + + ASSERT (OutputBuffer != NULL); + ASSERT (AuthenticationStatus != NULL); + + Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Search the match registered GetInfo handler for the input guided section. + // + for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) { + if (CompareGuid (&(HandlerInfo->ExtractHandlerGuidTable[Index]), &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid))) { + break; + } + } + + // + // Not found, the input guided section is not supported. + // + if (Index == HandlerInfo->NumberOfExtractHandler) { + return RETURN_UNSUPPORTED; + } + + // + // Call the match handler to getinfo for the input section data. + // + return HandlerInfo->ExtractDecodeHandlerTable [Index] ( + InputSection, + OutputBuffer, + ScratchBuffer, + AuthenticationStatus + ); +} diff --git a/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf b/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf new file mode 100644 index 0000000000..fb6e3d136c --- /dev/null +++ b/MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf @@ -0,0 +1,48 @@ +#/** @file +# Component description file for DxeCore Performance Library +# +# This library provides intrastructure for DxeCore to log performance. +# Copyright (c) 2007, Intel Corporation. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiExtractGuidedSectionLib + FILE_GUID = 41ddf016-2a11-415f-8880-00d938e9541a + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ExtractGuidedSectionLib + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 IPF EBC +# + +[Sources.common] + PeiExtractGuidedSectionLib.c + +[Packages] + MdePkg/MdePkg.dec + + +[LibraryClasses] + BaseMemoryLib + DebugLib + HobLib + +[FixedPcd.common] + gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler + +