From 93edd1887e34c3959ce927da1a22e8c54ce18a83 Mon Sep 17 00:00:00 2001 From: Tom Lendacky Date: Wed, 23 Sep 2020 13:04:00 -0500 Subject: 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: 7b7508ad784d ("UefiCpuPkg: Allow AP booting under SEV-ES") Cc: Garrett Kirkendall Signed-off-by: Tom Lendacky Message-Id: <21345cdbc906519558202b3851257ca07b9239ba.1600884239.git.thomas.lendacky@amd.com> Reviewed-by: Laszlo Ersek [lersek@redhat.com: supply missing space character after "PcdGet32"] --- UefiCpuPkg/Library/MpInitLib/MpLib.c | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) (limited to 'UefiCpuPkg') diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 07426274f6..6d977d45bc 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -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; } -- cgit v1.2.3