1/* 2 * (C) Copyright 2013 3 * David Feng <fenghua@phytium.com.cn> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8#include <asm-offsets.h> 9#include <config.h> 10#include <asm/ptrace.h> 11#include <asm/macro.h> 12#include <linux/linkage.h> 13 14/* 15 * Exception vectors. 16 */ 17 .align 11 18 .globl vectors 19vectors: 20 .align 7 /* Current EL Synchronous Thread */ 21 stp x29, x30, [sp, #-16]! 22 bl _exception_entry 23 bl do_bad_sync 24 b exception_exit 25 26 .align 7 /* Current EL IRQ Thread */ 27 stp x29, x30, [sp, #-16]! 28 bl _exception_entry 29 bl do_bad_irq 30 b exception_exit 31 32 .align 7 /* Current EL FIQ Thread */ 33 stp x29, x30, [sp, #-16]! 34 bl _exception_entry 35 bl do_bad_fiq 36 b exception_exit 37 38 .align 7 /* Current EL Error Thread */ 39 stp x29, x30, [sp, #-16]! 40 bl _exception_entry 41 bl do_bad_error 42 b exception_exit 43 44 .align 7 /* Current EL Synchronous Handler */ 45 stp x29, x30, [sp, #-16]! 46 bl _exception_entry 47 bl do_sync 48 b exception_exit 49 50 .align 7 /* Current EL IRQ Handler */ 51 stp x29, x30, [sp, #-16]! 52 bl _exception_entry 53 bl do_irq 54 b exception_exit 55 56 .align 7 /* Current EL FIQ Handler */ 57 stp x29, x30, [sp, #-16]! 58 bl _exception_entry 59 bl do_fiq 60 b exception_exit 61 62 .align 7 /* Current EL Error Handler */ 63 stp x29, x30, [sp, #-16]! 64 bl _exception_entry 65 bl do_error 66 b exception_exit 67 68/* 69 * Enter Exception. 70 * This will save the processor state that is ELR/X0~X30 71 * to the stack frame. 72 */ 73_exception_entry: 74 stp x27, x28, [sp, #-16]! 75 stp x25, x26, [sp, #-16]! 76 stp x23, x24, [sp, #-16]! 77 stp x21, x22, [sp, #-16]! 78 stp x19, x20, [sp, #-16]! 79 stp x17, x18, [sp, #-16]! 80 stp x15, x16, [sp, #-16]! 81 stp x13, x14, [sp, #-16]! 82 stp x11, x12, [sp, #-16]! 83 stp x9, x10, [sp, #-16]! 84 stp x7, x8, [sp, #-16]! 85 stp x5, x6, [sp, #-16]! 86 stp x3, x4, [sp, #-16]! 87 stp x1, x2, [sp, #-16]! 88 89 /* Could be running at EL3/EL2/EL1 */ 90 switch_el x11, 3f, 2f, 1f 913: mrs x1, esr_el3 92 mrs x2, elr_el3 93 mrs x3, daif 94 mrs x4, vbar_el3 95 mrs x5, spsr_el3 96 sub x6, sp, #(8*30) 97 mrs x7, sctlr_el3 98 mrs x8, scr_el3 99 mrs x9, ttbr0_el3 100 b 0f 1012: mrs x1, esr_el2 102 mrs x2, elr_el2 103 mrs x3, daif 104 mrs x4, vbar_el2 105 mrs x5, spsr_el2 106 sub x6, sp, #(8*30) 107 mrs x7, sctlr_el2 108 mrs x8, hcr_el2 109 mrs x9, ttbr0_el2 110 b 0f 111 1121: mrs x1, esr_el1 113 mrs x2, elr_el1 114 mrs x3, daif 115 mrs x4, vbar_el1 116 mrs x5, spsr_el1 117 sub x6, sp, #(8*30) 118 mrs x7, sctlr_el1 119 mov x8, #0 /* Not used, EL1 don't have register, like 'scr_el1' */ 120 mrs x9, ttbr0_el1 1210: 122 stp x2, x0, [sp, #-16]! 123 stp x3, x1, [sp, #-16]! 124 stp x5, x4, [sp, #-16]! 125 stp x7, x6, [sp, #-16]! 126 stp x9, x8, [sp, #-16]! 127 mov x0, sp 128 ret 129 130 131exception_exit: 132 add sp, sp, #(8*8)/* see: sys registers size of struct pt_regs */ 133 ldp x2, x0, [sp],#16 134 switch_el x11, 3f, 2f, 1f 1353: msr elr_el3, x2 136 b 0f 1372: msr elr_el2, x2 138 b 0f 1391: msr elr_el1, x2 1400: 141 ldp x1, x2, [sp],#16 142 ldp x3, x4, [sp],#16 143 ldp x5, x6, [sp],#16 144 ldp x7, x8, [sp],#16 145 ldp x9, x10, [sp],#16 146 ldp x11, x12, [sp],#16 147 ldp x13, x14, [sp],#16 148 ldp x15, x16, [sp],#16 149 ldp x17, x18, [sp],#16 150 ldp x19, x20, [sp],#16 151 ldp x21, x22, [sp],#16 152 ldp x23, x24, [sp],#16 153 ldp x25, x26, [sp],#16 154 ldp x27, x28, [sp],#16 155 ldp x29, x30, [sp],#16 156 eret 157