1 /*
2 * Copyright (c) 2022-2024 Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 /*
20 * This file is derivative of CMSIS V5.9.0 startup_ARMCM55.c
21 * Git SHA: 2b7495b8535bdcb306dac29b9ded4cfb679d7e5c
22 */
23
24 #include "tfm_hal_device_header.h"
25
26 /*----------------------------------------------------------------------------
27 External References
28 *----------------------------------------------------------------------------*/
29 extern uint32_t __INITIAL_SP;
30 extern uint32_t __STACK_LIMIT;
31
32 extern __NO_RETURN void __PROGRAM_START(void);
33
34 /*----------------------------------------------------------------------------
35 Internal References
36 *----------------------------------------------------------------------------*/
37 __NO_RETURN void Reset_Handler(void);
38
39 /*----------------------------------------------------------------------------
40 Exception / Interrupt Handler
41 *----------------------------------------------------------------------------*/
42 /* Exception handler that blocks execution. */
exception_handler(void)43 __NO_RETURN void exception_handler(void)
44 {
45 while (1);
46 }
47
48 /* No IRQs are enabled at boot, so this handler should be unreachable. In case
49 * it is ever reached, disable the IRQ that was triggered and return. In debug
50 * builds, block execution to catch the bug.
51 */
invalid_irq_handler(void)52 void invalid_irq_handler(void)
53 {
54 #ifndef NDEBUG
55 while (1);
56 #else
57 NVIC_DisableIRQ((IRQn_Type)((int32_t)__get_IPSR() - 16));
58 #endif
59 }
60
61 /*----------------------------------------------------------------------------
62 Exception / Interrupt Vector table
63 *----------------------------------------------------------------------------*/
64
65 #if defined ( __GNUC__ )
66 #pragma GCC diagnostic push
67 #pragma GCC diagnostic ignored "-Wpedantic"
68 #endif
69
70 extern const VECTOR_TABLE_Type __VECTOR_TABLE[];
71 const VECTOR_TABLE_Type __VECTOR_TABLE[] __VECTOR_TABLE_ATTRIBUTE = {
72 (VECTOR_TABLE_Type)(&__INITIAL_SP), /* Initial Stack Pointer */
73 Reset_Handler, /* Reset Handler */
74 exception_handler, /* -14: NMI Handler */
75 exception_handler, /* -13: Hard Fault Handler */
76 exception_handler, /* -12: MPU Fault Handler */
77 exception_handler, /* -11: Bus Fault Handler */
78 exception_handler, /* -10: Usage Fault Handler */
79 exception_handler, /* -9: Secure Fault Handler */
80 0, /* Reserved */
81 0, /* Reserved */
82 0, /* Reserved */
83 exception_handler, /* -5: SVCall Handler */
84 exception_handler, /* -4: Debug Monitor Handler */
85 0, /* Reserved */
86 exception_handler, /* -2: PendSV Handler */
87 exception_handler, /* -1: SysTick Handler */
88
89 invalid_irq_handler, /* 0: Non-Secure Watchdog Reset Request Handler */
90 invalid_irq_handler, /* 1: Non-Secure Watchdog Handler */
91 invalid_irq_handler, /* 2: SLOWCLK Timer Handler */
92 invalid_irq_handler, /* 3: TIMER 0 Handler */
93 invalid_irq_handler, /* 4: TIMER 1 Handler */
94 invalid_irq_handler, /* 5: TIMER 2 Handler */
95 0, /* 6: Reserved */
96 0, /* 7: Reserved */
97 0, /* 8: Reserved */
98 invalid_irq_handler, /* 9: MPC Combined (Secure) Handler */
99 invalid_irq_handler, /* 10: PPC Combined (Secure) Handler */
100 invalid_irq_handler, /* 11: MSC Combined (Secure) Handler */
101 invalid_irq_handler, /* 12: Bridge Error (Secure) Handler */
102 0, /* 13: Reserved */
103 invalid_irq_handler, /* 14: PPU Combined (Secure) Handler */
104 0, /* 15: Reserved */
105 invalid_irq_handler, /* 16: NPU0 Handler */
106 invalid_irq_handler, /* 17: NPU1 Handler */
107 invalid_irq_handler, /* 18: NPU2 Handler */
108 invalid_irq_handler, /* 19: NPU3 Handler */
109 invalid_irq_handler, /* 20: KMU (Secure) Handler */
110 0, /* 21: Reserved */
111 0, /* 22: Reserved */
112 0, /* 23: Reserved */
113 invalid_irq_handler, /* 24: DMA350 Combined (Secure) Handler */
114 invalid_irq_handler, /* 25: DMA350 Combined (Non-Secure) Handler */
115 invalid_irq_handler, /* 26: DMA350 Security Violation Handler */
116 invalid_irq_handler, /* 27: TIMER 3 AON Handler */
117 invalid_irq_handler, /* 28: CPU0 CTI IRQ 0 Handler */
118 invalid_irq_handler, /* 29: CPU0 CTI IRQ 1 Handler */
119 0, /* 30: Reserved */
120 0, /* 31: Reserved */
121
122 /* External interrupts */
123 invalid_irq_handler, /* 32: SAM Critical Security Fault (Secure) Handler */
124 invalid_irq_handler, /* 33: SAM Security Fault (Secure) Handler */
125 invalid_irq_handler, /* 34: GPIO Combined (Secure) Handler */
126 invalid_irq_handler, /* 35: Secure Debug Channel Handler */
127 invalid_irq_handler, /* 36: FPU Exception Handler */
128 invalid_irq_handler, /* 37: SRAM or TRAM Corrected ECC Error (Secure) Handler */
129 invalid_irq_handler, /* 38: Secure I-Cache (Secure) Handler */
130 invalid_irq_handler, /* 39: ATU (Secure) Handler */
131 invalid_irq_handler, /* 40: CMU MHU 0 Sender Handler */
132 invalid_irq_handler, /* 41: CMU MHU 0 Receiver Handler */
133 invalid_irq_handler, /* 42: CMU MHU 1 Sender Handler */
134 invalid_irq_handler, /* 43: CMU MHU 1 Receiver Handler */
135 invalid_irq_handler, /* 44: CMU MHU 2 Sender Handler */
136 invalid_irq_handler, /* 45: CMU MHU 2 Receiver Handler */
137 invalid_irq_handler, /* 46: CMU MHU 3 Sender Handler */
138 invalid_irq_handler, /* 47: CMU MHU 3 Receiver Handler */
139 invalid_irq_handler, /* 48: CMU MHU 4 Sender Handler */
140 invalid_irq_handler, /* 49: CMU MHU 4 Receiver Handler */
141 invalid_irq_handler, /* 50: CMU MHU 5 Sender Handler */
142 invalid_irq_handler, /* 51: CMU MHU 5 Receiver Handler */
143 invalid_irq_handler, /* 52: CMU MHU 6 Sender Handler */
144 invalid_irq_handler, /* 53: CMU MHU 6 Receiver Handler */
145 invalid_irq_handler, /* 54: CMU MHU 7 Sender Handler */
146 invalid_irq_handler, /* 55: CMU MHU 7 Receiver Handler */
147 invalid_irq_handler, /* 56: CMU MHU 8 Sender Handler */
148 invalid_irq_handler, /* 57: CMU MHU 8 Receiver Handler */
149 invalid_irq_handler, /* 58: Crypto Engine (Secure) Handler */
150 invalid_irq_handler, /* 59: SoC System Timer 0 AON Handler */
151 invalid_irq_handler, /* 60: SoC System Timer 1 AON Handler */
152 invalid_irq_handler, /* 61: SRAM ECC Detected Partial Write (Secure) Handler */
153 invalid_irq_handler, /* 62: Integrity Checker Handler */
154 0, /* 63: Reserved */
155 0, /* 64: Reserved */
156 0, /* 65: Reserved */
157 0, /* 66: Reserved */
158 0, /* 67: Reserved */
159 0, /* 68: Reserved */
160 0, /* 69: Reserved */
161 0, /* 70: Reserved */
162 0, /* 71: Reserved */
163 0, /* 72: Reserved */
164 0, /* 73: Reserved */
165 0, /* 74: Reserved */
166 0, /* 75: Reserved */
167 0, /* 76: Reserved */
168 0, /* 77: Reserved */
169 0, /* 78: Reserved */
170 0, /* 79: Reserved */
171 0, /* 80: Reserved */
172 0, /* 81: Reserved */
173 0, /* 82: Reserved */
174 0, /* 83: Reserved */
175 0, /* 84: Reserved */
176 0, /* 85: Reserved */
177 0, /* 86: Reserved */
178 0, /* 87: Reserved */
179 0, /* 88: Reserved */
180 0, /* 89: Reserved */
181 0, /* 90: Reserved */
182 0, /* 91: Reserved */
183 0, /* 92: Reserved */
184 0, /* 93: Reserved */
185 0, /* 94: Reserved */
186 0, /* 95: Reserved */
187 };
188
189 #if defined ( __GNUC__ )
190 #pragma GCC diagnostic pop
191 #endif
192
193 /*----------------------------------------------------------------------------
194 Reset Handler called on controller reset
195 *----------------------------------------------------------------------------*/
Reset_Handler(void)196 void Reset_Handler(void)
197 {
198 __set_MSPLIM((uint32_t)(&__STACK_LIMIT));
199
200 SystemInit(); /* CMSIS System Initialization */
201 __PROGRAM_START(); /* Enter PreMain (C library entry point) */
202 }
203