summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg/Library/MtrrLib
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2017-10-19 10:43:08 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2017-10-20 12:52:08 +0800
commit86cabbcfa005ca9c9589402d4fb7c984e741cc19 (patch)
treed1d3dbdef98ed558fc43f95876ea53a103f7e963 /UefiCpuPkg/Library/MtrrLib
parent1e3f7a3782f1928a19bba81d9d0dba28d15fdae5 (diff)
downloadedk2-86cabbcfa005ca9c9589402d4fb7c984e741cc19.tar.gz
edk2-86cabbcfa005ca9c9589402d4fb7c984e741cc19.tar.bz2
edk2-86cabbcfa005ca9c9589402d4fb7c984e741cc19.zip
UefiCpuPkg/MtrrLib: Fix bug that may incorrectly set <1MB attribute
MtrrLibSetBelow1MBMemoryAttribute() may be called multiple times. It's possible that in a 2nd call, Modified[0] is set to TRUE in 1st call but ClearMasks[0] and OrMasks[0] is uninitialized in 2nd call. It causes FixedSettings->Mtrr[0] be set to random data. The patch fixes this issue by introducing a local Modified[] array and only updates FixedSettings->Mtrr[] when LocalModified[i] is TRUE. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Diffstat (limited to 'UefiCpuPkg/Library/MtrrLib')
-rw-r--r--UefiCpuPkg/Library/MtrrLib/MtrrLib.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
index cb22558103..200becdd4a 100644
--- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
+++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
@@ -2114,22 +2114,32 @@ MtrrLibSetBelow1MBMemoryAttribute (
UINT64 OrMask;
UINT64 ClearMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
UINT64 OrMasks[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
+ BOOLEAN LocalModified[ARRAY_SIZE (mMtrrLibFixedMtrrTable)];
ASSERT (BaseAddress < BASE_1MB);
+ SetMem (LocalModified, sizeof (LocalModified), FALSE);
+
+ //
+ // (Value & ~0 | 0) still equals to (Value)
+ //
+ SetMem64 (ClearMasks, sizeof (ClearMasks), 0);
+ SetMem64 (OrMasks, sizeof (OrMasks), 0);
+
MsrIndex = (UINT32)-1;
while ((BaseAddress < BASE_1MB) && (Length != 0)) {
Status = MtrrLibProgramFixedMtrr (Type, &BaseAddress, &Length, &MsrIndex, &ClearMask, &OrMask);
if (RETURN_ERROR (Status)) {
return Status;
}
- ClearMasks[MsrIndex] = ClearMask;
- OrMasks[MsrIndex] = OrMask;
- Modified[MsrIndex] = TRUE;
+ ClearMasks[MsrIndex] = ClearMask;
+ OrMasks[MsrIndex] = OrMask;
+ Modified[MsrIndex] = TRUE;
+ LocalModified[MsrIndex] = TRUE;
}
for (MsrIndex = 0; MsrIndex < ARRAY_SIZE (mMtrrLibFixedMtrrTable); MsrIndex++) {
- if (Modified[MsrIndex]) {
+ if (LocalModified[MsrIndex]) {
FixedSettings->Mtrr[MsrIndex] = (FixedSettings->Mtrr[MsrIndex] & ~ClearMasks[MsrIndex]) | OrMasks[MsrIndex];
}
}
@@ -2354,6 +2364,7 @@ MtrrSetMemoryAttributesInMtrrSettings (
//
// 3. Apply the below-1MB memory attribute settings.
//
+ ZeroMem (WorkingFixedSettings.Mtrr, sizeof (WorkingFixedSettings.Mtrr));
for (Index = 0; Index < RangeCount; Index++) {
if (Ranges[Index].BaseAddress >= BASE_1MB) {
continue;