From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.43; helo=mga05.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 9F78E21F833AA for ; Mon, 8 Jan 2018 19:30:46 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Jan 2018 19:35:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,334,1511856000"; d="scan'208";a="19407609" Received: from ray-dev.ccr.corp.intel.com ([10.239.9.19]) by fmsmga004.fm.intel.com with ESMTP; 08 Jan 2018 19:35:55 -0800 From: Ruiyu Ni To: edk2-devel@lists.01.org Cc: Eric Dong , Star Zeng Date: Tue, 9 Jan 2018 11:35:50 +0800 Message-Id: <20180109033552.378192-3-ruiyu.ni@intel.com> X-Mailer: git-send-email 2.15.1.windows.2 In-Reply-To: <20180109033552.378192-1-ruiyu.ni@intel.com> References: <20180109033552.378192-1-ruiyu.ni@intel.com> Subject: [PATCH 2/4] UefiCpuPkg/MtrrLib: Fix bug that may calculate wrong MTRR result 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: Tue, 09 Jan 2018 03:30:47 -0000 Code forgot to initialize the optional weight between adjacent vertices. It caused wrong MTRR result was calculated for some memory settings. The logic was incorrectly removed when converting from POC code. The patch adds back the initialization. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni Cc: Eric Dong Cc: Star Zeng --- UefiCpuPkg/Library/MtrrLib/MtrrLib.c | 37 ++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index b83d768c5f..566a4cb67b 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -1583,20 +1583,33 @@ MtrrLibCalculateMtrrs ( Vector[VectorCount - 1].Address = Base1; Weight = (UINT8 *) &Vector[VectorCount]; - // - // Set mandatory weight between any vector to max - // Set optional weight and between any vector and self->self to 0 - // E.g.: - // 00 FF FF FF - // 00 00 FF FF - // 00 00 00 FF - // 00 00 00 00 - // for (VectorIndex = 0; VectorIndex < VectorCount; VectorIndex++) { + // + // Set optional weight between vertices and self->self to 0 + // SetMem (&Weight[M(VectorIndex, 0)], VectorIndex + 1, 0); - if (VectorIndex != VectorCount - 1) { - Weight[M (VectorIndex, VectorIndex + 1)] = (DefaultType == Vector[VectorIndex].Type) ? 0 : 1; - SetMem (&Weight[M (VectorIndex, VectorIndex + 2)], VectorCount - VectorIndex - 2, MAX_WEIGHT); + // + // Set mandatory weight between vectors to MAX_WEIGHT + // + SetMem (&Weight[M (VectorIndex, VectorIndex + 1)], VectorCount - VectorIndex - 1, MAX_WEIGHT); + + // Final result looks like: + // 00 FF FF FF + // 00 00 FF FF + // 00 00 00 FF + // 00 00 00 00 + } + + // + // Set mandatory weight and optional weight for adjacent vertices + // + for (VectorIndex = 0; VectorIndex < VectorCount - 1; VectorIndex++) { + if (Vector[VectorIndex].Type != DefaultType) { + Weight[M (VectorIndex, VectorIndex + 1)] = 1; + Weight[O (VectorIndex, VectorIndex + 1)] = 0; + } else { + Weight[M (VectorIndex, VectorIndex + 1)] = 0; + Weight[O (VectorIndex, VectorIndex + 1)] = 1; } } -- 2.15.1.windows.2