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_bpiall_vbar 10*2c3a1078SDimitris Papastamos 11*2c3a1078SDimitris Papastamosvector_base wa_cve_2017_5715_bpiall_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 branch predictor, `r0` is a dummy register 24*2c3a1078SDimitris Papastamos * and is unused. 25*2c3a1078SDimitris Papastamos */ 26*2c3a1078SDimitris Papastamos stcopr r0, BPIALL 27*2c3a1078SDimitris Papastamos isb 28*2c3a1078SDimitris Papastamos 29*2c3a1078SDimitris Papastamos /* 30*2c3a1078SDimitris Papastamos * As we cannot use any temporary registers and cannot 31*2c3a1078SDimitris Papastamos * clobber SP, we can decode the exception entry using 32*2c3a1078SDimitris Papastamos * an unrolled binary search. 33*2c3a1078SDimitris Papastamos * 34*2c3a1078SDimitris Papastamos * Note, if this code is re-used by other secure payloads, 35*2c3a1078SDimitris Papastamos * the below exception entry vectors must be changed to 36*2c3a1078SDimitris Papastamos * the vectors specific to that secure payload. 37*2c3a1078SDimitris Papastamos */ 38*2c3a1078SDimitris Papastamos 39*2c3a1078SDimitris Papastamos tst sp, #4 40*2c3a1078SDimitris Papastamos bne 1f 41*2c3a1078SDimitris Papastamos 42*2c3a1078SDimitris Papastamos tst sp, #2 43*2c3a1078SDimitris Papastamos bne 3f 44*2c3a1078SDimitris Papastamos 45*2c3a1078SDimitris Papastamos /* Expected encoding: 0x1 and 0x0 */ 46*2c3a1078SDimitris Papastamos tst sp, #1 47*2c3a1078SDimitris Papastamos /* Restore original value of SP by clearing the bottom 3 bits */ 48*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 49*2c3a1078SDimitris Papastamos bne plat_panic_handler /* IRQ */ 50*2c3a1078SDimitris Papastamos b sp_min_handle_fiq /* FIQ */ 51*2c3a1078SDimitris Papastamos 52*2c3a1078SDimitris Papastamos1: 53*2c3a1078SDimitris Papastamos tst sp, #2 54*2c3a1078SDimitris Papastamos bne 2f 55*2c3a1078SDimitris Papastamos 56*2c3a1078SDimitris Papastamos /* Expected encoding: 0x4 and 0x5 */ 57*2c3a1078SDimitris Papastamos tst sp, #1 58*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 59*2c3a1078SDimitris Papastamos bne sp_min_handle_smc /* Syscall */ 60*2c3a1078SDimitris Papastamos b plat_panic_handler /* Prefetch abort */ 61*2c3a1078SDimitris Papastamos 62*2c3a1078SDimitris Papastamos2: 63*2c3a1078SDimitris Papastamos /* Expected encoding: 0x7 and 0x6 */ 64*2c3a1078SDimitris Papastamos tst sp, #1 65*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 66*2c3a1078SDimitris Papastamos bne sp_min_entrypoint /* Reset */ 67*2c3a1078SDimitris Papastamos b plat_panic_handler /* Undef */ 68*2c3a1078SDimitris Papastamos 69*2c3a1078SDimitris Papastamos3: 70*2c3a1078SDimitris Papastamos /* Expected encoding: 0x2 and 0x3 */ 71*2c3a1078SDimitris Papastamos tst sp, #1 72*2c3a1078SDimitris Papastamos bic sp, sp, #0x7 73*2c3a1078SDimitris Papastamos bne plat_panic_handler /* Data abort */ 74*2c3a1078SDimitris Papastamos b plat_panic_handler /* Reserved */ 75