1df8f3188SJeenu Viswambharan/* 2df8f3188SJeenu Viswambharan * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3df8f3188SJeenu Viswambharan * 4df8f3188SJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause 5df8f3188SJeenu Viswambharan */ 6df8f3188SJeenu Viswambharan 7df8f3188SJeenu Viswambharan 8df8f3188SJeenu Viswambharan#include <asm_macros.S> 9ee6ff1bbSJeenu Viswambharan#include <assert_macros.S> 10df8f3188SJeenu Viswambharan#include <context.h> 11df8f3188SJeenu Viswambharan#include <ea_handle.h> 12*b56dc2a9SJeenu Viswambharan#include <ras_arch.h> 13df8f3188SJeenu Viswambharan 14df8f3188SJeenu Viswambharan 15df8f3188SJeenu Viswambharan .globl handle_lower_el_ea_esb 16df8f3188SJeenu Viswambharan .globl enter_lower_el_sync_ea 17df8f3188SJeenu Viswambharan .globl enter_lower_el_async_ea 18df8f3188SJeenu Viswambharan 19df8f3188SJeenu Viswambharan 20df8f3188SJeenu Viswambharan/* 21df8f3188SJeenu Viswambharan * Function to delegate External Aborts synchronized by ESB instruction at EL3 22df8f3188SJeenu Viswambharan * vector entry. This function assumes GP registers x0-x29 have been saved, and 23df8f3188SJeenu Viswambharan * are available for use. It delegates the handling of the EA to platform 24df8f3188SJeenu Viswambharan * handler, and returns only upon successfully handling the EA; otherwise 25df8f3188SJeenu Viswambharan * panics. On return from this function, the original exception handler is 26df8f3188SJeenu Viswambharan * expected to resume. 27df8f3188SJeenu Viswambharan */ 28df8f3188SJeenu Viswambharanfunc handle_lower_el_ea_esb 29df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_ESB 30df8f3188SJeenu Viswambharan mrs x1, DISR_EL1 31df8f3188SJeenu Viswambharan b ea_proceed 32df8f3188SJeenu Viswambharanendfunc handle_lower_el_ea_esb 33df8f3188SJeenu Viswambharan 34df8f3188SJeenu Viswambharan 35df8f3188SJeenu Viswambharan/* 36df8f3188SJeenu Viswambharan * This function forms the tail end of Synchronous Exception entry from lower 37df8f3188SJeenu Viswambharan * EL, and expects to handle only Synchronous External Aborts from lower EL. If 38df8f3188SJeenu Viswambharan * any other kind of exception is detected, then this function reports unhandled 39df8f3188SJeenu Viswambharan * exception. 40df8f3188SJeenu Viswambharan * 41df8f3188SJeenu Viswambharan * Since it's part of exception vector, this function doesn't expect any GP 42df8f3188SJeenu Viswambharan * registers to have been saved. It delegates the handling of the EA to platform 43df8f3188SJeenu Viswambharan * handler, and upon successfully handling the EA, exits EL3; otherwise panics. 44df8f3188SJeenu Viswambharan */ 45df8f3188SJeenu Viswambharanfunc enter_lower_el_sync_ea 46df8f3188SJeenu Viswambharan /* 47df8f3188SJeenu Viswambharan * Explicitly save x30 so as to free up a register and to enable 48df8f3188SJeenu Viswambharan * branching. 49df8f3188SJeenu Viswambharan */ 50df8f3188SJeenu Viswambharan str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 51df8f3188SJeenu Viswambharan 52df8f3188SJeenu Viswambharan mrs x30, esr_el3 53df8f3188SJeenu Viswambharan ubfx x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH 54df8f3188SJeenu Viswambharan 55df8f3188SJeenu Viswambharan /* Check for I/D aborts from lower EL */ 56df8f3188SJeenu Viswambharan cmp x30, #EC_IABORT_LOWER_EL 57df8f3188SJeenu Viswambharan b.eq 1f 58df8f3188SJeenu Viswambharan 59df8f3188SJeenu Viswambharan cmp x30, #EC_DABORT_LOWER_EL 60df8f3188SJeenu Viswambharan b.ne 2f 61df8f3188SJeenu Viswambharan 62df8f3188SJeenu Viswambharan1: 63df8f3188SJeenu Viswambharan /* Test for EA bit in the instruction syndrome */ 64df8f3188SJeenu Viswambharan mrs x30, esr_el3 65df8f3188SJeenu Viswambharan tbz x30, #ESR_ISS_EABORT_EA_BIT, 2f 66df8f3188SJeenu Viswambharan 67df8f3188SJeenu Viswambharan /* Save GP registers */ 68df8f3188SJeenu Viswambharan bl save_gp_registers 69df8f3188SJeenu Viswambharan 70df8f3188SJeenu Viswambharan /* Setup exception class and syndrome arguments for platform handler */ 71df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_SYNC 72df8f3188SJeenu Viswambharan mrs x1, esr_el3 73df8f3188SJeenu Viswambharan adr x30, el3_exit 74*b56dc2a9SJeenu Viswambharan b delegate_sync_ea 75df8f3188SJeenu Viswambharan 76df8f3188SJeenu Viswambharan2: 77df8f3188SJeenu Viswambharan /* Synchronous exceptions other than the above are assumed to be EA */ 78df8f3188SJeenu Viswambharan ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 79df8f3188SJeenu Viswambharan no_ret report_unhandled_exception 80df8f3188SJeenu Viswambharanendfunc enter_lower_el_sync_ea 81df8f3188SJeenu Viswambharan 82df8f3188SJeenu Viswambharan 83df8f3188SJeenu Viswambharan/* 84df8f3188SJeenu Viswambharan * This function handles SErrors from lower ELs. 85df8f3188SJeenu Viswambharan * 86df8f3188SJeenu Viswambharan * Since it's part of exception vector, this function doesn't expect any GP 87df8f3188SJeenu Viswambharan * registers to have been saved. It delegates the handling of the EA to platform 88df8f3188SJeenu Viswambharan * handler, and upon successfully handling the EA, exits EL3; otherwise panics. 89df8f3188SJeenu Viswambharan */ 90df8f3188SJeenu Viswambharanfunc enter_lower_el_async_ea 91df8f3188SJeenu Viswambharan /* 92df8f3188SJeenu Viswambharan * Explicitly save x30 so as to free up a register and to enable 93df8f3188SJeenu Viswambharan * branching 94df8f3188SJeenu Viswambharan */ 95df8f3188SJeenu Viswambharan str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 96df8f3188SJeenu Viswambharan 97df8f3188SJeenu Viswambharan /* Save GP registers */ 98df8f3188SJeenu Viswambharan bl save_gp_registers 99df8f3188SJeenu Viswambharan 100df8f3188SJeenu Viswambharan /* Setup exception class and syndrome arguments for platform handler */ 101df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_ASYNC 102df8f3188SJeenu Viswambharan mrs x1, esr_el3 103df8f3188SJeenu Viswambharan adr x30, el3_exit 104*b56dc2a9SJeenu Viswambharan b delegate_async_ea 105df8f3188SJeenu Viswambharanendfunc enter_lower_el_async_ea 106df8f3188SJeenu Viswambharan 107df8f3188SJeenu Viswambharan 108df8f3188SJeenu Viswambharan/* 109*b56dc2a9SJeenu Viswambharan * Prelude for Synchronous External Abort handling. This function assumes that 110*b56dc2a9SJeenu Viswambharan * all GP registers have been saved by the caller. 111*b56dc2a9SJeenu Viswambharan * 112*b56dc2a9SJeenu Viswambharan * x0: EA reason 113*b56dc2a9SJeenu Viswambharan * x1: EA syndrome 114*b56dc2a9SJeenu Viswambharan */ 115*b56dc2a9SJeenu Viswambharanfunc delegate_sync_ea 116*b56dc2a9SJeenu Viswambharan#if RAS_EXTENSION 117*b56dc2a9SJeenu Viswambharan /* 118*b56dc2a9SJeenu Viswambharan * Check for Uncontainable error type. If so, route to the platform 119*b56dc2a9SJeenu Viswambharan * fatal error handler rather than the generic EA one. 120*b56dc2a9SJeenu Viswambharan */ 121*b56dc2a9SJeenu Viswambharan ubfx x2, x1, #EABORT_SET_SHIFT, #EABORT_SET_WIDTH 122*b56dc2a9SJeenu Viswambharan cmp x2, #ERROR_STATUS_SET_UC 123*b56dc2a9SJeenu Viswambharan b.ne 1f 124*b56dc2a9SJeenu Viswambharan 125*b56dc2a9SJeenu Viswambharan /* Check fault status code */ 126*b56dc2a9SJeenu Viswambharan ubfx x3, x1, #EABORT_DFSC_SHIFT, #EABORT_DFSC_WIDTH 127*b56dc2a9SJeenu Viswambharan cmp x3, #SYNC_EA_FSC 128*b56dc2a9SJeenu Viswambharan b.ne 1f 129*b56dc2a9SJeenu Viswambharan 130*b56dc2a9SJeenu Viswambharan no_ret plat_handle_uncontainable_ea 131*b56dc2a9SJeenu Viswambharan1: 132*b56dc2a9SJeenu Viswambharan#endif 133*b56dc2a9SJeenu Viswambharan 134*b56dc2a9SJeenu Viswambharan b ea_proceed 135*b56dc2a9SJeenu Viswambharanendfunc delegate_sync_ea 136*b56dc2a9SJeenu Viswambharan 137*b56dc2a9SJeenu Viswambharan 138*b56dc2a9SJeenu Viswambharan/* 139*b56dc2a9SJeenu Viswambharan * Prelude for Asynchronous External Abort handling. This function assumes that 140*b56dc2a9SJeenu Viswambharan * all GP registers have been saved by the caller. 141*b56dc2a9SJeenu Viswambharan * 142*b56dc2a9SJeenu Viswambharan * x0: EA reason 143*b56dc2a9SJeenu Viswambharan * x1: EA syndrome 144*b56dc2a9SJeenu Viswambharan */ 145*b56dc2a9SJeenu Viswambharanfunc delegate_async_ea 146*b56dc2a9SJeenu Viswambharan#if RAS_EXTENSION 147*b56dc2a9SJeenu Viswambharan /* 148*b56dc2a9SJeenu Viswambharan * Check for Implementation Defined Syndrome. If so, skip checking 149*b56dc2a9SJeenu Viswambharan * Uncontainable error type from the syndrome as the format is unknown. 150*b56dc2a9SJeenu Viswambharan */ 151*b56dc2a9SJeenu Viswambharan tbnz x1, #SERROR_IDS_BIT, 1f 152*b56dc2a9SJeenu Viswambharan 153*b56dc2a9SJeenu Viswambharan /* 154*b56dc2a9SJeenu Viswambharan * Check for Uncontainable error type. If so, route to the platform 155*b56dc2a9SJeenu Viswambharan * fatal error handler rather than the generic EA one. 156*b56dc2a9SJeenu Viswambharan */ 157*b56dc2a9SJeenu Viswambharan ubfx x2, x1, #EABORT_AET_SHIFT, #EABORT_AET_WIDTH 158*b56dc2a9SJeenu Viswambharan cmp x2, #ERROR_STATUS_UET_UC 159*b56dc2a9SJeenu Viswambharan b.ne 1f 160*b56dc2a9SJeenu Viswambharan 161*b56dc2a9SJeenu Viswambharan /* Check DFSC for SError type */ 162*b56dc2a9SJeenu Viswambharan ubfx x3, x1, #EABORT_DFSC_SHIFT, #EABORT_DFSC_WIDTH 163*b56dc2a9SJeenu Viswambharan cmp x3, #DFSC_SERROR 164*b56dc2a9SJeenu Viswambharan b.ne 1f 165*b56dc2a9SJeenu Viswambharan 166*b56dc2a9SJeenu Viswambharan no_ret plat_handle_uncontainable_ea 167*b56dc2a9SJeenu Viswambharan1: 168*b56dc2a9SJeenu Viswambharan#endif 169*b56dc2a9SJeenu Viswambharan 170*b56dc2a9SJeenu Viswambharan b ea_proceed 171*b56dc2a9SJeenu Viswambharanendfunc delegate_async_ea 172*b56dc2a9SJeenu Viswambharan 173*b56dc2a9SJeenu Viswambharan 174*b56dc2a9SJeenu Viswambharan/* 175df8f3188SJeenu Viswambharan * Delegate External Abort handling to platform's EA handler. This function 176df8f3188SJeenu Viswambharan * assumes that all GP registers have been saved by the caller. 177df8f3188SJeenu Viswambharan * 178df8f3188SJeenu Viswambharan * x0: EA reason 179df8f3188SJeenu Viswambharan * x1: EA syndrome 180df8f3188SJeenu Viswambharan */ 181df8f3188SJeenu Viswambharanfunc ea_proceed 182df8f3188SJeenu Viswambharan /* Save EL3 state */ 183df8f3188SJeenu Viswambharan mrs x2, spsr_el3 184df8f3188SJeenu Viswambharan mrs x3, elr_el3 185df8f3188SJeenu Viswambharan stp x2, x3, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] 186df8f3188SJeenu Viswambharan 187df8f3188SJeenu Viswambharan /* 188df8f3188SJeenu Viswambharan * Save ESR as handling might involve lower ELs, and returning back to 189df8f3188SJeenu Viswambharan * EL3 from there would trample the original ESR. 190df8f3188SJeenu Viswambharan */ 191df8f3188SJeenu Viswambharan mrs x4, scr_el3 192df8f3188SJeenu Viswambharan mrs x5, esr_el3 193df8f3188SJeenu Viswambharan stp x4, x5, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] 194df8f3188SJeenu Viswambharan 195df8f3188SJeenu Viswambharan /* 196df8f3188SJeenu Viswambharan * Setup rest of arguments, and call platform External Abort handler. 197df8f3188SJeenu Viswambharan * 198df8f3188SJeenu Viswambharan * x0: EA reason (already in place) 199df8f3188SJeenu Viswambharan * x1: Exception syndrome (already in place). 200df8f3188SJeenu Viswambharan * x2: Cookie (unused for now). 201df8f3188SJeenu Viswambharan * x3: Context pointer. 202df8f3188SJeenu Viswambharan * x4: Flags (security state from SCR for now). 203df8f3188SJeenu Viswambharan */ 204df8f3188SJeenu Viswambharan mov x2, xzr 205df8f3188SJeenu Viswambharan mov x3, sp 206df8f3188SJeenu Viswambharan ubfx x4, x4, #0, #1 207df8f3188SJeenu Viswambharan 208df8f3188SJeenu Viswambharan /* Switch to runtime stack */ 209df8f3188SJeenu Viswambharan ldr x5, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] 210df8f3188SJeenu Viswambharan msr spsel, #0 211df8f3188SJeenu Viswambharan mov sp, x5 212df8f3188SJeenu Viswambharan 213df8f3188SJeenu Viswambharan mov x29, x30 214ee6ff1bbSJeenu Viswambharan#if ENABLE_ASSERTIONS 215ee6ff1bbSJeenu Viswambharan /* Stash the stack pointer */ 216ee6ff1bbSJeenu Viswambharan mov x28, sp 217ee6ff1bbSJeenu Viswambharan#endif 218df8f3188SJeenu Viswambharan bl plat_ea_handler 219df8f3188SJeenu Viswambharan mov x30, x29 220df8f3188SJeenu Viswambharan 221ee6ff1bbSJeenu Viswambharan#if ENABLE_ASSERTIONS 222ee6ff1bbSJeenu Viswambharan /* 223ee6ff1bbSJeenu Viswambharan * Error handling flows might involve long jumps; so upon returning from 224ee6ff1bbSJeenu Viswambharan * the platform error handler, validate that the we've completely 225ee6ff1bbSJeenu Viswambharan * unwound the stack. 226ee6ff1bbSJeenu Viswambharan */ 227ee6ff1bbSJeenu Viswambharan mov x27, sp 228ee6ff1bbSJeenu Viswambharan cmp x28, x27 229ee6ff1bbSJeenu Viswambharan ASM_ASSERT(eq) 230ee6ff1bbSJeenu Viswambharan#endif 231ee6ff1bbSJeenu Viswambharan 232df8f3188SJeenu Viswambharan /* Make SP point to context */ 233df8f3188SJeenu Viswambharan msr spsel, #1 234df8f3188SJeenu Viswambharan 235df8f3188SJeenu Viswambharan /* Restore EL3 state */ 236df8f3188SJeenu Viswambharan ldp x1, x2, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] 237df8f3188SJeenu Viswambharan msr spsr_el3, x1 238df8f3188SJeenu Viswambharan msr elr_el3, x2 239df8f3188SJeenu Viswambharan 240df8f3188SJeenu Viswambharan /* Restore ESR_EL3 and SCR_EL3 */ 241df8f3188SJeenu Viswambharan ldp x3, x4, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] 242df8f3188SJeenu Viswambharan msr scr_el3, x3 243df8f3188SJeenu Viswambharan msr esr_el3, x4 244df8f3188SJeenu Viswambharan 245df8f3188SJeenu Viswambharan ret 246df8f3188SJeenu Viswambharanendfunc ea_proceed 247