]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MtrrLib/MtrrLib.c
UefiCpuPkg/MtrrLib: Fix a MTRR calculation bug
[mirror_edk2.git] / UefiCpuPkg / Library / MtrrLib / MtrrLib.c
index fafa15fd63f38561a4e864f3b6e49512b41b908a..768d4d5cff0671b6e6476cb83416254798fb696c 100644 (file)
@@ -47,7 +47,7 @@ typedef struct {
   UINT64                 Address;\r
   UINT64                 Alignment;\r
   UINT64                 Length;\r
-  UINT8                  Type : 7;\r
+  MTRR_MEMORY_CACHE_TYPE Type : 7;\r
 \r
   //\r
   // Temprary use for calculating the best MTRR settings.\r
@@ -1429,7 +1429,7 @@ MtrrLibCalculateSubtractivePath (
           while (SubStart != SubStop) {\r
             Status = MtrrLibAppendVariableMtrr (\r
               Mtrrs, MtrrCapacity, MtrrCount,\r
-              Vertices[SubStart].Address, Vertices[SubStart].Length, (MTRR_MEMORY_CACHE_TYPE) Vertices[SubStart].Type\r
+              Vertices[SubStart].Address, Vertices[SubStart].Length, Vertices[SubStart].Type\r
             );\r
             if (RETURN_ERROR (Status)) {\r
               return Status;\r
@@ -1450,10 +1450,11 @@ MtrrLibCalculateSubtractivePath (
             Pre = Vertices[Cur].Previous;\r
             SubStop = Pre;\r
 \r
-            if (Weight[M (Pre, Cur)] != 0) {\r
+            if (Weight[M (Pre, Cur)] + Weight[O (Pre, Cur)] != 0) {\r
               Status = MtrrLibAppendVariableMtrr (\r
                 Mtrrs, MtrrCapacity, MtrrCount,\r
-                Vertices[Pre].Address, Vertices[Cur].Address - Vertices[Pre].Address, LowestPrecedentType\r
+                Vertices[Pre].Address, Vertices[Cur].Address - Vertices[Pre].Address,\r
+                (Pre != Cur - 1) ? LowestPrecedentType : Vertices[Pre].Type\r
               );\r
               if (RETURN_ERROR (Status)) {\r
                 return Status;\r