/** @file
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
VOID
TestPointDumpMemoryAttributesTable (
IN EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable
);
EFI_STATUS
TestPointCheckImageMemoryAttribute (
IN EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable,
IN EFI_PHYSICAL_ADDRESS ImageBase,
IN UINT64 ImageSize,
IN BOOLEAN IsFromSmm
);
EFI_STATUS
TestPointCheckSmmMemoryAttributesTable (
IN EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable
)
{
EFI_STATUS Status;
EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
UINTN Index;
UINTN HandleBufSize;
EFI_HANDLE *HandleBuf;
UINTN HandleCount;
EFI_STATUS ReturnStatus;
ReturnStatus = EFI_SUCCESS;
DEBUG ((DEBUG_INFO, "==== TestPointDumpSmmLoadedImage - Enter\n"));
HandleBuf = NULL;
HandleBufSize = 0;
Status = gSmst->SmmLocateHandle (
ByProtocol,
&gEfiLoadedImageProtocolGuid,
NULL,
&HandleBufSize,
HandleBuf
);
if (Status != EFI_BUFFER_TOO_SMALL) {
goto Done ;
}
HandleBuf = AllocateZeroPool (HandleBufSize);
if (HandleBuf == NULL) {
goto Done ;
}
Status = gSmst->SmmLocateHandle (
ByProtocol,
&gEfiLoadedImageProtocolGuid,
NULL,
&HandleBufSize,
HandleBuf
);
if (EFI_ERROR (Status)) {
goto Done ;
}
HandleCount = HandleBufSize / sizeof(EFI_HANDLE);
DEBUG ((DEBUG_INFO, "SmmLoadedImage (%d):\n", HandleCount));
for (Index = 0; Index < HandleCount; Index++) {
Status = gSmst->SmmHandleProtocol (
HandleBuf[Index],
&gEfiLoadedImageProtocolGuid,
(VOID **)&LoadedImage
);
if (EFI_ERROR(Status)) {
continue;
}
Status = TestPointCheckImageMemoryAttribute (
MemoryAttributesTable,
(EFI_PHYSICAL_ADDRESS)(UINTN)LoadedImage->ImageBase,
LoadedImage->ImageSize,
TRUE
);
if (EFI_ERROR(Status)) {
ReturnStatus = Status;
}
}
Done:
if (HandleBuf != NULL) {
FreePool (HandleBuf);
}
return ReturnStatus;
}
/**
Retrieves a pointer to the system configuration table from the SMM System Table
based on a specified GUID.
@param[in] TableGuid The pointer to table's GUID type.
@param[out] Table The pointer to the table associated with TableGuid in the EFI System Table.
@retval EFI_SUCCESS A configuration table matching TableGuid was found.
@retval EFI_NOT_FOUND A configuration table matching TableGuid could not be found.
**/
EFI_STATUS
EFIAPI
SmmGetSystemConfigurationTable (
IN EFI_GUID *TableGuid,
OUT VOID **Table
)
{
UINTN Index;
ASSERT (TableGuid != NULL);
ASSERT (Table != NULL);
*Table = NULL;
for (Index = 0; Index < gSmst->NumberOfTableEntries; Index++) {
if (CompareGuid (TableGuid, &(gSmst->SmmConfigurationTable[Index].VendorGuid))) {
*Table = gSmst->SmmConfigurationTable[Index].VendorTable;
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
TestPointCheckSmmMemAttribute (
VOID
)
{
EFI_STATUS Status;
VOID *MemoryAttributesTable;
DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmMemAttribute - Enter\n"));
Status = SmmGetSystemConfigurationTable (&gEdkiiPiSmmMemoryAttributesTableGuid, (VOID **)&MemoryAttributesTable);
if (!EFI_ERROR (Status)) {
TestPointDumpMemoryAttributesTable(MemoryAttributesTable);
Status = TestPointCheckSmmMemoryAttributesTable(MemoryAttributesTable);
}
if (EFI_ERROR (Status)) {
TestPointLibAppendErrorString (
PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV,
NULL,
TEST_POINT_BYTE6_SMM_READY_TO_LOCK_SMM_MEMORY_ATTRIBUTE_TABLE_FUNCTIONAL_ERROR_CODE \
TEST_POINT_SMM_READY_TO_LOCK \
TEST_POINT_BYTE6_SMM_READY_TO_LOCK_SMM_MEMORY_ATTRIBUTE_TABLE_FUNCTIONAL_ERROR_STRING
);
}
DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmMemAttribute - Exit\n"));
return Status;
}