From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 49ACA21A134AE for ; Thu, 4 May 2017 19:15:50 -0700 (PDT) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga104.jf.intel.com with ESMTP; 04 May 2017 19:15:49 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.38,290,1491289200"; d="scan'208";a="1143876889" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.1]) by fmsmga001.fm.intel.com with ESMTP; 04 May 2017 19:15:48 -0700 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Jeff Fan Date: Fri, 5 May 2017 10:15:46 +0800 Message-Id: <20170505021546.193068-1-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.12.2.windows.2 Subject: [PATCH] UefiCpuPkg/MtrrLib: Don't report OutOfResource when MTRR is enough X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 May 2017 02:15:50 -0000 The MTRR calculation algorithm contains a bug that when left subtraction cannot produce better MTRR solution, it forgets to restore the BaseAddress/Length so that MtrrLibGetMtrrNumber() returns bigger value of actual required MTRR numbers. As a result, the MtrrLib reports OutOfResource but actually the MTRR is enough. MEMORY_RANGE mC[] = { 0, 0x100000, CacheUncacheable, 0x100000, 0x89F00000, CacheWriteBack, 0x8A000000, 0x75000000, CacheUncacheable, 0xFF000000, 0x01000000, CacheWriteProtected, 0x100000000, 0x7F00000000, CacheUncacheable, 0xFC240000, 0x2000, CacheWriteCombining // <-- trigger the error }; Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ruiyu Ni Cc: Jeff Fan --- UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index 9d1927262a..cf1af29936 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -851,6 +851,8 @@ MtrrLibGetMtrrNumber ( UINT64 SubtractiveLength; UINT64 BaseAlignment; UINT32 Index; + UINT64 OriginalBaseAddress; + UINT64 OriginalLength; *SubLeft = 0; *SubRight = 0; @@ -861,6 +863,9 @@ MtrrLibGetMtrrNumber ( // Get the optimal left subtraction solution. // if (BaseAddress != 0) { + + OriginalBaseAddress = BaseAddress; + OriginalLength = Length; SubtractiveBaseAddress = 0; SubtractiveLength = 0; // @@ -915,7 +920,10 @@ MtrrLibGetMtrrNumber ( // if (*SubLeft != 0) { BaseAddress = SubtractiveBaseAddress; - Length = SubtractiveLength; + Length = SubtractiveLength; + } else { + BaseAddress = OriginalBaseAddress; + Length = OriginalLength; } } -- 2.12.2.windows.2