#include "DxeMain.h"\r
#include "Imem.h"\r
\r
+STATIC EFI_LOCK mPoolMemoryLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY);\r
+\r
#define POOL_FREE_SIGNATURE SIGNATURE_32('p','f','r','0')\r
typedef struct {\r
UINT32 Signature;\r
// as we would in a strict power-of-2 sequence\r
//\r
STATIC CONST UINT16 mPoolSizeTable[] = {\r
- 64, 128, 192, 320, 512, 832, 1344, 2176, 3520, 5696, 9216, 14912, 24128\r
+ 128, 256, 384, 640, 1024, 1664, 2688, 4352, 7040, 11392, 18432, 29824\r
};\r
\r
#define SIZE_TO_LIST(a) (GetPoolIndexFromSize (a))\r
#define LIST_TO_SIZE(a) (mPoolSizeTable [a])\r
\r
-#define MAX_POOL_LIST (sizeof (mPoolSizeTable) / sizeof (mPoolSizeTable[0]))\r
+#define MAX_POOL_LIST (ARRAY_SIZE (mPoolSizeTable))\r
\r
#define MAX_POOL_SIZE (MAX_ADDRESS - POOL_OVERHEAD)\r
\r
//\r
// Acquire the memory lock and make the allocation\r
//\r
- Status = CoreAcquireLockOrFail (&gMemoryLock);\r
+ Status = CoreAcquireLockOrFail (&mPoolMemoryLock);\r
if (EFI_ERROR (Status)) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
*Buffer = CoreAllocatePoolI (PoolType, Size);\r
- CoreReleaseMemoryLock ();\r
+ CoreReleaseLock (&mPoolMemoryLock);\r
return (*Buffer != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;\r
}\r
\r
\r
Status = CoreInternalAllocatePool (PoolType, Size, Buffer);\r
if (!EFI_ERROR (Status)) {\r
- CoreUpdateProfile ((EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0), MemoryProfileActionAllocatePool, PoolType, Size, *Buffer);\r
+ CoreUpdateProfile (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0),\r
+ MemoryProfileActionAllocatePool,\r
+ PoolType,\r
+ Size,\r
+ *Buffer,\r
+ NULL\r
+ );\r
+ InstallMemoryAttributesTableOnMemoryAllocation (PoolType);\r
}\r
return Status;\r
}\r
\r
+STATIC\r
+VOID *\r
+CoreAllocatePoolPagesI (\r
+ IN EFI_MEMORY_TYPE PoolType,\r
+ IN UINTN NoPages,\r
+ IN UINTN Granularity\r
+ )\r
+{\r
+ VOID *Buffer;\r
+ EFI_STATUS Status;\r
+\r
+ Status = CoreAcquireLockOrFail (&gMemoryLock);\r
+ if (EFI_ERROR (Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ Buffer = CoreAllocatePoolPages (PoolType, NoPages, Granularity);\r
+ CoreReleaseMemoryLock ();\r
+\r
+ if (Buffer != NULL) {\r
+ ApplyMemoryProtectionPolicy (EfiConventionalMemory, PoolType,\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)Buffer, EFI_PAGES_TO_SIZE (NoPages));\r
+ }\r
+ return Buffer;\r
+}\r
+\r
/**\r
Internal function to allocate pool of a particular type.\r
Caller must have the memory lock held\r
UINTN NoPages;\r
UINTN Granularity;\r
\r
- ASSERT_LOCKED (&gMemoryLock);\r
+ ASSERT_LOCKED (&mPoolMemoryLock);\r
\r
if (PoolType == EfiACPIReclaimMemory ||\r
PoolType == EfiACPIMemoryNVS ||\r
if (Index >= SIZE_TO_LIST (Granularity)) {\r
NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity) - 1;\r
NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1);\r
- Head = CoreAllocatePoolPages (PoolType, NoPages, Granularity);\r
+ Head = CoreAllocatePoolPagesI (PoolType, NoPages, Granularity);\r
goto Done;\r
}\r
\r
//\r
// Get another page\r
//\r
- NewPage = CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES (Granularity), Granularity);\r
+ NewPage = CoreAllocatePoolPagesI (PoolType, EFI_SIZE_TO_PAGES (Granularity), Granularity);\r
if (NewPage == NULL) {\r
goto Done;\r
}\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- CoreAcquireMemoryLock ();\r
+ CoreAcquireLock (&mPoolMemoryLock);\r
Status = CoreFreePoolI (Buffer, PoolType);\r
- CoreReleaseMemoryLock ();\r
+ CoreReleaseLock (&mPoolMemoryLock);\r
return Status;\r
}\r
\r
\r
Status = CoreInternalFreePool (Buffer, &PoolType);\r
if (!EFI_ERROR (Status)) {\r
- CoreUpdateProfile ((EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0), MemoryProfileActionFreePool, (EFI_MEMORY_TYPE) 0, 0, Buffer);\r
+ CoreUpdateProfile (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0),\r
+ MemoryProfileActionFreePool,\r
+ PoolType,\r
+ 0,\r
+ Buffer,\r
+ NULL\r
+ );\r
+ InstallMemoryAttributesTableOnMemoryAllocation (PoolType);\r
}\r
return Status;\r
}\r
\r
+STATIC\r
+VOID\r
+CoreFreePoolPagesI (\r
+ IN EFI_MEMORY_TYPE PoolType,\r
+ IN EFI_PHYSICAL_ADDRESS Memory,\r
+ IN UINTN NoPages\r
+ )\r
+{\r
+ CoreAcquireMemoryLock ();\r
+ CoreFreePoolPages (Memory, NoPages);\r
+ CoreReleaseMemoryLock ();\r
+\r
+ ApplyMemoryProtectionPolicy (PoolType, EfiConventionalMemory,\r
+ (EFI_PHYSICAL_ADDRESS)(UINTN)Memory, EFI_PAGES_TO_SIZE (NoPages));\r
+}\r
+\r
/**\r
Internal function to free a pool entry.\r
Caller must have the memory lock held\r
//\r
ASSERT (Tail->Signature == POOL_TAIL_SIGNATURE);\r
ASSERT (Head->Size == Tail->Size);\r
- ASSERT_LOCKED (&gMemoryLock);\r
+ ASSERT_LOCKED (&mPoolMemoryLock);\r
\r
if (Tail->Signature != POOL_TAIL_SIGNATURE) {\r
return EFI_INVALID_PARAMETER;\r
//\r
NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity) - 1;\r
NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1);\r
- CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN) Head, NoPages);\r
+ CoreFreePoolPagesI (Pool->MemoryType, (EFI_PHYSICAL_ADDRESS) (UINTN) Head, NoPages);\r
\r
} else {\r
\r
//\r
// Free the page\r
//\r
- CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN)NewPage, EFI_SIZE_TO_PAGES (Granularity));\r
+ CoreFreePoolPagesI (Pool->MemoryType, (EFI_PHYSICAL_ADDRESS) (UINTN)NewPage,\r
+ EFI_SIZE_TO_PAGES (Granularity));\r
}\r
}\r
}\r