summaryrefslogtreecommitdiffstats
path: root/UefiCpuPkg
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2017-10-17 09:46:27 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2017-10-17 10:05:36 +0800
commit1c29d03869355a5e9dfafb88332c139d8c5c2215 (patch)
tree0cf8e424d61f4c0305218d677c70907d18d7fa7e /UefiCpuPkg
parente2ac374f85a1a1b8a3ecd04699a68e6dcddd5d24 (diff)
downloadedk2-1c29d03869355a5e9dfafb88332c139d8c5c2215.tar.gz
edk2-1c29d03869355a5e9dfafb88332c139d8c5c2215.tar.bz2
edk2-1c29d03869355a5e9dfafb88332c139d8c5c2215.zip
UefiCpuPkg/MtrrLib: Fix MtrrDebugPrintAllMtrrsWorker to avoid hang
ARRAY_SIZE(Mtrrs->Variables.Mtrr) was used in MtrrDebugPrintAllMtrrsWorker() to parse the MTRR registers. Instead, the actual variable MTRR count should be used. Otherwise, the uninitialized random data in MtrrSetting may cause MtrrLibSetMemoryType() hang. Steven Shi found this bug in QEMU when using Q35 chip. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Steven Shi <steven.shi@intel.com> Cc: Laszlo Ersek <lersek@redhat.com>
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r--UefiCpuPkg/Library/MtrrLib/MtrrLib.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
index 2fd1d0153e..cb22558103 100644
--- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
+++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c
@@ -2776,6 +2776,7 @@ MtrrDebugPrintAllMtrrsWorker (
UINTN RangeCount;
UINT64 MtrrValidBitsMask;
UINT64 MtrrValidAddressMask;
+ UINT32 VariableMtrrCount;
MTRR_MEMORY_RANGE Ranges[
ARRAY_SIZE (mMtrrLibFixedMtrrTable) * sizeof (UINT64) + 2 * ARRAY_SIZE (Mtrrs->Variables.Mtrr) + 1
];
@@ -2785,6 +2786,8 @@ MtrrDebugPrintAllMtrrsWorker (
return;
}
+ VariableMtrrCount = GetVariableMtrrCountWorker ();
+
if (MtrrSetting != NULL) {
Mtrrs = MtrrSetting;
} else {
@@ -2802,7 +2805,7 @@ MtrrDebugPrintAllMtrrsWorker (
DEBUG((DEBUG_CACHE, "Fixed MTRR[%02d] : %016lx\n", Index, Mtrrs->Fixed.Mtrr[Index]));
}
- for (Index = 0; Index < ARRAY_SIZE (Mtrrs->Variables.Mtrr); Index++) {
+ for (Index = 0; Index < VariableMtrrCount; Index++) {
if (((MSR_IA32_MTRR_PHYSMASK_REGISTER *)&Mtrrs->Variables.Mtrr[Index].Mask)->Bits.V == 0) {
//
// If mask is not valid, then do not display range
@@ -2829,11 +2832,11 @@ MtrrDebugPrintAllMtrrsWorker (
RangeCount = 1;
MtrrLibGetRawVariableRanges (
- &Mtrrs->Variables, ARRAY_SIZE (Mtrrs->Variables.Mtrr),
+ &Mtrrs->Variables, VariableMtrrCount,
MtrrValidBitsMask, MtrrValidAddressMask, RawVariableRanges
);
MtrrLibApplyVariableMtrrs (
- RawVariableRanges, ARRAY_SIZE (RawVariableRanges),
+ RawVariableRanges, VariableMtrrCount,
Ranges, ARRAY_SIZE (Ranges), &RangeCount
);