]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MtrrLib: Fix MtrrDebugPrintAllMtrrsWorker to avoid hang
authorRuiyu Ni <ruiyu.ni@intel.com>
Tue, 17 Oct 2017 01:46:27 +0000 (09:46 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Tue, 17 Oct 2017 02:05:36 +0000 (10:05 +0800)
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>
UefiCpuPkg/Library/MtrrLib/MtrrLib.c

index 2fd1d0153ee6d9f5accfecd99c3271101ab1d69e..cb22558103cd5db28b69c31ffa18ec287c5a6f04 100644 (file)
@@ -2776,6 +2776,7 @@ MtrrDebugPrintAllMtrrsWorker (
     UINTN             RangeCount;\r
     UINT64            MtrrValidBitsMask;\r
     UINT64            MtrrValidAddressMask;\r
     UINTN             RangeCount;\r
     UINT64            MtrrValidBitsMask;\r
     UINT64            MtrrValidAddressMask;\r
+    UINT32            VariableMtrrCount;\r
     MTRR_MEMORY_RANGE Ranges[\r
       ARRAY_SIZE (mMtrrLibFixedMtrrTable) * sizeof (UINT64) + 2 * ARRAY_SIZE (Mtrrs->Variables.Mtrr) + 1\r
       ];\r
     MTRR_MEMORY_RANGE Ranges[\r
       ARRAY_SIZE (mMtrrLibFixedMtrrTable) * sizeof (UINT64) + 2 * ARRAY_SIZE (Mtrrs->Variables.Mtrr) + 1\r
       ];\r
@@ -2785,6 +2786,8 @@ MtrrDebugPrintAllMtrrsWorker (
       return;\r
     }\r
 \r
       return;\r
     }\r
 \r
+    VariableMtrrCount = GetVariableMtrrCountWorker ();\r
+\r
     if (MtrrSetting != NULL) {\r
       Mtrrs = MtrrSetting;\r
     } else {\r
     if (MtrrSetting != NULL) {\r
       Mtrrs = MtrrSetting;\r
     } else {\r
@@ -2802,7 +2805,7 @@ MtrrDebugPrintAllMtrrsWorker (
       DEBUG((DEBUG_CACHE, "Fixed MTRR[%02d]   : %016lx\n", Index, Mtrrs->Fixed.Mtrr[Index]));\r
     }\r
 \r
       DEBUG((DEBUG_CACHE, "Fixed MTRR[%02d]   : %016lx\n", Index, Mtrrs->Fixed.Mtrr[Index]));\r
     }\r
 \r
-    for (Index = 0; Index < ARRAY_SIZE (Mtrrs->Variables.Mtrr); Index++) {\r
+    for (Index = 0; Index < VariableMtrrCount; Index++) {\r
       if (((MSR_IA32_MTRR_PHYSMASK_REGISTER *)&Mtrrs->Variables.Mtrr[Index].Mask)->Bits.V == 0) {\r
         //\r
         // If mask is not valid, then do not display range\r
       if (((MSR_IA32_MTRR_PHYSMASK_REGISTER *)&Mtrrs->Variables.Mtrr[Index].Mask)->Bits.V == 0) {\r
         //\r
         // If mask is not valid, then do not display range\r
@@ -2829,11 +2832,11 @@ MtrrDebugPrintAllMtrrsWorker (
     RangeCount = 1;\r
 \r
     MtrrLibGetRawVariableRanges (\r
     RangeCount = 1;\r
 \r
     MtrrLibGetRawVariableRanges (\r
-      &Mtrrs->Variables, ARRAY_SIZE (Mtrrs->Variables.Mtrr),\r
+      &Mtrrs->Variables, VariableMtrrCount,\r
       MtrrValidBitsMask, MtrrValidAddressMask, RawVariableRanges\r
       );\r
     MtrrLibApplyVariableMtrrs (\r
       MtrrValidBitsMask, MtrrValidAddressMask, RawVariableRanges\r
       );\r
     MtrrLibApplyVariableMtrrs (\r
-      RawVariableRanges, ARRAY_SIZE (RawVariableRanges),\r
+      RawVariableRanges, VariableMtrrCount,\r
       Ranges, ARRAY_SIZE (Ranges), &RangeCount\r
       );\r
 \r
       Ranges, ARRAY_SIZE (Ranges), &RangeCount\r
       );\r
 \r