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> 9*ee6ff1bbSJeenu Viswambharan#include <assert_macros.S> 10df8f3188SJeenu Viswambharan#include <context.h> 11df8f3188SJeenu Viswambharan#include <ea_handle.h> 12df8f3188SJeenu Viswambharan 13df8f3188SJeenu Viswambharan 14df8f3188SJeenu Viswambharan .globl handle_lower_el_ea_esb 15df8f3188SJeenu Viswambharan .globl enter_lower_el_sync_ea 16df8f3188SJeenu Viswambharan .globl enter_lower_el_async_ea 17df8f3188SJeenu Viswambharan 18df8f3188SJeenu Viswambharan 19df8f3188SJeenu Viswambharan/* 20df8f3188SJeenu Viswambharan * Function to delegate External Aborts synchronized by ESB instruction at EL3 21df8f3188SJeenu Viswambharan * vector entry. This function assumes GP registers x0-x29 have been saved, and 22df8f3188SJeenu Viswambharan * are available for use. It delegates the handling of the EA to platform 23df8f3188SJeenu Viswambharan * handler, and returns only upon successfully handling the EA; otherwise 24df8f3188SJeenu Viswambharan * panics. On return from this function, the original exception handler is 25df8f3188SJeenu Viswambharan * expected to resume. 26df8f3188SJeenu Viswambharan */ 27df8f3188SJeenu Viswambharanfunc handle_lower_el_ea_esb 28df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_ESB 29df8f3188SJeenu Viswambharan mrs x1, DISR_EL1 30df8f3188SJeenu Viswambharan b ea_proceed 31df8f3188SJeenu Viswambharanendfunc handle_lower_el_ea_esb 32df8f3188SJeenu Viswambharan 33df8f3188SJeenu Viswambharan 34df8f3188SJeenu Viswambharan/* 35df8f3188SJeenu Viswambharan * This function forms the tail end of Synchronous Exception entry from lower 36df8f3188SJeenu Viswambharan * EL, and expects to handle only Synchronous External Aborts from lower EL. If 37df8f3188SJeenu Viswambharan * any other kind of exception is detected, then this function reports unhandled 38df8f3188SJeenu Viswambharan * exception. 39df8f3188SJeenu Viswambharan * 40df8f3188SJeenu Viswambharan * Since it's part of exception vector, this function doesn't expect any GP 41df8f3188SJeenu Viswambharan * registers to have been saved. It delegates the handling of the EA to platform 42df8f3188SJeenu Viswambharan * handler, and upon successfully handling the EA, exits EL3; otherwise panics. 43df8f3188SJeenu Viswambharan */ 44df8f3188SJeenu Viswambharanfunc enter_lower_el_sync_ea 45df8f3188SJeenu Viswambharan /* 46df8f3188SJeenu Viswambharan * Explicitly save x30 so as to free up a register and to enable 47df8f3188SJeenu Viswambharan * branching. 48df8f3188SJeenu Viswambharan */ 49df8f3188SJeenu Viswambharan str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 50df8f3188SJeenu Viswambharan 51df8f3188SJeenu Viswambharan mrs x30, esr_el3 52df8f3188SJeenu Viswambharan ubfx x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH 53df8f3188SJeenu Viswambharan 54df8f3188SJeenu Viswambharan /* Check for I/D aborts from lower EL */ 55df8f3188SJeenu Viswambharan cmp x30, #EC_IABORT_LOWER_EL 56df8f3188SJeenu Viswambharan b.eq 1f 57df8f3188SJeenu Viswambharan 58df8f3188SJeenu Viswambharan cmp x30, #EC_DABORT_LOWER_EL 59df8f3188SJeenu Viswambharan b.ne 2f 60df8f3188SJeenu Viswambharan 61df8f3188SJeenu Viswambharan1: 62df8f3188SJeenu Viswambharan /* Test for EA bit in the instruction syndrome */ 63df8f3188SJeenu Viswambharan mrs x30, esr_el3 64df8f3188SJeenu Viswambharan tbz x30, #ESR_ISS_EABORT_EA_BIT, 2f 65df8f3188SJeenu Viswambharan 66df8f3188SJeenu Viswambharan /* Save GP registers */ 67df8f3188SJeenu Viswambharan bl save_gp_registers 68df8f3188SJeenu Viswambharan 69df8f3188SJeenu Viswambharan /* Setup exception class and syndrome arguments for platform handler */ 70df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_SYNC 71df8f3188SJeenu Viswambharan mrs x1, esr_el3 72df8f3188SJeenu Viswambharan adr x30, el3_exit 73df8f3188SJeenu Viswambharan b ea_proceed 74df8f3188SJeenu Viswambharan 75df8f3188SJeenu Viswambharan2: 76df8f3188SJeenu Viswambharan /* Synchronous exceptions other than the above are assumed to be EA */ 77df8f3188SJeenu Viswambharan ldr x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 78df8f3188SJeenu Viswambharan no_ret report_unhandled_exception 79df8f3188SJeenu Viswambharanendfunc enter_lower_el_sync_ea 80df8f3188SJeenu Viswambharan 81df8f3188SJeenu Viswambharan 82df8f3188SJeenu Viswambharan/* 83df8f3188SJeenu Viswambharan * This function handles SErrors from lower ELs. 84df8f3188SJeenu Viswambharan * 85df8f3188SJeenu Viswambharan * Since it's part of exception vector, this function doesn't expect any GP 86df8f3188SJeenu Viswambharan * registers to have been saved. It delegates the handling of the EA to platform 87df8f3188SJeenu Viswambharan * handler, and upon successfully handling the EA, exits EL3; otherwise panics. 88df8f3188SJeenu Viswambharan */ 89df8f3188SJeenu Viswambharanfunc enter_lower_el_async_ea 90df8f3188SJeenu Viswambharan /* 91df8f3188SJeenu Viswambharan * Explicitly save x30 so as to free up a register and to enable 92df8f3188SJeenu Viswambharan * branching 93df8f3188SJeenu Viswambharan */ 94df8f3188SJeenu Viswambharan str x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR] 95df8f3188SJeenu Viswambharan 96df8f3188SJeenu Viswambharan /* Save GP registers */ 97df8f3188SJeenu Viswambharan bl save_gp_registers 98df8f3188SJeenu Viswambharan 99df8f3188SJeenu Viswambharan /* Setup exception class and syndrome arguments for platform handler */ 100df8f3188SJeenu Viswambharan mov x0, #ERROR_EA_ASYNC 101df8f3188SJeenu Viswambharan mrs x1, esr_el3 102df8f3188SJeenu Viswambharan adr x30, el3_exit 103df8f3188SJeenu Viswambharan b ea_proceed 104df8f3188SJeenu Viswambharanendfunc enter_lower_el_async_ea 105df8f3188SJeenu Viswambharan 106df8f3188SJeenu Viswambharan 107df8f3188SJeenu Viswambharan/* 108df8f3188SJeenu Viswambharan * Delegate External Abort handling to platform's EA handler. This function 109df8f3188SJeenu Viswambharan * assumes that all GP registers have been saved by the caller. 110df8f3188SJeenu Viswambharan * 111df8f3188SJeenu Viswambharan * x0: EA reason 112df8f3188SJeenu Viswambharan * x1: EA syndrome 113df8f3188SJeenu Viswambharan */ 114df8f3188SJeenu Viswambharanfunc ea_proceed 115df8f3188SJeenu Viswambharan /* Save EL3 state */ 116df8f3188SJeenu Viswambharan mrs x2, spsr_el3 117df8f3188SJeenu Viswambharan mrs x3, elr_el3 118df8f3188SJeenu Viswambharan stp x2, x3, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] 119df8f3188SJeenu Viswambharan 120df8f3188SJeenu Viswambharan /* 121df8f3188SJeenu Viswambharan * Save ESR as handling might involve lower ELs, and returning back to 122df8f3188SJeenu Viswambharan * EL3 from there would trample the original ESR. 123df8f3188SJeenu Viswambharan */ 124df8f3188SJeenu Viswambharan mrs x4, scr_el3 125df8f3188SJeenu Viswambharan mrs x5, esr_el3 126df8f3188SJeenu Viswambharan stp x4, x5, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] 127df8f3188SJeenu Viswambharan 128df8f3188SJeenu Viswambharan /* 129df8f3188SJeenu Viswambharan * Setup rest of arguments, and call platform External Abort handler. 130df8f3188SJeenu Viswambharan * 131df8f3188SJeenu Viswambharan * x0: EA reason (already in place) 132df8f3188SJeenu Viswambharan * x1: Exception syndrome (already in place). 133df8f3188SJeenu Viswambharan * x2: Cookie (unused for now). 134df8f3188SJeenu Viswambharan * x3: Context pointer. 135df8f3188SJeenu Viswambharan * x4: Flags (security state from SCR for now). 136df8f3188SJeenu Viswambharan */ 137df8f3188SJeenu Viswambharan mov x2, xzr 138df8f3188SJeenu Viswambharan mov x3, sp 139df8f3188SJeenu Viswambharan ubfx x4, x4, #0, #1 140df8f3188SJeenu Viswambharan 141df8f3188SJeenu Viswambharan /* Switch to runtime stack */ 142df8f3188SJeenu Viswambharan ldr x5, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP] 143df8f3188SJeenu Viswambharan msr spsel, #0 144df8f3188SJeenu Viswambharan mov sp, x5 145df8f3188SJeenu Viswambharan 146df8f3188SJeenu Viswambharan mov x29, x30 147*ee6ff1bbSJeenu Viswambharan#if ENABLE_ASSERTIONS 148*ee6ff1bbSJeenu Viswambharan /* Stash the stack pointer */ 149*ee6ff1bbSJeenu Viswambharan mov x28, sp 150*ee6ff1bbSJeenu Viswambharan#endif 151df8f3188SJeenu Viswambharan bl plat_ea_handler 152df8f3188SJeenu Viswambharan mov x30, x29 153df8f3188SJeenu Viswambharan 154*ee6ff1bbSJeenu Viswambharan#if ENABLE_ASSERTIONS 155*ee6ff1bbSJeenu Viswambharan /* 156*ee6ff1bbSJeenu Viswambharan * Error handling flows might involve long jumps; so upon returning from 157*ee6ff1bbSJeenu Viswambharan * the platform error handler, validate that the we've completely 158*ee6ff1bbSJeenu Viswambharan * unwound the stack. 159*ee6ff1bbSJeenu Viswambharan */ 160*ee6ff1bbSJeenu Viswambharan mov x27, sp 161*ee6ff1bbSJeenu Viswambharan cmp x28, x27 162*ee6ff1bbSJeenu Viswambharan ASM_ASSERT(eq) 163*ee6ff1bbSJeenu Viswambharan#endif 164*ee6ff1bbSJeenu Viswambharan 165df8f3188SJeenu Viswambharan /* Make SP point to context */ 166df8f3188SJeenu Viswambharan msr spsel, #1 167df8f3188SJeenu Viswambharan 168df8f3188SJeenu Viswambharan /* Restore EL3 state */ 169df8f3188SJeenu Viswambharan ldp x1, x2, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3] 170df8f3188SJeenu Viswambharan msr spsr_el3, x1 171df8f3188SJeenu Viswambharan msr elr_el3, x2 172df8f3188SJeenu Viswambharan 173df8f3188SJeenu Viswambharan /* Restore ESR_EL3 and SCR_EL3 */ 174df8f3188SJeenu Viswambharan ldp x3, x4, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3] 175df8f3188SJeenu Viswambharan msr scr_el3, x3 176df8f3188SJeenu Viswambharan msr esr_el3, x4 177df8f3188SJeenu Viswambharan 178df8f3188SJeenu Viswambharan ret 179df8f3188SJeenu Viswambharanendfunc ea_proceed 180