/**@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; } } }