]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmExceptionLib/AArch64/AArch64Exception.c
ArmPkg: Replace BSD License with BSD+Patent License
[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
2d120489
AB
22#define EL0_STACK_PAGES 2\r
23\r
24VOID\r
25RegisterEl0Stack (\r
26 IN VOID *Stack\r
27 );\r
28\r
2939c778
EC
29RETURN_STATUS ArchVectorConfig(\r
30 IN UINTN VectorBaseAddress\r
31 )\r
32{\r
33 UINTN HcrReg;\r
2d120489
AB
34 UINT8 *Stack;\r
35\r
36 Stack = AllocatePages (EL0_STACK_PAGES);\r
37 if (Stack == NULL) {\r
38 return RETURN_OUT_OF_RESOURCES;\r
39 }\r
40\r
41 RegisterEl0Stack ((UINT8 *)Stack + EFI_PAGES_TO_SIZE (EL0_STACK_PAGES));\r
2939c778
EC
42\r
43 if (ArmReadCurrentEL() == AARCH64_EL2) {\r
44 HcrReg = ArmReadHcr();\r
45\r
46 // Trap General Exceptions. All exceptions that would be routed to EL1 are routed to EL2\r
47 HcrReg |= ARM_HCR_TGE;\r
48\r
49 ArmWriteHcr(HcrReg);\r
50 }\r
51\r
52 return RETURN_SUCCESS;\r
53}\r