]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c
ArmPkg/ArmExceptionLib: use static buffer for sp_el0
[mirror_edk2.git] / ArmPkg / Library / ArmExceptionLib / AArch64 / AArch64Exception.c
CommitLineData
2939c778
EC
1/** @file\r
2* Exception Handling support specific for AArch64\r
3*\r
4* Copyright (c) 2016 HP Development Company, L.P.\r
5*\r
4059386c 6* SPDX-License-Identifier: BSD-2-Clause-Patent\r
2939c778
EC
7*\r
8**/\r
9\r
10#include <Uefi.h>\r
11\r
12#include <Chipset/AArch64.h>\r
2d120489 13#include <Library/MemoryAllocationLib.h>\r
2939c778
EC
14#include <Protocol/DebugSupport.h> // for MAX_AARCH64_EXCEPTION\r
15\r
16UINTN gMaxExceptionNumber = MAX_AARCH64_EXCEPTION;\r
17EFI_EXCEPTION_CALLBACK gExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = { 0 };\r
18EFI_EXCEPTION_CALLBACK gDebuggerExceptionHandlers[MAX_AARCH64_EXCEPTION + 1] = { 0 };\r
19PHYSICAL_ADDRESS gExceptionVectorAlignmentMask = ARM_VECTOR_TABLE_ALIGNMENT;\r
20UINTN gDebuggerNoHandlerValue = 0; // todo: define for AArch64\r
21\r
e1d24410
HG
22#define EL0_STACK_SIZE EFI_PAGES_TO_SIZE(2)\r
23STATIC UINTN mNewStackBase[EL0_STACK_SIZE / sizeof (UINTN)];\r
2d120489
AB
24\r
25VOID\r
26RegisterEl0Stack (\r
27 IN VOID *Stack\r
28 );\r
29\r
2939c778
EC
30RETURN_STATUS ArchVectorConfig(\r
31 IN UINTN VectorBaseAddress\r
32 )\r
33{\r
34 UINTN HcrReg;\r
2d120489 35\r
e1d24410
HG
36 // Round down sp by 16 bytes alignment\r
37 RegisterEl0Stack (\r
38 (VOID *)(((UINTN)mNewStackBase + EL0_STACK_SIZE) & ~0xFUL)\r
39 );\r
2939c778
EC
40\r
41 if (ArmReadCurrentEL() == AARCH64_EL2) {\r
42 HcrReg = ArmReadHcr();\r
43\r
44 // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2\r
45 HcrReg |= ARM_HCR_TGE;\r
46\r
47 ArmWriteHcr(HcrReg);\r
48 }\r
49\r
50 return RETURN_SUCCESS;\r
51}\r