mirror of https://github.com/acidanthera/audk.git
ArmPkg/ArmPlatformPkg: position vectors relative to base
We currently rely on .align directives to ensure that each exception vector entry is the appropriate offset from the vector base address. This is slightly fragile, as were an entry to become too large (greater than 32 A64 instructions), all following entries would be silently shifted until they meet the next alignment boundary. Thus we might execute the wrong code in response to an exception. To prevent this, introduce a new macro, VECTOR_ENTRY, that uses .org directives to position each entry at the precise required offset from the base of a vector. A vector entry which is too large will trigger a build failure rather than a runtime failure which is difficult to debug. For consistency, the base and end of each vector is similarly annotated, with VECTOR_BASE and VECTOR_END, which provide the necessary alignment and symbol exports. The now redundant directives and labels are removed. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Mark Rutland <mark.rutland@arm.com> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18904 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
fafb7e9c11
commit
d855b261d1
|
@ -12,6 +12,7 @@
|
|||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#include <Chipset/AArch64.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <AsmMacroIoLibV8.h>
|
||||
|
||||
|
@ -95,14 +96,12 @@
|
|||
UINT64 Padding;0x328 // Required for stack alignment
|
||||
*/
|
||||
|
||||
GCC_ASM_EXPORT(ExceptionHandlersStart)
|
||||
GCC_ASM_EXPORT(ExceptionHandlersEnd)
|
||||
GCC_ASM_EXPORT(CommonExceptionEntry)
|
||||
GCC_ASM_EXPORT(AsmCommonExceptionEntry)
|
||||
GCC_ASM_EXPORT(CommonCExceptionHandler)
|
||||
|
||||
.text
|
||||
.align 11
|
||||
|
||||
#define GP_CONTEXT_SIZE (32 * 8)
|
||||
#define FP_CONTEXT_SIZE (32 * 16)
|
||||
|
@ -160,84 +159,85 @@ GCC_ASM_EXPORT(CommonCExceptionHandler)
|
|||
// This code gets copied to the ARM vector table
|
||||
// VectorTableStart - VectorTableEnd gets copied
|
||||
//
|
||||
ASM_PFX(ExceptionHandlersStart):
|
||||
VECTOR_BASE(ExceptionHandlersStart)
|
||||
|
||||
//
|
||||
// Current EL with SP0 : 0x0 - 0x180
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SYNC)
|
||||
ASM_PFX(SynchronousExceptionSP0):
|
||||
b ASM_PFX(SynchronousExceptionEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_IRQ)
|
||||
ASM_PFX(IrqSP0):
|
||||
b ASM_PFX(IrqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_FIQ)
|
||||
ASM_PFX(FiqSP0):
|
||||
b ASM_PFX(FiqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SP0_SERR)
|
||||
ASM_PFX(SErrorSP0):
|
||||
b ASM_PFX(SErrorEntry)
|
||||
|
||||
//
|
||||
// Current EL with SPx: 0x200 - 0x380
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPx_SYNC)
|
||||
ASM_PFX(SynchronousExceptionSPx):
|
||||
b ASM_PFX(SynchronousExceptionEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPx_IRQ)
|
||||
ASM_PFX(IrqSPx):
|
||||
b ASM_PFX(IrqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPx_FIQ)
|
||||
ASM_PFX(FiqSPx):
|
||||
b ASM_PFX(FiqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_CUR_SPx_SERR)
|
||||
ASM_PFX(SErrorSPx):
|
||||
b ASM_PFX(SErrorEntry)
|
||||
|
||||
//
|
||||
// Lower EL using AArch64 : 0x400 - 0x580
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SYNC)
|
||||
ASM_PFX(SynchronousExceptionA64):
|
||||
b ASM_PFX(SynchronousExceptionEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_IRQ)
|
||||
ASM_PFX(IrqA64):
|
||||
b ASM_PFX(IrqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_FIQ)
|
||||
ASM_PFX(FiqA64):
|
||||
b ASM_PFX(FiqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A64_SERR)
|
||||
ASM_PFX(SErrorA64):
|
||||
b ASM_PFX(SErrorEntry)
|
||||
|
||||
//
|
||||
// Lower EL using AArch32 : 0x0 - 0x180
|
||||
// Lower EL using AArch32 : 0x600 - 0x780
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SYNC)
|
||||
ASM_PFX(SynchronousExceptionA32):
|
||||
b ASM_PFX(SynchronousExceptionEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_IRQ)
|
||||
ASM_PFX(IrqA32):
|
||||
b ASM_PFX(IrqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_FIQ)
|
||||
ASM_PFX(FiqA32):
|
||||
b ASM_PFX(FiqEntry)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(ExceptionHandlersStart, ARM_VECTOR_LOW_A32_SERR)
|
||||
ASM_PFX(SErrorA32):
|
||||
b ASM_PFX(SErrorEntry)
|
||||
|
||||
VECTOR_END(ExceptionHandlersStart)
|
||||
|
||||
#undef REG_PAIR
|
||||
#undef REG_ONE
|
||||
|
|
|
@ -97,6 +97,38 @@
|
|||
|
||||
#define ARM_VECTOR_TABLE_ALIGNMENT ((1 << 11)-1)
|
||||
|
||||
// Vector table offset definitions
|
||||
#define ARM_VECTOR_CUR_SP0_SYNC 0x000
|
||||
#define ARM_VECTOR_CUR_SP0_IRQ 0x080
|
||||
#define ARM_VECTOR_CUR_SP0_FIQ 0x100
|
||||
#define ARM_VECTOR_CUR_SP0_SERR 0x180
|
||||
|
||||
#define ARM_VECTOR_CUR_SPx_SYNC 0x200
|
||||
#define ARM_VECTOR_CUR_SPx_IRQ 0x280
|
||||
#define ARM_VECTOR_CUR_SPx_FIQ 0x300
|
||||
#define ARM_VECTOR_CUR_SPx_SERR 0x380
|
||||
|
||||
#define ARM_VECTOR_LOW_A64_SYNC 0x400
|
||||
#define ARM_VECTOR_LOW_A64_IRQ 0x480
|
||||
#define ARM_VECTOR_LOW_A64_FIQ 0x500
|
||||
#define ARM_VECTOR_LOW_A64_SERR 0x580
|
||||
|
||||
#define ARM_VECTOR_LOW_A32_SYNC 0x600
|
||||
#define ARM_VECTOR_LOW_A32_IRQ 0x680
|
||||
#define ARM_VECTOR_LOW_A32_FIQ 0x700
|
||||
#define ARM_VECTOR_LOW_A32_SERR 0x780
|
||||
|
||||
#define VECTOR_BASE(tbl) \
|
||||
.align 11; \
|
||||
GCC_ASM_EXPORT(tbl); \
|
||||
ASM_PFX(tbl): \
|
||||
|
||||
#define VECTOR_ENTRY(tbl, off) \
|
||||
.org ASM_PFX(tbl) + off
|
||||
|
||||
#define VECTOR_END(tbl) \
|
||||
.org ASM_PFX(tbl) + 0x800
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmEnableSWPInstruction (
|
||||
|
|
|
@ -12,82 +12,85 @@
|
|||
#
|
||||
#------------------------------------------------------------------------------
|
||||
|
||||
GCC_ASM_EXPORT(DebugAgentVectorTable)
|
||||
#include <Chipset/AArch64.h>
|
||||
|
||||
GCC_ASM_IMPORT(DefaultExceptionHandler)
|
||||
|
||||
.text
|
||||
.align 11
|
||||
ASM_PFX(DebugAgentVectorTable):
|
||||
VECTOR_BASE(DebugAgentVectorTable)
|
||||
|
||||
//
|
||||
// Current EL with SP0 : 0x0 - 0x180
|
||||
//
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SP0_SYNC)
|
||||
ASM_PFX(SynchronousExceptionSP0):
|
||||
b ASM_PFX(SynchronousExceptionSP0)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SP0_IRQ)
|
||||
ASM_PFX(IrqSP0):
|
||||
b ASM_PFX(IrqSP0)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SP0_FIQ)
|
||||
ASM_PFX(FiqSP0):
|
||||
b ASM_PFX(FiqSP0)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SP0_SERR)
|
||||
ASM_PFX(SErrorSP0):
|
||||
b ASM_PFX(SErrorSP0)
|
||||
|
||||
//
|
||||
// Current EL with SPx: 0x200 - 0x380
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SPx_SYNC)
|
||||
ASM_PFX(SynchronousExceptionSPx):
|
||||
b ASM_PFX(SynchronousExceptionSPx)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SPx_IRQ)
|
||||
ASM_PFX(IrqSPx):
|
||||
b ASM_PFX(IrqSPx)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SPx_FIQ)
|
||||
ASM_PFX(FiqSPx):
|
||||
b ASM_PFX(FiqSPx)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_CUR_SPx_SERR)
|
||||
ASM_PFX(SErrorSPx):
|
||||
b ASM_PFX(SErrorSPx)
|
||||
|
||||
/* Lower EL using AArch64 : 0x400 - 0x580 */
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A64_SYNC)
|
||||
ASM_PFX(SynchronousExceptionA64):
|
||||
b ASM_PFX(SynchronousExceptionA64)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A64_IRQ)
|
||||
ASM_PFX(IrqA64):
|
||||
b ASM_PFX(IrqA64)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A64_FIQ)
|
||||
ASM_PFX(FiqA64):
|
||||
b ASM_PFX(FiqA64)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A64_SERR)
|
||||
ASM_PFX(SErrorA64):
|
||||
b ASM_PFX(SErrorA64)
|
||||
|
||||
//
|
||||
// Lower EL using AArch32 : 0x0 - 0x180
|
||||
// Lower EL using AArch32 : 0x600 - 0x780
|
||||
//
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A32_SYNC)
|
||||
ASM_PFX(SynchronousExceptionA32):
|
||||
b ASM_PFX(SynchronousExceptionA32)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A32_IRQ)
|
||||
ASM_PFX(IrqA32):
|
||||
b ASM_PFX(IrqA32)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A32_FIQ)
|
||||
ASM_PFX(FiqA32):
|
||||
b ASM_PFX(FiqA32)
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(DebugAgentVectorTable, ARM_VECTOR_LOW_A32_SERR)
|
||||
ASM_PFX(SErrorA32):
|
||||
b ASM_PFX(SErrorA32)
|
||||
|
||||
VECTOR_END(DebugAgentVectorTable)
|
||||
|
|
|
@ -11,22 +11,17 @@
|
|||
#
|
||||
#
|
||||
|
||||
#include <Chipset/AArch64.h>
|
||||
#include <AsmMacroIoLibV8.h>
|
||||
#include <Base.h>
|
||||
#include <AutoGen.h>
|
||||
|
||||
.text
|
||||
.align 11
|
||||
|
||||
GCC_ASM_EXPORT(PeiVectorTable)
|
||||
|
||||
//============================================================
|
||||
//Default Exception Handlers
|
||||
//============================================================
|
||||
|
||||
ASM_PFX(PeiVectorTable):
|
||||
|
||||
|
||||
#define TO_HANDLER \
|
||||
EL1_OR_EL2(x1) \
|
||||
1: mrs x1, elr_el1 /* EL1 Exception Link Register */ ;\
|
||||
|
@ -40,42 +35,46 @@ ASM_PFX(PeiVectorTable):
|
|||
// No context saving at all.
|
||||
//
|
||||
|
||||
.align 7
|
||||
VECTOR_BASE(PeiVectorTable)
|
||||
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SYNC)
|
||||
_DefaultSyncExceptHandler_t:
|
||||
mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_IRQ)
|
||||
_DefaultIrq_t:
|
||||
mov x0, #EXCEPT_AARCH64_IRQ
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_FIQ)
|
||||
_DefaultFiq_t:
|
||||
mov x0, #EXCEPT_AARCH64_FIQ
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SP0_SERR)
|
||||
_DefaultSError_t:
|
||||
mov x0, #EXCEPT_AARCH64_SERROR
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPx_SYNC)
|
||||
_DefaultSyncExceptHandler_h:
|
||||
mov x0, #EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPx_IRQ)
|
||||
_DefaultIrq_h:
|
||||
mov x0, #EXCEPT_AARCH64_IRQ
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPx_FIQ)
|
||||
_DefaultFiq_h:
|
||||
mov x0, #EXCEPT_AARCH64_FIQ
|
||||
TO_HANDLER
|
||||
|
||||
.align 7
|
||||
VECTOR_ENTRY(PeiVectorTable, ARM_VECTOR_CUR_SPx_SERR)
|
||||
_DefaultSError_h:
|
||||
mov x0, #EXCEPT_AARCH64_SERROR
|
||||
TO_HANDLER
|
||||
|
||||
VECTOR_END(PeiVectorTable)
|
||||
|
|
Loading…
Reference in New Issue