//\r
// Create 512 child-level entries that map to 2M/4K.\r
//\r
- ParentPagingEntry->Uintn = (UINTN)Buffer + *BufferSize;\r
- ZeroMem ((VOID *)ParentPagingEntry->Uintn, SIZE_4KB);\r
+ PagingEntry = (IA32_PAGING_ENTRY *)((UINTN)Buffer + *BufferSize);\r
+ ZeroMem (PagingEntry, SIZE_4KB);\r
+\r
+ for (SubOffset = 0, Index = 0; Index < 512; Index++) {\r
+ PagingEntry[Index].Uint64 = OneOfPagingEntry.Uint64 + SubOffset;\r
+ SubOffset += RegionLength;\r
+ }\r
\r
//\r
// Set NOP attributes\r
// Note: Should NOT inherit the attributes from the original entry because a zero RW bit\r
// will make the entire region read-only even the child entries set the RW bit.\r
//\r
+ // Non-leaf entry doesn't have PAT bit. So use ~IA32_PE_BASE_ADDRESS_MASK_40 is to make sure PAT bit\r
+ // (bit12) in original big-leaf entry is not assigned to PageTableBaseAddress field of non-leaf entry.\r
+ //\r
PageTableLibSetPnle (&ParentPagingEntry->Pnle, &NopAttribute, &AllOneMask);\r
-\r
- PagingEntry = (IA32_PAGING_ENTRY *)(UINTN)IA32_PNLE_PAGE_TABLE_BASE_ADDRESS (&ParentPagingEntry->Pnle);\r
- for (SubOffset = 0, Index = 0; Index < 512; Index++) {\r
- PagingEntry[Index].Uint64 = OneOfPagingEntry.Uint64 + SubOffset;\r
- SubOffset += RegionLength;\r
- }\r
+ ParentPagingEntry->Uint64 = ((UINTN)(VOID *)PagingEntry) | (ParentPagingEntry->Uint64 & (~IA32_PE_BASE_ADDRESS_MASK_40));\r
}\r
} else {\r
//\r