spm_shim_exceptions.S 3.07 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
 * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <asm_macros.S>
#include <bl_common.h>
#include <context.h>

/* -----------------------------------------------------------------------------
 * Very simple stackless exception handlers used by the spm shim layer.
 * -----------------------------------------------------------------------------
 */
	.globl	spm_shim_exceptions_ptr

vector_base spm_shim_exceptions_ptr, .spm_shim_exceptions

	/* -----------------------------------------------------
	 * Current EL with SP0 : 0x0 - 0x200
	 * -----------------------------------------------------
	 */
vector_entry SynchronousExceptionSP0, .spm_shim_exceptions
	b	.
26
end_vector_entry SynchronousExceptionSP0
27
28
29

vector_entry IrqSP0, .spm_shim_exceptions
	b	.
30
end_vector_entry IrqSP0
31
32
33

vector_entry FiqSP0, .spm_shim_exceptions
	b	.
34
end_vector_entry FiqSP0
35
36
37

vector_entry SErrorSP0, .spm_shim_exceptions
	b	.
38
end_vector_entry SErrorSP0
39
40
41
42
43
44
45

	/* -----------------------------------------------------
	 * Current EL with SPx: 0x200 - 0x400
	 * -----------------------------------------------------
	 */
vector_entry SynchronousExceptionSPx, .spm_shim_exceptions
	b	.
46
end_vector_entry SynchronousExceptionSPx
47
48
49

vector_entry IrqSPx, .spm_shim_exceptions
	b	.
50
end_vector_entry IrqSPx
51
52
53

vector_entry FiqSPx, .spm_shim_exceptions
	b	.
54
end_vector_entry FiqSPx
55
56
57

vector_entry SErrorSPx, .spm_shim_exceptions
	b	.
58
end_vector_entry SErrorSPx
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

	/* -----------------------------------------------------
	 * Lower EL using AArch64 : 0x400 - 0x600. No exceptions
	 * are handled since secure_partition does not implement
	 * a lower EL
	 * -----------------------------------------------------
	 */
vector_entry SynchronousExceptionA64, .spm_shim_exceptions
	msr	tpidr_el1, x30
	mrs	x30, esr_el1
	ubfx	x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH

	cmp	x30, #EC_AARCH64_SVC
	b.eq 	do_smc

	cmp	x30, #EC_AARCH32_SVC
	b.eq	do_smc

	cmp	x30, #EC_AARCH64_SYS
	b.eq	handle_sys_trap

	/* Fail in all the other cases */
	b	panic

	/* ---------------------------------------------
	 * Tell SPM that we are done initialising
	 * ---------------------------------------------
	 */
do_smc:
	mrs	x30, tpidr_el1
	smc	#0
	eret

	/* AArch64 system instructions trap are handled as a panic for now */
handle_sys_trap:
panic:
	b	panic
96
end_vector_entry SynchronousExceptionA64
97
98
99

vector_entry IrqA64, .spm_shim_exceptions
	b	.
100
end_vector_entry IrqA64
101
102
103

vector_entry FiqA64, .spm_shim_exceptions
	b	.
104
end_vector_entry FiqA64
105
106
107

vector_entry SErrorA64, .spm_shim_exceptions
	b	.
108
end_vector_entry SErrorA64
109
110
111
112
113
114
115

	/* -----------------------------------------------------
	 * Lower EL using AArch32 : 0x600 - 0x800
	 * -----------------------------------------------------
	 */
vector_entry SynchronousExceptionA32, .spm_shim_exceptions
	b	.
116
end_vector_entry SynchronousExceptionA32
117
118
119

vector_entry IrqA32, .spm_shim_exceptions
	b	.
120
end_vector_entry IrqA32
121
122
123

vector_entry FiqA32, .spm_shim_exceptions
	b	.
124
end_vector_entry FiqA32
125
126
127

vector_entry SErrorA32, .spm_shim_exceptions
	b	.
128
end_vector_entry SErrorA32