123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- /** @file
- Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <PiPei.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/DebugLib.h>
- #include <Library/ExtractGuidedSectionLib.h>
- #include <Library/PcdLib.h>
- #include <Library/PrePiLib.h>
- #define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}
- typedef struct {
- UINT32 NumberOfExtractHandler;
- GUID *ExtractHandlerGuidTable;
- EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable;
- EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;
- } PRE_PI_EXTRACT_GUIDED_SECTION_DATA;
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA *
- GetSavedData (
- VOID
- )
- {
- EFI_HOB_GUID_TYPE *GuidHob;
- GUID SavedDataGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;
- GuidHob = GetFirstGuidHob (&SavedDataGuid);
- GuidHob++;
- return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA *)GuidHob;
- }
- RETURN_STATUS
- EFIAPI
- ExtractGuidedSectionRegisterHandlers (
- IN CONST GUID *SectionGuid,
- IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler,
- IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler
- )
- {
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
- UINT32 Index;
- //
- // Check input parameter.
- //
- if (SectionGuid == NULL) {
- return RETURN_INVALID_PARAMETER;
- }
- SavedData = GetSavedData ();
- //
- // Search the match registered GetInfo handler for the input guided section.
- //
- for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
- if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionGuid)) {
- break;
- }
- }
- //
- // If the guided handler has been registered before, only update its handler.
- //
- if (Index < SavedData->NumberOfExtractHandler) {
- SavedData->ExtractDecodeHandlerTable[Index] = DecodeHandler;
- SavedData->ExtractGetInfoHandlerTable[Index] = GetInfoHandler;
- return RETURN_SUCCESS;
- }
- //
- // Check the global table is enough to contain new Handler.
- //
- if (SavedData->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) {
- return RETURN_OUT_OF_RESOURCES;
- }
- //
- // Register new Handler and guid value.
- //
- CopyGuid (&SavedData->ExtractHandlerGuidTable[SavedData->NumberOfExtractHandler], SectionGuid);
- SavedData->ExtractDecodeHandlerTable[SavedData->NumberOfExtractHandler] = DecodeHandler;
- SavedData->ExtractGetInfoHandlerTable[SavedData->NumberOfExtractHandler++] = GetInfoHandler;
- return RETURN_SUCCESS;
- }
- UINTN
- EFIAPI
- ExtractGuidedSectionGetGuidList (
- IN OUT GUID **ExtractHandlerGuidTable
- )
- {
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
- ASSERT (ExtractHandlerGuidTable != NULL);
- SavedData = GetSavedData ();
- *ExtractHandlerGuidTable = SavedData->ExtractHandlerGuidTable;
- return SavedData->NumberOfExtractHandler;
- }
- RETURN_STATUS
- EFIAPI
- ExtractGuidedSectionGetInfo (
- IN CONST VOID *InputSection,
- OUT UINT32 *OutputBufferSize,
- OUT UINT32 *ScratchBufferSize,
- OUT UINT16 *SectionAttribute
- )
- {
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
- UINT32 Index;
- EFI_GUID *SectionDefinitionGuid;
- if (InputSection == NULL) {
- return RETURN_INVALID_PARAMETER;
- }
- ASSERT (OutputBufferSize != NULL);
- ASSERT (ScratchBufferSize != NULL);
- ASSERT (SectionAttribute != NULL);
- SavedData = GetSavedData ();
- if (IS_SECTION2 (InputSection)) {
- SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid);
- } else {
- SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid);
- }
- //
- // Search the match registered GetInfo handler for the input guided section.
- //
- for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
- if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
- break;
- }
- }
- //
- // Not found, the input guided section is not supported.
- //
- if (Index == SavedData->NumberOfExtractHandler) {
- return RETURN_INVALID_PARAMETER;
- }
- //
- // Call the match handler to getinfo for the input section data.
- //
- return SavedData->ExtractGetInfoHandlerTable[Index](
- InputSection,
- OutputBufferSize,
- ScratchBufferSize,
- SectionAttribute
- );
- }
- RETURN_STATUS
- EFIAPI
- ExtractGuidedSectionDecode (
- IN CONST VOID *InputSection,
- OUT VOID **OutputBuffer,
- OUT VOID *ScratchBuffer OPTIONAL,
- OUT UINT32 *AuthenticationStatus
- )
- {
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;
- UINT32 Index;
- EFI_GUID *SectionDefinitionGuid;
- if (InputSection == NULL) {
- return RETURN_INVALID_PARAMETER;
- }
- ASSERT (OutputBuffer != NULL);
- ASSERT (AuthenticationStatus != NULL);
- SavedData = GetSavedData ();
- if (IS_SECTION2 (InputSection)) {
- SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *)InputSection)->SectionDefinitionGuid);
- } else {
- SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *)InputSection)->SectionDefinitionGuid);
- }
- //
- // Search the match registered GetInfo handler for the input guided section.
- //
- for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index++) {
- if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {
- break;
- }
- }
- //
- // Not found, the input guided section is not supported.
- //
- if (Index == SavedData->NumberOfExtractHandler) {
- return RETURN_INVALID_PARAMETER;
- }
- //
- // Call the match handler to getinfo for the input section data.
- //
- return SavedData->ExtractDecodeHandlerTable[Index](
- InputSection,
- OutputBuffer,
- ScratchBuffer,
- AuthenticationStatus
- );
- }
- RETURN_STATUS
- EFIAPI
- ExtractGuidedSectionLibConstructor (
- VOID
- )
- {
- PRE_PI_EXTRACT_GUIDED_SECTION_DATA SavedData;
- GUID HobGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;
- //
- // Allocate global pool space to store the registered handler and its guid value.
- //
- SavedData.ExtractHandlerGuidTable = (GUID *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID));
- if (SavedData.ExtractHandlerGuidTable == NULL) {
- return RETURN_OUT_OF_RESOURCES;
- }
- SavedData.ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER));
- if (SavedData.ExtractDecodeHandlerTable == NULL) {
- return RETURN_OUT_OF_RESOURCES;
- }
- SavedData.ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *)AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER));
- if (SavedData.ExtractGetInfoHandlerTable == NULL) {
- return RETURN_OUT_OF_RESOURCES;
- }
- //
- // the initialized number is Zero.
- //
- SavedData.NumberOfExtractHandler = 0;
- BuildGuidDataHob (&HobGuid, &SavedData, sizeof (SavedData));
- return RETURN_SUCCESS;
- }
|