2018-09-13 16:11:07 -07:00
|
|
|
/** @file
|
|
|
|
|
|
2018-11-06 13:54:36 -07:00
|
|
|
Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
|
2019-06-12 18:01:09 -07:00
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
2018-09-13 16:11:07 -07:00
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
#include <PiPei.h>
|
|
|
|
|
#include <Library/BaseLib.h>
|
|
|
|
|
#include <Library/DebugLib.h>
|
|
|
|
|
#include <Library/BaseMemoryLib.h>
|
|
|
|
|
#include <Library/DebugLogBufferLib.h>
|
|
|
|
|
#include <Library/BootloaderCoreLib.h>
|
|
|
|
|
#include <Library/HobLib.h>
|
|
|
|
|
#include <Library/PcdLib.h>
|
2018-11-09 16:05:42 -08:00
|
|
|
#include <HashStore.h>
|
2018-09-13 16:11:07 -07:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Get the component hash data by the component type.
|
|
|
|
|
|
|
|
|
|
@param[in] ComponentType Component type.
|
|
|
|
|
@param[out] HashData Hash data pointer corresponding Component type.
|
|
|
|
|
|
|
|
|
|
@retval RETURN_SUCCESS Get hash data succeeded.
|
|
|
|
|
@retval RETURN_UNSUPPORTED Hash component type is not supported.
|
|
|
|
|
@retval RETURN_NOT_FOUND Hash data is not found.
|
|
|
|
|
@retval RETURN_INVALID_PARAMETER HashData is NULL.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
RETURN_STATUS
|
|
|
|
|
GetComponentHash (
|
|
|
|
|
IN UINT8 ComponentType,
|
|
|
|
|
OUT CONST UINT8 **HashData
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
LOADER_GLOBAL_DATA *LdrGlobal;
|
2018-11-09 16:05:42 -08:00
|
|
|
HASH_STORE_TABLE *HashStorePtr;
|
|
|
|
|
UINT8 HashIndex;
|
2018-09-13 16:11:07 -07:00
|
|
|
|
|
|
|
|
if (HashData == NULL) {
|
|
|
|
|
return RETURN_INVALID_PARAMETER;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HashIndex = ComponentType;
|
|
|
|
|
*HashData = NULL;
|
|
|
|
|
if (HashIndex >= HASH_INDEX_MAX_NUM) {
|
|
|
|
|
return RETURN_UNSUPPORTED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-09 16:05:42 -08:00
|
|
|
LdrGlobal = GetLoaderGlobalDataPointer ();
|
|
|
|
|
HashStorePtr = (HASH_STORE_TABLE *)LdrGlobal->HashStorePtr;
|
|
|
|
|
if ((HashStorePtr == NULL) || (! (HashStorePtr->Valid & (1 << HashIndex)))) {
|
2018-09-13 16:11:07 -07:00
|
|
|
return RETURN_NOT_FOUND;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-09 16:05:42 -08:00
|
|
|
*HashData = (UINT8 *)HashStorePtr->Data[HashIndex].Data;
|
2018-09-13 16:11:07 -07:00
|
|
|
|
|
|
|
|
return RETURN_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Set the component hash data by the component type.
|
|
|
|
|
|
|
|
|
|
@param[in] ComponentType Component type.
|
|
|
|
|
@param[in] HashData Hash data pointer corresponding Component type.
|
|
|
|
|
|
|
|
|
|
@retval RETURN_SUCCESS Set hash data succeeded.
|
|
|
|
|
@retval RETURN_UNSUPPORTED Hash component type is not supported.
|
|
|
|
|
@retval RETURN_NOT_FOUND Hash data is not found.
|
|
|
|
|
@retval RETURN_INVALID_PARAMETER HashData is NULL.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
RETURN_STATUS
|
|
|
|
|
SetComponentHash (
|
|
|
|
|
IN UINT8 ComponentType,
|
|
|
|
|
IN CONST UINT8 *HashData
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
LOADER_GLOBAL_DATA *LdrGlobal;
|
2018-11-09 16:05:42 -08:00
|
|
|
HASH_STORE_TABLE *HashStorePtr;
|
2018-09-13 16:11:07 -07:00
|
|
|
UINT8 HashIndex;
|
|
|
|
|
|
|
|
|
|
if (HashData == NULL) {
|
|
|
|
|
return RETURN_INVALID_PARAMETER;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HashIndex = ComponentType;
|
|
|
|
|
LdrGlobal = GetLoaderGlobalDataPointer ();
|
2018-11-09 16:05:42 -08:00
|
|
|
HashStorePtr = (HASH_STORE_TABLE *)LdrGlobal->HashStorePtr;
|
|
|
|
|
if ((HashStorePtr == NULL) || (HashIndex != HASH_INDEX_PAYLOAD_DYNAMIC)) {
|
2018-09-13 16:11:07 -07:00
|
|
|
return RETURN_UNSUPPORTED;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-09 16:05:42 -08:00
|
|
|
CopyMem ((UINT8 *)HashStorePtr->Data[HashIndex].Data, HashData, HASH_STORE_DIGEST_LENGTH);
|
2018-09-13 16:11:07 -07:00
|
|
|
return RETURN_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Returns the pointer to the Flash Map.
|
|
|
|
|
|
|
|
|
|
This function will get the flash map pointer from global data
|
|
|
|
|
|
|
|
|
|
@return The pointer to the Flash Map.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetFlashMapPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->FlashMapPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Returns the pointer to the HOB list.
|
|
|
|
|
|
|
|
|
|
If the pointer to the HOB list is NULL, then ASSERT().
|
|
|
|
|
|
|
|
|
|
@return The pointer to the HOB list.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetHobListPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
LOADER_GLOBAL_DATA *LdrGlobal;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Only check this parameter in debug mode
|
|
|
|
|
//
|
|
|
|
|
LdrGlobal = GetLoaderGlobalDataPointer();
|
|
|
|
|
return LdrGlobal->LdrHobList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves performance data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The performance data pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
BL_PERF_DATA *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetPerfDataPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return &GetLoaderGlobalDataPointer()->PerfData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function gets the configuration data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The configuration data blob pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetConfigDataPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->ConfDataPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves current platform id.
|
|
|
|
|
|
|
|
|
|
@retval The current platform id.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
UINT16
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetPlatformId (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->PlatformId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves log buffer pointer.
|
|
|
|
|
|
|
|
|
|
@retval The log buffer pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetDebugLogBufferPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->LogBufPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves global library data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The library data pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetLibraryDataPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->LibDataPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves global library data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The library data pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetServiceListPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->ServicePtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves global PCD data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The PCD data pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetPcdDataPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->PcdDataPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves current boot partition.
|
|
|
|
|
|
|
|
|
|
@retval The current boot partition.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
UINT8
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetCurrentBootPartition (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->CurrentBootPartition;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Returns the current stage of Bootloader execution.
|
|
|
|
|
|
|
|
|
|
@retval LOADER_STAGE Current stage of bootloader execution.
|
|
|
|
|
**/
|
|
|
|
|
LOADER_STAGE
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetLoaderStage (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->LoaderStage;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves platform data pointer.
|
|
|
|
|
|
|
|
|
|
@retval The platform data pointer.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetPlatformDataPtr (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->PlatDataPtr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
Gets component information from the flash map.
|
|
|
|
|
|
|
|
|
|
This function will look for the component based on the input signature
|
|
|
|
|
in the flash map, if found, will return the base address and size of the component.
|
|
|
|
|
|
|
|
|
|
@param[in] Signature Signature of the component information required
|
|
|
|
|
@param[out] Base Base address of the component
|
|
|
|
|
@param[out] Size Size of the component
|
|
|
|
|
|
|
|
|
|
@retval EFI_SUCCESS Found the component with the matching signature.
|
|
|
|
|
@retval EFI_NOT_FOUND Component with the matching signature not found.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
EFI_STATUS
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetComponentInfo (
|
|
|
|
|
IN UINT32 Signature,
|
|
|
|
|
OUT UINT32 *Base,
|
|
|
|
|
OUT UINT32 *Size
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
EFI_STATUS Status;
|
|
|
|
|
|
|
|
|
|
if (FeaturePcdGet (PcdFlashMapEnabled) == FALSE) {
|
|
|
|
|
//
|
|
|
|
|
// If Flash Map is not enabled, get base and size from PCD's
|
|
|
|
|
//
|
|
|
|
|
Status = GetComponentPcdInfo (Signature, Base, Size);
|
|
|
|
|
return Status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (GetCurrentBootPartition() == 1) {
|
|
|
|
|
Status = GetComponentInfoByPartition (Signature, TRUE, Base, Size);
|
|
|
|
|
} else {
|
|
|
|
|
Status = GetComponentInfoByPartition (Signature, FALSE, Base, Size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves features configuration.
|
|
|
|
|
|
|
|
|
|
@retval The feature configuration.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
UINT32
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetFeatureCfg (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->LdrFeatures;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-06 13:54:36 -07:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function sets device table.
|
|
|
|
|
|
|
|
|
|
@param DeviceTable The pointer to device table.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID
|
|
|
|
|
EFIAPI
|
|
|
|
|
SetDeviceTable (
|
|
|
|
|
IN VOID *DeviceTable
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
GetLoaderGlobalDataPointer()->DeviceTable = DeviceTable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
This function retrieves the platform device table.
|
|
|
|
|
|
|
|
|
|
@retval The platform device table.
|
|
|
|
|
|
|
|
|
|
**/
|
|
|
|
|
VOID *
|
|
|
|
|
EFIAPI
|
|
|
|
|
GetDeviceTable (
|
|
|
|
|
VOID
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
return GetLoaderGlobalDataPointer()->DeviceTable;
|
|
|
|
|
}
|
|
|
|
|
|