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 <[email protected]> Cc: Eric Dong <[email protected]> Cc: Star Zeng <[email protected]> --- 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 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

