UINTN BitStart;\r
UINTN Index;\r
IA32_PAGING_ENTRY *PagingEntry;\r
+ IA32_PAGING_ENTRY *CurrentPagingEntry;\r
UINT64 RegionLength;\r
UINT64 SubLength;\r
UINT64 SubOffset;\r
//\r
PagingEntry = (IA32_PAGING_ENTRY *)(UINTN)IA32_PNLE_PAGE_TABLE_BASE_ADDRESS (&ParentPagingEntry->Pnle);\r
while (Offset < Length && Index < 512) {\r
- SubLength = MIN (Length - Offset, RegionStart + RegionLength - (LinearAddress + Offset));\r
+ CurrentPagingEntry = (!Modify && CreateNew) ? &OneOfPagingEntry : &PagingEntry[Index];\r
+ SubLength = MIN (Length - Offset, RegionStart + RegionLength - (LinearAddress + Offset));\r
if ((Level <= MaxLeafLevel) &&\r
(((LinearAddress + Offset) & RegionMask) == 0) &&\r
(((IA32_MAP_ATTRIBUTE_PAGE_TABLE_BASE_ADDRESS (Attribute) + Offset) & RegionMask) == 0) &&\r
- (SubLength == RegionLength)\r
+ (SubLength == RegionLength) &&\r
+ ((CurrentPagingEntry->Pce.Present == 0) || IsPle (CurrentPagingEntry, Level))\r
)\r
{\r
//\r
// Create one entry mapping the entire region (1G, 2M or 4K).\r
//\r
if (Modify) {\r
- PageTableLibSetPle (Level, &PagingEntry[Index], Offset, Attribute, Mask);\r
+ PageTableLibSetPle (Level, CurrentPagingEntry, Offset, Attribute, Mask);\r
}\r
} else {\r
//\r
// but the length is SMALLER than the RegionLength.\r
//\r
Status = PageTableLibMapInLevel (\r
- (!Modify && CreateNew) ? &OneOfPagingEntry : &PagingEntry[Index],\r
+ CurrentPagingEntry,\r
Modify,\r
Buffer,\r
BufferSize,\r