UINTN FSize;\r
UINTN Offset;\r
UINTN NoPages;\r
+ UINTN Granularity;\r
\r
ASSERT_LOCKED (&gMemoryLock);\r
\r
+ if (PoolType == EfiACPIReclaimMemory ||\r
+ PoolType == EfiACPIMemoryNVS ||\r
+ PoolType == EfiRuntimeServicesCode ||\r
+ PoolType == EfiRuntimeServicesData) {\r
+\r
+ Granularity = EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT;\r
+ } else {\r
+ Granularity = DEFAULT_PAGE_ALLOCATION;\r
+ }\r
+\r
//\r
// Adjust the size by the pool header & tail overhead\r
//\r
// (slow)\r
//\r
if (Index >= MAX_POOL_LIST) {\r
- NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION) - 1;\r
- NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION) - 1);\r
- Head = CoreAllocatePoolPages (PoolType, NoPages, DEFAULT_PAGE_ALLOCATION);\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
goto Done;\r
}\r
\r
//\r
// Get another page\r
//\r
- NewPage = CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION), DEFAULT_PAGE_ALLOCATION);\r
+ NewPage = CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES (Granularity), Granularity);\r
if (NewPage == NULL) {\r
goto Done;\r
}\r
// Carve up new page into free pool blocks\r
//\r
Offset = 0;\r
- while (Offset < DEFAULT_PAGE_ALLOCATION) {\r
+ while (Offset < Granularity) {\r
ASSERT (Index < MAX_POOL_LIST);\r
FSize = LIST_TO_SIZE(Index);\r
\r
- while (Offset + FSize <= DEFAULT_PAGE_ALLOCATION) {\r
+ while (Offset + FSize <= Granularity) {\r
Free = (POOL_FREE *) &NewPage[Offset];\r
Free->Signature = POOL_FREE_SIGNATURE;\r
Free->Index = (UINT32)Index;\r
Index -= 1;\r
}\r
\r
- ASSERT (Offset == DEFAULT_PAGE_ALLOCATION);\r
+ ASSERT (Offset == Granularity);\r
Index = SIZE_TO_LIST(Size);\r
}\r
\r
UINTN FSize;\r
UINTN Offset;\r
BOOLEAN AllFree;\r
+ UINTN Granularity;\r
\r
ASSERT(Buffer != NULL);\r
//\r
Pool->Used -= Size;\r
DEBUG ((DEBUG_POOL, "FreePool: %p (len %lx) %,ld\n", Head->Data, (UINT64)(Head->Size - POOL_OVERHEAD), (UINT64) Pool->Used));\r
\r
+ if (Head->Type == EfiACPIReclaimMemory ||\r
+ Head->Type == EfiACPIMemoryNVS ||\r
+ Head->Type == EfiRuntimeServicesCode ||\r
+ Head->Type == EfiRuntimeServicesData) {\r
+\r
+ Granularity = EFI_ACPI_RUNTIME_PAGE_ALLOCATION_ALIGNMENT;\r
+ } else {\r
+ Granularity = DEFAULT_PAGE_ALLOCATION;\r
+ }\r
+\r
//\r
// Determine the pool list\r
//\r
//\r
// Return the memory pages back to free memory\r
//\r
- NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION) - 1;\r
- NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION) - 1);\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
\r
} else {\r
// See if all the pool entries in the same page as Free are freed pool\r
// entries\r
//\r
- NewPage = (CHAR8 *)((UINTN)Free & ~((DEFAULT_PAGE_ALLOCATION) -1));\r
+ NewPage = (CHAR8 *)((UINTN)Free & ~(Granularity - 1));\r
Free = (POOL_FREE *) &NewPage[0];\r
ASSERT(Free != NULL);\r
\r
AllFree = TRUE;\r
Offset = 0;\r
\r
- while ((Offset < DEFAULT_PAGE_ALLOCATION) && (AllFree)) {\r
+ while ((Offset < Granularity) && (AllFree)) {\r
FSize = LIST_TO_SIZE(Index);\r
- while (Offset + FSize <= DEFAULT_PAGE_ALLOCATION) {\r
+ while (Offset + FSize <= Granularity) {\r
Free = (POOL_FREE *) &NewPage[Offset];\r
ASSERT(Free != NULL);\r
if (Free->Signature != POOL_FREE_SIGNATURE) {\r
Index = Free->Index;\r
Offset = 0;\r
\r
- while (Offset < DEFAULT_PAGE_ALLOCATION) {\r
+ while (Offset < Granularity) {\r
FSize = LIST_TO_SIZE(Index);\r
- while (Offset + FSize <= DEFAULT_PAGE_ALLOCATION) {\r
+ while (Offset + FSize <= Granularity) {\r
Free = (POOL_FREE *) &NewPage[Offset];\r
ASSERT(Free != NULL);\r
RemoveEntryList (&Free->Link);\r
//\r
// Free the page\r
//\r
- CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN)NewPage, EFI_SIZE_TO_PAGES (DEFAULT_PAGE_ALLOCATION));\r
+ CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN)NewPage, EFI_SIZE_TO_PAGES (Granularity));\r
}\r
}\r
}\r