Correct the way of handling EFI_SECTION_GUID_DEFINED type sections with a large size Cc: Leif Lindholm <leif.lindholm@linaro.org> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ge Song <ge.song@hxt-semitech.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
		
			
				
	
	
		
			262 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @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;
 | 
						|
  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;
 | 
						|
}
 |