Add Checking for MTRR existence.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10223 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
xli24 2010-03-10 02:38:39 +00:00
parent c4ae2792f2
commit 947a573ada
3 changed files with 108 additions and 1 deletions

View File

@ -590,6 +590,10 @@ CpuSetMemoryAttributes (
RETURN_STATUS Status; RETURN_STATUS Status;
MTRR_MEMORY_CACHE_TYPE CacheType; MTRR_MEMORY_CACHE_TYPE CacheType;
if (!IsMtrrSupported ()) {
return EFI_UNSUPPORTED;
}
DEBUG((EFI_D_ERROR, "CpuAp: SetMemorySpaceAttributes(BA=%08x, Len=%08x, Attr=%08x)\n", BaseAddress, Length, Attributes)); DEBUG((EFI_D_ERROR, "CpuAp: SetMemorySpaceAttributes(BA=%08x, Len=%08x, Attr=%08x)\n", BaseAddress, Length, Attributes));
// //
@ -856,6 +860,10 @@ RefreshGcdMemoryAttributes (
MTRR_FIXED_SETTINGS MtrrFixedSettings; MTRR_FIXED_SETTINGS MtrrFixedSettings;
UINT32 FirmwareVariableMtrrCount; UINT32 FirmwareVariableMtrrCount;
if (!IsMtrrSupported ()) {
return;
}
FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount (); FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();
ASSERT (FirmwareVariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR); ASSERT (FirmwareVariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);

View File

@ -314,4 +314,16 @@ VOID
MtrrDebugPrintAllMtrrs ( MtrrDebugPrintAllMtrrs (
); );
/**
Checks if MTRR is supported.
@retval TRUE MTRR is supported.
@retval FALSE MTRR is not supported.
**/
BOOLEAN
IsMtrrSupported (
VOID
);
#endif // _MTRR_LIB_H_ #endif // _MTRR_LIB_H_

View File

@ -93,6 +93,10 @@ GetVariableMtrrCount (
VOID VOID
) )
{ {
if (!IsMtrrSupported ()) {
return 0;
}
return (UINT32)(AsmReadMsr64 (MTRR_LIB_IA32_MTRR_CAP) & MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK); return (UINT32)(AsmReadMsr64 (MTRR_LIB_IA32_MTRR_CAP) & MTRR_LIB_IA32_MTRR_CAP_VCNT_MASK);
} }
@ -107,7 +111,14 @@ GetFirmwareVariableMtrrCount (
VOID VOID
) )
{ {
return GetVariableMtrrCount () - RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER; UINT32 VariableMtrrCount;
VariableMtrrCount = GetVariableMtrrCount ();
if (VariableMtrrCount < RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER) {
return 0;
}
return VariableMtrrCount - RESERVED_FIRMWARE_VARIABLE_MTRR_NUMBER;
} }
/** /**
@ -319,6 +330,10 @@ MtrrGetMemoryAttributeInVariableMtrr (
UINT32 FirmwareVariableMtrrCount; UINT32 FirmwareVariableMtrrCount;
UINT32 VariableMtrrEnd; UINT32 VariableMtrrEnd;
if (!IsMtrrSupported ()) {
return 0;
}
FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount (); FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();
VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1; VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1;
@ -870,6 +885,10 @@ MtrrSetMemoryAttribute (
UINT32 FirmwareVariableMtrrCount; UINT32 FirmwareVariableMtrrCount;
UINT32 VariableMtrrEnd; UINT32 VariableMtrrEnd;
if (!IsMtrrSupported ()) {
return RETURN_UNSUPPORTED;
}
FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount (); FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();
VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1; VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1;
@ -1110,6 +1129,10 @@ MtrrGetMemoryAttribute (
UINT64 MtrrValidAddressMask; UINT64 MtrrValidAddressMask;
UINTN VariableMtrrCount; UINTN VariableMtrrCount;
if (!IsMtrrSupported ()) {
return CacheUncacheable;
}
// //
// Check if MTRR is enabled, if not, return UC as attribute // Check if MTRR is enabled, if not, return UC as attribute
// //
@ -1190,6 +1213,10 @@ MtrrGetVariableMtrr (
UINT32 Index; UINT32 Index;
UINT32 VariableMtrrCount; UINT32 VariableMtrrCount;
if (!IsMtrrSupported ()) {
return VariableSettings;
}
VariableMtrrCount = GetVariableMtrrCount (); VariableMtrrCount = GetVariableMtrrCount ();
ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR); ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);
@ -1250,6 +1277,10 @@ MtrrSetVariableMtrr (
{ {
UINTN Cr4; UINTN Cr4;
if (!IsMtrrSupported ()) {
return VariableSettings;
}
Cr4 = PreMtrrChange (); Cr4 = PreMtrrChange ();
MtrrSetVariableMtrrWorker (VariableSettings); MtrrSetVariableMtrrWorker (VariableSettings);
PostMtrrChange (Cr4); PostMtrrChange (Cr4);
@ -1273,6 +1304,10 @@ MtrrGetFixedMtrr (
{ {
UINT32 Index; UINT32 Index;
if (!IsMtrrSupported ()) {
return FixedSettings;
}
for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) { for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) {
FixedSettings->Mtrr[Index] = FixedSettings->Mtrr[Index] =
AsmReadMsr64 (MtrrLibFixedMtrrTable[Index].Msr); AsmReadMsr64 (MtrrLibFixedMtrrTable[Index].Msr);
@ -1319,6 +1354,10 @@ MtrrSetFixedMtrr (
{ {
UINTN Cr4; UINTN Cr4;
if (!IsMtrrSupported ()) {
return FixedSettings;
}
Cr4 = PreMtrrChange (); Cr4 = PreMtrrChange ();
MtrrSetFixedMtrrWorker (FixedSettings); MtrrSetFixedMtrrWorker (FixedSettings);
PostMtrrChange (Cr4); PostMtrrChange (Cr4);
@ -1341,6 +1380,10 @@ MtrrGetAllMtrrs (
OUT MTRR_SETTINGS *MtrrSetting OUT MTRR_SETTINGS *MtrrSetting
) )
{ {
if (!IsMtrrSupported ()) {
return MtrrSetting;
}
// //
// Get fixed MTRRs // Get fixed MTRRs
// //
@ -1376,6 +1419,10 @@ MtrrSetAllMtrrs (
{ {
UINTN Cr4; UINTN Cr4;
if (!IsMtrrSupported ()) {
return MtrrSetting;
}
Cr4 = PreMtrrChange (); Cr4 = PreMtrrChange ();
// //
@ -1412,6 +1459,10 @@ MtrrDebugPrintAllMtrrs (
UINTN Index; UINTN Index;
UINTN VariableMtrrCount; UINTN VariableMtrrCount;
if (!IsMtrrSupported ()) {
return;
}
MtrrGetAllMtrrs (&MtrrSettings); MtrrGetAllMtrrs (&MtrrSettings);
DEBUG((EFI_D_ERROR, "DefaultType = %016lx\n", MtrrSettings.MtrrDefType)); DEBUG((EFI_D_ERROR, "DefaultType = %016lx\n", MtrrSettings.MtrrDefType));
for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) { for (Index = 0; Index < MTRR_NUMBER_OF_FIXED_MTRR; Index++) {
@ -1435,3 +1486,39 @@ MtrrDebugPrintAllMtrrs (
); );
} }
/**
Checks if MTRR is supported.
@retval TRUE MTRR is supported.
@retval FALSE MTRR is not supported.
**/
BOOLEAN
EFIAPI
IsMtrrSupported (
VOID
)
{
UINT32 RegEdx;
UINT64 MtrrCap;
//
// Check CPUID(1).EDX[12] for MTRR capability
//
AsmCpuid (1, NULL, NULL, NULL, &RegEdx);
if (BitFieldRead32 (RegEdx, 12, 12) == 0) {
return FALSE;
}
//
// Check IA32_MTRRCAP.[0..7] for number of variable MTRRs and IA32_MTRRCAP[8] for
// fixed MTRRs existence. If number of variable MTRRs is zero, or fixed MTRRs do not
// exist, return false.
//
MtrrCap = AsmReadMsr64 (MTRR_LIB_IA32_MTRR_CAP);
if ((BitFieldRead64 (MtrrCap, 0, 7) == 0) || (BitFieldRead64 (MtrrCap, 8, 8) == 0)) {
return FALSE;
}
return TRUE;
}