X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=Nt32Pkg%2FWinNtAutoScanPei%2FWinNtAutoScan.c;h=cd3777ab2b7dd690b0942fa4c4521ae649e66d9d;hb=9d2eedba985bea28c8821691355d447d61f4f6ed;hp=9591c39fcfb6843b46dca8a31064d13ab1e8fd27;hpb=68443c61b4e51bdef20a60692bf1c417c5e06fb8;p=mirror_edk2.git
diff --git a/Nt32Pkg/WinNtAutoScanPei/WinNtAutoScan.c b/Nt32Pkg/WinNtAutoScanPei/WinNtAutoScan.c
index 9591c39fcf..cd3777ab2b 100644
--- a/Nt32Pkg/WinNtAutoScanPei/WinNtAutoScan.c
+++ b/Nt32Pkg/WinNtAutoScanPei/WinNtAutoScan.c
@@ -1,13 +1,8 @@
/**@file
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Copyright (c) 2006, Intel Corporation. All rights reserved.
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP
+SPDX-License-Identifier: BSD-2-Clause-Patent
Module Name:
WinNtAutoscan.c
@@ -27,8 +22,11 @@ Revision History
//
// The protocols, PPI and GUID defintions for this module
//
-#include
#include
+#include
+
+#include
+
//
// The Library classes this module consumes
//
@@ -37,6 +35,62 @@ Revision History
#include
#include
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
+ { EfiReservedMemoryType, 0x0004 },
+ { EfiRuntimeServicesCode, 0x0040 },
+ { EfiRuntimeServicesData, 0x0040 },
+ { EfiBootServicesCode, 0x0300 },
+ { EfiBootServicesData, 0x1000 },
+ { EfiMaxMemoryType, 0 }
+};
+
+/**
+ Validate variable data for the MemoryTypeInformation.
+
+ @param MemoryData Variable data.
+ @param MemoryDataSize Variable data length.
+
+ @return TRUE The variable data is valid.
+ @return FALSE The variable data is invalid.
+
+**/
+BOOLEAN
+ValidateMemoryTypeInfoVariable (
+ IN EFI_MEMORY_TYPE_INFORMATION *MemoryData,
+ IN UINTN MemoryDataSize
+ )
+{
+ UINTN Count;
+ UINTN Index;
+
+ // Check the input parameter.
+ if (MemoryData == NULL) {
+ return FALSE;
+ }
+
+ // Get Count
+ Count = MemoryDataSize / sizeof (*MemoryData);
+
+ // Check Size
+ if (Count * sizeof(*MemoryData) != MemoryDataSize) {
+ return FALSE;
+ }
+
+ // Check last entry type filed.
+ if (MemoryData[Count - 1].Type != EfiMaxMemoryType) {
+ return FALSE;
+ }
+
+ // Check the type filed.
+ for (Index = 0; Index < Count - 1; Index++) {
+ if (MemoryData[Index].Type >= EfiMaxMemoryType) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
EFI_STATUS
EFIAPI
PeimInitializeWinNtAutoScan (
@@ -62,10 +116,11 @@ Returns:
PEI_NT_AUTOSCAN_PPI *PeiNtService;
UINT64 MemorySize;
EFI_PHYSICAL_ADDRESS MemoryBase;
- PEI_BASE_MEMORY_TEST_PPI *MemoryTestPpi;
- EFI_PHYSICAL_ADDRESS ErrorAddress;
UINTN Index;
EFI_RESOURCE_ATTRIBUTE_TYPE Attributes;
+ EFI_PEI_READ_ONLY_VARIABLE2_PPI *Variable;
+ UINTN DataSize;
+ EFI_MEMORY_TYPE_INFORMATION MemoryData [EfiMaxMemoryType + 1];
DEBUG ((EFI_D_ERROR, "NT 32 Autoscan PEIM Loaded\n"));
@@ -81,17 +136,6 @@ Returns:
);
ASSERT_EFI_ERROR (Status);
- //
- // Get the Memory Test PPI
- //
- Status = PeiServicesLocatePpi (
- &gPeiBaseMemoryTestPpiGuid,
- 0,
- NULL,
- (VOID**)&MemoryTestPpi
- );
- ASSERT_EFI_ERROR (Status);
-
Index = 0;
do {
Status = PeiNtService->NtAutoScan (Index, &MemoryBase, &MemorySize);
@@ -108,20 +152,7 @@ Returns:
if (Index == 0) {
//
- // For the first area register it as PEI tested memory
- //
- Status = MemoryTestPpi->BaseMemoryTest (
- (EFI_PEI_SERVICES **) PeiServices,
- MemoryTestPpi,
- MemoryBase,
- MemorySize,
- Quick,
- &ErrorAddress
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Register the "tested" memory with the PEI Core
+ // Register the memory with the PEI Core
//
Status = PeiServicesInstallPeiMemory (MemoryBase, MemorySize);
ASSERT_EFI_ERROR (Status);
@@ -140,9 +171,49 @@ Returns:
} while (!EFI_ERROR (Status));
//
- // Build the CPU hob with 36-bit addressing and 16-bits of IO space.
+ // Build the CPU hob with 52-bit addressing and 16-bits of IO space.
//
- BuildCpuHob (36, 16);
-
+ BuildCpuHob (52, 16);
+
+ //
+ // Build GUIDed Hob that contains the Memory Type Information array
+ //
+ Status = PeiServicesLocatePpi (
+ &gEfiPeiReadOnlyVariable2PpiGuid,
+ 0,
+ NULL,
+ (VOID **)&Variable
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ DataSize = sizeof (MemoryData);
+ Status = Variable->GetVariable (
+ Variable,
+ EFI_MEMORY_TYPE_INFORMATION_VARIABLE_NAME,
+ &gEfiMemoryTypeInformationGuid,
+ NULL,
+ &DataSize,
+ &MemoryData
+ );
+ if (EFI_ERROR (Status) || !ValidateMemoryTypeInfoVariable(MemoryData, DataSize)) {
+ //
+ // Create Memory Type Information HOB
+ //
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ mDefaultMemoryTypeInformation,
+ sizeof(mDefaultMemoryTypeInformation)
+ );
+ } else {
+ //
+ // Create Memory Type Information HOB
+ //
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ MemoryData,
+ DataSize
+ );
+ }
+
return Status;
}