slimbootloader/PayloadPkg/Library/PayloadLib/PayloadLib.c

414 lines
8.1 KiB
C

/** @file
This file provides payload common library interfaces.
Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiPei.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
#include <Library/PayloadLib.h>
#include <Library/DebugLogBufferLib.h>
#include <Guid/PayloadKeyHashGuid.h>
#include <Guid/FlashMapInfoGuid.h>
#include <Guid/LoaderPlatformInfoGuid.h>
/**
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
)
{
VOID *GuidHob;
PAYLOAD_KEY_HASH *PayloadKeyHash;
UINT32 Index;
if (HashData == NULL) {
return RETURN_INVALID_PARAMETER;
}
//
// Get public key hash from HOB
//
GuidHob = GetNextGuidHob (&gPayloadKeyHashGuid, GetHobList());
ASSERT (GuidHob != NULL);
*HashData = NULL;
PayloadKeyHash = (PAYLOAD_KEY_HASH *)GET_GUID_HOB_DATA (GuidHob);
for (Index = 0; Index < PayloadKeyHash->DigestCount; Index++) {
if (PayloadKeyHash->KeyHash[Index].ComponentType == ComponentType) {
break;
}
}
if (PayloadKeyHash->DigestCount == Index) {
DEBUG ((DEBUG_ERROR, "NOT found hash data for component type %d!\n", ComponentType));
return EFI_NOT_FOUND;
}
*HashData = &PayloadKeyHash->KeyHash[Index].Digest[0];
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_UNSUPPORTED Hash component type is not supported for PayloadLib.
**/
RETURN_STATUS
SetComponentHash (
IN UINT8 ComponentType,
IN CONST UINT8 *HashData
)
{
return RETURN_UNSUPPORTED;
}
/**
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
)
{
VOID *HobList;
HobList = (VOID *)PcdGet32 (PcdPayloadHobList);
ASSERT (HobList != NULL);
return HobList;
}
/**
Returns the pointer to the Flash Map.
@return The pointer to the Flash Map.
**/
VOID *
EFIAPI
GetFlashMapPtr (
VOID
)
{
FLASH_MAP *FlashMap;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = GetNextGuidHob (&gFlashMapInfoGuid, (VOID *)PcdGet32 (PcdPayloadHobList));
if (GuidHob == NULL) {
return NULL;
}
FlashMap = (FLASH_MAP *)GET_GUID_HOB_DATA (GuidHob);
if (FlashMap == NULL) {
return NULL;
}
return FlashMap;
}
/**
This function retrieves performance data pointer.
@retval The performance data pointer.
**/
BL_PERF_DATA *
EFIAPI
GetPerfDataPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return &PayloadGlobalDataPtr->PerfData;
}
/**
This function gets the configuration data pointer.
**/
VOID *
EFIAPI
GetConfigDataPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->CfgDataPtr;
}
/**
This function retrieves current platform id.
@retval The current platform id.
**/
UINT16
EFIAPI
GetPlatformId (
VOID
)
{
LOADER_PLATFORM_INFO *LoaderPlatformInfo;
LoaderPlatformInfo = (LOADER_PLATFORM_INFO *)GetLoaderPlatformInfoPtr();
ASSERT (LoaderPlatformInfo != NULL);
return LoaderPlatformInfo->PlatformId;
}
/**
This function retrieves log buffer pointer.
@retval The log buffer pointer.
**/
VOID *
EFIAPI
GetDebugLogBufferPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->LogBufPtr;
}
/**
This function retrieves global library data pointer.
@retval The library data pointer.
**/
VOID *
EFIAPI
GetLibraryDataPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->LibDataPtr;
}
/**
This function retrieves global library data pointer.
@retval The library data pointer.
**/
VOID *
EFIAPI
GetServiceListPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->ServiceList;
}
/**
This function retrieves features configuration.
@retval The feature configuration.
**/
UINT32
EFIAPI
GetFeatureCfg (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->LdrFeatures;
}
/**
This function retrieves global PCD data pointer.
@retval The PCD data pointer.
**/
VOID *
EFIAPI
GetPcdDataPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->PcdDataPtr;
}
/**
Get cpu number of cores.
@retval cpu number of cores
**/
UINT8
EFIAPI
GetCurrentBootPartition (
VOID
)
{
EFI_HOB_GUID_TYPE *GuidHob;
LOADER_PLATFORM_INFO *LoaderPlatformInfo;
GuidHob = GetNextGuidHob (&gLoaderPlatformInfoGuid, (VOID *)PcdGet32 (PcdPayloadHobList));
if (GuidHob == NULL) {
return 1;
}
LoaderPlatformInfo = (LOADER_PLATFORM_INFO *)GET_GUID_HOB_DATA (GuidHob);
return LoaderPlatformInfo->BootPartition;
}
/**
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 (GetCurrentBootPartition() == 1) {
Status = GetComponentInfoByPartition (Signature, TRUE, Base, Size);
} else {
Status = GetComponentInfoByPartition (Signature, FALSE, Base, Size);
}
return Status;
}
/**
Returns the current stage of Bootloader execution.
@retval LOADER_STAGE Current stage of bootloader execution.
**/
LOADER_STAGE
EFIAPI
GetLoaderStage (
VOID
)
{
return LOADER_STAGE_PAYLOAD;
}
/**
This function sets device table.
@param DeviceTable The pointer to device table.
**/
VOID
EFIAPI
SetDeviceTable (
IN VOID *DeviceTable
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
PayloadGlobalDataPtr->DeviceTable = DeviceTable;
}
/**
This function retrieves the platform device table.
@retval The platform device table.
**/
VOID *
EFIAPI
GetDeviceTable (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *) PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->DeviceTable;
}
/**
This function retrieves container list pointer.
@retval The container list pointer.
**/
VOID *
EFIAPI
GetContainerListPtr (
VOID
)
{
PAYLOAD_GLOBAL_DATA *PayloadGlobalDataPtr;
PayloadGlobalDataPtr = (PAYLOAD_GLOBAL_DATA *)PcdGet32 (PcdGlobalDataAddress);
return PayloadGlobalDataPtr->ContainerList;
}