/**@file\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
Module Name:\r
WinNtAutoscan.c\r
//\r
// The protocols, PPI and GUID defintions for this module\r
//\r
-#include <Ppi/BaseMemoryTest.h>\r
#include <Ppi/NtAutoscan.h>\r
+#include <Ppi/ReadOnlyVariable2.h>\r
+\r
+#include <Guid/MemoryTypeInformation.h>\r
+\r
//\r
// The Library classes this module consumes\r
//\r
#include <Library/HobLib.h>\r
#include <Library/PeiServicesLib.h>\r
\r
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {\r
+ { EfiReservedMemoryType, 0x0004 },\r
+ { EfiRuntimeServicesCode, 0x0040 },\r
+ { EfiRuntimeServicesData, 0x0040 },\r
+ { EfiBootServicesCode, 0x0300 },\r
+ { EfiBootServicesData, 0x1000 },\r
+ { EfiMaxMemoryType, 0 }\r
+};\r
+\r
+/**\r
+ Validate variable data for the MemoryTypeInformation. \r
+\r
+ @param MemoryData Variable data.\r
+ @param MemoryDataSize Variable data length.\r
+ \r
+ @return TRUE The variable data is valid.\r
+ @return FALSE The variable data is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+ValidateMemoryTypeInfoVariable (\r
+ IN EFI_MEMORY_TYPE_INFORMATION *MemoryData,\r
+ IN UINTN MemoryDataSize\r
+ )\r
+{\r
+ UINTN Count;\r
+ UINTN Index;\r
+\r
+ // Check the input parameter.\r
+ if (MemoryData == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ // Get Count\r
+ Count = MemoryDataSize / sizeof (*MemoryData);\r
+\r
+ // Check Size\r
+ if (Count * sizeof(*MemoryData) != MemoryDataSize) {\r
+ return FALSE;\r
+ }\r
+\r
+ // Check last entry type filed.\r
+ if (MemoryData[Count - 1].Type != EfiMaxMemoryType) {\r
+ return FALSE;\r
+ }\r
+\r
+ // Check the type filed.\r
+ for (Index = 0; Index < Count - 1; Index++) {\r
+ if (MemoryData[Index].Type >= EfiMaxMemoryType) {\r
+ return FALSE;\r
+ }\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
EFI_STATUS\r
EFIAPI\r
PeimInitializeWinNtAutoScan (\r
PEI_NT_AUTOSCAN_PPI *PeiNtService;\r
UINT64 MemorySize;\r
EFI_PHYSICAL_ADDRESS MemoryBase;\r
- PEI_BASE_MEMORY_TEST_PPI *MemoryTestPpi;\r
- EFI_PHYSICAL_ADDRESS ErrorAddress;\r
UINTN Index;\r
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;\r
+ EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable;\r
+ UINTN DataSize;\r
+ EFI_MEMORY_TYPE_INFORMATION MemoryData [EfiMaxMemoryType + 1];\r
\r
\r
DEBUG ((EFI_D_ERROR, "NT 32 Autoscan PEIM Loaded\n"));\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
- //\r
- // Get the Memory Test PPI\r
- //\r
- Status = PeiServicesLocatePpi (\r
- &gPeiBaseMemoryTestPpiGuid,\r
- 0,\r
- NULL,\r
- (VOID**)&MemoryTestPpi\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
Index = 0;\r
do {\r
Status = PeiNtService->NtAutoScan (Index, &MemoryBase, &MemorySize);\r
\r
if (Index == 0) {\r
//\r
- // For the first area register it as PEI tested memory\r
- //\r
- Status = MemoryTestPpi->BaseMemoryTest (\r
- (EFI_PEI_SERVICES **) PeiServices,\r
- MemoryTestPpi,\r
- MemoryBase,\r
- MemorySize,\r
- Quick,\r
- &ErrorAddress\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- //\r
- // Register the "tested" memory with the PEI Core\r
+ // Register the memory with the PEI Core\r
//\r
Status = PeiServicesInstallPeiMemory (MemoryBase, MemorySize);\r
ASSERT_EFI_ERROR (Status);\r
} while (!EFI_ERROR (Status));\r
\r
//\r
- // Build the CPU hob with 36-bit addressing and 16-bits of IO space.\r
+ // Build the CPU hob with 52-bit addressing and 16-bits of IO space.\r
//\r
- BuildCpuHob (36, 16);\r
- \r
+ BuildCpuHob (52, 16);\r
+\r
+ //\r
+ // Build GUIDed Hob that contains the Memory Type Information array\r
+ //\r
+ Status = PeiServicesLocatePpi (\r
+ &gEfiPeiReadOnlyVariable2PpiGuid,\r
+ 0,\r
+ NULL,\r
+ (VOID **)&Variable\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ DataSize = sizeof (MemoryData);\r
+ Status = Variable->GetVariable (\r
+ Variable,\r
+ EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,\r
+ &gEfiMemoryTypeInformationGuid,\r
+ NULL,\r
+ &DataSize,\r
+ &MemoryData\r
+ );\r
+ if (EFI_ERROR (Status) || !ValidateMemoryTypeInfoVariable(MemoryData, DataSize)) {\r
+ //\r
+ // Create Memory Type Information HOB\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiMemoryTypeInformationGuid,\r
+ mDefaultMemoryTypeInformation,\r
+ sizeof(mDefaultMemoryTypeInformation)\r
+ );\r
+ } else {\r
+ //\r
+ // Create Memory Type Information HOB\r
+ //\r
+ BuildGuidDataHob (\r
+ &gEfiMemoryTypeInformationGuid,\r
+ MemoryData,\r
+ DataSize\r
+ );\r
+ }\r
+\r
return Status;\r
}\r