summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorJian J Wang <jian.j.wang@intel.com>2017-12-15 10:25:12 +0800
committerStar Zeng <star.zeng@intel.com>2017-12-15 12:14:52 +0800
commit41b4600c308d13fc90cef308c8fbb8f0e15f4e5f (patch)
tree3b902526d9fc57b0dd52a3fd64e034aa969b7159 /MdeModulePkg
parentb36acb21c0ff7e8502627a71673d37e996aeb4b6 (diff)
downloadedk2-41b4600c308d13fc90cef308c8fbb8f0e15f4e5f.tar.gz
edk2-41b4600c308d13fc90cef308c8fbb8f0e15f4e5f.tar.bz2
edk2-41b4600c308d13fc90cef308c8fbb8f0e15f4e5f.zip
MdeModulePkg/DxeIplPeim: fix incorrect page table split during protecting
The root cause of this issue is that, during splitting page table, the page size should be the value of next level (smaller one) instead of current level. The wrong page size will then cause wrong page table introduced, which will break the normal boot. Validation works include booting to Windows 10 and Fedora 26 on real Intel platform and OVMF emulated platform in addition to manual checks on page table with JTAG tool. Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Eric Dong <eric.dong@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>
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
index 26116e420c..bbdfa2bb8e 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
@@ -472,6 +472,8 @@ SetPageTablePoolReadOnly (
//
// The smaller granularity of page must be needed.
//
+ ASSERT (Level > 1);
+
NewPageTable = AllocatePageTableMemory (1);
ASSERT (NewPageTable != NULL);
@@ -481,10 +483,10 @@ SetPageTablePoolReadOnly (
++EntryIndex) {
NewPageTable[EntryIndex] = PhysicalAddress | AddressEncMask |
IA32_PG_P | IA32_PG_RW;
- if (Level > 1) {
+ if (Level > 2) {
NewPageTable[EntryIndex] |= IA32_PG_PS;
}
- PhysicalAddress += LevelSize[Level];
+ PhysicalAddress += LevelSize[Level - 1];
}
PageTable[Index] = (UINT64)(UINTN)NewPageTable | AddressEncMask |