BOOLEAN UseLeastAlignment;\r
\r
UseLeastAlignment = TRUE;\r
+ SubLength = 0;\r
\r
//\r
// Calculate the alignment of the base address.\r
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
*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
UINT32 EndIndex;\r
UINT32 DeltaCount;\r
\r
+ LengthRight = 0;\r
+ LengthLeft = 0;\r
Limit = BaseAddress + Length;\r
StartIndex = *Count;\r
EndIndex = *Count;\r
\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
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
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
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
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
\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
MtrrLibPostMtrrChange (&MtrrContext);\r
}\r
\r
- return Status;\r
+ return RETURN_SUCCESS;\r
}\r
\r
/**\r