From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out30-43.freemail.mail.aliyun.com (out30-43.freemail.mail.aliyun.com [115.124.30.43]) by mx.groups.io with SMTP id smtpd.web12.5451.1591666028932969109 for ; Mon, 08 Jun 2020 18:27:09 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: linux.alibaba.com, ip: 115.124.30.43, mailfrom: guoheyi@linux.alibaba.com) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R161e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01f04397;MF=guoheyi@linux.alibaba.com;NM=1;PH=DS;RN=5;SR=0;TI=SMTPD_---0U.1Nwlx_1591666014; Received: from laochao-HP-ProDesk-680-G1-TWR.hz.ali.com(mailfrom:guoheyi@linux.alibaba.com fp:SMTPD_---0U.1Nwlx_1591666014) by smtp.aliyun-inc.com(127.0.0.1); Tue, 09 Jun 2020 09:27:05 +0800 From: guoheyi@linux.alibaba.com To: devel@edk2.groups.io Cc: yitian.ly@alibaba-inc.com, Heyi Guo , Leif Lindholm , Ard Biesheuvel Subject: [PATCH] ArmPkg/ArmExceptionLib: use static buffer for sp_el0 Date: Tue, 9 Jun 2020 09:26:30 +0800 Message-Id: <1591665990-15342-1-git-send-email-guoheyi@linux.alibaba.com> X-Mailer: git-send-email 2.7.4 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 --- Cc: Leif Lindholm Cc: Ard Biesheuvel --- ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c b/ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c index be1cdcf..1e2aeaa 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(); -- 2.7.4