1*2c3a1078SDimitris Papastamos/* 2*2c3a1078SDimitris Papastamos * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3*2c3a1078SDimitris Papastamos * 4*2c3a1078SDimitris Papastamos * SPDX-License-Identifier: BSD-3-Clause 5*2c3a1078SDimitris Papastamos */ 6*2c3a1078SDimitris Papastamos 7*2c3a1078SDimitris Papastamos#include <asm_macros.S> 8*2c3a1078SDimitris Papastamos 9*2c3a1078SDimitris Papastamos .globl wa_cve_2017_5715_icache_inv_vbar 10*2c3a1078SDimitris Papastamos 11*2c3a1078SDimitris Papastamosvector_base wa_cve_2017_5715_icache_inv_vbar 12*2c3a1078SDimitris Papastamos /* We encode the exception entry in the bottom 3 bits of SP */ 13*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Reset: 0b111 */ 14*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Undef: 0b110 */ 15*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Syscall: 0b101 */ 16*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Prefetch abort: 0b100 */ 17*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Data abort: 0b011 */ 18*2c3a1078SDimitris Papastamos add sp, sp, #1 /* Reserved: 0b010 */ 19*2c3a1078SDimitris Papastamos add sp, sp, #1 /* IRQ: 0b001 */ 20*2c3a1078SDimitris Papastamos nop /* FIQ: 0b000 */ 21*2c3a1078SDimitris Papastamos 22*2c3a1078SDimitris Papastamos /* 23*2c3a1078SDimitris Papastamos * Invalidate the instruction cache, which we assume also 24*2c3a1078SDimitris Papastamos * invalidates the branch predictor. This may depend on 25*2c3a1078SDimitris Papastamos * other CPU specific changes (e.g. an ACTLR setting). 26*2c3a1078SDimitris Papastamos */ 27*2c3a1078SDimitris Papastamos stcopr r0, ICIALLU 28*2c3a1078SDimitris Papastamos isb 29*2c3a1078SDimitris Papastamos 30*2c3a1078SDimitris Papastamos /* 31*2c3a1078SDimitris Papastamos * As we cannot use any temporary registers and cannot 32*2c3a1078SDimitris Papastamos * clobber SP, we can decode the exception entry using 33*2c3a1078SDimitris Papastamos * an unrolled binary search. 34*2c3a1078SDimitris Papastamos * 35*2c3a1078SDimitris Papastamos * Note, if this code is re-used by other secure payloads, 36*2c3a1078SDimitris Papastamos * the below exception entry vectors must be changed to 37*2c3a1078SDimitris Papastamos * the vectors specific to that secure payload. 38*2c3a1078SDimitris Papastamos */ 39*2c3a1078SDimitris Papastamos 40*2c3a1078SDimitris Papastamos tst sp, #4 41*2c3a1078SDimitris Papastamos bne 1f 42*2c3a1078SDimitris Papastamos 43*2c3a1078SDimitris Papastamos tst sp, #2 44*2c3a1078SDimitris Papastamos bne 3f 45*2c3a1078SDimitris Papastamos 46*2c3a1078SDimitris Papastamos /* Expected encoding: 0x1 and 0x0 */ 47*2c3a1078SDimitris Papastamos tst sp, #1 48*2c3a1078SDimitris Papastamos /* Restore original value of SP by clearing the bottom 3 bits */ 49*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 50*2c3a1078SDimitris Papastamos bne plat_panic_handler /* IRQ */ 51*2c3a1078SDimitris Papastamos b sp_min_handle_fiq /* FIQ */ 52*2c3a1078SDimitris Papastamos 53*2c3a1078SDimitris Papastamos1: 54*2c3a1078SDimitris Papastamos /* Expected encoding: 0x4 and 0x5 */ 55*2c3a1078SDimitris Papastamos tst sp, #2 56*2c3a1078SDimitris Papastamos bne 2f 57*2c3a1078SDimitris Papastamos 58*2c3a1078SDimitris Papastamos tst sp, #1 59*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 60*2c3a1078SDimitris Papastamos bne sp_min_handle_smc /* Syscall */ 61*2c3a1078SDimitris Papastamos b plat_panic_handler /* Prefetch abort */ 62*2c3a1078SDimitris Papastamos 63*2c3a1078SDimitris Papastamos2: 64*2c3a1078SDimitris Papastamos /* Expected encoding: 0x7 and 0x6 */ 65*2c3a1078SDimitris Papastamos tst sp, #1 66*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 67*2c3a1078SDimitris Papastamos bne sp_min_entrypoint /* Reset */ 68*2c3a1078SDimitris Papastamos b plat_panic_handler /* Undef */ 69*2c3a1078SDimitris Papastamos 70*2c3a1078SDimitris Papastamos3: 71*2c3a1078SDimitris Papastamos /* Expected encoding: 0x2 and 0x3 */ 72*2c3a1078SDimitris Papastamos tst sp, #1 73*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 74*2c3a1078SDimitris Papastamos bne plat_panic_handler /* Data abort */ 75*2c3a1078SDimitris Papastamos b plat_panic_handler /* Reserved */ 76