/** @file Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #include #include CHAR8 *mSmramStateName[] = { "Open", "Closed", "Locked", "Cacheable", "Allocated", "NeedTest", "NeedEccInit", }; VOID DumpSmramDescriptor ( IN UINTN NumberOfSmmReservedRegions, IN EFI_SMRAM_DESCRIPTOR *Descriptor ) { UINTN Index; UINTN BitIndex; for (Index = 0; Index < NumberOfSmmReservedRegions; Index++) { DEBUG ((DEBUG_INFO, " BA=%016lx (A=%016lx) L=%016lx State=%016lx", Descriptor[Index].PhysicalStart, Descriptor[Index].CpuStart, Descriptor[Index].PhysicalSize, Descriptor[Index].RegionState )); DEBUG ((DEBUG_INFO, " (")); for (BitIndex = 0; BitIndex < sizeof(mSmramStateName)/sizeof(mSmramStateName[0]); BitIndex++) { if ((Descriptor[Index].RegionState & LShiftU64 (1, BitIndex)) != 0) { DEBUG ((DEBUG_INFO, mSmramStateName[BitIndex])); DEBUG ((DEBUG_INFO, ",")); } } DEBUG ((DEBUG_INFO, ")\n")); } } EFI_STATUS CheckSmramDescriptor ( IN UINTN NumberOfSmmReservedRegions, IN EFI_SMRAM_DESCRIPTOR *Descriptor ) { UINTN Index; UINT64 Base; UINT64 Length; Base = 0; Length = 0; for (Index = 0; Index < NumberOfSmmReservedRegions; Index++) { if (Base == 0) { Base = Descriptor[Index].PhysicalStart; Length = Descriptor[Index].PhysicalSize; } else { if (Base + Length == Descriptor[Index].PhysicalStart) { Length = Length + Descriptor[Index].PhysicalSize; } else if (Descriptor[Index].PhysicalStart + Descriptor[Index].PhysicalSize == Base) { Base = Descriptor[Index].PhysicalStart; Length = Length + Descriptor[Index].PhysicalSize; } else { DEBUG ((DEBUG_ERROR, "Smram is not adjacent\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_END_OF_PEI \ TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_STRING ); return EFI_INVALID_PARAMETER; } } } if (Length != GetPowerOfTwo64 (Length)) { DEBUG ((DEBUG_ERROR, "Smram is not aligned\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_MEMORY_DISCOVERED \ TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_STRING ); return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } #if 0 EFI_STATUS TestPointCheckSmramHob ( VOID ) { EFI_PEI_HOB_POINTERS Hob; EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *SmramHobDescriptorBlock; UINT64 Base; UINT64 Length; UINTN Index; DEBUG ((DEBUG_INFO, "==== TestPointCheckSmramHob - Enter\n")); Hob.Raw = GetHobList (); DEBUG ((DEBUG_INFO, "SMRAM HOB\n")); while (!END_OF_HOB_LIST (Hob)) { if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) { if (CompareGuid (&Hob.Guid->Name, &gEfiSmmSmramMemoryGuid)) { SmramHobDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *) (Hob.Guid + 1); DumpSmramDescriptor (SmramHobDescriptorBlock->NumberOfSmmReservedRegions, SmramHobDescriptorBlock->Descriptor); break; } } Hob.Raw = GET_NEXT_HOB (Hob); } DEBUG ((DEBUG_INFO, "==== TestPointCheckSmramHob - Exit\n")); Base = 0; Length = 0; Hob.Raw = GetHobList (); while (!END_OF_HOB_LIST (Hob)) { if (Hob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) { if (CompareGuid (&Hob.Guid->Name, &gEfiSmmSmramMemoryGuid)) { SmramHobDescriptorBlock = (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *) (Hob.Guid + 1); for (Index = 0; Index < SmramHobDescriptorBlock->NumberOfSmmReservedRegions; Index++) { if (Base == 0) { Base = SmramHobDescriptorBlock->Descriptor[Index].PhysicalStart; Length = SmramHobDescriptorBlock->Descriptor[Index].PhysicalSize; } else { if (Base + Length == SmramHobDescriptorBlock->Descriptor[Index].PhysicalStart) { Length = Length + SmramHobDescriptorBlock->Descriptor[Index].PhysicalSize; } else if (SmramHobDescriptorBlock->Descriptor[Index].PhysicalStart + SmramHobDescriptorBlock->Descriptor[Index].PhysicalSize == Base) { Base = SmramHobDescriptorBlock->Descriptor[Index].PhysicalStart; Length = Length + SmramHobDescriptorBlock->Descriptor[Index].PhysicalSize; } else { DEBUG ((DEBUG_ERROR, "SmramHob is not adjacent\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_END_OF_PEI \ TEST_POINT_BYTE2_END_OF_PEI_SYSTEM_RESOURCE_FUNCTIONAL_ERROR_STRING ); return EFI_INVALID_PARAMETER; } } } break; } } Hob.Raw = GET_NEXT_HOB (Hob); } if (Length != GetPowerOfTwo64 (Length)) { DEBUG ((DEBUG_ERROR, "SmramHob is not aligned\n")); TestPointLibAppendErrorString ( PLATFORM_TEST_POINT_ROLE_PLATFORM_IBV, NULL, TEST_POINT_BYTE1_MEMORY_DISCOVERED_MEMORY_RESOURCE_FUNCTIONAL_ERROR_CODE \ TEST_POINT_MEMORY_DISCOVERED \ TEST_POINT_BYTE1_MEMORY_DISCOVERED_MEMORY_RESOURCE_FUNCTIONAL_ERROR_STRING ); return EFI_INVALID_PARAMETER; } return EFI_SUCCESS; } #endif EFI_STATUS TestPointCheckSmmInfoPei ( VOID ) { EFI_STATUS Status; PEI_SMM_ACCESS_PPI *SmmAccess; UINTN Size; EFI_SMRAM_DESCRIPTOR *SmramRanges; DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmInfoPei - Enter\n")); Status = PeiServicesLocatePpi (&gPeiSmmAccessPpiGuid, 0, NULL, (VOID **)&SmmAccess); if (EFI_ERROR (Status)) { Status = EFI_SUCCESS; goto Done ; } Size = 0; Status = SmmAccess->GetCapabilities ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), SmmAccess, &Size, NULL); ASSERT (Status == EFI_BUFFER_TOO_SMALL); SmramRanges = (EFI_SMRAM_DESCRIPTOR *) AllocateZeroPool (Size); ASSERT (SmramRanges != NULL); Status = SmmAccess->GetCapabilities ((EFI_PEI_SERVICES **)GetPeiServicesTablePointer (), SmmAccess, &Size, SmramRanges); ASSERT_EFI_ERROR (Status); DEBUG ((DEBUG_INFO, "SMRAM Info\n")); DumpSmramDescriptor (Size / sizeof (EFI_SMRAM_DESCRIPTOR), SmramRanges); Status = CheckSmramDescriptor (Size / sizeof (EFI_SMRAM_DESCRIPTOR), SmramRanges); FreePool (SmramRanges); Done: DEBUG ((DEBUG_INFO, "==== TestPointCheckSmmInfoPei - Exit\n")); return Status; }