MdeModulePkg/DxeIpl: disable paging before creating new page table

PEI Stack Guard needs to enable paging before DxeIpl. This might cause
#GP in the transition from 32-bit PEI to 64-bit DXE due to the code
trying to write CR3 register with PML4 page table while the processor
is enabled with PAE paging.

Simply disabling paging before updating CR3 can solve this conflict.
There's no such issue for 64-bit PEI so this change applies only to
32-bit code.

Cc: Star Zeng <star.zeng@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: "Ware, Ryan R" <ryan.r.ware@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Jian J Wang <jian.j.wang@intel.com>
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
This commit is contained in:
Jian J Wang 2018-08-23 15:58:31 +08:00
parent 4b2dc555d8
commit 2af2988f3a
1 changed files with 10 additions and 0 deletions

View File

@ -325,6 +325,11 @@ HandOffToDxeCore (
PERF_EVENT_SIGNAL_END (gEndOfPeiSignalPpi.Guid); PERF_EVENT_SIGNAL_END (gEndOfPeiSignalPpi.Guid);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
//
// Paging might be already enabled. To avoid conflict configuration,
// disable paging first anyway.
//
AsmWriteCr0 (AsmReadCr0 () & (~BIT31));
AsmWriteCr3 (PageTables); AsmWriteCr3 (PageTables);
// //
@ -445,6 +450,11 @@ HandOffToDxeCore (
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (BuildPageTablesIa32Pae) { if (BuildPageTablesIa32Pae) {
//
// Paging might be already enabled. To avoid conflict configuration,
// disable paging first anyway.
//
AsmWriteCr0 (AsmReadCr0 () & (~BIT31));
AsmWriteCr3 (PageTables); AsmWriteCr3 (PageTables);
// //
// Set Physical Address Extension (bit 5 of CR4). // Set Physical Address Extension (bit 5 of CR4).