123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /** @file
- @copyright
- Copyright 1999 - 2021 Intel Corporation. <BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "S3NvramSave.h"
- #include <Library/MemoryAllocationLib.h>
- #include <Library/LargeVariableReadLib.h>
- #include <Library/LargeVariableWriteLib.h>
- /**
- 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;
- }
|