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