1*0ae76531SDavid Feng/* 2*0ae76531SDavid Feng * (C) Copyright 2013 3*0ae76531SDavid Feng * David Feng <fenghua@phytium.com.cn> 4*0ae76531SDavid Feng * 5*0ae76531SDavid Feng * SPDX-License-Identifier: GPL-2.0+ 6*0ae76531SDavid Feng */ 7*0ae76531SDavid Feng 8*0ae76531SDavid Feng#include <asm-offsets.h> 9*0ae76531SDavid Feng#include <config.h> 10*0ae76531SDavid Feng#include <version.h> 11*0ae76531SDavid Feng#include <asm/ptrace.h> 12*0ae76531SDavid Feng#include <asm/macro.h> 13*0ae76531SDavid Feng#include <linux/linkage.h> 14*0ae76531SDavid Feng 15*0ae76531SDavid Feng/* 16*0ae76531SDavid Feng * Enter Exception. 17*0ae76531SDavid Feng * This will save the processor state that is ELR/X0~X30 18*0ae76531SDavid Feng * to the stack frame. 19*0ae76531SDavid Feng */ 20*0ae76531SDavid Feng.macro exception_entry 21*0ae76531SDavid Feng stp x29, x30, [sp, #-16]! 22*0ae76531SDavid Feng stp x27, x28, [sp, #-16]! 23*0ae76531SDavid Feng stp x25, x26, [sp, #-16]! 24*0ae76531SDavid Feng stp x23, x24, [sp, #-16]! 25*0ae76531SDavid Feng stp x21, x22, [sp, #-16]! 26*0ae76531SDavid Feng stp x19, x20, [sp, #-16]! 27*0ae76531SDavid Feng stp x17, x18, [sp, #-16]! 28*0ae76531SDavid Feng stp x15, x16, [sp, #-16]! 29*0ae76531SDavid Feng stp x13, x14, [sp, #-16]! 30*0ae76531SDavid Feng stp x11, x12, [sp, #-16]! 31*0ae76531SDavid Feng stp x9, x10, [sp, #-16]! 32*0ae76531SDavid Feng stp x7, x8, [sp, #-16]! 33*0ae76531SDavid Feng stp x5, x6, [sp, #-16]! 34*0ae76531SDavid Feng stp x3, x4, [sp, #-16]! 35*0ae76531SDavid Feng stp x1, x2, [sp, #-16]! 36*0ae76531SDavid Feng 37*0ae76531SDavid Feng /* Could be running at EL3/EL2/EL1 */ 38*0ae76531SDavid Feng switch_el x11, 3f, 2f, 1f 39*0ae76531SDavid Feng3: mrs x1, esr_el3 40*0ae76531SDavid Feng mrs x2, elr_el3 41*0ae76531SDavid Feng b 0f 42*0ae76531SDavid Feng2: mrs x1, esr_el2 43*0ae76531SDavid Feng mrs x2, elr_el2 44*0ae76531SDavid Feng b 0f 45*0ae76531SDavid Feng1: mrs x1, esr_el1 46*0ae76531SDavid Feng mrs x2, elr_el1 47*0ae76531SDavid Feng0: 48*0ae76531SDavid Feng stp x2, x0, [sp, #-16]! 49*0ae76531SDavid Feng mov x0, sp 50*0ae76531SDavid Feng.endm 51*0ae76531SDavid Feng 52*0ae76531SDavid Feng/* 53*0ae76531SDavid Feng * Exception vectors. 54*0ae76531SDavid Feng */ 55*0ae76531SDavid Feng .align 11 56*0ae76531SDavid Feng .globl vectors 57*0ae76531SDavid Fengvectors: 58*0ae76531SDavid Feng .align 7 59*0ae76531SDavid Feng b _do_bad_sync /* Current EL Synchronous Thread */ 60*0ae76531SDavid Feng 61*0ae76531SDavid Feng .align 7 62*0ae76531SDavid Feng b _do_bad_irq /* Current EL IRQ Thread */ 63*0ae76531SDavid Feng 64*0ae76531SDavid Feng .align 7 65*0ae76531SDavid Feng b _do_bad_fiq /* Current EL FIQ Thread */ 66*0ae76531SDavid Feng 67*0ae76531SDavid Feng .align 7 68*0ae76531SDavid Feng b _do_bad_error /* Current EL Error Thread */ 69*0ae76531SDavid Feng 70*0ae76531SDavid Feng .align 7 71*0ae76531SDavid Feng b _do_sync /* Current EL Synchronous Handler */ 72*0ae76531SDavid Feng 73*0ae76531SDavid Feng .align 7 74*0ae76531SDavid Feng b _do_irq /* Current EL IRQ Handler */ 75*0ae76531SDavid Feng 76*0ae76531SDavid Feng .align 7 77*0ae76531SDavid Feng b _do_fiq /* Current EL FIQ Handler */ 78*0ae76531SDavid Feng 79*0ae76531SDavid Feng .align 7 80*0ae76531SDavid Feng b _do_error /* Current EL Error Handler */ 81*0ae76531SDavid Feng 82*0ae76531SDavid Feng 83*0ae76531SDavid Feng_do_bad_sync: 84*0ae76531SDavid Feng exception_entry 85*0ae76531SDavid Feng bl do_bad_sync 86*0ae76531SDavid Feng 87*0ae76531SDavid Feng_do_bad_irq: 88*0ae76531SDavid Feng exception_entry 89*0ae76531SDavid Feng bl do_bad_irq 90*0ae76531SDavid Feng 91*0ae76531SDavid Feng_do_bad_fiq: 92*0ae76531SDavid Feng exception_entry 93*0ae76531SDavid Feng bl do_bad_fiq 94*0ae76531SDavid Feng 95*0ae76531SDavid Feng_do_bad_error: 96*0ae76531SDavid Feng exception_entry 97*0ae76531SDavid Feng bl do_bad_error 98*0ae76531SDavid Feng 99*0ae76531SDavid Feng_do_sync: 100*0ae76531SDavid Feng exception_entry 101*0ae76531SDavid Feng bl do_sync 102*0ae76531SDavid Feng 103*0ae76531SDavid Feng_do_irq: 104*0ae76531SDavid Feng exception_entry 105*0ae76531SDavid Feng bl do_irq 106*0ae76531SDavid Feng 107*0ae76531SDavid Feng_do_fiq: 108*0ae76531SDavid Feng exception_entry 109*0ae76531SDavid Feng bl do_fiq 110*0ae76531SDavid Feng 111*0ae76531SDavid Feng_do_error: 112*0ae76531SDavid Feng exception_entry 113*0ae76531SDavid Feng bl do_error 114