UefiCpuPkg/CpuDxe: Fix assert issue on IA32 platform

This patch is to fix an assert issue during booting IA32 platforms
such as OvmfIa32 or Quark. This issue is caused by trying to access
page table on a platform without page table. A check is added to
avoid the assert.

Bug tracker: https://bugzilla.tianocore.org/show_bug.cgi?id=724

Cc: Star Zeng <star.zeng@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
This commit is contained in:
Jian J Wang 2017-09-29 11:08:27 +08:00 committed by Star Zeng
parent aa57c0f096
commit c46bced224
1 changed files with 40 additions and 10 deletions

View File

@ -683,7 +683,7 @@ SetGcdMemorySpaceAttributes (
**/
VOID
RefreshGcdMemoryAttributes (
RefreshMemoryAttributesFromMtrr (
VOID
)
{
@ -704,14 +704,9 @@ RefreshGcdMemoryAttributes (
UINT32 FirmwareVariableMtrrCount;
UINT8 DefaultMemoryType;
if (!IsMtrrSupported ()) {
return;
}
FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();
ASSERT (FirmwareVariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);
mIsFlushingGCD = TRUE;
MemorySpaceMap = NULL;
//
@ -862,11 +857,46 @@ RefreshGcdMemoryAttributes (
if (MemorySpaceMap != NULL) {
FreePool (MemorySpaceMap);
}
}
//
// Update page attributes
//
RefreshGcdMemoryAttributesFromPaging();
/**
Check if paging is enabled or not.
**/
BOOLEAN
IsPagingAndPageAddressExtensionsEnabled (
VOID
)
{
IA32_CR0 Cr0;
IA32_CR4 Cr4;
Cr0.UintN = AsmReadCr0 ();
Cr4.UintN = AsmReadCr4 ();
return ((Cr0.Bits.PG != 0) && (Cr4.Bits.PAE != 0));
}
/**
Refreshes the GCD Memory Space attributes according to MTRRs and Paging.
This function refreshes the GCD Memory Space attributes according to MTRRs
and page tables.
**/
VOID
RefreshGcdMemoryAttributes (
VOID
)
{
mIsFlushingGCD = TRUE;
if (IsMtrrSupported ()) {
RefreshMemoryAttributesFromMtrr ();
}
if (IsPagingAndPageAddressExtensionsEnabled ()) {
RefreshGcdMemoryAttributesFromPaging ();
}
mIsFlushingGCD = FALSE;
}