/**@file
PlatformId Event HOB creation
Copyright (c) 2024, Google LLC. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DPREFIX "sp800155evts: "
/**
* Creates an EFI_HOB_TYPE_GUID_EXTENSION HOB for a given SP800155 event.
* Associates the string data with gTcg800155PlatformIdEventHobGuid. Any
* unused bytes or out-of-bounds event sizes are considered corrupted and
* are discarded.
**/
STATIC
VOID
PlatformIdRegisterSp800155 (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN UINT8 *Evt,
IN UINTN EvtSize
)
{
EFI_STATUS Status;
VOID *Hob;
EFI_HOB_GUID_TYPE *GuidHob;
UINT8 *EvtDest;
Status = (*PeiServices)->CreateHob (
PeiServices,
EFI_HOB_TYPE_GUID_EXTENSION,
sizeof (EFI_HOB_GUID_TYPE) + (UINT16)EvtSize,
&Hob
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, DPREFIX "GUID HOB creation failed, skipping\n"));
return;
}
GuidHob = (EFI_HOB_GUID_TYPE *)Hob;
CopyGuid (&GuidHob->Name, &gTcg800155PlatformIdEventHobGuid);
EvtDest = (UINT8 *)GET_GUID_HOB_DATA (Hob);
CopyMem (EvtDest, Evt, EvtSize);
// Fill the remaining HOB padding bytes with 0s.
SetMem (EvtDest + EvtSize, GET_GUID_HOB_DATA_SIZE (Hob) - EvtSize, 0);
}
/**
* Reads the given path from the fw_cfg file and registers it as an
* EFI_HOB_GUID_EXTENSION HOB with gTcg800155PlatformIdEventHobGuid.
* Returns FALSE iff the file does not exist.
**/
BOOLEAN
PlatformIdRegisterEvent (
IN CONST EFI_PEI_SERVICES **PeiServices,
IN CONST CHAR8 *Path
)
{
EFI_STATUS Status;
UINTN NumPages;
EFI_PHYSICAL_ADDRESS Pages;
FIRMWARE_CONFIG_ITEM FdtItem;
UINTN FdtSize;
UINT8 *Evt;
Status = QemuFwCfgFindFile (Path, &FdtItem, &FdtSize);
if (EFI_ERROR (Status)) {
return FALSE;
}
if (FdtSize > MAX_UINT16 - sizeof (EFI_HOB_GUID_TYPE)) {
DEBUG ((DEBUG_ERROR, DPREFIX "Eventdata too large for HOB, skipping\n"));
return TRUE;
}
NumPages = EFI_SIZE_TO_PAGES (FdtSize);
Status = (*PeiServices)->AllocatePages (
PeiServices,
EfiBootServicesData,
NumPages,
&Pages
);
if (EFI_ERROR (Status)) {
return TRUE;
}
Evt = (UINT8 *)(UINTN)Pages;
QemuFwCfgSelectItem (FdtItem);
QemuFwCfgReadBytes (FdtSize, Evt);
PlatformIdRegisterSp800155 (PeiServices, Evt, FdtSize);
Status = (*PeiServices)->FreePages (PeiServices, Pages, NumPages);
ASSERT_EFI_ERROR (Status);
return TRUE;
}
VOID
PlatformIdInitialization (
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
UINTN Index;
CHAR8 Path[64];
for (Index = 0; ; Index++) {
AsciiSPrint (Path, sizeof (Path), "opt/org.tianocode/sp800155evt/%d", Index);
if (!PlatformIdRegisterEvent (PeiServices, Path)) {
break;
}
}
}