| /** @file | |
| Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
| 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. | |
| **/ | |
| #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; | |
| if (InputSection == NULL) { | |
| return RETURN_INVALID_PARAMETER; | |
| } | |
| ASSERT (OutputBufferSize != NULL); | |
| ASSERT (ScratchBufferSize != NULL); | |
| ASSERT (SectionAttribute != NULL); | |
| 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], &(((EFI_GUID_DEFINED_SECTION *) InputSection)->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; | |
| if (InputSection == NULL) { | |
| return RETURN_INVALID_PARAMETER; | |
| } | |
| ASSERT (OutputBuffer != NULL); | |
| ASSERT (AuthenticationStatus != NULL); | |
| 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], &(((EFI_GUID_DEFINED_SECTION *) InputSection)->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; | |
| } |