/** @file @copyright Copyright 1999 - 2021 Intel Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "S3NvramSave.h" #include #include #include /** Verify the SysHost structure size. Verifies that the size of the SysHost structure in PEI is the same as the size of the SysHost structure and DXE and ASSERT's is the size is not the same. This is typically caused by the use of pointers or UINTNs in the SysHost structure, neither of those datatypes are allowed in SysHost. @param None @retval None **/ VOID VerifySysHostStructureSize ( VOID ) { if (PcdGet32 (PcdPeiSyshostMemorySize) != sizeof (SYSHOST)) { DEBUG ((EFI_D_ERROR, "ERROR: In DXE sizeof SysHost = %d, in PEI sizeof SysHost = %d\n", sizeof (SYSHOST), PcdGet32 (PcdPeiSyshostMemorySize) )); DEBUG ((EFI_D_ERROR, "Size of SysHost must match in PEI and DXE\n")); ASSERT (FALSE); } return; } // VerifySysHostStructureSize /** Saves the FSP Non-Volatile Storage HOB to the UEFI Variable Services @param None @retval EFI_SUCCESS The FSP Non-Volatile Storage HOB was successfully saved. @retval EFI_ERROR The FSP Non-Volatile Storage HOB was not successfully saved. **/ EFI_STATUS SaveFspNonVolatileStorageHob ( VOID ) { EFI_STATUS Status; EFI_HOB_GUID_TYPE *GuidHob; VOID *HobData; VOID *VariableData; UINTN DataSize; UINTN FspNvsBufferSize; BOOLEAN DataIsIdentical; FspNvsBufferSize = 0; DataSize = 0; VariableData = NULL; GuidHob = NULL; HobData = NULL; DataIsIdentical = FALSE; Status = EFI_SUCCESS; DEBUG ((DEBUG_INFO, "Saving FSP / MRC Training Data\n")); GuidHob = GetFirstGuidHob (&gFspNonVolatileStorageHobGuid); if (GuidHob != NULL) { HobData = GET_GUID_HOB_DATA (GuidHob); DataSize = GET_GUID_HOB_DATA_SIZE (GuidHob); if (DataSize > 0) { // // Check if the presently saved data is identical to the data given by MRC/FSP // Status = GetLargeVariable (L"FspNvsBuffer", &gFspNonVolatileStorageHobGuid, &FspNvsBufferSize, NULL); if (Status == EFI_BUFFER_TOO_SMALL) { if (FspNvsBufferSize == DataSize) { VariableData = AllocatePool (FspNvsBufferSize); if (VariableData != NULL) { Status = GetLargeVariable (L"FspNvsBuffer", &gFspNonVolatileStorageHobGuid, &FspNvsBufferSize, VariableData); if (!EFI_ERROR (Status) && (FspNvsBufferSize == DataSize) && (0 == CompareMem (HobData, VariableData, DataSize))) { DataIsIdentical = TRUE; } FreePool (VariableData); } } } Status = EFI_SUCCESS; if (!DataIsIdentical) { Status = SetLargeVariable (L"FspNvsBuffer", &gFspNonVolatileStorageHobGuid, TRUE, DataSize, HobData); ASSERT_EFI_ERROR (Status); DEBUG ((DEBUG_INFO, "Saved size of FSP / MRC Training Data: 0x%x\n", DataSize)); } else { DEBUG ((DEBUG_INFO, "FSP / MRC Training Data is identical to data from last boot, no need to save.\n")); } } } return Status; } EFI_STATUS EFIAPI S3NvramSaveEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) /** This is the main entry point of the S3 NVRAM Save module. @param ImageHandle - Handle for the image of this driver. @param SystemTable - Pointer to the EFI System Table. @retval EFI_SUCCESS - Module launched successfully. **/ { EFI_STATUS Status = EFI_SUCCESS; // // Check that SysHost size in DXE is the same as PEI. // #ifndef FSP_API_MODE VerifySysHostStructureSize (); #endif // // Save structures into NVRAM if needed // Status = SaveFspNonVolatileStorageHob (); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Error: FSP NVRAM Data NOT Saved! Status: %r\n", Status)); Status = EFI_SUCCESS; } return Status; }