summaryrefslogtreecommitdiffstats
path: root/ArmPkg/Library/ArmExceptionLib
diff options
context:
space:
mode:
authorHeyi Guo <guoheyi@linux.alibaba.com>2020-06-09 09:26:30 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2020-06-10 18:06:45 +0000
commite1d24410da356731da70b3334f86343e11e207d2 (patch)
tree60fc661f433ff225e1290ce51ea8301823d3a35d /ArmPkg/Library/ArmExceptionLib
parent14c7ed8b51f60097ad771277da69f74b22a7a759 (diff)
downloadedk2-e1d24410da356731da70b3334f86343e11e207d2.tar.gz
edk2-e1d24410da356731da70b3334f86343e11e207d2.tar.bz2
edk2-e1d24410da356731da70b3334f86343e11e207d2.zip
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 <guoheyi@linux.alibaba.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
Diffstat (limited to 'ArmPkg/Library/ArmExceptionLib')
-rw-r--r--ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c14
1 files changed, 6 insertions, 8 deletions
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();