UefiCpuPkg/MpInitLib: Reduce reset vector memory pressure

The AP reset vector stack allocation is only required if running as an
SEV-ES guest. Since the reset vector allocation is below 1MB in memory,
eliminate the requirement for bare-metal systems and non SEV-ES guests
to allocate the extra stack area, which can be large if the
PcdCpuMaxLogicalProcessorNumber value is large, and also remove the
CPU_STACK_ALIGNMENT alignment.

Fixes: 7b7508ad78 ("UefiCpuPkg: Allow AP booting under SEV-ES")
Cc: Garrett Kirkendall <garrett.kirkendall@amd.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Message-Id: <21345cdbc906519558202b3851257ca07b9239ba.1600884239.git.thomas.lendacky@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
[lersek@redhat.com: supply missing space character after "PcdGet32"]
This commit is contained in:
Tom Lendacky 2020-09-23 13:04:00 -05:00 committed by mergify[bot]
parent 92e9c44f20
commit 93edd1887e
1 changed files with 17 additions and 19 deletions

View File

@ -1141,20 +1141,6 @@ RestoreWakeupBuffer(
);
}
/**
Calculate the size of the reset stack.
@return Total amount of memory required for stacks
**/
STATIC
UINTN
GetApResetStackSize (
VOID
)
{
return AP_RESET_STACK_SIZE * PcdGet32(PcdCpuMaxLogicalProcessorNumber);
}
/**
Calculate the size of the reset vector.
@ -1170,11 +1156,23 @@ GetApResetVectorSize (
{
UINTN Size;
Size = ALIGN_VALUE (AddressMap->RendezvousFunnelSize +
AddressMap->SwitchToRealSize +
sizeof (MP_CPU_EXCHANGE_INFO),
CPU_STACK_ALIGNMENT);
Size += GetApResetStackSize ();
Size = AddressMap->RendezvousFunnelSize +
AddressMap->SwitchToRealSize +
sizeof (MP_CPU_EXCHANGE_INFO);
//
// The AP reset stack is only used by SEV-ES guests. Do not add to the
// allocation if SEV-ES is not enabled.
//
if (PcdGetBool (PcdSevEsIsEnabled)) {
//
// Stack location is based on APIC ID, so use the total number of
// processors for calculating the total stack area.
//
Size += AP_RESET_STACK_SIZE * PcdGet32 (PcdCpuMaxLogicalProcessorNumber);
Size = ALIGN_VALUE (Size, CPU_STACK_ALIGNMENT);
}
return Size;
}