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_ARMCM33.c
21  * Git SHA: 2b7495b8535bdcb306dac29b9ded4cfb679d7e5c
22  */
23 
24 /* NS linker scripts using the default CMSIS style naming conventions, while the
25  * secure and bl2 linker scripts remain untouched (region.h compatibility).
26  * To be compatible with the untouched files (which using ARMCLANG naming style),
27  * we have to override __INITIAL_SP and __STACK_LIMIT labels. */
28 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
29 #include "cmsis_override.h"
30 #endif
31 
32 #include "tfm_hal_device_header.h"
33 
34 /*----------------------------------------------------------------------------
35   External References
36  *----------------------------------------------------------------------------*/
37 extern uint32_t __INITIAL_SP;
38 extern uint32_t __STACK_LIMIT;
39 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
40 extern uint64_t __STACK_SEAL;
41 #endif
42 
43 typedef void(*VECTOR_TABLE_Type)(void);
44 
45 extern __NO_RETURN void __PROGRAM_START(void);
46 
47 /*----------------------------------------------------------------------------
48   Internal References
49  *----------------------------------------------------------------------------*/
50 __NO_RETURN void Reset_Handler (void);
51 
52 /*----------------------------------------------------------------------------
53   Exception / Interrupt Handler
54  *----------------------------------------------------------------------------*/
55 #define DEFAULT_IRQ_HANDLER(handler_name)  \
56 __NO_RETURN void __WEAK handler_name(void); \
57 void handler_name(void) { \
58     while(1); \
59 }
60 
61 /* Exceptions */
62 DEFAULT_IRQ_HANDLER(NMI_Handler)
63 DEFAULT_IRQ_HANDLER(HardFault_Handler)
64 DEFAULT_IRQ_HANDLER(MemManage_Handler)
65 DEFAULT_IRQ_HANDLER(BusFault_Handler)
66 DEFAULT_IRQ_HANDLER(UsageFault_Handler)
67 DEFAULT_IRQ_HANDLER(SecureFault_Handler)
68 DEFAULT_IRQ_HANDLER(SVC_Handler)
69 DEFAULT_IRQ_HANDLER(DebugMon_Handler)
70 DEFAULT_IRQ_HANDLER(PendSV_Handler)
71 DEFAULT_IRQ_HANDLER(SysTick_Handler)
72 
73 DEFAULT_IRQ_HANDLER(WDT_BOD_IRQHandler)
74 DEFAULT_IRQ_HANDLER(DMA0_IRQHandler)
75 DEFAULT_IRQ_HANDLER(GINT0_IRQHandler)
76 DEFAULT_IRQ_HANDLER(GINT1_IRQHandler)
77 DEFAULT_IRQ_HANDLER(PIN_INT0_IRQHandler)
78 DEFAULT_IRQ_HANDLER(PIN_INT1_IRQHandler)
79 DEFAULT_IRQ_HANDLER(PIN_INT2_IRQHandler)
80 DEFAULT_IRQ_HANDLER(PIN_INT3_IRQHandler)
81 DEFAULT_IRQ_HANDLER(UTICK0_IRQHandler)
82 DEFAULT_IRQ_HANDLER(MRT0_IRQHandler)
83 DEFAULT_IRQ_HANDLER(CTIMER0_IRQHandler)
84 DEFAULT_IRQ_HANDLER(CTIMER1_IRQHandler)
85 DEFAULT_IRQ_HANDLER(SCT0_IRQHandler)
86 DEFAULT_IRQ_HANDLER(CTIMER3_IRQHandler)
87 DEFAULT_IRQ_HANDLER(FLEXCOMM0_IRQHandler)
88 DEFAULT_IRQ_HANDLER(FLEXCOMM1_IRQHandler)
89 DEFAULT_IRQ_HANDLER(FLEXCOMM2_IRQHandler)
90 DEFAULT_IRQ_HANDLER(FLEXCOMM3_IRQHandler)
91 DEFAULT_IRQ_HANDLER(FLEXCOMM4_IRQHandler)
92 DEFAULT_IRQ_HANDLER(FLEXCOMM5_IRQHandler)
93 DEFAULT_IRQ_HANDLER(FLEXCOMM6_IRQHandler)
94 DEFAULT_IRQ_HANDLER(FLEXCOMM7_IRQHandler)
95 DEFAULT_IRQ_HANDLER(ADC0_IRQHandler)
96 DEFAULT_IRQ_HANDLER(Reserved39_IRQHandler)
97 DEFAULT_IRQ_HANDLER(ACMP_IRQHandler)
98 DEFAULT_IRQ_HANDLER(Reserved41_IRQHandler)
99 DEFAULT_IRQ_HANDLER(Reserved42_IRQHandler)
100 DEFAULT_IRQ_HANDLER(USB0_NEEDCLK_IRQHandler)
101 DEFAULT_IRQ_HANDLER(USB0_IRQHandler)
102 DEFAULT_IRQ_HANDLER(RTC_IRQHandler)
103 DEFAULT_IRQ_HANDLER(Reserved46_IRQHandler)
104 DEFAULT_IRQ_HANDLER(MAILBOX_IRQHandler)
105 DEFAULT_IRQ_HANDLER(PIN_INT4_IRQHandler)
106 DEFAULT_IRQ_HANDLER(PIN_INT5_IRQHandler)
107 DEFAULT_IRQ_HANDLER(PIN_INT6_IRQHandler)
108 DEFAULT_IRQ_HANDLER(PIN_INT7_IRQHandler)
109 DEFAULT_IRQ_HANDLER(CTIMER2_IRQHandler)
110 DEFAULT_IRQ_HANDLER(CTIMER4_IRQHandler)
111 DEFAULT_IRQ_HANDLER(OS_EVENT_IRQHandler)
112 DEFAULT_IRQ_HANDLER(Reserved55_IRQHandler)
113 DEFAULT_IRQ_HANDLER(Reserved56_IRQHandler)
114 DEFAULT_IRQ_HANDLER(Reserved57_IRQHandler)
115 DEFAULT_IRQ_HANDLER(SDIO_IRQHandler)
116 DEFAULT_IRQ_HANDLER(Reserved59_IRQHandler)
117 DEFAULT_IRQ_HANDLER(Reserved60_IRQHandler)
118 DEFAULT_IRQ_HANDLER(Reserved61_IRQHandler)
119 DEFAULT_IRQ_HANDLER(USB1_PHY_IRQHandler)
120 DEFAULT_IRQ_HANDLER(USB1_IRQHandler)
121 DEFAULT_IRQ_HANDLER(USB1_NEEDCLK_IRQHandler)
122 DEFAULT_IRQ_HANDLER(SEC_HYPERVISOR_CALL_IRQHandler)
123 DEFAULT_IRQ_HANDLER(SEC_GPIO_INT0_IRQ0_IRQHandler)
124 DEFAULT_IRQ_HANDLER(SEC_GPIO_INT0_IRQ1_IRQHandler)
125 DEFAULT_IRQ_HANDLER(PLU_IRQHandler)
126 DEFAULT_IRQ_HANDLER(SEC_VIO_IRQHandler)
127 DEFAULT_IRQ_HANDLER(HASHCRYPT_IRQHandler)
128 DEFAULT_IRQ_HANDLER(CASER_IRQHandler)
129 DEFAULT_IRQ_HANDLER(PUF_IRQHandler)
130 DEFAULT_IRQ_HANDLER(PQ_IRQHandler)
131 DEFAULT_IRQ_HANDLER(DMA1_IRQHandler)
132 DEFAULT_IRQ_HANDLER(FLEXCOMM8_IRQHandler)
133 
134 /*----------------------------------------------------------------------------
135   Exception / Interrupt Vector table
136  *----------------------------------------------------------------------------*/
137 
138 #if defined ( __GNUC__ )
139 #pragma GCC diagnostic push
140 #pragma GCC diagnostic ignored "-Wpedantic"
141 #endif
142 
143 extern const VECTOR_TABLE_Type __VECTOR_TABLE[];
144        const VECTOR_TABLE_Type __VECTOR_TABLE[] __VECTOR_TABLE_ATTRIBUTE = {
145   (VECTOR_TABLE_Type)(&__INITIAL_SP),            /*      Initial Stack Pointer */
146   Reset_Handler,                     /* Reset Handler */
147   NMI_Handler,                       /* NMI Handler*/
148   HardFault_Handler,                 /* Hard Fault Handler*/
149   MemManage_Handler,                 /* MPU Fault Handler*/
150   BusFault_Handler,                  /* Bus Fault Handler*/
151   UsageFault_Handler,                /* Usage Fault Handler*/
152   SecureFault_Handler,               /* Secure Fault Handler */
153   0,                                 /* Reserved*/
154   0,                                 /* Reserved*/
155   0,                                 /* Reserved*/
156   SVC_Handler,                       /* SVCall Handler*/
157   DebugMon_Handler,                  /* Debug Monitor Handler*/
158   0,                                 /* Reserved*/
159   PendSV_Handler,                    /* PendSV Handler*/
160   SysTick_Handler,                   /* SysTick Handler*/
161 
162 /* External Interrupts*/
163   WDT_BOD_IRQHandler,                /* Windowed watchdog timer, Brownout detect, Flash interrupt */
164   DMA0_IRQHandler,                   /* DMA0 controller */
165   GINT0_IRQHandler,                  /* GPIO group 0 */
166   GINT1_IRQHandler,                  /* GPIO group 1 */
167   PIN_INT0_IRQHandler,               /* Pin interrupt 0 or pattern match engine slice 0 */
168   PIN_INT1_IRQHandler,               /* Pin interrupt 1or pattern match engine slice 1 */
169   PIN_INT2_IRQHandler,               /* Pin interrupt 2 or pattern match engine slice 2 */
170   PIN_INT3_IRQHandler,               /* Pin interrupt 3 or pattern match engine slice 3 */
171   UTICK0_IRQHandler,                 /* Micro-tick Timer */
172   MRT0_IRQHandler,                   /* Multi-rate timer */
173   CTIMER0_IRQHandler,                /* Standard counter/timer CTIMER0 */
174   CTIMER1_IRQHandler,                /* Standard counter/timer CTIMER1 */
175   SCT0_IRQHandler,                   /* SCTimer/PWM */
176   CTIMER3_IRQHandler,                /* Standard counter/timer CTIMER3 */
177   FLEXCOMM0_IRQHandler,              /* Flexcomm Interface 0 (USART, SPI, I2C, I2S, FLEXCOMM) */
178   FLEXCOMM1_IRQHandler,              /* Flexcomm Interface 1 (USART, SPI, I2C, I2S, FLEXCOMM) */
179   FLEXCOMM2_IRQHandler,              /* Flexcomm Interface 2 (USART, SPI, I2C, I2S, FLEXCOMM) */
180   FLEXCOMM3_IRQHandler,              /* Flexcomm Interface 3 (USART, SPI, I2C, I2S, FLEXCOMM) */
181   FLEXCOMM4_IRQHandler,              /* Flexcomm Interface 4 (USART, SPI, I2C, I2S, FLEXCOMM) */
182   FLEXCOMM5_IRQHandler,              /* Flexcomm Interface 5 (USART, SPI, I2C, I2S, FLEXCOMM) */
183   FLEXCOMM6_IRQHandler,              /* Flexcomm Interface 6 (USART, SPI, I2C, I2S, FLEXCOMM) */
184   FLEXCOMM7_IRQHandler,              /* Flexcomm Interface 7 (USART, SPI, I2C, I2S, FLEXCOMM) */
185   ADC0_IRQHandler,                   /* ADC0  */
186   Reserved39_IRQHandler,             /* Reserved interrupt */
187   ACMP_IRQHandler,                   /* ACMP  interrupts */
188   Reserved41_IRQHandler,             /* Reserved interrupt */
189   Reserved42_IRQHandler,             /* Reserved interrupt */
190   USB0_NEEDCLK_IRQHandler,           /* USB Activity Wake-up Interrupt */
191   USB0_IRQHandler,                   /* USB device */
192   RTC_IRQHandler,                    /* RTC alarm and wake-up interrupts */
193   Reserved46_IRQHandler,             /* Reserved interrupt */
194   MAILBOX_IRQHandler,                /* WAKEUP,Mailbox interrupt (present on selected devices) */
195   PIN_INT4_IRQHandler,               /* Pin interrupt 4 or pattern match engine slice 4 int */
196   PIN_INT5_IRQHandler,               /* Pin interrupt 5 or pattern match engine slice 5 int */
197   PIN_INT6_IRQHandler,               /* Pin interrupt 6 or pattern match engine slice 6 int */
198   PIN_INT7_IRQHandler,               /* Pin interrupt 7 or pattern match engine slice 7 int */
199   CTIMER2_IRQHandler,                /* Standard counter/timer CTIMER2 */
200   CTIMER4_IRQHandler,                /* Standard counter/timer CTIMER4 */
201   OS_EVENT_IRQHandler,               /* OSEVTIMER0 and OSEVTIMER0_WAKEUP interrupts */
202   Reserved55_IRQHandler,             /* Reserved interrupt */
203   Reserved56_IRQHandler,             /* Reserved interrupt */
204   Reserved57_IRQHandler,             /* Reserved interrupt */
205   SDIO_IRQHandler,                   /* SD/MMC  */
206   Reserved59_IRQHandler,             /* Reserved interrupt */
207   Reserved60_IRQHandler,             /* Reserved interrupt */
208   Reserved61_IRQHandler,             /* Reserved interrupt */
209   USB1_PHY_IRQHandler,               /* USB1_PHY */
210   USB1_IRQHandler,                   /* USB1 interrupt */
211   USB1_NEEDCLK_IRQHandler,           /* USB1 activity */
212   SEC_HYPERVISOR_CALL_IRQHandler,    /* SEC_HYPERVISOR_CALL interrupt */
213   SEC_GPIO_INT0_IRQ0_IRQHandler,     /* SEC_GPIO_INT0_IRQ0 interrupt */
214   SEC_GPIO_INT0_IRQ1_IRQHandler,     /* SEC_GPIO_INT0_IRQ1 interrupt */
215   PLU_IRQHandler,                    /* PLU interrupt */
216   SEC_VIO_IRQHandler,                /* SEC_VIO interrupt */
217   HASHCRYPT_IRQHandler,              /* HASHCRYPT interrupt */
218   CASER_IRQHandler,                  /* CASPER interrupt */
219   PUF_IRQHandler,                    /* PUF interrupt */
220   PQ_IRQHandler,                     /* PQ interrupt */
221   DMA1_IRQHandler,                   /* DMA1 interrupt */
222   FLEXCOMM8_IRQHandler,              /* Flexcomm Interface 8 (SPI, , FLEXCOMM) */
223 };
224 
225 #if defined ( __GNUC__ )
226 #pragma GCC diagnostic pop
227 #endif
228 
229 /*----------------------------------------------------------------------------
230   Reset Handler called on controller reset
231  *----------------------------------------------------------------------------*/
Reset_Handler(void)232 void Reset_Handler(void)
233 {
234 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
235     __disable_irq();
236 #endif
237     __set_PSP((uint32_t)(&__INITIAL_SP));
238 
239     __set_MSPLIM((uint32_t)(&__STACK_LIMIT));
240     __set_PSPLIM((uint32_t)(&__STACK_LIMIT));
241 
242 #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
243     __TZ_set_STACKSEAL_S((uint32_t *)(&__STACK_SEAL));
244 #endif
245 
246     SystemInit();                             /* CMSIS System Initialization */
247     __PROGRAM_START();                        /* Enter PreMain (C library entry point) */
248 }
249