| /** @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; | |
| } |