.section ".text.exception" // save general registers to stack .macro save_all sub sp, sp, 36 * 8 stp x0, x1, [sp, 16 * 0] stp x2, x3, [sp, 16 * 1] stp x4, x5, [sp, 16 * 2] stp x6, x7, [sp, 16 * 3] stp x8, x9, [sp, 16 * 4] stp x10, x11, [sp, 16 * 5] stp x12, x13, [sp, 16 * 6] stp x14, x15, [sp, 16 * 7] stp x16, x17, [sp, 16 * 8] stp x18, x19, [sp, 16 * 9] stp x20, x21, [sp, 16 * 10] stp x22, x23, [sp, 16 * 11] stp x24, x25, [sp, 16 * 12] stp x26, x27, [sp, 16 * 13] stp x28, fp, [sp, 16 * 14] mrs x0, spsr_el1 mrs x1, elr_el1 mrs x2, esr_el1 mrs x3, sp_el0 stp lr, x0, [sp, 16 * 15] stp x1, x2, [sp, 16 * 16] str x3, [sp, 16 * 17] .endm // load general registers from stack .macro load_all ldp lr, x0, [sp, 16 * 15] ldp x1, x2, [sp, 16 * 16] ldr x3, [sp, 16 * 17] msr spsr_el1, x0 msr elr_el1, x1 msr esr_el1, x2 msr sp_el0, x3 ldp x0, x1, [sp, 16 * 0] ldp x2, x3, [sp, 16 * 1] ldp x4, x5, [sp, 16 * 2] ldp x6, x7, [sp, 16 * 3] ldp x8, x9, [sp, 16 * 4] ldp x10, x11, [sp, 16 * 5] ldp x12, x13, [sp, 16 * 6] ldp x14, x15, [sp, 16 * 7] ldp x16, x17, [sp, 16 * 8] ldp x18, x19, [sp, 16 * 9] ldp x20, x21, [sp, 16 * 10] ldp x22, x23, [sp, 16 * 11] ldp x24, x25, [sp, 16 * 12] ldp x26, x27, [sp, 16 * 13] ldp x28, fp, [sp, 16 * 14] add sp, sp, 36 * 8 .endm _null_handler: save_all bl not_implemented_handler load_all eret _synchronous_handler: save_all mov x0, sp bl synchronous_handler load_all eret _irq_handler: save_all bl irq_handler load_all eret .align 11 .global exception_vector_table exception_vector_table: b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _synchronous_handler .align 7 b _irq_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _synchronous_handler .align 7 b _irq_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7 b _null_handler .align 7