X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=UefiCpuPkg%2FLibrary%2FMtrrLib%2FMtrrLib.c;h=9d1927262a4edee650bd18621fac69cba7f73738;hp=31a08a3935c8b87256d47706f5eef38893d6733c;hb=c9b449213337172d629197a75390a151eba65eb6;hpb=8051302a36b31f7619dc7753280ba449f163b62f diff --git a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c index 31a08a3935..9d1927262a 100644 --- a/UefiCpuPkg/Library/MtrrLib/MtrrLib.c +++ b/UefiCpuPkg/Library/MtrrLib/MtrrLib.c @@ -50,57 +50,57 @@ typedef struct { // CONST FIXED_MTRR mMtrrLibFixedMtrrTable[] = { { - MTRR_LIB_IA32_MTRR_FIX64K_00000, + MSR_IA32_MTRR_FIX64K_00000, 0, SIZE_64KB }, { - MTRR_LIB_IA32_MTRR_FIX16K_80000, + MSR_IA32_MTRR_FIX16K_80000, 0x80000, SIZE_16KB }, { - MTRR_LIB_IA32_MTRR_FIX16K_A0000, + MSR_IA32_MTRR_FIX16K_A0000, 0xA0000, SIZE_16KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_C0000, + MSR_IA32_MTRR_FIX4K_C0000, 0xC0000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_C8000, + MSR_IA32_MTRR_FIX4K_C8000, 0xC8000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_D0000, + MSR_IA32_MTRR_FIX4K_D0000, 0xD0000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_D8000, + MSR_IA32_MTRR_FIX4K_D8000, 0xD8000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_E0000, + MSR_IA32_MTRR_FIX4K_E0000, 0xE0000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_E8000, + MSR_IA32_MTRR_FIX4K_E8000, 0xE8000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_F0000, + MSR_IA32_MTRR_FIX4K_F0000, 0xF0000, SIZE_4KB }, { - MTRR_LIB_IA32_MTRR_FIX4K_F8000, + MSR_IA32_MTRR_FIX4K_F8000, 0xF8000, SIZE_4KB } @@ -214,11 +214,15 @@ MtrrGetDefaultMemoryTypeWorker ( IN MTRR_SETTINGS *MtrrSetting ) { + MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; + if (MtrrSetting == NULL) { - return (MTRR_MEMORY_CACHE_TYPE) (AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE) & 0x7); + DefType.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); } else { - return (MTRR_MEMORY_CACHE_TYPE) (MtrrSetting->MtrrDefType & 0x7); + DefType.Uint64 = MtrrSetting->MtrrDefType; } + + return (MTRR_MEMORY_CACHE_TYPE) DefType.Bits.Type; } @@ -254,6 +258,7 @@ MtrrLibPreMtrrChange ( OUT MTRR_CONTEXT *MtrrContext ) { + MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; // // Disable interrupts and save current interrupt state // @@ -278,7 +283,9 @@ MtrrLibPreMtrrChange ( // // Disable MTRRs // - AsmMsrBitFieldWrite64 (MTRR_LIB_IA32_MTRR_DEF_TYPE, 10, 11, 0); + DefType.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); + DefType.Bits.E = 0; + AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, DefType.Uint64); } /** @@ -330,10 +337,14 @@ MtrrLibPostMtrrChange ( IN MTRR_CONTEXT *MtrrContext ) { + MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; // // Enable Cache MTRR // - AsmMsrBitFieldWrite64 (MTRR_LIB_IA32_MTRR_DEF_TYPE, 10, 11, 3); + DefType.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); + DefType.Bits.E = 1; + DefType.Bits.FE = 1; + AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, DefType.Uint64); MtrrLibPostMtrrChangeEnableCache (MtrrContext); } @@ -412,9 +423,9 @@ MtrrGetVariableMtrrWorker ( for (Index = 0; Index < VariableMtrrCount; Index++) { if (MtrrSetting == NULL) { VariableSettings->Mtrr[Index].Base = - AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1)); + AsmReadMsr64 (MSR_IA32_MTRR_PHYSBASE0 + (Index << 1)); VariableSettings->Mtrr[Index].Mask = - AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1) + 1); + AsmReadMsr64 (MSR_IA32_MTRR_PHYSMASK0 + (Index << 1)); } else { VariableSettings->Mtrr[Index].Base = MtrrSetting->Variables.Mtrr[Index].Base; VariableSettings->Mtrr[Index].Mask = MtrrSetting->Variables.Mtrr[Index].Mask; @@ -568,20 +579,19 @@ MtrrLibProgramFixedMtrr ( This function shadows the content of variable MTRRs into an internal array: VariableMtrr. - @param[in] VariableSettings The variable MTRR values to shadow - @param[in] FirmwareVariableMtrrCount The number of variable MTRRs available to firmware - @param[in] MtrrValidBitsMask The mask for the valid bit of the MTRR - @param[in] MtrrValidAddressMask The valid address mask for MTRR - @param[out] VariableMtrr The array to shadow variable MTRRs content + @param[in] VariableSettings The variable MTRR values to shadow + @param[in] VariableMtrrCount The number of variable MTRRs + @param[in] MtrrValidBitsMask The mask for the valid bit of the MTRR + @param[in] MtrrValidAddressMask The valid address mask for MTRR + @param[out] VariableMtrr The array to shadow variable MTRRs content - @return The return value of this parameter indicates the - number of MTRRs which has been used. + @return Number of MTRRs which has been used. **/ UINT32 MtrrGetMemoryAttributeInVariableMtrrWorker ( IN MTRR_VARIABLE_SETTINGS *VariableSettings, - IN UINTN FirmwareVariableMtrrCount, + IN UINTN VariableMtrrCount, IN UINT64 MtrrValidBitsMask, IN UINT64 MtrrValidAddressMask, OUT VARIABLE_MTRR *VariableMtrr @@ -591,8 +601,8 @@ MtrrGetMemoryAttributeInVariableMtrrWorker ( UINT32 UsedMtrr; ZeroMem (VariableMtrr, sizeof (VARIABLE_MTRR) * MTRR_NUMBER_OF_VARIABLE_MTRR); - for (Index = 0, UsedMtrr = 0; Index < FirmwareVariableMtrrCount; Index++) { - if ((VariableSettings->Mtrr[Index].Mask & MTRR_LIB_CACHE_MTRR_ENABLED) != 0) { + for (Index = 0, UsedMtrr = 0; Index < VariableMtrrCount; Index++) { + if (((MSR_IA32_MTRR_PHYSMASK_REGISTER *) &VariableSettings->Mtrr[Index].Mask)->Bits.V != 0) { VariableMtrr[Index].Msr = (UINT32)Index; VariableMtrr[Index].BaseAddress = (VariableSettings->Mtrr[Index].Base & MtrrValidAddressMask); VariableMtrr[Index].Length = ((~(VariableSettings->Mtrr[Index].Mask & MtrrValidAddressMask)) & MtrrValidBitsMask) + 1; @@ -692,6 +702,7 @@ MtrrLibGetPositiveMtrrNumber ( BOOLEAN UseLeastAlignment; UseLeastAlignment = TRUE; + SubLength = 0; // // Calculate the alignment of the base address. @@ -724,8 +735,10 @@ MtrrLibGetPositiveMtrrNumber ( Return whether the left MTRR type precedes the right MTRR type. The MTRR type precedence rules are: - 1. UC precedes any other type - 2. WT precedes WB + 1. UC precedes any other type + 2. WT precedes WB + For further details, please refer the IA32 Software Developer's Manual, + Volume 3, Section "MTRR Precedences". @param Left The left MTRR type. @param Right The right MTRR type. @@ -824,7 +837,7 @@ MtrrLibGetMtrrNumber ( IN UINT64 Alignment0, OUT UINT32 *SubLeft, // subtractive from BaseAddress to get more aligned address, to save MTRR OUT UINT32 *SubRight // subtractive from BaseAddress + Length, to save MTRR -) + ) { UINT64 Alignment; UINT32 LeastLeftMtrrNumber; @@ -842,11 +855,14 @@ MtrrLibGetMtrrNumber ( *SubLeft = 0; *SubRight = 0; LeastSubtractiveMtrrNumber = 0; + BaseAlignment = 0; // // Get the optimal left subtraction solution. // if (BaseAddress != 0) { + SubtractiveBaseAddress = 0; + SubtractiveLength = 0; // // Get the MTRR number needed without left subtraction. // @@ -954,46 +970,6 @@ MtrrLibGetMtrrNumber ( return LeastSubtractiveMtrrNumber + MiddleMtrrNumber + LeastRightMtrrNumber; } - -/** - Converts the Memory attribute value to MTRR_MEMORY_CACHE_TYPE. - - If MtrrSetting is not NULL, gets the default memory attribute from input - MTRR settings buffer. - If MtrrSetting is NULL, gets the default memory attribute from MSR. - - @param[in] MtrrSetting A buffer holding all MTRRs content. - @param[in] MtrrType MTRR memory type - - @return The enum item in MTRR_MEMORY_CACHE_TYPE - -**/ -MTRR_MEMORY_CACHE_TYPE -GetMemoryCacheTypeFromMtrrType ( - IN MTRR_SETTINGS *MtrrSetting, - IN UINT64 MtrrType - ) -{ - switch (MtrrType) { - case MTRR_CACHE_UNCACHEABLE: - return CacheUncacheable; - case MTRR_CACHE_WRITE_COMBINING: - return CacheWriteCombining; - case MTRR_CACHE_WRITE_THROUGH: - return CacheWriteThrough; - case MTRR_CACHE_WRITE_PROTECTED: - return CacheWriteProtected; - case MTRR_CACHE_WRITE_BACK: - return CacheWriteBack; - default: - // - // MtrrType is MTRR_CACHE_INVALID_TYPE, that means - // no MTRR covers the range - // - return MtrrGetDefaultMemoryTypeWorker (MtrrSetting); - } -} - /** Initializes the valid bits mask and valid address mask for MTRRs. @@ -1030,71 +1006,34 @@ MtrrLibInitializeMtrrMask ( Determines the real attribute of a memory range. This function is to arbitrate the real attribute of the memory when - there are 2 MTRRs covers the same memory range. For further details, + there are 2 MTRRs covers the same memory range. For further details, please refer the IA32 Software Developer's Manual, Volume 3, - Section 10.11.4.1. + Section "MTRR Precedences". @param[in] MtrrType1 The first kind of Memory type @param[in] MtrrType2 The second kind of memory type **/ -UINT64 +MTRR_MEMORY_CACHE_TYPE MtrrLibPrecedence ( - IN UINT64 MtrrType1, - IN UINT64 MtrrType2 + IN MTRR_MEMORY_CACHE_TYPE MtrrType1, + IN MTRR_MEMORY_CACHE_TYPE MtrrType2 ) { - UINT64 MtrrType; - - MtrrType = MTRR_CACHE_INVALID_TYPE; - switch (MtrrType1) { - case MTRR_CACHE_UNCACHEABLE: - MtrrType = MTRR_CACHE_UNCACHEABLE; - break; - case MTRR_CACHE_WRITE_COMBINING: - if ( - MtrrType2==MTRR_CACHE_WRITE_COMBINING || - MtrrType2==MTRR_CACHE_UNCACHEABLE - ) { - MtrrType = MtrrType2; - } - break; - case MTRR_CACHE_WRITE_THROUGH: - if ( - MtrrType2==MTRR_CACHE_WRITE_THROUGH || - MtrrType2==MTRR_CACHE_WRITE_BACK - ) { - MtrrType = MTRR_CACHE_WRITE_THROUGH; - } else if(MtrrType2==MTRR_CACHE_UNCACHEABLE) { - MtrrType = MTRR_CACHE_UNCACHEABLE; - } - break; - case MTRR_CACHE_WRITE_PROTECTED: - if (MtrrType2 == MTRR_CACHE_WRITE_PROTECTED || - MtrrType2 == MTRR_CACHE_UNCACHEABLE) { - MtrrType = MtrrType2; - } - break; - case MTRR_CACHE_WRITE_BACK: - if ( - MtrrType2== MTRR_CACHE_UNCACHEABLE || - MtrrType2==MTRR_CACHE_WRITE_THROUGH || - MtrrType2== MTRR_CACHE_WRITE_BACK - ) { - MtrrType = MtrrType2; - } - break; - case MTRR_CACHE_INVALID_TYPE: - MtrrType = MtrrType2; - break; - default: - break; + if (MtrrType1 == MtrrType2) { + return MtrrType1; } - if (MtrrType2 == MTRR_CACHE_INVALID_TYPE) { - MtrrType = MtrrType1; + ASSERT ( + MtrrLibTypeLeftPrecedeRight (MtrrType1, MtrrType2) || + MtrrLibTypeLeftPrecedeRight (MtrrType2, MtrrType1) + ); + + if (MtrrLibTypeLeftPrecedeRight (MtrrType1, MtrrType2)) { + return MtrrType1; + } else { + return MtrrType2; } - return MtrrType; } /** @@ -1116,29 +1055,27 @@ MtrrGetMemoryAttributeByAddressWorker ( IN PHYSICAL_ADDRESS Address ) { - UINT64 TempQword; - UINTN Index; - UINTN SubIndex; - UINT64 MtrrType; - UINT64 TempMtrrType; - MTRR_MEMORY_CACHE_TYPE CacheType; - VARIABLE_MTRR VariableMtrr[MTRR_NUMBER_OF_VARIABLE_MTRR]; - UINT64 MtrrValidBitsMask; - UINT64 MtrrValidAddressMask; - UINTN VariableMtrrCount; - MTRR_VARIABLE_SETTINGS VariableSettings; + MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; + UINT64 FixedMtrr; + UINTN Index; + UINTN SubIndex; + MTRR_MEMORY_CACHE_TYPE MtrrType; + VARIABLE_MTRR VariableMtrr[MTRR_NUMBER_OF_VARIABLE_MTRR]; + UINT64 MtrrValidBitsMask; + UINT64 MtrrValidAddressMask; + UINT32 VariableMtrrCount; + MTRR_VARIABLE_SETTINGS VariableSettings; // // Check if MTRR is enabled, if not, return UC as attribute // if (MtrrSetting == NULL) { - TempQword = AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE); + DefType.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); } else { - TempQword = MtrrSetting->MtrrDefType; + DefType.Uint64 = MtrrSetting->MtrrDefType; } - MtrrType = MTRR_CACHE_INVALID_TYPE; - if ((TempQword & MTRR_LIB_CACHE_MTRR_ENABLED) == 0) { + if (DefType.Bits.E == 0) { return CacheUncacheable; } @@ -1146,65 +1083,66 @@ MtrrGetMemoryAttributeByAddressWorker ( // If address is less than 1M, then try to go through the fixed MTRR // if (Address < BASE_1MB) { - if ((TempQword & MTRR_LIB_CACHE_FIXED_MTRR_ENABLED) != 0) { + if (DefType.Bits.FE != 0) { // // Go through the fixed MTRR // for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) { - if (Address >= mMtrrLibFixedMtrrTable[Index].BaseAddress && - Address < ( - mMtrrLibFixedMtrrTable[Index].BaseAddress + - (mMtrrLibFixedMtrrTable[Index].Length * 8) - ) - ) { - SubIndex = - ((UINTN)Address - mMtrrLibFixedMtrrTable[Index].BaseAddress) / - mMtrrLibFixedMtrrTable[Index].Length; - if (MtrrSetting == NULL) { - TempQword = AsmReadMsr64 (mMtrrLibFixedMtrrTable[Index].Msr); - } else { - TempQword = MtrrSetting->Fixed.Mtrr[Index]; - } - MtrrType = RShiftU64 (TempQword, SubIndex * 8) & 0xFF; - return GetMemoryCacheTypeFromMtrrType (MtrrSetting, MtrrType); - } + if (Address >= mMtrrLibFixedMtrrTable[Index].BaseAddress && + Address < mMtrrLibFixedMtrrTable[Index].BaseAddress + + (mMtrrLibFixedMtrrTable[Index].Length * 8)) { + SubIndex = + ((UINTN) Address - mMtrrLibFixedMtrrTable[Index].BaseAddress) / + mMtrrLibFixedMtrrTable[Index].Length; + if (MtrrSetting == NULL) { + FixedMtrr = AsmReadMsr64 (mMtrrLibFixedMtrrTable[Index].Msr); + } else { + FixedMtrr = MtrrSetting->Fixed.Mtrr[Index]; + } + return (MTRR_MEMORY_CACHE_TYPE) (RShiftU64 (FixedMtrr, SubIndex * 8) & 0xFF); + } } } } - MtrrLibInitializeMtrrMask(&MtrrValidBitsMask, &MtrrValidAddressMask); - MtrrGetVariableMtrrWorker ( - MtrrSetting, - GetVariableMtrrCountWorker (), - &VariableSettings - ); + VariableMtrrCount = GetVariableMtrrCountWorker (); + ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR); + MtrrGetVariableMtrrWorker (MtrrSetting, VariableMtrrCount, &VariableSettings); + MtrrLibInitializeMtrrMask (&MtrrValidBitsMask, &MtrrValidAddressMask); MtrrGetMemoryAttributeInVariableMtrrWorker ( - &VariableSettings, - GetFirmwareVariableMtrrCountWorker (), - MtrrValidBitsMask, - MtrrValidAddressMask, - VariableMtrr - ); + &VariableSettings, + VariableMtrrCount, + MtrrValidBitsMask, + MtrrValidAddressMask, + VariableMtrr + ); // // Go through the variable MTRR // - VariableMtrrCount = GetVariableMtrrCountWorker (); - ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR); - + MtrrType = CacheInvalid; for (Index = 0; Index < VariableMtrrCount; Index++) { if (VariableMtrr[Index].Valid) { if (Address >= VariableMtrr[Index].BaseAddress && - Address < VariableMtrr[Index].BaseAddress+VariableMtrr[Index].Length) { - TempMtrrType = VariableMtrr[Index].Type; - MtrrType = MtrrLibPrecedence (MtrrType, TempMtrrType); + Address < VariableMtrr[Index].BaseAddress + VariableMtrr[Index].Length) { + if (MtrrType == CacheInvalid) { + MtrrType = (MTRR_MEMORY_CACHE_TYPE) VariableMtrr[Index].Type; + } else { + MtrrType = MtrrLibPrecedence (MtrrType, (MTRR_MEMORY_CACHE_TYPE) VariableMtrr[Index].Type); + } } } } - CacheType = GetMemoryCacheTypeFromMtrrType (MtrrSetting, MtrrType); - return CacheType; + // + // If there is no MTRR which covers the Address, use the default MTRR type. + // + if (MtrrType == CacheInvalid) { + MtrrType = (MTRR_MEMORY_CACHE_TYPE) DefType.Bits.Type; + } + + return MtrrType; } @@ -1437,6 +1375,8 @@ MtrrLibSetMemoryType ( UINT32 EndIndex; UINT32 DeltaCount; + LengthRight = 0; + LengthLeft = 0; Limit = BaseAddress + Length; StartIndex = *Count; EndIndex = *Count; @@ -1596,6 +1536,7 @@ MtrrLibAddVariableMtrr ( MTRR_LIB_ASSERT_ALIGNED (BaseAddress, Length); if (Type == CacheInvalid) { + ASSERT (Ranges != NULL); for (Index = 0; Index < RangeCount; Index++) { if (Ranges[Index].BaseAddress <= BaseAddress && BaseAddress < Ranges[Index].BaseAddress + Ranges[Index].Length) { @@ -1689,6 +1630,8 @@ MtrrLibSetMemoryAttributeInVariableMtrr ( UINT32 SubtractiveRight; BOOLEAN UseLeastAlignment; + Alignment = 0; + MtrrNumber = MtrrLibGetMtrrNumber (Ranges, RangeCount, VariableMtrr, *VariableMtrrCount, BaseAddress, Length, Type, Alignment0, &SubtractiveLeft, &SubtractiveRight); @@ -1913,6 +1856,8 @@ MtrrSetMemoryAttributeWorker ( if (((BaseAddress & ~MtrrValidAddressMask) != 0) || (Length & ~MtrrValidAddressMask) != 0) { return RETURN_UNSUPPORTED; } + OriginalVariableMtrrCount = 0; + VariableSettings = NULL; ZeroMem (&WorkingFixedSettings, sizeof (WorkingFixedSettings)); for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) { @@ -2083,25 +2028,27 @@ MtrrSetMemoryAttributeWorker ( ASSERT (OriginalVariableMtrrCount - FreeVariableMtrrCount <= FirmwareVariableMtrrCount); // - // Move MTRRs after the FirmwraeVariableMtrrCount position to beginning + // Move MTRRs after the FirmwareVariableMtrrCount position to beginning // - WorkingIndex = FirmwareVariableMtrrCount; - for (Index = 0; Index < FirmwareVariableMtrrCount; Index++) { - if (!OriginalVariableMtrr[Index].Valid) { - // - // Found an empty MTRR in WorkingIndex position - // - for (; WorkingIndex < OriginalVariableMtrrCount; WorkingIndex++) { - if (OriginalVariableMtrr[WorkingIndex].Valid) { - break; + if (FirmwareVariableMtrrCount < OriginalVariableMtrrCount) { + WorkingIndex = FirmwareVariableMtrrCount; + for (Index = 0; Index < FirmwareVariableMtrrCount; Index++) { + if (!OriginalVariableMtrr[Index].Valid) { + // + // Found an empty MTRR in WorkingIndex position + // + for (; WorkingIndex < OriginalVariableMtrrCount; WorkingIndex++) { + if (OriginalVariableMtrr[WorkingIndex].Valid) { + break; + } } - } - if (WorkingIndex != OriginalVariableMtrrCount) { - CopyMem (&OriginalVariableMtrr[Index], &OriginalVariableMtrr[WorkingIndex], sizeof (VARIABLE_MTRR)); - VariableSettingModified[Index] = TRUE; - VariableSettingModified[WorkingIndex] = TRUE; - OriginalVariableMtrr[WorkingIndex].Valid = FALSE; + if (WorkingIndex != OriginalVariableMtrrCount) { + CopyMem (&OriginalVariableMtrr[Index], &OriginalVariableMtrr[WorkingIndex], sizeof (VARIABLE_MTRR)); + VariableSettingModified[Index] = TRUE; + VariableSettingModified[WorkingIndex] = TRUE; + OriginalVariableMtrr[WorkingIndex].Valid = FALSE; + } } } } @@ -2114,7 +2061,7 @@ MtrrSetMemoryAttributeWorker ( if (VariableSettingModified[Index]) { if (OriginalVariableMtrr[Index].Valid) { VariableSettings->Mtrr[Index].Base = (OriginalVariableMtrr[Index].BaseAddress & MtrrValidAddressMask) | (UINT8) OriginalVariableMtrr[Index].Type; - VariableSettings->Mtrr[Index].Mask = (~(OriginalVariableMtrr[Index].Length - 1)) & MtrrValidAddressMask | BIT11; + VariableSettings->Mtrr[Index].Mask = ((~(OriginalVariableMtrr[Index].Length - 1)) & MtrrValidAddressMask) | BIT11; } else { VariableSettings->Mtrr[Index].Base = 0; VariableSettings->Mtrr[Index].Mask = 0; @@ -2147,6 +2094,8 @@ Done: // // Write variable MTRRs + // When only fixed MTRRs were changed, below loop doesn't run + // because OriginalVariableMtrrCount equals to 0. // for (Index = 0; Index < OriginalVariableMtrrCount; Index++) { if (VariableSettingModified[Index]) { @@ -2168,7 +2117,7 @@ Done: MtrrLibPostMtrrChange (&MtrrContext); } - return Status; + return RETURN_SUCCESS; } /** @@ -2283,11 +2232,11 @@ MtrrSetVariableMtrrWorker ( for (Index = 0; Index < VariableMtrrCount; Index++) { AsmWriteMsr64 ( - MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1), + MSR_IA32_MTRR_PHYSBASE0 + (Index << 1), VariableSettings->Mtrr[Index].Base ); AsmWriteMsr64 ( - MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1) + 1, + MSR_IA32_MTRR_PHYSMASK0 + (Index << 1), VariableSettings->Mtrr[Index].Mask ); } @@ -2408,7 +2357,7 @@ MtrrGetAllMtrrs ( // // Get MTRR_DEF_TYPE value // - MtrrSetting->MtrrDefType = AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE); + MtrrSetting->MtrrDefType = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); return MtrrSetting; } @@ -2449,7 +2398,7 @@ MtrrSetAllMtrrs ( // // Set MTRR_DEF_TYPE value // - AsmWriteMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE, MtrrSetting->MtrrDefType); + AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, MtrrSetting->MtrrDefType); MtrrLibPostMtrrChangeEnableCache (&MtrrContext);