/**\r
Worker function returns the default MTRR cache type for the system.\r
\r
+ If MtrrSetting is not NULL, returns the default MTRR cache type from input\r
+ MTRR settings buffer.\r
+ If MtrrSetting is NULL, returns the default MTRR cache type from MSR.\r
+\r
+ @param[in] MtrrSetting A buffer holding all MTRRs content.\r
+\r
@return The default MTRR cache type.\r
\r
**/\r
MTRR_MEMORY_CACHE_TYPE\r
MtrrGetDefaultMemoryTypeWorker (\r
- VOID\r
+ IN MTRR_SETTINGS *MtrrSetting\r
)\r
{\r
- return (MTRR_MEMORY_CACHE_TYPE) (AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE) & 0x7);\r
+ if (MtrrSetting == NULL) {\r
+ return (MTRR_MEMORY_CACHE_TYPE) (AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE) & 0x7);\r
+ } else {\r
+ return (MTRR_MEMORY_CACHE_TYPE) (MtrrSetting->MtrrDefType & 0x7);\r
+ }\r
}\r
\r
\r
if (!IsMtrrSupported ()) {\r
return CacheUncacheable;\r
}\r
- return MtrrGetDefaultMemoryTypeWorker ();\r
+ return MtrrGetDefaultMemoryTypeWorker (NULL);\r
}\r
\r
/**\r
/**\r
Worker function will get the raw value in variable MTRRs\r
\r
+ If MtrrSetting is not NULL, gets the variable MTRRs raw value from input\r
+ MTRR settings buffer.\r
+ If MtrrSetting is NULL, gets the variable MTRRs raw value from MTRRs.\r
+\r
+ @param[in] MtrrSetting A buffer holding all MTRRs content.\r
+ @param[in] VariableMtrrCount Number of variable MTRRs.\r
@param[out] VariableSettings A buffer to hold variable MTRRs content.\r
\r
@return The VariableSettings input pointer\r
**/\r
MTRR_VARIABLE_SETTINGS*\r
MtrrGetVariableMtrrWorker (\r
+ IN MTRR_SETTINGS *MtrrSetting,\r
IN UINT32 VariableMtrrCount,\r
OUT MTRR_VARIABLE_SETTINGS *VariableSettings\r
)\r
ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);\r
\r
for (Index = 0; Index < VariableMtrrCount; Index++) {\r
- VariableSettings->Mtrr[Index].Base =\r
- AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1));\r
- VariableSettings->Mtrr[Index].Mask =\r
- AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1) + 1);\r
+ if (MtrrSetting == NULL) {\r
+ VariableSettings->Mtrr[Index].Base =\r
+ AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1));\r
+ VariableSettings->Mtrr[Index].Mask =\r
+ AsmReadMsr64 (MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (Index << 1) + 1);\r
+ } else {\r
+ VariableSettings->Mtrr[Index].Base = MtrrSetting->Variables.Mtrr[Index].Base;\r
+ VariableSettings->Mtrr[Index].Mask = MtrrSetting->Variables.Mtrr[Index].Mask;\r
+ }\r
}\r
\r
return VariableSettings;\r
}\r
\r
return MtrrGetVariableMtrrWorker (\r
+ NULL,\r
GetVariableMtrrCountWorker (),\r
VariableSettings\r
);\r
}\r
\r
MtrrGetVariableMtrrWorker (\r
+ NULL,\r
GetVariableMtrrCountWorker (),\r
&VariableSettings\r
);\r
/**\r
Converts the Memory attribute value to MTRR_MEMORY_CACHE_TYPE.\r
\r
+ If MtrrSetting is not NULL, gets the default memory attribute from input\r
+ MTRR settings buffer.\r
+ If MtrrSetting is NULL, gets the default memory attribute from MSR.\r
+\r
+ @param[in] MtrrSetting A buffer holding all MTRRs content.\r
@param[in] MtrrType MTRR memory type\r
\r
@return The enum item in MTRR_MEMORY_CACHE_TYPE\r
**/\r
MTRR_MEMORY_CACHE_TYPE\r
GetMemoryCacheTypeFromMtrrType (\r
+ IN MTRR_SETTINGS *MtrrSetting,\r
IN UINT64 MtrrType\r
)\r
{\r
// MtrrType is MTRR_CACHE_INVALID_TYPE, that means\r
// no MTRR covers the range\r
//\r
- return MtrrGetDefaultMemoryType ();\r
+ return MtrrGetDefaultMemoryTypeWorker (MtrrSetting);\r
}\r
}\r
\r
return MtrrType;\r
}\r
\r
-\r
-\r
/**\r
- This function will get the memory cache type of the specific address.\r
+ Worker function will get the memory cache type of the specific address.\r
\r
- This function is mainly for debug purpose.\r
+ If MtrrSetting is not NULL, gets the memory cache type from input\r
+ MTRR settings buffer.\r
+ If MtrrSetting is NULL, gets the memory cache type from MTRRs.\r
\r
+ @param[in] MtrrSetting A buffer holding all MTRRs content.\r
@param[in] Address The specific address\r
\r
@return Memory cache type of the specific address\r
\r
**/\r
MTRR_MEMORY_CACHE_TYPE\r
-EFIAPI\r
-MtrrGetMemoryAttribute (\r
+MtrrGetMemoryAttributeByAddressWorker (\r
+ IN MTRR_SETTINGS *MtrrSetting,\r
IN PHYSICAL_ADDRESS Address\r
)\r
{\r
UINTN VariableMtrrCount;\r
MTRR_VARIABLE_SETTINGS VariableSettings;\r
\r
- if (!IsMtrrSupported ()) {\r
- return CacheUncacheable;\r
- }\r
-\r
//\r
// Check if MTRR is enabled, if not, return UC as attribute\r
//\r
- TempQword = AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE);\r
+ if (MtrrSetting == NULL) {\r
+ TempQword = AsmReadMsr64 (MTRR_LIB_IA32_MTRR_DEF_TYPE);\r
+ } else {\r
+ TempQword = MtrrSetting->MtrrDefType;\r
+ }\r
MtrrType = MTRR_CACHE_INVALID_TYPE;\r
\r
if ((TempQword & MTRR_LIB_CACHE_MTRR_ENABLED) == 0) {\r
SubIndex =\r
((UINTN)Address - mMtrrLibFixedMtrrTable[Index].BaseAddress) /\r
mMtrrLibFixedMtrrTable[Index].Length;\r
- TempQword = AsmReadMsr64 (mMtrrLibFixedMtrrTable[Index].Msr);\r
+ if (MtrrSetting == NULL) {\r
+ TempQword = AsmReadMsr64 (mMtrrLibFixedMtrrTable[Index].Msr);\r
+ } else {\r
+ TempQword = MtrrSetting->Fixed.Mtrr[Index];\r
+ }\r
MtrrType = RShiftU64 (TempQword, SubIndex * 8) & 0xFF;\r
- return GetMemoryCacheTypeFromMtrrType (MtrrType);\r
+ return GetMemoryCacheTypeFromMtrrType (MtrrSetting, MtrrType);\r
}\r
}\r
}\r
MtrrLibInitializeMtrrMask(&MtrrValidBitsMask, &MtrrValidAddressMask);\r
\r
MtrrGetVariableMtrrWorker (\r
+ MtrrSetting,\r
GetVariableMtrrCountWorker (),\r
&VariableSettings\r
);\r
}\r
}\r
}\r
- CacheType = GetMemoryCacheTypeFromMtrrType (MtrrType);\r
+ CacheType = GetMemoryCacheTypeFromMtrrType (MtrrSetting, MtrrType);\r
\r
return CacheType;\r
}\r
\r
\r
+/**\r
+ This function will get the memory cache type of the specific address.\r
+\r
+ This function is mainly for debug purpose.\r
+\r
+ @param[in] Address The specific address\r
+\r
+ @return Memory cache type of the specific address\r
+\r
+**/\r
+MTRR_MEMORY_CACHE_TYPE\r
+EFIAPI\r
+MtrrGetMemoryAttribute (\r
+ IN PHYSICAL_ADDRESS Address\r
+ )\r
+{\r
+ if (!IsMtrrSupported ()) {\r
+ return CacheUncacheable;\r
+ }\r
+\r
+ return MtrrGetMemoryAttributeByAddressWorker (NULL, Address);\r
+}\r
+\r
\r
/**\r
This function prints all MTRRs for debugging.\r
//\r
VariableMtrrCount = GetVariableMtrrCountWorker ();\r
FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCountWorker ();\r
- MtrrGetVariableMtrrWorker (VariableMtrrCount, &OriginalVariableSettings);\r
+ MtrrGetVariableMtrrWorker (NULL, VariableMtrrCount, &OriginalVariableSettings);\r
CopyMem (&WorkingVariableSettings, &OriginalVariableSettings, sizeof (WorkingVariableSettings));\r
ProgramVariableSettings = TRUE;\r
VariableSettings = &WorkingVariableSettings;\r
// Get variable MTRRs\r
//\r
MtrrGetVariableMtrrWorker (\r
+ NULL,\r
GetVariableMtrrCountWorker (),\r
&MtrrSetting->Variables\r
);\r