From: Ruiyu Ni <ruiyu.ni@intel.com>
To: edk2-devel@lists.01.org
Cc: Eric Dong <eric.dong@intel.com>, Star Zeng <star.zeng@intel.com>
Subject: [PATCH 2/4] UefiCpuPkg/MtrrLib: Fix bug that may calculate wrong MTRR result
Date: Tue, 9 Jan 2018 11:35:50 +0800 [thread overview]
Message-ID: <20180109033552.378192-3-ruiyu.ni@intel.com> (raw)
In-Reply-To: <20180109033552.378192-1-ruiyu.ni@intel.com>
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 <ruiyu.ni@intel.com>
Cc: Eric Dong <eric.dong@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
---
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
next prev parent reply other threads:[~2018-01-09 3:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-09 3:35 [PATCH 0/4] Quality improvement of MtrrLib Ruiyu Ni
2018-01-09 3:35 ` [PATCH 1/4] UefiCpuPkg/MtrrLib: Refine the debug messages Ruiyu Ni
2018-01-09 3:35 ` Ruiyu Ni [this message]
2018-01-09 3:35 ` [PATCH 3/4] UefiCpuPkg/MtrrLib: Handle one setting request covering all memory Ruiyu Ni
2018-01-09 3:35 ` [PATCH 4/4] UefiCpuPkg/MtrrLib: Correct typo to change vector to vertex Ruiyu Ni
2018-01-10 2:25 ` [PATCH 0/4] Quality improvement of MtrrLib Dong, Eric
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180109033552.378192-3-ruiyu.ni@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox