xref: /rk3399_ARM-atf/bl32/sp_min/wa_cve_2017_5715_bpiall.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_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