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>
PHYSICAL_ADDRESS gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT;\r
UINTN gDebuggerNoHandlerValue = 0; // todo: define for AArch64\r
\r
-#define EL0_STACK_PAGES 2\r
+#define EL0_STACK_SIZE EFI_PAGES_TO_SIZE(2)\r
+STATIC UINTN mNewStackBase[EL0_STACK_SIZE / sizeof (UINTN)];\r
\r
VOID\r
RegisterEl0Stack (\r
)\r
{\r
UINTN HcrReg;\r
- UINT8 *Stack;\r
\r
- Stack = AllocatePages (EL0_STACK_PAGES);\r
- if (Stack == NULL) {\r
- return RETURN_OUT_OF_RESOURCES;\r
- }\r
-\r
- RegisterEl0Stack ((UINT8 *)Stack + EFI_PAGES_TO_SIZE (EL0_STACK_PAGES));\r
+ // Round down sp by 16 bytes alignment\r
+ RegisterEl0Stack (\r
+ (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)\r
+ );\r
\r
if (ArmReadCurrentEL() == AARCH64_EL2) {\r
HcrReg = ArmReadHcr();\r