X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdePkg%2FLibrary%2FDxeExtractGuidedSectionLib%2FDxeExtractGuidedSectionLib.c;h=e0a07835d709d406aa522be9b8090f836d018dc7;hp=5f03a982cf77945fce60830059d6a9864578db15;hb=19388d2960b2fe0347da23799e93ccc52f540214;hpb=518db1d9e02c74955b5c96351c0d0ec1b58430ae diff --git a/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c index 5f03a982cf..e0a07835d7 100644 --- a/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c +++ b/MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.c @@ -1,8 +1,8 @@ /** @file Provide generic extract guided section functions for Dxe phase. - Copyright (c) 2007 - 2008, Intel Corporation
- All rights reserved. This program and the accompanying materials + Copyright (c) 2007 - 2008, 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 @@ -15,55 +15,105 @@ #include #include -#include #include #include #include -GUID *mExtractHandlerGuidTable; +#define EXTRACT_HANDLER_TABLE_SIZE 0x10 + UINT32 mNumberOfExtractHandler = 0; +UINT32 mMaxNumberOfExtractHandler = 0; -EXTRACT_GUIDED_SECTION_DECODE_HANDLER *mExtractDecodeHandlerTable; -EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *mExtractGetInfoHandlerTable; +GUID *mExtractHandlerGuidTable = NULL; +EXTRACT_GUIDED_SECTION_DECODE_HANDLER *mExtractDecodeHandlerTable = NULL; +EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *mExtractGetInfoHandlerTable = NULL; /** - Constructor 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. + Reallocates more global memory to store the registered guid and Handler list. - @retval RETURN_SUCCESS Allocate the global memory space to store guid and function tables. + @retval RETURN_SUCCESS Reallocate more global memory space to store guid and function tables. @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated. **/ RETURN_STATUS EFIAPI -DxeExtractGuidedSectionLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable +ReallocateExtractHandlerTable ( ) -{ +{ // - // Allocate global pool space to store the registered handler and its guid value. + // Reallocate memory for GuidTable // - mExtractHandlerGuidTable = (GUID *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)); + mExtractHandlerGuidTable = ReallocatePool ( + mMaxNumberOfExtractHandler * sizeof (GUID), + (mMaxNumberOfExtractHandler + EXTRACT_HANDLER_TABLE_SIZE) * sizeof (GUID), + mExtractHandlerGuidTable + ); + if (mExtractHandlerGuidTable == NULL) { - return RETURN_OUT_OF_RESOURCES; + goto Done; } - - mExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)); + + // + // Reallocate memory for Decode handler Table + // + mExtractDecodeHandlerTable = ReallocatePool ( + mMaxNumberOfExtractHandler * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER), + (mMaxNumberOfExtractHandler + EXTRACT_HANDLER_TABLE_SIZE) * sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER), + mExtractDecodeHandlerTable + ); + if (mExtractDecodeHandlerTable == NULL) { - FreePool (mExtractHandlerGuidTable); - return RETURN_OUT_OF_RESOURCES; + goto Done; } - mExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) AllocatePool (PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER)); + // + // Reallocate memory for GetInfo handler Table + // + mExtractGetInfoHandlerTable = ReallocatePool ( + mMaxNumberOfExtractHandler * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER), + (mMaxNumberOfExtractHandler + EXTRACT_HANDLER_TABLE_SIZE) * sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER), + mExtractGetInfoHandlerTable + ); + if (mExtractGetInfoHandlerTable == NULL) { + goto Done; + } + + // + // Increase max handler number + // + mMaxNumberOfExtractHandler = mMaxNumberOfExtractHandler + EXTRACT_HANDLER_TABLE_SIZE; + return RETURN_SUCCESS; + +Done: + if (mExtractHandlerGuidTable != NULL) { FreePool (mExtractHandlerGuidTable); + } + if (mExtractDecodeHandlerTable != NULL) { FreePool (mExtractDecodeHandlerTable); - return RETURN_OUT_OF_RESOURCES; + } + if (mExtractGetInfoHandlerTable != NULL) { + FreePool (mExtractGetInfoHandlerTable); } - return RETURN_SUCCESS; + return RETURN_OUT_OF_RESOURCES; +} +/** + Constructor 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 function tables. + @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated. +**/ +RETURN_STATUS +EFIAPI +DxeExtractGuidedSectionLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return ReallocateExtractHandlerTable (); } /** @@ -149,8 +199,10 @@ ExtractGuidedSectionRegisterHandlers ( // // Check the global table is enough to contain new Handler. // - if (mNumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) { - return RETURN_OUT_OF_RESOURCES; + if (mNumberOfExtractHandler >= mMaxNumberOfExtractHandler) { + if (ReallocateExtractHandlerTable () != RETURN_SUCCESS) { + return RETURN_OUT_OF_RESOURCES; + } } //