UefiCpuPkg/CpuMpPei: Parallel get stack base for better performance.

Parallel run the function GetStackBase for all APs for better
performance.

Reviewed-by: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Daoxiang Li <daoxiang.li@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
This commit is contained in:
Zhiguang Liu 2023-12-28 13:04:28 +08:00 committed by mergify[bot]
parent e449451770
commit e8166a852e

View File

@ -267,13 +267,15 @@ GetStackBase (
) )
{ {
EFI_PHYSICAL_ADDRESS StackBase; EFI_PHYSICAL_ADDRESS StackBase;
UINTN Index;
MpInitLibWhoAmI (&Index);
StackBase = (EFI_PHYSICAL_ADDRESS)(UINTN)&StackBase; StackBase = (EFI_PHYSICAL_ADDRESS)(UINTN)&StackBase;
StackBase += BASE_4KB; StackBase += BASE_4KB;
StackBase &= ~((EFI_PHYSICAL_ADDRESS)BASE_4KB - 1); StackBase &= ~((EFI_PHYSICAL_ADDRESS)BASE_4KB - 1);
StackBase -= PcdGet32 (PcdCpuApStackSize); StackBase -= PcdGet32 (PcdCpuApStackSize);
*(EFI_PHYSICAL_ADDRESS *)Buffer = StackBase; *((EFI_PHYSICAL_ADDRESS *)Buffer + Index) = StackBase;
} }
/** /**
@ -287,7 +289,7 @@ SetupStackGuardPage (
) )
{ {
EFI_PEI_HOB_POINTERS Hob; EFI_PEI_HOB_POINTERS Hob;
EFI_PHYSICAL_ADDRESS StackBase; EFI_PHYSICAL_ADDRESS *StackBase;
UINTN NumberOfProcessors; UINTN NumberOfProcessors;
UINTN Bsp; UINTN Bsp;
UINTN Index; UINTN Index;
@ -308,44 +310,44 @@ SetupStackGuardPage (
NumberOfProcessors = 1; NumberOfProcessors = 1;
} }
StackBase = (EFI_PHYSICAL_ADDRESS *)AllocatePages (EFI_SIZE_TO_PAGES (sizeof (EFI_PHYSICAL_ADDRESS) * NumberOfProcessors));
ASSERT (StackBase != NULL);
if (StackBase == NULL) {
return;
}
ZeroMem (StackBase, sizeof (EFI_PHYSICAL_ADDRESS) * NumberOfProcessors);
MpInitLibStartupAllAPs (GetStackBase, FALSE, NULL, 0, (VOID *)StackBase, NULL);
MpInitLibWhoAmI (&Bsp); MpInitLibWhoAmI (&Bsp);
for (Index = 0; Index < NumberOfProcessors; ++Index) { Hob.Raw = GetHobList ();
StackBase = 0; while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {
if (CompareGuid (
if (Index == Bsp) { &gEfiHobMemoryAllocStackGuid,
Hob.Raw = GetHobList (); &(Hob.MemoryAllocationStack->AllocDescriptor.Name)
while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) { ))
if (CompareGuid ( {
&gEfiHobMemoryAllocStackGuid, StackBase[Bsp] = Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress;
&(Hob.MemoryAllocationStack->AllocDescriptor.Name) break;
))
{
StackBase = Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress;
break;
}
Hob.Raw = GET_NEXT_HOB (Hob);
}
} else {
//
// Ask AP to return is stack base address.
//
MpInitLibStartupThisAP (GetStackBase, Index, NULL, 0, (VOID *)&StackBase, NULL);
} }
ASSERT (StackBase != 0); Hob.Raw = GET_NEXT_HOB (Hob);
}
for (Index = 0; Index < NumberOfProcessors; ++Index) {
ASSERT (StackBase[Index] != 0);
// //
// Set Guard page at stack base address. // Set Guard page at stack base address.
// //
ConvertMemoryPageToNotPresent (StackBase, EFI_PAGE_SIZE); ConvertMemoryPageToNotPresent (StackBase[Index], EFI_PAGE_SIZE);
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
"Stack Guard set at %lx [cpu%lu]!\n", "Stack Guard set at %lx [cpu%lu]!\n",
(UINT64)StackBase, (UINT64)StackBase[Index],
(UINT64)Index (UINT64)Index
)); ));
} }
FreePages (StackBase, EFI_SIZE_TO_PAGES (sizeof (EFI_PHYSICAL_ADDRESS) * NumberOfProcessors));
// //
// Publish the changes of page table. // Publish the changes of page table.
// //