]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/MtrrLib/MtrrLib.c
UefiCpuPkg/MtrrLib: Avoid running unnecessary code
[mirror_edk2.git] / UefiCpuPkg / Library / MtrrLib / MtrrLib.c
index 524f21e84299830a4c3464bed1d6a2a87925ee9a..9d1927262a4edee650bd18621fac69cba7f73738 100644 (file)
@@ -702,6 +702,7 @@ MtrrLibGetPositiveMtrrNumber (
   BOOLEAN        UseLeastAlignment;\r
 \r
   UseLeastAlignment = TRUE;\r
+  SubLength = 0;\r
 \r
   //\r
   // Calculate the alignment of the base address.\r
@@ -836,7 +837,7 @@ MtrrLibGetMtrrNumber (
   IN UINT64                 Alignment0,\r
   OUT UINT32                *SubLeft, // subtractive from BaseAddress to get more aligned address, to save MTRR\r
   OUT UINT32                *SubRight // subtractive from BaseAddress + Length, to save MTRR\r
-)\r
+  )\r
 {\r
   UINT64  Alignment;\r
   UINT32  LeastLeftMtrrNumber;\r
@@ -854,11 +855,14 @@ MtrrLibGetMtrrNumber (
   *SubLeft = 0;\r
   *SubRight = 0;\r
   LeastSubtractiveMtrrNumber = 0;\r
+  BaseAlignment = 0;\r
 \r
   //\r
   // Get the optimal left subtraction solution.\r
   //\r
   if (BaseAddress != 0) {\r
+    SubtractiveBaseAddress = 0;\r
+    SubtractiveLength      = 0;\r
     //\r
     // Get the MTRR number needed without left subtraction.\r
     //\r
@@ -1371,6 +1375,8 @@ MtrrLibSetMemoryType (
   UINT32                           EndIndex;\r
   UINT32                           DeltaCount;\r
 \r
+  LengthRight = 0;\r
+  LengthLeft  = 0;\r
   Limit = BaseAddress + Length;\r
   StartIndex = *Count;\r
   EndIndex = *Count;\r
@@ -1530,6 +1536,7 @@ MtrrLibAddVariableMtrr (
 \r
   MTRR_LIB_ASSERT_ALIGNED (BaseAddress, Length);\r
   if (Type == CacheInvalid) {\r
+    ASSERT (Ranges != NULL);\r
     for (Index = 0; Index < RangeCount; Index++) {\r
       if (Ranges[Index].BaseAddress <= BaseAddress && BaseAddress < Ranges[Index].BaseAddress + Ranges[Index].Length) {\r
 \r
@@ -1623,6 +1630,8 @@ MtrrLibSetMemoryAttributeInVariableMtrr (
   UINT32                    SubtractiveRight;\r
   BOOLEAN                   UseLeastAlignment;\r
 \r
+  Alignment = 0;\r
+\r
   MtrrNumber = MtrrLibGetMtrrNumber (Ranges, RangeCount, VariableMtrr, *VariableMtrrCount,\r
                                      BaseAddress, Length, Type, Alignment0, &SubtractiveLeft, &SubtractiveRight);\r
 \r
@@ -1847,6 +1856,8 @@ MtrrSetMemoryAttributeWorker (
   if (((BaseAddress & ~MtrrValidAddressMask) != 0) || (Length & ~MtrrValidAddressMask) != 0) {\r
     return RETURN_UNSUPPORTED;\r
   }\r
+  OriginalVariableMtrrCount = 0;\r
+  VariableSettings          = NULL;\r
 \r
   ZeroMem (&WorkingFixedSettings, sizeof (WorkingFixedSettings));\r
   for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) {\r
@@ -2017,25 +2028,27 @@ MtrrSetMemoryAttributeWorker (
   ASSERT (OriginalVariableMtrrCount - FreeVariableMtrrCount <= FirmwareVariableMtrrCount);\r
 \r
   //\r
-  // Move MTRRs after the FirmwraeVariableMtrrCount position to beginning\r
+  // Move MTRRs after the FirmwareVariableMtrrCount position to beginning\r
   //\r
-  WorkingIndex = FirmwareVariableMtrrCount;\r
-  for (Index = 0; Index < FirmwareVariableMtrrCount; Index++) {\r
-    if (!OriginalVariableMtrr[Index].Valid) {\r
-      //\r
-      // Found an empty MTRR in WorkingIndex position\r
-      //\r
-      for (; WorkingIndex < OriginalVariableMtrrCount; WorkingIndex++) {\r
-        if (OriginalVariableMtrr[WorkingIndex].Valid) {\r
-          break;\r
+  if (FirmwareVariableMtrrCount < OriginalVariableMtrrCount) {\r
+    WorkingIndex = FirmwareVariableMtrrCount;\r
+    for (Index = 0; Index < FirmwareVariableMtrrCount; Index++) {\r
+      if (!OriginalVariableMtrr[Index].Valid) {\r
+        //\r
+        // Found an empty MTRR in WorkingIndex position\r
+        //\r
+        for (; WorkingIndex < OriginalVariableMtrrCount; WorkingIndex++) {\r
+          if (OriginalVariableMtrr[WorkingIndex].Valid) {\r
+            break;\r
+          }\r
         }\r
-      }\r
 \r
-      if (WorkingIndex != OriginalVariableMtrrCount) {\r
-        CopyMem (&OriginalVariableMtrr[Index], &OriginalVariableMtrr[WorkingIndex], sizeof (VARIABLE_MTRR));\r
-        VariableSettingModified[Index] = TRUE;\r
-        VariableSettingModified[WorkingIndex] = TRUE;\r
-        OriginalVariableMtrr[WorkingIndex].Valid = FALSE;\r
+        if (WorkingIndex != OriginalVariableMtrrCount) {\r
+          CopyMem (&OriginalVariableMtrr[Index], &OriginalVariableMtrr[WorkingIndex], sizeof (VARIABLE_MTRR));\r
+          VariableSettingModified[Index] = TRUE;\r
+          VariableSettingModified[WorkingIndex] = TRUE;\r
+          OriginalVariableMtrr[WorkingIndex].Valid = FALSE;\r
+        }\r
       }\r
     }\r
   }\r
@@ -2048,7 +2061,7 @@ MtrrSetMemoryAttributeWorker (
     if (VariableSettingModified[Index]) {\r
       if (OriginalVariableMtrr[Index].Valid) {\r
         VariableSettings->Mtrr[Index].Base = (OriginalVariableMtrr[Index].BaseAddress & MtrrValidAddressMask) | (UINT8) OriginalVariableMtrr[Index].Type;\r
-        VariableSettings->Mtrr[Index].Mask = (~(OriginalVariableMtrr[Index].Length - 1)) & MtrrValidAddressMask | BIT11;\r
+        VariableSettings->Mtrr[Index].Mask = ((~(OriginalVariableMtrr[Index].Length - 1)) & MtrrValidAddressMask) | BIT11;\r
       } else {\r
         VariableSettings->Mtrr[Index].Base = 0;\r
         VariableSettings->Mtrr[Index].Mask = 0;\r
@@ -2081,6 +2094,8 @@ Done:
 \r
   //\r
   // Write variable MTRRs\r
+  // When only fixed MTRRs were changed, below loop doesn't run\r
+  // because OriginalVariableMtrrCount equals to 0.\r
   //\r
   for (Index = 0; Index < OriginalVariableMtrrCount; Index++) {\r
     if (VariableSettingModified[Index]) {\r
@@ -2102,7 +2117,7 @@ Done:
     MtrrLibPostMtrrChange (&MtrrContext);\r
   }\r
 \r
-  return Status;\r
+  return RETURN_SUCCESS;\r
 }\r
 \r
 /**\r