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; }