{\r
EFI_STATUS Status;\r
EFI_PHYSICAL_ADDRESS Address;\r
- UINTN ApSafeBufferSize;\r
UINTN Index;\r
EFI_GCD_MEMORY_SPACE_DESCRIPTOR MemDesc;\r
UINTN StackBase;\r
CPU_INFO_IN_HOB *CpuInfoInHob;\r
+ UINTN StackPages;\r
+ UINTN FuncPages;\r
\r
SaveCpuMpData (CpuMpData);\r
\r
// Allocating it in advance since memory services are not available in\r
// Exit Boot Services callback function.\r
//\r
- ApSafeBufferSize = EFI_PAGES_TO_SIZE (\r
- EFI_SIZE_TO_PAGES (\r
- CpuMpData->AddressMap.RelocateApLoopFuncSize\r
- )\r
- );\r
+ // +------------+ (TopOfApStack)\r
+ // | Stack * N |\r
+ // +------------+ (stack base, 4k aligned)\r
+ // | Padding |\r
+ // +------------+\r
+ // | Ap Loop |\r
+ // +------------+ ((low address, 4k-aligned)\r
+ //\r
+\r
+ StackPages = EFI_SIZE_TO_PAGES (CpuMpData->CpuCount * AP_SAFE_STACK_SIZE);\r
+ FuncPages = EFI_SIZE_TO_PAGES (CpuMpData->AddressMap.RelocateApLoopFuncSize);\r
+\r
Address = BASE_4GB - 1;\r
Status = gBS->AllocatePages (\r
AllocateMaxAddress,\r
EfiReservedMemoryType,\r
- EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
+ StackPages + FuncPages,\r
&Address\r
);\r
ASSERT_EFI_ERROR (Status);\r
if (!EFI_ERROR (Status)) {\r
gDS->SetMemorySpaceAttributes (\r
Address,\r
- ApSafeBufferSize,\r
+ EFI_PAGES_TO_SIZE (FuncPages),\r
MemDesc.Attributes & (~EFI_MEMORY_XP)\r
);\r
}\r
\r
- ApSafeBufferSize = EFI_PAGES_TO_SIZE (\r
- EFI_SIZE_TO_PAGES (\r
- CpuMpData->CpuCount * AP_SAFE_STACK_SIZE\r
- )\r
- );\r
- Address = BASE_4GB - 1;\r
- Status = gBS->AllocatePages (\r
- AllocateMaxAddress,\r
- EfiReservedMemoryType,\r
- EFI_SIZE_TO_PAGES (ApSafeBufferSize),\r
- &Address\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- mReservedTopOfApStack = (UINTN)Address + ApSafeBufferSize;\r
+ mReservedTopOfApStack = (UINTN)Address + EFI_PAGES_TO_SIZE (StackPages+FuncPages);\r
ASSERT ((mReservedTopOfApStack & (UINTN)(CPU_STACK_ALIGNMENT - 1)) == 0);\r
CopyMem (\r
mReservedApLoop.Data,\r