1 /*
2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include "rk3399_mcu.h"
8
9 /* Stack configuration */
10 #define STACK_SIZE 0x00000040
11 __attribute__ ((section(".co_stack")))
12 unsigned long pstack[STACK_SIZE];
13
14 /* Macro definition */
15 #define WEAK __attribute__ ((weak))
16
17 /* System exception vector handler */
18 __attribute__ ((used))
19 void WEAK reset_handler(void);
20 void WEAK nmi_handler(void);
21 void WEAK hardware_fault_handler(void);
22 void WEAK svc_handler(void);
23 void WEAK pend_sv_handler(void);
24 void WEAK systick_handler(void);
25
26 extern int m0_main(void);
27
28 /* Function prototypes */
29 static void default_reset_handler(void);
30 static void default_handler(void);
31
32 /*
33 * The minimal vector table for a Cortex M3. Note that the proper constructs
34 * must be placed on this to ensure that it ends up at physical address
35 * 0x00000000.
36 */
37 __attribute__ ((used, section(".isr_vector")))
38 void (* const g_pfnVectors[])(void) = {
39 /* core Exceptions */
40 (void *)&pstack[STACK_SIZE], /* the initial stack pointer */
41 reset_handler,
42 nmi_handler,
43 hardware_fault_handler,
44 0, 0, 0, 0, 0, 0, 0,
45 svc_handler,
46 0, 0,
47 pend_sv_handler,
48 systick_handler,
49
50 /* external exceptions */
51 0, 0, 0, 0, 0, 0, 0,
52 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0,
54 0, 0, 0, 0, 0, 0, 0,
55 0, 0, 0, 0
56 };
57
58 /**
59 * This is the code that gets called when the processor first
60 * starts execution following a reset event. Only the absolutely
61 * necessary set is performed, after which the application
62 * supplied m0_main() routine is called.
63 */
default_reset_handler(void)64 static void default_reset_handler(void)
65 {
66 /* call the application's entry point */
67 m0_main();
68 }
69
70 /**
71 * Provide weak aliases for each Exception handler to the Default_Handler.
72 * As they are weak aliases, any function with the same name will override
73 * this definition.
74 */
75 #pragma weak reset_handler = default_reset_handler
76 #pragma weak nmi_handler = default_handler
77 #pragma weak hardware_fault_handler = default_handler
78 #pragma weak svc_handler = default_handler
79 #pragma weak pend_sv_handler = default_handler
80 #pragma weak systick_handler = default_handler
81
82 /**
83 * This is the code that gets called when the processor receives
84 * an unexpected interrupt. This simply enters an infinite loop,
85 * preserving the system state for examination by a debugger.
86 */
default_handler(void)87 static void default_handler(void)
88 {
89 /* go into an infinite loop. */
90 while (1)
91 ;
92 }
93