* Main file supporting the SEC Phase for Versatile Express\r
*\r
* Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
-* Copyright (c) 2011-2014, ARM Limited. All rights reserved.\r
+* Copyright (c) 2011-2021, Arm Limited. All rights reserved.<BR>\r
* Copyright (c) 2016 HP Development Company, L.P.\r
*\r
-* This program and the accompanying materials\r
-* are licensed and made available under the terms and conditions of the BSD License\r
-* which accompanies this distribution. The full text of the license may be found at\r
-* http://opensource.org/licenses/bsd-license.php\r
-*\r
-* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+* SPDX-License-Identifier: BSD-2-Clause-Patent\r
*\r
**/\r
\r
\r
STATIC\r
RETURN_STATUS\r
-CopyExceptionHandlers(\r
- IN PHYSICAL_ADDRESS BaseAddress\r
+CopyExceptionHandlers (\r
+ IN PHYSICAL_ADDRESS BaseAddress\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
-RegisterExceptionHandler(\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
+RegisterExceptionHandler (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
);\r
\r
VOID\r
-ExceptionHandlersStart(\r
+ExceptionHandlersStart (\r
VOID\r
);\r
\r
VOID\r
-ExceptionHandlersEnd(\r
+ExceptionHandlersEnd (\r
VOID\r
);\r
\r
-RETURN_STATUS ArchVectorConfig(\r
- IN UINTN VectorBaseAddress\r
+RETURN_STATUS\r
+ArchVectorConfig (\r
+ IN UINTN VectorBaseAddress\r
);\r
\r
// these globals are provided by the architecture specific source (Arm or AArch64)\r
-extern UINTN gMaxExceptionNumber;\r
-extern EFI_EXCEPTION_CALLBACK gExceptionHandlers[];\r
-extern EFI_EXCEPTION_CALLBACK gDebuggerExceptionHandlers[];\r
-extern PHYSICAL_ADDRESS gExceptionVectorAlignmentMask;\r
-extern UINTN gDebuggerNoHandlerValue;\r
+extern UINTN gMaxExceptionNumber;\r
+extern EFI_EXCEPTION_CALLBACK gExceptionHandlers[];\r
+extern EFI_EXCEPTION_CALLBACK gDebuggerExceptionHandlers[];\r
+extern PHYSICAL_ADDRESS gExceptionVectorAlignmentMask;\r
+extern UINTN gDebuggerNoHandlerValue;\r
\r
// A compiler flag adjusts the compilation of this library to a variant where\r
// the vectors are relocated (copied) to another location versus using the\r
// address this at library build time. Since this affects the build of the\r
// library we cannot represent this in a PCD since PCDs are evaluated on\r
// a per-module basis.\r
-#if defined(ARM_RELOCATE_VECTORS)\r
-STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;\r
+#if defined (ARM_RELOCATE_VECTORS)\r
+STATIC CONST BOOLEAN gArmRelocateVectorTable = TRUE;\r
#else\r
-STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;\r
+STATIC CONST BOOLEAN gArmRelocateVectorTable = FALSE;\r
#endif\r
\r
-\r
/**\r
Initializes all CPU exceptions entries and provides the default exception handlers.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeCpuExceptionHandlers(\r
- IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
+InitializeCpuExceptionHandlers (\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
)\r
{\r
- RETURN_STATUS Status;\r
- UINTN VectorBase;\r
+ RETURN_STATUS Status;\r
+ UINTN VectorBase;\r
\r
Status = EFI_SUCCESS;\r
\r
- // if we are requested to copy exceptin handlers to another location\r
+ // if we are requested to copy exception handlers to another location\r
if (gArmRelocateVectorTable) {\r
-\r
- VectorBase = PcdGet64(PcdCpuVectorBaseAddress);\r
- Status = CopyExceptionHandlers(VectorBase);\r
-\r
- }\r
- else { // use VBAR to point to where our exception handlers are\r
+ VectorBase = PcdGet64 (PcdCpuVectorBaseAddress);\r
+ Status = CopyExceptionHandlers (VectorBase);\r
+ } else {\r
+ // use VBAR to point to where our exception handlers are\r
\r
// The vector table must be aligned for the architecture. If this\r
// assertion fails ensure the appropriate FFS alignment is in effect,\r
// for AArch64 Align=4K is required. Align=Auto can be used but this\r
// is known to cause an issue with populating the reset vector area\r
// for encapsulated FVs.\r
- ASSERT(((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);\r
+ ASSERT (((UINTN)ExceptionHandlersStart & gExceptionVectorAlignmentMask) == 0);\r
\r
// We do not copy the Exception Table at PcdGet64(PcdCpuVectorBaseAddress). We just set Vector\r
// Base Address to point into CpuDxe code.\r
Status = RETURN_SUCCESS;\r
}\r
\r
- if (!RETURN_ERROR(Status)) {\r
+ if (!RETURN_ERROR (Status)) {\r
// call the architecture-specific routine to prepare for the new vector\r
// configuration to take effect\r
- ArchVectorConfig(VectorBase);\r
+ ArchVectorConfig (VectorBase);\r
\r
- ArmWriteVBar(VectorBase);\r
+ ArmWriteVBar (VectorBase);\r
}\r
\r
return RETURN_SUCCESS;\r
}\r
\r
/**\r
-Copies exception handlers to the speciifed address.\r
+Copies exception handlers to the specified address.\r
\r
Caller should try to get an array of interrupt and/or exception vectors that are in use and need to\r
persist by EFI_VECTOR_HANDOFF_INFO defined in PI 1.3 specification.\r
**/\r
STATIC\r
RETURN_STATUS\r
-CopyExceptionHandlers(\r
- IN PHYSICAL_ADDRESS BaseAddress\r
+CopyExceptionHandlers (\r
+ IN PHYSICAL_ADDRESS BaseAddress\r
)\r
{\r
- RETURN_STATUS Status;\r
- UINTN Length;\r
- UINTN Index;\r
- UINT32 *VectorBase;\r
+ RETURN_STATUS Status;\r
+ UINTN Length;\r
+ UINTN Index;\r
+ UINT32 *VectorBase;\r
\r
// ensure that the destination value specifies an address meeting the vector alignment requirements\r
ASSERT ((BaseAddress & gExceptionVectorAlignmentMask) == 0);\r
\r
VectorBase = (UINT32 *)(UINTN)BaseAddress;\r
\r
- if (FeaturePcdGet(PcdDebuggerExceptionSupport) == TRUE) {\r
+ if (FeaturePcdGet (PcdDebuggerExceptionSupport) == TRUE) {\r
// Save existing vector table, in case debugger is already hooked in\r
- CopyMem((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));\r
+ CopyMem ((VOID *)gDebuggerExceptionHandlers, (VOID *)VectorBase, sizeof (EFI_EXCEPTION_CALLBACK)* (gMaxExceptionNumber+1));\r
}\r
\r
// Copy our assembly code into the page that contains the exception vectors.\r
- CopyMem((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);\r
+ CopyMem ((VOID *)VectorBase, (VOID *)ExceptionHandlersStart, Length);\r
\r
//\r
// Initialize the C entry points for interrupts\r
//\r
for (Index = 0; Index <= gMaxExceptionNumber; Index++) {\r
- if (!FeaturePcdGet(PcdDebuggerExceptionSupport) ||\r
- (gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue)) {\r
-\r
- Status = RegisterExceptionHandler(Index, NULL);\r
- ASSERT_EFI_ERROR(Status);\r
- }\r
- else {\r
+ if (!FeaturePcdGet (PcdDebuggerExceptionSupport) ||\r
+ (gDebuggerExceptionHandlers[Index] == 0) || (gDebuggerExceptionHandlers[Index] == (VOID *)gDebuggerNoHandlerValue))\r
+ {\r
+ Status = RegisterExceptionHandler (Index, NULL);\r
+ ASSERT_EFI_ERROR (Status);\r
+ } else {\r
// If the debugger has already hooked put its vector back\r
VectorBase[Index] = (UINT32)(UINTN)gDebuggerExceptionHandlers[Index];\r
}\r
}\r
\r
// Flush Caches since we updated executable stuff\r
- InvalidateInstructionCacheRange((VOID *)(UINTN)BaseAddress, Length);\r
+ InvalidateInstructionCacheRange ((VOID *)(UINTN)BaseAddress, Length);\r
\r
return RETURN_SUCCESS;\r
}\r
\r
-\r
/**\r
Initializes all CPU interrupt/exceptions entries and provides the default interrupt/exception handlers.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-InitializeCpuInterruptHandlers(\r
-IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
-)\r
+InitializeCpuInterruptHandlers (\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL\r
+ )\r
{\r
// not needed, this is what the CPU driver is for\r
return EFI_UNSUPPORTED;\r
or this function is not supported.\r
**/\r
RETURN_STATUS\r
-RegisterCpuInterruptHandler(\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN EFI_CPU_INTERRUPT_HANDLER ExceptionHandler\r
- ) {\r
+RegisterCpuInterruptHandler (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN EFI_CPU_INTERRUPT_HANDLER ExceptionHandler\r
+ )\r
+{\r
if (ExceptionType > gMaxExceptionNumber) {\r
return RETURN_UNSUPPORTED;\r
}\r
**/\r
EFI_STATUS\r
EFIAPI\r
-RegisterExceptionHandler(\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
+RegisterExceptionHandler (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler\r
)\r
{\r
- return RegisterCpuInterruptHandler(ExceptionType, InterruptHandler);\r
+ return RegisterCpuInterruptHandler (ExceptionType, InterruptHandler);\r
}\r
\r
VOID\r
EFIAPI\r
-CommonCExceptionHandler(\r
- IN EFI_EXCEPTION_TYPE ExceptionType,\r
- IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
+CommonCExceptionHandler (\r
+ IN EFI_EXCEPTION_TYPE ExceptionType,\r
+ IN OUT EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
if (ExceptionType <= gMaxExceptionNumber) {\r
gExceptionHandlers[ExceptionType](ExceptionType, SystemContext);\r
return;\r
}\r
- }\r
- else {\r
- DEBUG((EFI_D_ERROR, "Unknown exception type %d\n", ExceptionType));\r
- ASSERT(FALSE);\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "Unknown exception type %d\n", ExceptionType));\r
+ ASSERT (FALSE);\r
}\r
\r
- DefaultExceptionHandler(ExceptionType, SystemContext);\r
+ DefaultExceptionHandler (ExceptionType, SystemContext);\r
}\r
\r
/**\r
EFI_STATUS\r
EFIAPI\r
InitializeCpuExceptionHandlersEx (\r
- IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL,\r
- IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL\r
+ IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL,\r
+ IN CPU_EXCEPTION_INIT_DATA *InitData OPTIONAL\r
)\r
{\r
return InitializeCpuExceptionHandlers (VectorInfo);\r
}\r
-\r