From: Heyi Guo Date: Tue, 9 Jun 2020 01:26:30 +0000 (+0800) Subject: ArmPkg/ArmExceptionLib: use static buffer for sp_el0 X-Git-Tag: edk2-stable202008~337 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=e1d24410da356731da70b3334f86343e11e207d2 ArmPkg/ArmExceptionLib: use static buffer for sp_el0 The exception library is also used in DxeMain before memory services are available, and AllocatePages() will fail in this case and cause sp_el0 remains 0. Then if any exception occurs before CpuDxe driver is loaded, a recursive exception will be trigged by page translation fault for sp = 0 - 0x130. Use static buffer instead to fix this issue. Signed-off-by: Heyi Guo Reviewed-by: Ard Biesheuvel --- diff --git a/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c b/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c index be1cdcf5eb..514f80a2d4 100644 --- a/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c +++ b/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c @@ -19,7 +19,8 @@ EFI_EXCEPTION_CALLBACK gDebuggerExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = PHYSICAL_ADDRESS gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT; UINTN gDebuggerNoHandlerValue = 0; // todo: define for AArch64 -#define EL0_STACK_PAGES 2 +#define EL0_STACK_SIZE EFI_PAGES_TO_SIZE(2) +STATIC UINTN mNewStackBase[EL0_STACK_SIZE / sizeof (UINTN)]; VOID RegisterEl0Stack ( @@ -31,14 +32,11 @@ RETURN_STATUS ArchVectorConfig( ) { UINTN HcrReg; - UINT8 *Stack; - Stack = AllocatePages (EL0_STACK_PAGES); - if (Stack == NULL) { - return RETURN_OUT_OF_RESOURCES; - } - - RegisterEl0Stack ((UINT8 *)Stack + EFI_PAGES_TO_SIZE (EL0_STACK_PAGES)); + // Round down sp by 16 bytes alignment + RegisterEl0Stack ( + (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL) + ); if (ArmReadCurrentEL() == AARCH64_EL2) { HcrReg = ArmReadHcr();