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