/** @file Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #define NEXT_MEMORY_DESCRIPTOR(MemoryDescriptor, Size) \ ((EFI_MEMORY_DESCRIPTOR *)((UINT8 *)(MemoryDescriptor) + (Size))) extern EFI_MEMORY_DESCRIPTOR *mUefiMemoryMap; extern UINTN mUefiMemoryMapSize; extern UINTN mUefiDescriptorSize; extern EFI_GCD_MEMORY_SPACE_DESCRIPTOR *mGcdMemoryMap; extern EFI_GCD_IO_SPACE_DESCRIPTOR *mGcdIoMap; extern UINTN mGcdMemoryMapNumberOfDescriptors; extern UINTN mGcdIoMapNumberOfDescriptors; EFI_STATUS TestPointCheckPageTable ( IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINTN Length, IN BOOLEAN IsCode, IN BOOLEAN IsOutsideSmram ); BOOLEAN IsUefiPageNotPresent ( IN EFI_MEMORY_DESCRIPTOR *MemoryMap ) { switch (MemoryMap->Type) { case EfiLoaderCode: case EfiLoaderData: case EfiBootServicesCode: case EfiBootServicesData: case EfiConventionalMemory: case EfiUnusableMemory: case EfiACPIReclaimMemory: return TRUE; default: return FALSE; } } EFI_STATUS TestPointCheckSmmCommunicationBuffer ( IN EFI_MEMORY_DESCRIPTOR *UefiMemoryMap, IN UINTN UefiMemoryMapSize, IN UINTN UefiDescriptorSize, IN EFI_MEMORY_ATTRIBUTES_TABLE *MemoryAttributesTable ) { EFI_STATUS ReturnStatus; EFI_STATUS Status; EFI_MEMORY_DESCRIPTOR *MemoryMap; UINTN MemoryMapEntryCount; UINTN Index; EFI_MEMORY_DESCRIPTOR *Entry; DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmCommunicationBuffer - Enter\n")); ReturnStatus = EFI_SUCCESS; MemoryMapEntryCount = UefiMemoryMapSize/UefiDescriptorSize; MemoryMap = UefiMemoryMap; for (Index = 0; Index < MemoryMapEntryCount; Index++) { if (IsUefiPageNotPresent(MemoryMap)) { DEBUG ((DEBUG_INFO, "UEFI MemoryMap Checking 0x%lx - 0x%x\n", MemoryMap->PhysicalStart, EFI_PAGES_TO_SIZE(MemoryMap->NumberOfPages))); Status = TestPointCheckPageTable ( MemoryMap->PhysicalStart, EFI_PAGES_TO_SIZE((UINTN)MemoryMap->NumberOfPages), FALSE, TRUE ); if (EFI_ERROR(Status)) { ReturnStatus = Status; } } MemoryMap = NEXT_MEMORY_DESCRIPTOR(MemoryMap, UefiDescriptorSize); } if (MemoryAttributesTable != NULL) { Entry = (EFI_MEMORY_DESCRIPTOR *)(MemoryAttributesTable + 1); for (Index = 0; Index < MemoryAttributesTable->NumberOfEntries; Index++) { if (Entry->Type == EfiRuntimeServicesCode || Entry->Type == EfiRuntimeServicesData) { if ((Entry->Attribute & EFI_MEMORY_RO) != 0) { DEBUG ((DEBUG_INFO, "UEFI MemoryAttributeTable Checking 0x%lx - 0x%x\n", Entry->PhysicalStart, EFI_PAGES_TO_SIZE(Entry->NumberOfPages))); Status = TestPointCheckPageTable ( Entry->PhysicalStart, EFI_PAGES_TO_SIZE((UINTN)Entry->NumberOfPages), FALSE, TRUE ); if (EFI_ERROR(Status)) { ReturnStatus = Status; } } } Entry = NEXT_MEMORY_DESCRIPTOR (Entry, MemoryAttributesTable->DescriptorSize); } } if (EFI_ERROR (ReturnStatus)) { TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE6_SMM_READY_TO_LOCK_SECURE_SMM_COMMUNICATION_BUFFER_ERROR_CODE \ TEST_POINT_SMM_READY_TO_BOOT \ TEST_POINT_BYTE6_SMM_READY_TO_LOCK_SECURE_SMM_COMMUNICATION_BUFFER_ERROR_STRING ); } DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmCommunicationBuffer - Exit\n")); return EFI_SUCCESS; }