]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtAutoScanPei/WinNtAutoScan.c
Nt32Pkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Nt32Pkg / WinNtAutoScanPei / WinNtAutoScan.c
index 9591c39fcfb6843b46dca8a31064d13ab1e8fd27..cd3777ab2b7dd690b0942fa4c4521ae649e66d9d 100644 (file)
@@ -1,13 +1,8 @@
 /**@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
@@ -27,8 +22,11 @@ Revision History
 //\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
@@ -37,6 +35,62 @@ Revision History
 #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
@@ -62,10 +116,11 @@ Returns:
   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
@@ -81,17 +136,6 @@ Returns:
              );\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
@@ -108,20 +152,7 @@ Returns:
 \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
@@ -140,9 +171,49 @@ Returns:
   } 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