// Global to avoid infinite reentrance of memory allocation when updating\r
// page table attributes, which may need allocating pages for new PDE/PTE.\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED BOOLEAN mOnGuarding = FALSE;\r
+GLOBAL_REMOVE_IF_UNREFERENCED BOOLEAN mOnGuarding = FALSE;\r
\r
//\r
// Pointer to table tracking the Guarded memory with bitmap, in which '1'\r
// is used to indicate memory guarded. '0' might be free memory or Guard\r
// page itself, depending on status of memory adjacent to it.\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mGuardedMemoryMap = 0;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mGuardedMemoryMap = 0;\r
\r
//\r
// Current depth level of map table pointed by mGuardedMemoryMap.\r
// mMapLevel must be initialized at least by 1. It will be automatically\r
// updated according to the address of memory just tracked.\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINTN mMapLevel = 1;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINTN mMapLevel = 1;\r
\r
//\r
// Shift and mask for each level of map table\r
//\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINTN mLevelShift[GUARDED_HEAP_MAP_TABLE_DEPTH]\r
- = GUARDED_HEAP_MAP_TABLE_DEPTH_SHIFTS;\r
-GLOBAL_REMOVE_IF_UNREFERENCED UINTN mLevelMask[GUARDED_HEAP_MAP_TABLE_DEPTH]\r
- = GUARDED_HEAP_MAP_TABLE_DEPTH_MASKS;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINTN mLevelShift[GUARDED_HEAP_MAP_TABLE_DEPTH]\r
+ = GUARDED_HEAP_MAP_TABLE_DEPTH_SHIFTS;\r
+GLOBAL_REMOVE_IF_UNREFERENCED UINTN mLevelMask[GUARDED_HEAP_MAP_TABLE_DEPTH]\r
+ = GUARDED_HEAP_MAP_TABLE_DEPTH_MASKS;\r
\r
//\r
// SMM memory attribute protocol\r
//\r
-EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL *mSmmMemoryAttribute = NULL;\r
+EDKII_SMM_MEMORY_ATTRIBUTE_PROTOCOL *mSmmMemoryAttribute = NULL;\r
\r
/**\r
Set corresponding bits in bitmap table to 1 according to the address.\r
STATIC\r
VOID\r
SetBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN BitNumber,\r
- IN UINT64 *BitMap\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN BitNumber,\r
+ IN UINT64 *BitMap\r
)\r
{\r
- UINTN Lsbs;\r
- UINTN Qwords;\r
- UINTN Msbs;\r
- UINTN StartBit;\r
- UINTN EndBit;\r
+ UINTN Lsbs;\r
+ UINTN Qwords;\r
+ UINTN Msbs;\r
+ UINTN StartBit;\r
+ UINTN EndBit;\r
\r
- StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
- EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
+ EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
\r
if ((StartBit + BitNumber) >= GUARDED_HEAP_MAP_ENTRY_BITS) {\r
- Msbs = (GUARDED_HEAP_MAP_ENTRY_BITS - StartBit) %\r
- GUARDED_HEAP_MAP_ENTRY_BITS;\r
- Lsbs = (EndBit + 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
- Qwords = (BitNumber - Msbs) / GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Msbs = (GUARDED_HEAP_MAP_ENTRY_BITS - StartBit) %\r
+ GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Lsbs = (EndBit + 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Qwords = (BitNumber - Msbs) / GUARDED_HEAP_MAP_ENTRY_BITS;\r
} else {\r
- Msbs = BitNumber;\r
- Lsbs = 0;\r
- Qwords = 0;\r
+ Msbs = BitNumber;\r
+ Lsbs = 0;\r
+ Qwords = 0;\r
}\r
\r
if (Msbs > 0) {\r
}\r
\r
if (Qwords > 0) {\r
- SetMem64 ((VOID *)BitMap, Qwords * GUARDED_HEAP_MAP_ENTRY_BYTES,\r
- (UINT64)-1);\r
+ SetMem64 (\r
+ (VOID *)BitMap,\r
+ Qwords * GUARDED_HEAP_MAP_ENTRY_BYTES,\r
+ (UINT64)-1\r
+ );\r
BitMap += Qwords;\r
}\r
\r
STATIC\r
VOID\r
ClearBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN BitNumber,\r
- IN UINT64 *BitMap\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN BitNumber,\r
+ IN UINT64 *BitMap\r
)\r
{\r
- UINTN Lsbs;\r
- UINTN Qwords;\r
- UINTN Msbs;\r
- UINTN StartBit;\r
- UINTN EndBit;\r
+ UINTN Lsbs;\r
+ UINTN Qwords;\r
+ UINTN Msbs;\r
+ UINTN StartBit;\r
+ UINTN EndBit;\r
\r
- StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
- EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
+ EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
\r
if ((StartBit + BitNumber) >= GUARDED_HEAP_MAP_ENTRY_BITS) {\r
- Msbs = (GUARDED_HEAP_MAP_ENTRY_BITS - StartBit) %\r
- GUARDED_HEAP_MAP_ENTRY_BITS;\r
- Lsbs = (EndBit + 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
- Qwords = (BitNumber - Msbs) / GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Msbs = (GUARDED_HEAP_MAP_ENTRY_BITS - StartBit) %\r
+ GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Lsbs = (EndBit + 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ Qwords = (BitNumber - Msbs) / GUARDED_HEAP_MAP_ENTRY_BITS;\r
} else {\r
- Msbs = BitNumber;\r
- Lsbs = 0;\r
- Qwords = 0;\r
+ Msbs = BitNumber;\r
+ Lsbs = 0;\r
+ Qwords = 0;\r
}\r
\r
if (Msbs > 0) {\r
STATIC\r
UINT64\r
GetBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN BitNumber,\r
- IN UINT64 *BitMap\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN BitNumber,\r
+ IN UINT64 *BitMap\r
)\r
{\r
- UINTN StartBit;\r
- UINTN EndBit;\r
- UINTN Lsbs;\r
- UINTN Msbs;\r
- UINT64 Result;\r
+ UINTN StartBit;\r
+ UINTN EndBit;\r
+ UINTN Lsbs;\r
+ UINTN Msbs;\r
+ UINT64 Result;\r
\r
ASSERT (BitNumber <= GUARDED_HEAP_MAP_ENTRY_BITS);\r
\r
- StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
- EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
+ StartBit = (UINTN)GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address);\r
+ EndBit = (StartBit + BitNumber - 1) % GUARDED_HEAP_MAP_ENTRY_BITS;\r
\r
if ((StartBit + BitNumber) > GUARDED_HEAP_MAP_ENTRY_BITS) {\r
Msbs = GUARDED_HEAP_MAP_ENTRY_BITS - StartBit;\r
Lsbs = 0;\r
}\r
\r
- if (StartBit == 0 && BitNumber == GUARDED_HEAP_MAP_ENTRY_BITS) {\r
+ if ((StartBit == 0) && (BitNumber == GUARDED_HEAP_MAP_ENTRY_BITS)) {\r
Result = *BitMap;\r
} else {\r
- Result = RShiftU64((*BitMap), StartBit) & (LShiftU64(1, Msbs) - 1);\r
+ Result = RShiftU64 ((*BitMap), StartBit) & (LShiftU64 (1, Msbs) - 1);\r
if (Lsbs > 0) {\r
- BitMap += 1;\r
- Result |= LShiftU64 ((*BitMap) & (LShiftU64 (1, Lsbs) - 1), Msbs);\r
+ BitMap += 1;\r
+ Result |= LShiftU64 ((*BitMap) & (LShiftU64 (1, Lsbs) - 1), Msbs);\r
}\r
}\r
\r
IN UINTN Pages\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_PHYSICAL_ADDRESS Memory;\r
-\r
- Status = SmmInternalAllocatePages (AllocateAnyPages, EfiRuntimeServicesData,\r
- Pages, &Memory, FALSE);\r
+ EFI_STATUS Status;\r
+ EFI_PHYSICAL_ADDRESS Memory;\r
+\r
+ Status = SmmInternalAllocatePages (\r
+ AllocateAnyPages,\r
+ EfiRuntimeServicesData,\r
+ Pages,\r
+ &Memory,\r
+ FALSE\r
+ );\r
if (EFI_ERROR (Status)) {\r
Memory = 0;\r
}\r
**/\r
UINTN\r
FindGuardedMemoryMap (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN BOOLEAN AllocMapUnit,\r
- OUT UINT64 **BitMap\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN BOOLEAN AllocMapUnit,\r
+ OUT UINT64 **BitMap\r
)\r
{\r
- UINTN Level;\r
- UINT64 *GuardMap;\r
- UINT64 MapMemory;\r
- UINTN Index;\r
- UINTN Size;\r
- UINTN BitsToUnitEnd;\r
+ UINTN Level;\r
+ UINT64 *GuardMap;\r
+ UINT64 MapMemory;\r
+ UINTN Index;\r
+ UINTN Size;\r
+ UINTN BitsToUnitEnd;\r
\r
//\r
// Adjust current map table depth according to the address to access\r
RShiftU64 (\r
Address,\r
mLevelShift[GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel - 1]\r
- ) != 0) {\r
-\r
+ ) != 0)\r
+ {\r
if (mGuardedMemoryMap != 0) {\r
Size = (mLevelMask[GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel - 1] + 1)\r
* GUARDED_HEAP_MAP_ENTRY_BYTES;\r
SetMem ((VOID *)(UINTN)MapMemory, Size, 0);\r
\r
*(UINT64 *)(UINTN)MapMemory = mGuardedMemoryMap;\r
- mGuardedMemoryMap = MapMemory;\r
+ mGuardedMemoryMap = MapMemory;\r
}\r
\r
mMapLevel++;\r
-\r
}\r
\r
GuardMap = &mGuardedMemoryMap;\r
for (Level = GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel;\r
Level < GUARDED_HEAP_MAP_TABLE_DEPTH;\r
- ++Level) {\r
-\r
+ ++Level)\r
+ {\r
if (*GuardMap == 0) {\r
if (!AllocMapUnit) {\r
GuardMap = NULL;\r
break;\r
}\r
\r
- Size = (mLevelMask[Level] + 1) * GUARDED_HEAP_MAP_ENTRY_BYTES;\r
+ Size = (mLevelMask[Level] + 1) * GUARDED_HEAP_MAP_ENTRY_BYTES;\r
MapMemory = (UINT64)(UINTN)PageAlloc (EFI_SIZE_TO_PAGES (Size));\r
ASSERT (MapMemory != 0);\r
\r
*GuardMap = MapMemory;\r
}\r
\r
- Index = (UINTN)RShiftU64 (Address, mLevelShift[Level]);\r
- Index &= mLevelMask[Level];\r
- GuardMap = (UINT64 *)(UINTN)((*GuardMap) + Index * sizeof (UINT64));\r
-\r
+ Index = (UINTN)RShiftU64 (Address, mLevelShift[Level]);\r
+ Index &= mLevelMask[Level];\r
+ GuardMap = (UINT64 *)(UINTN)((*GuardMap) + Index * sizeof (UINT64));\r
}\r
\r
BitsToUnitEnd = GUARDED_HEAP_MAP_BITS - GUARDED_HEAP_MAP_BIT_INDEX (Address);\r
VOID\r
EFIAPI\r
SetGuardedMemoryBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
- UINT64 *BitMap;\r
- UINTN Bits;\r
- UINTN BitsToUnitEnd;\r
+ UINT64 *BitMap;\r
+ UINTN Bits;\r
+ UINTN BitsToUnitEnd;\r
\r
while (NumberOfPages > 0) {\r
BitsToUnitEnd = FindGuardedMemoryMap (Address, TRUE, &BitMap);\r
// Cross map unit\r
Bits = BitsToUnitEnd;\r
} else {\r
- Bits = NumberOfPages;\r
+ Bits = NumberOfPages;\r
}\r
\r
SetBits (Address, Bits, BitMap);\r
VOID\r
EFIAPI\r
ClearGuardedMemoryBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
- UINT64 *BitMap;\r
- UINTN Bits;\r
- UINTN BitsToUnitEnd;\r
+ UINT64 *BitMap;\r
+ UINTN Bits;\r
+ UINTN BitsToUnitEnd;\r
\r
while (NumberOfPages > 0) {\r
BitsToUnitEnd = FindGuardedMemoryMap (Address, TRUE, &BitMap);\r
// Cross map unit\r
Bits = BitsToUnitEnd;\r
} else {\r
- Bits = NumberOfPages;\r
+ Bits = NumberOfPages;\r
}\r
\r
ClearBits (Address, Bits, BitMap);\r
**/\r
UINTN\r
GetGuardedMemoryBits (\r
- IN EFI_PHYSICAL_ADDRESS Address,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS Address,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
- UINT64 *BitMap;\r
- UINTN Bits;\r
- UINTN Result;\r
- UINTN Shift;\r
- UINTN BitsToUnitEnd;\r
+ UINT64 *BitMap;\r
+ UINTN Bits;\r
+ UINTN Result;\r
+ UINTN Shift;\r
+ UINTN BitsToUnitEnd;\r
\r
ASSERT (NumberOfPages <= GUARDED_HEAP_MAP_ENTRY_BITS);\r
\r
\r
if (NumberOfPages > BitsToUnitEnd) {\r
// Cross map unit\r
- Bits = BitsToUnitEnd;\r
+ Bits = BitsToUnitEnd;\r
} else {\r
- Bits = NumberOfPages;\r
+ Bits = NumberOfPages;\r
}\r
\r
if (BitMap != NULL) {\r
UINTN\r
EFIAPI\r
GetGuardMapBit (\r
- IN EFI_PHYSICAL_ADDRESS Address\r
+ IN EFI_PHYSICAL_ADDRESS Address\r
)\r
{\r
- UINT64 *GuardMap;\r
+ UINT64 *GuardMap;\r
\r
FindGuardedMemoryMap (Address, FALSE, &GuardMap);\r
if (GuardMap != NULL) {\r
- if (RShiftU64 (*GuardMap,\r
- GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address)) & 1) {\r
+ if (RShiftU64 (\r
+ *GuardMap,\r
+ GUARDED_HEAP_MAP_ENTRY_BIT_INDEX (Address)\r
+ ) & 1)\r
+ {\r
return 1;\r
}\r
}\r
return 0;\r
}\r
\r
-\r
/**\r
Check to see if the page at the given address is a Guard page or not.\r
\r
BOOLEAN\r
EFIAPI\r
IsGuardPage (\r
- IN EFI_PHYSICAL_ADDRESS Address\r
-)\r
+ IN EFI_PHYSICAL_ADDRESS Address\r
+ )\r
{\r
- UINTN BitMap;\r
+ UINTN BitMap;\r
\r
//\r
// There must be at least one guarded page before and/or after given\r
return ((BitMap == BIT0) || (BitMap == BIT2) || (BitMap == (BIT2 | BIT0)));\r
}\r
\r
-\r
-\r
/**\r
Check to see if the page at the given address is guarded or not.\r
\r
BOOLEAN\r
EFIAPI\r
IsMemoryGuarded (\r
- IN EFI_PHYSICAL_ADDRESS Address\r
+ IN EFI_PHYSICAL_ADDRESS Address\r
)\r
{\r
return (GetGuardMapBit (Address) == 1);\r
VOID\r
EFIAPI\r
SetGuardPage (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
if (mSmmMemoryAttribute != NULL) {\r
mOnGuarding = TRUE;\r
- Status = mSmmMemoryAttribute->SetMemoryAttributes (\r
- mSmmMemoryAttribute,\r
- BaseAddress,\r
- EFI_PAGE_SIZE,\r
- EFI_MEMORY_RP\r
- );\r
+ Status = mSmmMemoryAttribute->SetMemoryAttributes (\r
+ mSmmMemoryAttribute,\r
+ BaseAddress,\r
+ EFI_PAGE_SIZE,\r
+ EFI_MEMORY_RP\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
mOnGuarding = FALSE;\r
}\r
VOID\r
EFIAPI\r
UnsetGuardPage (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress\r
)\r
{\r
- EFI_STATUS Status;\r
+ EFI_STATUS Status;\r
\r
if (mSmmMemoryAttribute != NULL) {\r
mOnGuarding = TRUE;\r
- Status = mSmmMemoryAttribute->ClearMemoryAttributes (\r
- mSmmMemoryAttribute,\r
- BaseAddress,\r
- EFI_PAGE_SIZE,\r
- EFI_MEMORY_RP\r
- );\r
+ Status = mSmmMemoryAttribute->ClearMemoryAttributes (\r
+ mSmmMemoryAttribute,\r
+ BaseAddress,\r
+ EFI_PAGE_SIZE,\r
+ EFI_MEMORY_RP\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
mOnGuarding = FALSE;\r
}\r
**/\r
BOOLEAN\r
IsMemoryTypeToGuard (\r
- IN EFI_MEMORY_TYPE MemoryType,\r
- IN EFI_ALLOCATE_TYPE AllocateType,\r
- IN UINT8 PageOrPool\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN EFI_ALLOCATE_TYPE AllocateType,\r
+ IN UINT8 PageOrPool\r
)\r
{\r
- UINT64 TestBit;\r
- UINT64 ConfigBit;\r
+ UINT64 TestBit;\r
+ UINT64 ConfigBit;\r
\r
- if ((PcdGet8 (PcdHeapGuardPropertyMask) & PageOrPool) == 0\r
- || mOnGuarding\r
- || AllocateType == AllocateAddress) {\r
+ if ( ((PcdGet8 (PcdHeapGuardPropertyMask) & PageOrPool) == 0)\r
+ || mOnGuarding\r
+ || (AllocateType == AllocateAddress))\r
+ {\r
return FALSE;\r
}\r
\r
ConfigBit |= PcdGet64 (PcdHeapGuardPageType);\r
}\r
\r
- if (MemoryType == EfiRuntimeServicesData ||\r
- MemoryType == EfiRuntimeServicesCode) {\r
+ if ((MemoryType == EfiRuntimeServicesData) ||\r
+ (MemoryType == EfiRuntimeServicesCode))\r
+ {\r
TestBit = LShiftU64 (1, MemoryType);\r
} else if (MemoryType == EfiMaxMemoryType) {\r
TestBit = (UINT64)-1;\r
**/\r
BOOLEAN\r
IsPoolTypeToGuard (\r
- IN EFI_MEMORY_TYPE MemoryType\r
+ IN EFI_MEMORY_TYPE MemoryType\r
)\r
{\r
- return IsMemoryTypeToGuard (MemoryType, AllocateAnyPages,\r
- GUARD_HEAP_TYPE_POOL);\r
+ return IsMemoryTypeToGuard (\r
+ MemoryType,\r
+ AllocateAnyPages,\r
+ GUARD_HEAP_TYPE_POOL\r
+ );\r
}\r
\r
/**\r
**/\r
BOOLEAN\r
IsPageTypeToGuard (\r
- IN EFI_MEMORY_TYPE MemoryType,\r
- IN EFI_ALLOCATE_TYPE AllocateType\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN EFI_ALLOCATE_TYPE AllocateType\r
)\r
{\r
return IsMemoryTypeToGuard (MemoryType, AllocateType, GUARD_HEAP_TYPE_PAGE);\r
VOID\r
)\r
{\r
- return IsMemoryTypeToGuard (EfiMaxMemoryType, AllocateAnyPages,\r
- GUARD_HEAP_TYPE_POOL|GUARD_HEAP_TYPE_PAGE);\r
+ return IsMemoryTypeToGuard (\r
+ EfiMaxMemoryType,\r
+ AllocateAnyPages,\r
+ GUARD_HEAP_TYPE_POOL|GUARD_HEAP_TYPE_PAGE\r
+ );\r
}\r
\r
/**\r
**/\r
VOID\r
SetGuardForMemory (\r
- IN EFI_PHYSICAL_ADDRESS Memory,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
- EFI_PHYSICAL_ADDRESS GuardPage;\r
+ EFI_PHYSICAL_ADDRESS GuardPage;\r
\r
//\r
// Set tail Guard\r
**/\r
VOID\r
UnsetGuardForMemory (\r
- IN EFI_PHYSICAL_ADDRESS Memory,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
EFI_PHYSICAL_ADDRESS GuardPage;\r
// -------------------\r
// Start -> -1 -2\r
//\r
- GuardPage = Memory - EFI_PAGES_TO_SIZE (1);\r
+ GuardPage = Memory - EFI_PAGES_TO_SIZE (1);\r
GuardBitmap = GetGuardedMemoryBits (Memory - EFI_PAGES_TO_SIZE (2), 2);\r
if ((GuardBitmap & BIT1) == 0) {\r
//\r
// --------------------\r
// +1 +0 <- End\r
//\r
- GuardPage = Memory + EFI_PAGES_TO_SIZE (NumberOfPages);\r
+ GuardPage = Memory + EFI_PAGES_TO_SIZE (NumberOfPages);\r
GuardBitmap = GetGuardedMemoryBits (GuardPage, 2);\r
if ((GuardBitmap & BIT0) == 0) {\r
//\r
//\r
// No matter what, we just clear the mark of the Guarded memory.\r
//\r
- ClearGuardedMemoryBits(Memory, NumberOfPages);\r
+ ClearGuardedMemoryBits (Memory, NumberOfPages);\r
}\r
\r
-\r
-\r
/**\r
Adjust the start address and number of pages to free according to Guard.\r
\r
**/\r
VOID\r
AdjustMemoryF (\r
- IN OUT EFI_PHYSICAL_ADDRESS *Memory,\r
- IN OUT UINTN *NumberOfPages\r
+ IN OUT EFI_PHYSICAL_ADDRESS *Memory,\r
+ IN OUT UINTN *NumberOfPages\r
)\r
{\r
EFI_PHYSICAL_ADDRESS Start;\r
UINT64 GuardBitmap;\r
UINT64 Attributes;\r
\r
- if (Memory == NULL || NumberOfPages == NULL || *NumberOfPages == 0) {\r
+ if ((Memory == NULL) || (NumberOfPages == NULL) || (*NumberOfPages == 0)) {\r
return;\r
}\r
\r
- Start = *Memory;\r
+ Start = *Memory;\r
PagesToFree = *NumberOfPages;\r
\r
//\r
// Start -> -1 -2\r
//\r
MemoryToTest = Start - EFI_PAGES_TO_SIZE (2);\r
- GuardBitmap = GetGuardedMemoryBits (MemoryToTest, 2);\r
+ GuardBitmap = GetGuardedMemoryBits (MemoryToTest, 2);\r
if ((GuardBitmap & BIT1) == 0) {\r
//\r
// Head Guard exists.\r
// +1 +0 <- End\r
//\r
MemoryToTest = Start + EFI_PAGES_TO_SIZE (PagesToFree);\r
- GuardBitmap = GetGuardedMemoryBits (MemoryToTest, 2);\r
+ GuardBitmap = GetGuardedMemoryBits (MemoryToTest, 2);\r
if ((GuardBitmap & BIT0) == 0) {\r
//\r
// Tail Guard exists.\r
PagesToFree -= 1;\r
}\r
\r
- *Memory = Start;\r
- *NumberOfPages = PagesToFree;\r
+ *Memory = Start;\r
+ *NumberOfPages = PagesToFree;\r
}\r
\r
-\r
/**\r
Adjust the pool head position to make sure the Guard page is adjavent to\r
pool tail or pool head.\r
**/\r
VOID *\r
AdjustPoolHeadA (\r
- IN EFI_PHYSICAL_ADDRESS Memory,\r
- IN UINTN NoPages,\r
- IN UINTN Size\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NoPages,\r
+ IN UINTN Size\r
)\r
{\r
- if (Memory == 0 || (PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) != 0) {\r
+ if ((Memory == 0) || ((PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) != 0)) {\r
//\r
// Pool head is put near the head Guard\r
//\r
**/\r
VOID *\r
AdjustPoolHeadF (\r
- IN EFI_PHYSICAL_ADDRESS Memory\r
+ IN EFI_PHYSICAL_ADDRESS Memory\r
)\r
{\r
- if (Memory == 0 || (PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) != 0) {\r
+ if ((Memory == 0) || ((PcdGet8 (PcdHeapGuardPropertyMask) & BIT7) != 0)) {\r
//\r
// Pool head is put near the head Guard\r
//\r
**/\r
UINTN\r
InternalAllocMaxAddressWithGuard (\r
- IN OUT LIST_ENTRY *FreePageList,\r
- IN UINTN NumberOfPages,\r
- IN UINTN MaxAddress,\r
- IN EFI_MEMORY_TYPE MemoryType\r
+ IN OUT LIST_ENTRY *FreePageList,\r
+ IN UINTN NumberOfPages,\r
+ IN UINTN MaxAddress,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
\r
)\r
{\r
UINTN Address;\r
\r
for (Node = FreePageList->BackLink; Node != FreePageList;\r
- Node = Node->BackLink) {\r
+ Node = Node->BackLink)\r
+ {\r
Pages = BASE_CR (Node, FREE_PAGE_LIST, Link);\r
- if (Pages->NumberOfPages >= NumberOfPages &&\r
- (UINTN)Pages + EFI_PAGES_TO_SIZE (NumberOfPages) - 1 <= MaxAddress) {\r
-\r
+ if ((Pages->NumberOfPages >= NumberOfPages) &&\r
+ ((UINTN)Pages + EFI_PAGES_TO_SIZE (NumberOfPages) - 1 <= MaxAddress))\r
+ {\r
//\r
// We may need 1 or 2 more pages for Guard. Check it out.\r
//\r
PagesToAlloc = NumberOfPages;\r
- TailGuard = (UINTN)Pages + EFI_PAGES_TO_SIZE (Pages->NumberOfPages);\r
+ TailGuard = (UINTN)Pages + EFI_PAGES_TO_SIZE (Pages->NumberOfPages);\r
if (!IsGuardPage (TailGuard)) {\r
//\r
// Add one if no Guard at the end of current free memory block.\r
}\r
\r
Address = InternalAllocPagesOnOneNode (Pages, PagesToAlloc, MaxAddress);\r
- ConvertSmmMemoryMapEntry(MemoryType, Address, PagesToAlloc, FALSE);\r
- CoreFreeMemoryMapStack();\r
+ ConvertSmmMemoryMapEntry (MemoryType, Address, PagesToAlloc, FALSE);\r
+ CoreFreeMemoryMapStack ();\r
if (HeadGuard == 0) {\r
// Don't pass the Guard page to user.\r
Address += EFI_PAGE_SIZE;\r
}\r
+\r
SetGuardForMemory (Address, NumberOfPages);\r
return Address;\r
}\r
IN BOOLEAN AddRegion\r
)\r
{\r
- EFI_PHYSICAL_ADDRESS MemoryToFree;\r
- UINTN PagesToFree;\r
+ EFI_PHYSICAL_ADDRESS MemoryToFree;\r
+ UINTN PagesToFree;\r
\r
if (((Memory & EFI_PAGE_MASK) != 0) || (Memory == 0) || (NumberOfPages == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- MemoryToFree = Memory;\r
- PagesToFree = NumberOfPages;\r
+ MemoryToFree = Memory;\r
+ PagesToFree = NumberOfPages;\r
\r
AdjustMemoryF (&MemoryToFree, &PagesToFree);\r
UnsetGuardForMemory (Memory, NumberOfPages);\r
VOID\r
)\r
{\r
- UINTN Entries[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINTN Shifts[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINTN Indices[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 Tables[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 Addresses[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 TableEntry;\r
- UINT64 Address;\r
- UINT64 GuardPage;\r
- INTN Level;\r
- UINTN Index;\r
- BOOLEAN OnGuarding;\r
-\r
- if (mGuardedMemoryMap == 0 ||\r
- mMapLevel == 0 ||\r
- mMapLevel > GUARDED_HEAP_MAP_TABLE_DEPTH) {\r
+ UINTN Entries[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINTN Shifts[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINTN Indices[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 Tables[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 Addresses[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 TableEntry;\r
+ UINT64 Address;\r
+ UINT64 GuardPage;\r
+ INTN Level;\r
+ UINTN Index;\r
+ BOOLEAN OnGuarding;\r
+\r
+ if ((mGuardedMemoryMap == 0) ||\r
+ (mMapLevel == 0) ||\r
+ (mMapLevel > GUARDED_HEAP_MAP_TABLE_DEPTH))\r
+ {\r
return;\r
}\r
\r
CopyMem (Entries, mLevelMask, sizeof (Entries));\r
CopyMem (Shifts, mLevelShift, sizeof (Shifts));\r
\r
- SetMem (Tables, sizeof(Tables), 0);\r
- SetMem (Addresses, sizeof(Addresses), 0);\r
- SetMem (Indices, sizeof(Indices), 0);\r
+ SetMem (Tables, sizeof (Tables), 0);\r
+ SetMem (Addresses, sizeof (Addresses), 0);\r
+ SetMem (Indices, sizeof (Indices), 0);\r
\r
Level = GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel;\r
Tables[Level] = mGuardedMemoryMap;\r
\r
DEBUG_CODE (\r
DumpGuardedMemoryBitmap ();\r
- );\r
+ );\r
\r
while (TRUE) {\r
if (Indices[Level] > Entries[Level]) {\r
Tables[Level] = 0;\r
Level -= 1;\r
} else {\r
-\r
- TableEntry = ((UINT64 *)(UINTN)(Tables[Level]))[Indices[Level]];\r
- Address = Addresses[Level];\r
+ TableEntry = ((UINT64 *)(UINTN)(Tables[Level]))[Indices[Level]];\r
+ Address = Addresses[Level];\r
\r
if (TableEntry == 0) {\r
-\r
OnGuarding = FALSE;\r
-\r
} else if (Level < GUARDED_HEAP_MAP_TABLE_DEPTH - 1) {\r
-\r
- Level += 1;\r
- Tables[Level] = TableEntry;\r
- Addresses[Level] = Address;\r
- Indices[Level] = 0;\r
+ Level += 1;\r
+ Tables[Level] = TableEntry;\r
+ Addresses[Level] = Address;\r
+ Indices[Level] = 0;\r
\r
continue;\r
-\r
} else {\r
-\r
Index = 0;\r
while (Index < GUARDED_HEAP_MAP_ENTRY_BITS) {\r
if ((TableEntry & 1) == 1) {\r
} else {\r
GuardPage = Address - EFI_PAGE_SIZE;\r
}\r
+\r
OnGuarding = TRUE;\r
} else {\r
if (OnGuarding) {\r
} else {\r
GuardPage = 0;\r
}\r
+\r
OnGuarding = FALSE;\r
}\r
\r
break;\r
}\r
\r
- Indices[Level] += 1;\r
- Address = (Level == 0) ? 0 : Addresses[Level - 1];\r
- Addresses[Level] = Address | LShiftU64(Indices[Level], Shifts[Level]);\r
-\r
+ Indices[Level] += 1;\r
+ Address = (Level == 0) ? 0 : Addresses[Level - 1];\r
+ Addresses[Level] = Address | LShiftU64 (Indices[Level], Shifts[Level]);\r
}\r
}\r
\r
NULL,\r
(VOID **)&mSmmMemoryAttribute\r
);\r
- if (!EFI_ERROR(Status)) {\r
+ if (!EFI_ERROR (Status)) {\r
SetAllGuardPages ();\r
}\r
}\r
**/\r
VOID\r
Uint64ToBinString (\r
- IN UINT64 Value,\r
- OUT CHAR8 *BinString\r
+ IN UINT64 Value,\r
+ OUT CHAR8 *BinString\r
)\r
{\r
- UINTN Index;\r
+ UINTN Index;\r
\r
if (BinString == NULL) {\r
return;\r
\r
for (Index = 64; Index > 0; --Index) {\r
BinString[Index - 1] = '0' + (Value & 1);\r
- Value = RShiftU64 (Value, 1);\r
+ Value = RShiftU64 (Value, 1);\r
}\r
+\r
BinString[64] = '\0';\r
}\r
\r
VOID\r
)\r
{\r
- UINTN Entries[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINTN Shifts[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINTN Indices[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 Tables[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 Addresses[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
- UINT64 TableEntry;\r
- UINT64 Address;\r
- INTN Level;\r
- UINTN RepeatZero;\r
- CHAR8 String[GUARDED_HEAP_MAP_ENTRY_BITS + 1];\r
- CHAR8 *Ruler1;\r
- CHAR8 *Ruler2;\r
-\r
- if (mGuardedMemoryMap == 0 ||\r
- mMapLevel == 0 ||\r
- mMapLevel > GUARDED_HEAP_MAP_TABLE_DEPTH) {\r
+ UINTN Entries[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINTN Shifts[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINTN Indices[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 Tables[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 Addresses[GUARDED_HEAP_MAP_TABLE_DEPTH];\r
+ UINT64 TableEntry;\r
+ UINT64 Address;\r
+ INTN Level;\r
+ UINTN RepeatZero;\r
+ CHAR8 String[GUARDED_HEAP_MAP_ENTRY_BITS + 1];\r
+ CHAR8 *Ruler1;\r
+ CHAR8 *Ruler2;\r
+\r
+ if ((mGuardedMemoryMap == 0) ||\r
+ (mMapLevel == 0) ||\r
+ (mMapLevel > GUARDED_HEAP_MAP_TABLE_DEPTH))\r
+ {\r
return;\r
}\r
\r
Ruler1 = " 3 2 1 0";\r
Ruler2 = "FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210";\r
\r
- DEBUG ((HEAP_GUARD_DEBUG_LEVEL, "============================="\r
- " Guarded Memory Bitmap "\r
- "==============================\r\n"));\r
+ DEBUG ((\r
+ HEAP_GUARD_DEBUG_LEVEL,\r
+ "============================="\r
+ " Guarded Memory Bitmap "\r
+ "==============================\r\n"\r
+ ));\r
DEBUG ((HEAP_GUARD_DEBUG_LEVEL, " %a\r\n", Ruler1));\r
DEBUG ((HEAP_GUARD_DEBUG_LEVEL, " %a\r\n", Ruler2));\r
\r
CopyMem (Entries, mLevelMask, sizeof (Entries));\r
CopyMem (Shifts, mLevelShift, sizeof (Shifts));\r
\r
- SetMem (Indices, sizeof(Indices), 0);\r
- SetMem (Tables, sizeof(Tables), 0);\r
- SetMem (Addresses, sizeof(Addresses), 0);\r
+ SetMem (Indices, sizeof (Indices), 0);\r
+ SetMem (Tables, sizeof (Tables), 0);\r
+ SetMem (Addresses, sizeof (Addresses), 0);\r
\r
Level = GUARDED_HEAP_MAP_TABLE_DEPTH - mMapLevel;\r
Tables[Level] = mGuardedMemoryMap;\r
\r
while (TRUE) {\r
if (Indices[Level] > Entries[Level]) {\r
-\r
Tables[Level] = 0;\r
Level -= 1;\r
RepeatZero = 0;\r
"========================================="\r
"=========================================\r\n"\r
));\r
-\r
} else {\r
-\r
- TableEntry = ((UINT64 *)(UINTN)Tables[Level])[Indices[Level]];\r
- Address = Addresses[Level];\r
+ TableEntry = ((UINT64 *)(UINTN)Tables[Level])[Indices[Level]];\r
+ Address = Addresses[Level];\r
\r
if (TableEntry == 0) {\r
-\r
if (Level == GUARDED_HEAP_MAP_TABLE_DEPTH - 1) {\r
if (RepeatZero == 0) {\r
- Uint64ToBinString(TableEntry, String);\r
+ Uint64ToBinString (TableEntry, String);\r
DEBUG ((HEAP_GUARD_DEBUG_LEVEL, "%016lx: %a\r\n", Address, String));\r
} else if (RepeatZero == 1) {\r
DEBUG ((HEAP_GUARD_DEBUG_LEVEL, "... : ...\r\n"));\r
}\r
+\r
RepeatZero += 1;\r
}\r
-\r
} else if (Level < GUARDED_HEAP_MAP_TABLE_DEPTH - 1) {\r
-\r
- Level += 1;\r
- Tables[Level] = TableEntry;\r
- Addresses[Level] = Address;\r
- Indices[Level] = 0;\r
- RepeatZero = 0;\r
+ Level += 1;\r
+ Tables[Level] = TableEntry;\r
+ Addresses[Level] = Address;\r
+ Indices[Level] = 0;\r
+ RepeatZero = 0;\r
\r
continue;\r
-\r
} else {\r
-\r
RepeatZero = 0;\r
- Uint64ToBinString(TableEntry, String);\r
+ Uint64ToBinString (TableEntry, String);\r
DEBUG ((HEAP_GUARD_DEBUG_LEVEL, "%016lx: %a\r\n", Address, String));\r
-\r
}\r
}\r
\r
break;\r
}\r
\r
- Indices[Level] += 1;\r
- Address = (Level == 0) ? 0 : Addresses[Level - 1];\r
- Addresses[Level] = Address | LShiftU64(Indices[Level], Shifts[Level]);\r
-\r
+ Indices[Level] += 1;\r
+ Address = (Level == 0) ? 0 : Addresses[Level - 1];\r
+ Addresses[Level] = Address | LShiftU64 (Indices[Level], Shifts[Level]);\r
}\r
}\r
\r
**/\r
BOOLEAN\r
VerifyMemoryGuard (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINTN NumberOfPages\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINTN NumberOfPages\r
)\r
{\r
EFI_STATUS Status;\r
}\r
\r
Attribute = 0;\r
- Address = BaseAddress - EFI_PAGE_SIZE;\r
- Status = mSmmMemoryAttribute->GetMemoryAttributes (\r
- mSmmMemoryAttribute,\r
- Address,\r
- EFI_PAGE_SIZE,\r
- &Attribute\r
- );\r
- if (EFI_ERROR (Status) || (Attribute & EFI_MEMORY_RP) == 0) {\r
- DEBUG ((DEBUG_ERROR, "Head Guard is not set at: %016lx (%016lX)!!!\r\n",\r
- Address, Attribute));\r
+ Address = BaseAddress - EFI_PAGE_SIZE;\r
+ Status = mSmmMemoryAttribute->GetMemoryAttributes (\r
+ mSmmMemoryAttribute,\r
+ Address,\r
+ EFI_PAGE_SIZE,\r
+ &Attribute\r
+ );\r
+ if (EFI_ERROR (Status) || ((Attribute & EFI_MEMORY_RP) == 0)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "Head Guard is not set at: %016lx (%016lX)!!!\r\n",\r
+ Address,\r
+ Attribute\r
+ ));\r
DumpGuardedMemoryBitmap ();\r
return FALSE;\r
}\r
\r
Attribute = 0;\r
- Address = BaseAddress + EFI_PAGES_TO_SIZE (NumberOfPages);\r
- Status = mSmmMemoryAttribute->GetMemoryAttributes (\r
- mSmmMemoryAttribute,\r
- Address,\r
- EFI_PAGE_SIZE,\r
- &Attribute\r
- );\r
- if (EFI_ERROR (Status) || (Attribute & EFI_MEMORY_RP) == 0) {\r
- DEBUG ((DEBUG_ERROR, "Tail Guard is not set at: %016lx (%016lX)!!!\r\n",\r
- Address, Attribute));\r
+ Address = BaseAddress + EFI_PAGES_TO_SIZE (NumberOfPages);\r
+ Status = mSmmMemoryAttribute->GetMemoryAttributes (\r
+ mSmmMemoryAttribute,\r
+ Address,\r
+ EFI_PAGE_SIZE,\r
+ &Attribute\r
+ );\r
+ if (EFI_ERROR (Status) || ((Attribute & EFI_MEMORY_RP) == 0)) {\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "Tail Guard is not set at: %016lx (%016lX)!!!\r\n",\r
+ Address,\r
+ Attribute\r
+ ));\r
DumpGuardedMemoryBitmap ();\r
return FALSE;\r
}\r
\r
return TRUE;\r
}\r
-\r