xref: /rk3399_ARM-atf/bl32/sp_min/wa_cve_2017_5715_icache_inv.S (revision d003b190938fa9e50ad351015da4b5225c78ce14)
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