/* * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) * * SPDX-License-Identifier: GPL-2.0-only */ #include #include #define ABORTSTACK_SIZE 4096 .text .align 12 BEGIN_FUNC(arm_vector_table) ldr pc, =invalid_vector_entry ldr pc, =invalid_vector_entry ldr pc, =invalid_vector_entry ldr pc, =invalid_vector_entry ldr pc, =arm_data_abort_exception ldr pc, =invalid_vector_entry ldr pc, =arm_irq_exception ldr pc, =invalid_vector_entry arm_vector_literals: .globl arm_vector_literals .ltorg END_FUNC(arm_vector_table) .align 12 /* * If any of the following exception happens, then there is something wrong * with our code, so abort explicitly: * - Undefined Instruction * - Supervisor Call * - Prefetch Abort */ BEGIN_FUNC(invalid_vector_entry) adr sp, _abortstack_bottom add sp, sp, #ABORTSTACK_SIZE bl invalid_exception END_FUNC(invalid_vector_entry) /* * Otherwise, we may receive some exceptions due to bootloader inappropriate * initialization, simply ignore them: * - Aborting instruction only if imprecise * - IRQ next instruction */ BEGIN_FUNC(arm_data_abort_exception) adr sp, _abortstack_bottom add sp, sp, #ABORTSTACK_SIZE /* Store CPSR and LR on stack */ sub lr, lr, #8 srsdb sp!, #PMODE_ABORT mrc p15, 0, r0, c5, c0, 0 /* Get data fault status register. */ mrc p15, 0, r1, c6, c0, 0 /* Get fault address register. */ bl check_data_abort_exception /* Jump to NextPC and restore user CPSR */ rfeia sp! END_FUNC(arm_data_abort_exception) BEGIN_FUNC(arm_irq_exception) adr sp, _abortstack_bottom add sp, sp, #ABORTSTACK_SIZE /* Store CPSR and LR on stack */ sub lr, lr, #4 srsdb sp!, #PMODE_IRQ bl valid_exception /* Jump to NextPC and restore CPSR */ rfeia sp! END_FUNC(arm_irq_exception) .align 3 _abortstack_bottom: .space ABORTSTACK_SIZE _abortstack_top: