1*4f6ad66aSAchin Gupta/* 2*4f6ad66aSAchin Gupta * Copyright (c) 2013, ARM Limited. All rights reserved. 3*4f6ad66aSAchin Gupta * 4*4f6ad66aSAchin Gupta * Redistribution and use in source and binary forms, with or without 5*4f6ad66aSAchin Gupta * modification, are permitted provided that the following conditions are met: 6*4f6ad66aSAchin Gupta * 7*4f6ad66aSAchin Gupta * Redistributions of source code must retain the above copyright notice, this 8*4f6ad66aSAchin Gupta * list of conditions and the following disclaimer. 9*4f6ad66aSAchin Gupta * 10*4f6ad66aSAchin Gupta * Redistributions in binary form must reproduce the above copyright notice, 11*4f6ad66aSAchin Gupta * this list of conditions and the following disclaimer in the documentation 12*4f6ad66aSAchin Gupta * and/or other materials provided with the distribution. 13*4f6ad66aSAchin Gupta * 14*4f6ad66aSAchin Gupta * Neither the name of ARM nor the names of its contributors may be used 15*4f6ad66aSAchin Gupta * to endorse or promote products derived from this software without specific 16*4f6ad66aSAchin Gupta * prior written permission. 17*4f6ad66aSAchin Gupta * 18*4f6ad66aSAchin Gupta * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*4f6ad66aSAchin Gupta * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*4f6ad66aSAchin Gupta * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*4f6ad66aSAchin Gupta * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*4f6ad66aSAchin Gupta * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*4f6ad66aSAchin Gupta * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*4f6ad66aSAchin Gupta * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*4f6ad66aSAchin Gupta * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*4f6ad66aSAchin Gupta * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*4f6ad66aSAchin Gupta * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*4f6ad66aSAchin Gupta * POSSIBILITY OF SUCH DAMAGE. 29*4f6ad66aSAchin Gupta */ 30*4f6ad66aSAchin Gupta 31*4f6ad66aSAchin Gupta#include <arch.h> 32*4f6ad66aSAchin Gupta#include <runtime_svc.h> 33*4f6ad66aSAchin Gupta 34*4f6ad66aSAchin Gupta .globl runtime_exceptions 35*4f6ad66aSAchin Gupta 36*4f6ad66aSAchin Gupta 37*4f6ad66aSAchin Gupta#include <asm_macros.S> 38*4f6ad66aSAchin Gupta 39*4f6ad66aSAchin Gupta 40*4f6ad66aSAchin Gupta .section aarch64_code, "ax"; .align 11 41*4f6ad66aSAchin Gupta 42*4f6ad66aSAchin Gupta .align 7 43*4f6ad66aSAchin Guptaruntime_exceptions: 44*4f6ad66aSAchin Gupta /* ----------------------------------------------------- 45*4f6ad66aSAchin Gupta * Current EL with _sp_el0 : 0x0 - 0x180 46*4f6ad66aSAchin Gupta * ----------------------------------------------------- 47*4f6ad66aSAchin Gupta */ 48*4f6ad66aSAchin Guptasync_exception_sp_el0: 49*4f6ad66aSAchin Gupta exception_entry save_regs 50*4f6ad66aSAchin Gupta mov x0, #SYNC_EXCEPTION_SP_EL0 51*4f6ad66aSAchin Gupta mov x1, sp 52*4f6ad66aSAchin Gupta bl sync_exception_handler 53*4f6ad66aSAchin Gupta exception_exit restore_regs 54*4f6ad66aSAchin Gupta eret 55*4f6ad66aSAchin Gupta 56*4f6ad66aSAchin Gupta .align 7 57*4f6ad66aSAchin Guptairq_sp_el0: 58*4f6ad66aSAchin Gupta exception_entry save_regs 59*4f6ad66aSAchin Gupta mov x0, #IRQ_SP_EL0 60*4f6ad66aSAchin Gupta mov x1, sp 61*4f6ad66aSAchin Gupta bl async_exception_handler 62*4f6ad66aSAchin Gupta exception_exit restore_regs 63*4f6ad66aSAchin Gupta eret 64*4f6ad66aSAchin Gupta 65*4f6ad66aSAchin Gupta .align 7 66*4f6ad66aSAchin Guptafiq_sp_el0: 67*4f6ad66aSAchin Gupta exception_entry save_regs 68*4f6ad66aSAchin Gupta mov x0, #FIQ_SP_EL0 69*4f6ad66aSAchin Gupta mov x1, sp 70*4f6ad66aSAchin Gupta bl async_exception_handler 71*4f6ad66aSAchin Gupta exception_exit restore_regs 72*4f6ad66aSAchin Gupta eret 73*4f6ad66aSAchin Gupta 74*4f6ad66aSAchin Gupta .align 7 75*4f6ad66aSAchin Guptaserror_sp_el0: 76*4f6ad66aSAchin Gupta exception_entry save_regs 77*4f6ad66aSAchin Gupta mov x0, #SERROR_SP_EL0 78*4f6ad66aSAchin Gupta mov x1, sp 79*4f6ad66aSAchin Gupta bl async_exception_handler 80*4f6ad66aSAchin Gupta exception_exit restore_regs 81*4f6ad66aSAchin Gupta eret 82*4f6ad66aSAchin Gupta 83*4f6ad66aSAchin Gupta /* ----------------------------------------------------- 84*4f6ad66aSAchin Gupta * Current EL with SPx: 0x200 - 0x380 85*4f6ad66aSAchin Gupta * ----------------------------------------------------- 86*4f6ad66aSAchin Gupta */ 87*4f6ad66aSAchin Gupta .align 7 88*4f6ad66aSAchin Guptasync_exception_sp_elx: 89*4f6ad66aSAchin Gupta exception_entry save_regs 90*4f6ad66aSAchin Gupta mov x0, #SYNC_EXCEPTION_SP_ELX 91*4f6ad66aSAchin Gupta mov x1, sp 92*4f6ad66aSAchin Gupta bl sync_exception_handler 93*4f6ad66aSAchin Gupta exception_exit restore_regs 94*4f6ad66aSAchin Gupta eret 95*4f6ad66aSAchin Gupta 96*4f6ad66aSAchin Gupta .align 7 97*4f6ad66aSAchin Guptairq_sp_elx: 98*4f6ad66aSAchin Gupta exception_entry save_regs 99*4f6ad66aSAchin Gupta mov x0, #IRQ_SP_ELX 100*4f6ad66aSAchin Gupta mov x1, sp 101*4f6ad66aSAchin Gupta bl async_exception_handler 102*4f6ad66aSAchin Gupta exception_exit restore_regs 103*4f6ad66aSAchin Gupta eret 104*4f6ad66aSAchin Gupta 105*4f6ad66aSAchin Gupta .align 7 106*4f6ad66aSAchin Guptafiq_sp_elx: 107*4f6ad66aSAchin Gupta exception_entry save_regs 108*4f6ad66aSAchin Gupta mov x0, #FIQ_SP_ELX 109*4f6ad66aSAchin Gupta mov x1, sp 110*4f6ad66aSAchin Gupta bl async_exception_handler 111*4f6ad66aSAchin Gupta exception_exit restore_regs 112*4f6ad66aSAchin Gupta eret 113*4f6ad66aSAchin Gupta 114*4f6ad66aSAchin Gupta .align 7 115*4f6ad66aSAchin Guptaserror_sp_elx: 116*4f6ad66aSAchin Gupta exception_entry save_regs 117*4f6ad66aSAchin Gupta mov x0, #SERROR_SP_ELX 118*4f6ad66aSAchin Gupta mov x1, sp 119*4f6ad66aSAchin Gupta bl async_exception_handler 120*4f6ad66aSAchin Gupta exception_exit restore_regs 121*4f6ad66aSAchin Gupta eret 122*4f6ad66aSAchin Gupta 123*4f6ad66aSAchin Gupta /* ----------------------------------------------------- 124*4f6ad66aSAchin Gupta * Lower EL using AArch64 : 0x400 - 0x580 125*4f6ad66aSAchin Gupta * ----------------------------------------------------- 126*4f6ad66aSAchin Gupta */ 127*4f6ad66aSAchin Gupta .align 7 128*4f6ad66aSAchin Guptasync_exception_aarch64: 129*4f6ad66aSAchin Gupta exception_entry save_regs 130*4f6ad66aSAchin Gupta mov x0, #SYNC_EXCEPTION_AARCH64 131*4f6ad66aSAchin Gupta mov x1, sp 132*4f6ad66aSAchin Gupta bl sync_exception_handler 133*4f6ad66aSAchin Gupta exception_exit restore_regs 134*4f6ad66aSAchin Gupta eret 135*4f6ad66aSAchin Gupta 136*4f6ad66aSAchin Gupta .align 7 137*4f6ad66aSAchin Guptairq_aarch64: 138*4f6ad66aSAchin Gupta exception_entry save_regs 139*4f6ad66aSAchin Gupta mov x0, #IRQ_AARCH64 140*4f6ad66aSAchin Gupta mov x1, sp 141*4f6ad66aSAchin Gupta bl async_exception_handler 142*4f6ad66aSAchin Gupta exception_exit restore_regs 143*4f6ad66aSAchin Gupta eret 144*4f6ad66aSAchin Gupta 145*4f6ad66aSAchin Gupta .align 7 146*4f6ad66aSAchin Guptafiq_aarch64: 147*4f6ad66aSAchin Gupta exception_entry save_regs 148*4f6ad66aSAchin Gupta mov x0, #FIQ_AARCH64 149*4f6ad66aSAchin Gupta mov x1, sp 150*4f6ad66aSAchin Gupta bl async_exception_handler 151*4f6ad66aSAchin Gupta exception_exit restore_regs 152*4f6ad66aSAchin Gupta eret 153*4f6ad66aSAchin Gupta 154*4f6ad66aSAchin Gupta .align 7 155*4f6ad66aSAchin Guptaserror_aarch64: 156*4f6ad66aSAchin Gupta exception_entry save_regs 157*4f6ad66aSAchin Gupta mov x0, #IRQ_AARCH32 158*4f6ad66aSAchin Gupta mov x1, sp 159*4f6ad66aSAchin Gupta bl async_exception_handler 160*4f6ad66aSAchin Gupta exception_exit restore_regs 161*4f6ad66aSAchin Gupta eret 162*4f6ad66aSAchin Gupta 163*4f6ad66aSAchin Gupta /* ----------------------------------------------------- 164*4f6ad66aSAchin Gupta * Lower EL using AArch32 : 0x600 - 0x780 165*4f6ad66aSAchin Gupta * ----------------------------------------------------- 166*4f6ad66aSAchin Gupta */ 167*4f6ad66aSAchin Gupta .align 7 168*4f6ad66aSAchin Guptasync_exception_aarch32: 169*4f6ad66aSAchin Gupta exception_entry save_regs 170*4f6ad66aSAchin Gupta mov x0, #SYNC_EXCEPTION_AARCH32 171*4f6ad66aSAchin Gupta mov x1, sp 172*4f6ad66aSAchin Gupta bl sync_exception_handler 173*4f6ad66aSAchin Gupta exception_exit restore_regs 174*4f6ad66aSAchin Gupta eret 175*4f6ad66aSAchin Gupta 176*4f6ad66aSAchin Gupta .align 7 177*4f6ad66aSAchin Guptairq_aarch32: 178*4f6ad66aSAchin Gupta exception_entry save_regs 179*4f6ad66aSAchin Gupta mov x0, #IRQ_AARCH32 180*4f6ad66aSAchin Gupta mov x1, sp 181*4f6ad66aSAchin Gupta bl async_exception_handler 182*4f6ad66aSAchin Gupta exception_exit restore_regs 183*4f6ad66aSAchin Gupta eret 184*4f6ad66aSAchin Gupta 185*4f6ad66aSAchin Gupta .align 7 186*4f6ad66aSAchin Guptafiq_aarch32: 187*4f6ad66aSAchin Gupta exception_entry save_regs 188*4f6ad66aSAchin Gupta mov x0, #FIQ_AARCH32 189*4f6ad66aSAchin Gupta mov x1, sp 190*4f6ad66aSAchin Gupta bl async_exception_handler 191*4f6ad66aSAchin Gupta exception_exit restore_regs 192*4f6ad66aSAchin Gupta eret 193*4f6ad66aSAchin Gupta 194*4f6ad66aSAchin Gupta .align 7 195*4f6ad66aSAchin Guptaserror_aarch32: 196*4f6ad66aSAchin Gupta exception_entry save_regs 197*4f6ad66aSAchin Gupta mov x0, #SERROR_AARCH32 198*4f6ad66aSAchin Gupta mov x1, sp 199*4f6ad66aSAchin Gupta bl async_exception_handler 200*4f6ad66aSAchin Gupta exception_exit restore_regs 201*4f6ad66aSAchin Gupta eret 202*4f6ad66aSAchin Gupta 203*4f6ad66aSAchin Gupta .align 7 204*4f6ad66aSAchin Gupta 205*4f6ad66aSAchin Guptasave_regs:; .type save_regs, %function 206*4f6ad66aSAchin Gupta sub sp, sp, #0x100 207*4f6ad66aSAchin Gupta stp x0, x1, [sp, #0x0] 208*4f6ad66aSAchin Gupta stp x2, x3, [sp, #0x10] 209*4f6ad66aSAchin Gupta stp x4, x5, [sp, #0x20] 210*4f6ad66aSAchin Gupta stp x6, x7, [sp, #0x30] 211*4f6ad66aSAchin Gupta stp x8, x9, [sp, #0x40] 212*4f6ad66aSAchin Gupta stp x10, x11, [sp, #0x50] 213*4f6ad66aSAchin Gupta stp x12, x13, [sp, #0x60] 214*4f6ad66aSAchin Gupta stp x14, x15, [sp, #0x70] 215*4f6ad66aSAchin Gupta stp x16, x17, [sp, #0x80] 216*4f6ad66aSAchin Gupta stp x18, x19, [sp, #0x90] 217*4f6ad66aSAchin Gupta stp x20, x21, [sp, #0xa0] 218*4f6ad66aSAchin Gupta stp x22, x23, [sp, #0xb0] 219*4f6ad66aSAchin Gupta stp x24, x25, [sp, #0xc0] 220*4f6ad66aSAchin Gupta stp x26, x27, [sp, #0xd0] 221*4f6ad66aSAchin Gupta mrs x0, sp_el0 222*4f6ad66aSAchin Gupta stp x28, x0, [sp, #0xe0] 223*4f6ad66aSAchin Gupta mrs x0, spsr_el3 224*4f6ad66aSAchin Gupta str x0, [sp, #0xf0] 225*4f6ad66aSAchin Gupta ret 226*4f6ad66aSAchin Gupta 227*4f6ad66aSAchin Gupta 228*4f6ad66aSAchin Guptarestore_regs:; .type restore_regs, %function 229*4f6ad66aSAchin Gupta ldr x9, [sp, #0xf0] 230*4f6ad66aSAchin Gupta msr spsr_el3, x9 231*4f6ad66aSAchin Gupta ldp x28, x9, [sp, #0xe0] 232*4f6ad66aSAchin Gupta msr sp_el0, x9 233*4f6ad66aSAchin Gupta ldp x26, x27, [sp, #0xd0] 234*4f6ad66aSAchin Gupta ldp x24, x25, [sp, #0xc0] 235*4f6ad66aSAchin Gupta ldp x22, x23, [sp, #0xb0] 236*4f6ad66aSAchin Gupta ldp x20, x21, [sp, #0xa0] 237*4f6ad66aSAchin Gupta ldp x18, x19, [sp, #0x90] 238*4f6ad66aSAchin Gupta ldp x16, x17, [sp, #0x80] 239*4f6ad66aSAchin Gupta ldp x14, x15, [sp, #0x70] 240*4f6ad66aSAchin Gupta ldp x12, x13, [sp, #0x60] 241*4f6ad66aSAchin Gupta ldp x10, x11, [sp, #0x50] 242*4f6ad66aSAchin Gupta ldp x8, x9, [sp, #0x40] 243*4f6ad66aSAchin Gupta ldp x6, x7, [sp, #0x30] 244*4f6ad66aSAchin Gupta ldp x4, x5, [sp, #0x20] 245*4f6ad66aSAchin Gupta ldp x2, x3, [sp, #0x10] 246*4f6ad66aSAchin Gupta ldp x0, x1, [sp, #0x0] 247*4f6ad66aSAchin Gupta add sp, sp, #0x100 248*4f6ad66aSAchin Gupta ret 249