From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 676AB223DB783 for ; Sat, 10 Feb 2018 06:18:46 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Feb 2018 06:24:33 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,489,1511856000"; d="scan'208";a="16777567" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.37]) by fmsmga007.fm.intel.com with ESMTP; 10 Feb 2018 06:24:32 -0800 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Star Zeng , Liming Gao Date: Sat, 10 Feb 2018 22:24:27 +0800 Message-Id: <20180210142427.426736-3-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.16.1.windows.1 In-Reply-To: <20180210142427.426736-1-ruiyu.ni@intel.com> References: <20180210142427.426736-1-ruiyu.ni@intel.com> Subject: [PATCH 2/2] MdeModulePkg/NullMemoryTest: Handle more reliable memory X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Feb 2018 14:18:46 -0000 Today's implementation converts the untested more reliable memory from reserved GCD type to system memory GCD type. Though it doesn't impact the return result of gBS->GetMemoryMap(). But it impacts the return result of gDS->GetMemorySpaceDescriptor(). The patch fixes the bug to convert the untested more reliable memory from reserved GCD type to more reliable memory GCD type. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Star Zeng Cc: Liming Gao --- .../MemoryTest/NullMemoryTestDxe/NullMemoryTest.c | 75 +++++++++++++--------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c b/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c index 9c9849c776..11af8ea77f 100644 --- a/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c +++ b/MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTest.c @@ -1,7 +1,7 @@ /** @file Implementation of Generic Memory Test Protocol which does not perform real memory test. -Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+Copyright (c) 2006 - 2018, 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 @@ -58,6 +58,38 @@ GenericMemoryTestEntryPoint ( return EFI_SUCCESS; } +/** + Convert the memory descriptor to tested. + + @param Descriptor Pointer to EFI_GCD_MEMORY_SPACE_DESCRIPTOR + + @retval EFI_SUCCESS The memory descriptor is converted to tested. + @retval others Error happens. +**/ +EFI_STATUS +ConvertToTestedMemory ( + IN CONST EFI_GCD_MEMORY_SPACE_DESCRIPTOR *Descriptor + ) +{ + EFI_STATUS Status; + Status = gDS->RemoveMemorySpace ( + Descriptor->BaseAddress, + Descriptor->Length + ); + if (!EFI_ERROR (Status)) { + Status = gDS->AddMemorySpace ( + ((Descriptor->Capabilities & EFI_MEMORY_MORE_RELIABLE) == EFI_MEMORY_MORE_RELIABLE) ? + EfiGcdMemoryTypeMoreReliable : EfiGcdMemoryTypeSystemMemory, + Descriptor->BaseAddress, + Descriptor->Length, + Descriptor->Capabilities &~ + (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME) + ); + } + return Status; +} + + /** Initialize the generic memory test. @@ -83,6 +115,7 @@ InitializeMemoryTest ( OUT BOOLEAN *RequireSoftECCInit ) { + EFI_STATUS Status; UINTN NumberOfDescriptors; EFI_GCD_MEMORY_SPACE_DESCRIPTOR *MemorySpaceMap; UINTN Index; @@ -96,22 +129,12 @@ InitializeMemoryTest ( // // For those reserved memory that have not been tested, simply promote to system memory. // - gDS->RemoveMemorySpace ( - MemorySpaceMap[Index].BaseAddress, - MemorySpaceMap[Index].Length - ); - - gDS->AddMemorySpace ( - EfiGcdMemoryTypeSystemMemory, - MemorySpaceMap[Index].BaseAddress, - MemorySpaceMap[Index].Length, - MemorySpaceMap[Index].Capabilities &~ - (EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME) - ); - + Status = ConvertToTestedMemory (&MemorySpaceMap[Index]); + ASSERT_EFI_ERROR (Status); mTestedSystemMemory += MemorySpaceMap[Index].Length; mTotalSystemMemory += MemorySpaceMap[Index].Length; - } else if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) { + } else if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) || + (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) { mTotalSystemMemory += MemorySpaceMap[Index].Length; } } @@ -204,22 +227,16 @@ EFI_STATUS EFIAPI GenCompatibleRangeTest ( IN EFI_GENERIC_MEMORY_TEST_PROTOCOL *This, - IN EFI_PHYSICAL_ADDRESS StartAddress, - IN UINT64 Length + IN EFI_PHYSICAL_ADDRESS StartAddress, + IN UINT64 Length ) { + EFI_STATUS Status; EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor; - gDS->GetMemorySpaceDescriptor (StartAddress, &Descriptor); - - gDS->RemoveMemorySpace (StartAddress, Length); - - gDS->AddMemorySpace ( - EfiGcdMemoryTypeSystemMemory, - StartAddress, - Length, - Descriptor.Capabilities &~(EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED | EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME) - ); - - return EFI_SUCCESS; + Status = gDS->GetMemorySpaceDescriptor (StartAddress, &Descriptor); + if (!EFI_ERROR (Status)) { + Status = ConvertToTestedMemory (&Descriptor); + } + return Status; } -- 2.16.1.windows.1