blob: 6014b12ed4b7f14d95debc81ad9c5cd554b67cba [file] [log] [blame]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +02001/*
2 * Copyright (c) 2018, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <asm_macros.S>
8
9 .globl tftf_vector
10
11vector_base tftf_vector
Sandrine Bailleux8b170a22019-01-11 18:47:26 +010012
13 /*
14 * Current EL with SP0 : 0x0 - 0x200.
15 */
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020016vector_entry SynchronousExceptionSP0
17 b SynchronousExceptionSP0
Sandrine Bailleux452f3602019-01-14 13:49:22 +010018end_vector_entry SynchronousExceptionSP0
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020019
20vector_entry IrqSP0
21 b IrqSP0
Sandrine Bailleux452f3602019-01-14 13:49:22 +010022end_vector_entry IrqSP0
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020023
24vector_entry FiqSP0
25 b FiqSP0
Sandrine Bailleux452f3602019-01-14 13:49:22 +010026end_vector_entry FiqSP0
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020027
28vector_entry SErrorSP0
29 b SErrorSP0
Sandrine Bailleux452f3602019-01-14 13:49:22 +010030end_vector_entry SErrorSP0
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020031
Sandrine Bailleux8b170a22019-01-11 18:47:26 +010032 /*
33 * Current EL with SPx : 0x200 - 0x400.
34 */
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020035vector_entry SynchronousExceptionSPx
36 b SynchronousExceptionSPx
Sandrine Bailleux452f3602019-01-14 13:49:22 +010037end_vector_entry SynchronousExceptionSPx
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020038
39vector_entry IrqSPx
Sandrine Bailleuxd1019672019-01-11 18:39:24 +010040 b irq_vector_entry
Sandrine Bailleux452f3602019-01-14 13:49:22 +010041end_vector_entry IrqSPx
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020042
43vector_entry FiqSPx
44 b FiqSPx
Sandrine Bailleux452f3602019-01-14 13:49:22 +010045end_vector_entry FiqSPx
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020046
47vector_entry SErrorSPx
48 b SErrorSPx
Sandrine Bailleux452f3602019-01-14 13:49:22 +010049end_vector_entry SErrorSPx
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020050
Sandrine Bailleux8b170a22019-01-11 18:47:26 +010051 /*
52 * Lower EL using AArch64 : 0x400 - 0x600.
53 */
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020054vector_entry SynchronousExceptionA64
55 b SynchronousExceptionA64
Sandrine Bailleux452f3602019-01-14 13:49:22 +010056end_vector_entry SynchronousExceptionA64
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020057
58vector_entry IrqA64
59 b IrqA64
Sandrine Bailleux452f3602019-01-14 13:49:22 +010060end_vector_entry IrqA64
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020061
62vector_entry FiqA64
63 b FiqA64
Sandrine Bailleux452f3602019-01-14 13:49:22 +010064end_vector_entry FiqA64
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020065
66vector_entry SErrorA64
67 b SErrorA64
Sandrine Bailleux452f3602019-01-14 13:49:22 +010068end_vector_entry SErrorA64
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020069
Sandrine Bailleux8b170a22019-01-11 18:47:26 +010070 /*
71 * Lower EL using AArch32 : 0x600 - 0x800.
72 */
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020073vector_entry SynchronousExceptionA32
74 b SynchronousExceptionA32
Sandrine Bailleux452f3602019-01-14 13:49:22 +010075end_vector_entry SynchronousExceptionA32
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020076
77vector_entry IrqA32
78 b IrqA32
Sandrine Bailleux452f3602019-01-14 13:49:22 +010079end_vector_entry IrqA32
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020080
81vector_entry FiqA32
82 b FiqA32
Sandrine Bailleux452f3602019-01-14 13:49:22 +010083end_vector_entry FiqA32
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020084
85vector_entry SErrorA32
86 b SErrorA32
Sandrine Bailleux452f3602019-01-14 13:49:22 +010087end_vector_entry SErrorA32
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020088
Sandrine Bailleuxd1019672019-01-11 18:39:24 +010089/*
90 * Exceptions will always be from the same exception level so no need to save
91 * and restore SPSR.
92 */
93.macro save_gp_regs
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +020094 stp x0, x1, [sp, #0x0]
95 stp x2, x3, [sp, #0x10]
96 stp x4, x5, [sp, #0x20]
97 stp x6, x7, [sp, #0x30]
98 stp x8, x9, [sp, #0x40]
99 stp x10, x11, [sp, #0x50]
100 stp x12, x13, [sp, #0x60]
101 stp x14, x15, [sp, #0x70]
102 stp x16, x17, [sp, #0x80]
103 stp x18, x19, [sp, #0x90]
104 stp x20, x21, [sp, #0xa0]
105 stp x22, x23, [sp, #0xb0]
106 stp x24, x25, [sp, #0xc0]
107 stp x26, x27, [sp, #0xd0]
Sandrine Bailleuxd1019672019-01-11 18:39:24 +0100108 stp x28, x29, [sp, #0xe0]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200109 mrs x0, sp_el0
Sandrine Bailleuxd1019672019-01-11 18:39:24 +0100110 stp x30, x0, [sp, #0xf0]
111.endm
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200112
Sandrine Bailleuxd1019672019-01-11 18:39:24 +0100113.macro restore_gp_regs
114 ldp x30, x0, [sp, #0xf0]
115 msr sp_el0, x0
116 ldp x28, x29, [sp, #0xe0]
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200117 ldp x26, x27, [sp, #0xd0]
118 ldp x24, x25, [sp, #0xc0]
119 ldp x22, x23, [sp, #0xb0]
120 ldp x20, x21, [sp, #0xa0]
121 ldp x18, x19, [sp, #0x90]
122 ldp x16, x17, [sp, #0x80]
123 ldp x14, x15, [sp, #0x70]
124 ldp x12, x13, [sp, #0x60]
125 ldp x10, x11, [sp, #0x50]
126 ldp x8, x9, [sp, #0x40]
127 ldp x6, x7, [sp, #0x30]
128 ldp x4, x5, [sp, #0x20]
129 ldp x2, x3, [sp, #0x10]
130 ldp x0, x1, [sp, #0x0]
Sandrine Bailleuxd1019672019-01-11 18:39:24 +0100131.endm
132
133func irq_vector_entry
134 sub sp, sp, #0x100
135 save_gp_regs
136 bl tftf_irq_handler_dispatcher
137 restore_gp_regs
Sandrine Bailleux3cd87d72018-10-09 11:12:55 +0200138 add sp, sp, #0x100
Sandrine Bailleuxd1019672019-01-11 18:39:24 +0100139 eret
140endfunc irq_vector_entry