18382e17cSCaesar Wang /*
28382e17cSCaesar Wang * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
38382e17cSCaesar Wang *
482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause
58382e17cSCaesar Wang */
68382e17cSCaesar Wang
78382e17cSCaesar Wang #include "rk3399_mcu.h"
88382e17cSCaesar Wang
98382e17cSCaesar Wang /* Stack configuration */
10ff4735cfSLin Huang #define STACK_SIZE 0x00000040
118382e17cSCaesar Wang __attribute__ ((section(".co_stack")))
128382e17cSCaesar Wang unsigned long pstack[STACK_SIZE];
138382e17cSCaesar Wang
148382e17cSCaesar Wang /* Macro definition */
158382e17cSCaesar Wang #define WEAK __attribute__ ((weak))
168382e17cSCaesar Wang
178382e17cSCaesar Wang /* System exception vector handler */
188382e17cSCaesar Wang __attribute__ ((used))
198382e17cSCaesar Wang void WEAK reset_handler(void);
208382e17cSCaesar Wang void WEAK nmi_handler(void);
218382e17cSCaesar Wang void WEAK hardware_fault_handler(void);
228382e17cSCaesar Wang void WEAK svc_handler(void);
238382e17cSCaesar Wang void WEAK pend_sv_handler(void);
248382e17cSCaesar Wang void WEAK systick_handler(void);
258382e17cSCaesar Wang
26*af81a91fSChristoph Müllner extern int m0_main(void);
278382e17cSCaesar Wang
288382e17cSCaesar Wang /* Function prototypes */
298382e17cSCaesar Wang static void default_reset_handler(void);
308382e17cSCaesar Wang static void default_handler(void);
318382e17cSCaesar Wang
328382e17cSCaesar Wang /*
338382e17cSCaesar Wang * The minimal vector table for a Cortex M3. Note that the proper constructs
348382e17cSCaesar Wang * must be placed on this to ensure that it ends up at physical address
358382e17cSCaesar Wang * 0x00000000.
368382e17cSCaesar Wang */
378382e17cSCaesar Wang __attribute__ ((used, section(".isr_vector")))
388382e17cSCaesar Wang void (* const g_pfnVectors[])(void) = {
398382e17cSCaesar Wang /* core Exceptions */
408382e17cSCaesar Wang (void *)&pstack[STACK_SIZE], /* the initial stack pointer */
418382e17cSCaesar Wang reset_handler,
428382e17cSCaesar Wang nmi_handler,
438382e17cSCaesar Wang hardware_fault_handler,
448382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0,
458382e17cSCaesar Wang svc_handler,
468382e17cSCaesar Wang 0, 0,
478382e17cSCaesar Wang pend_sv_handler,
488382e17cSCaesar Wang systick_handler,
498382e17cSCaesar Wang
508382e17cSCaesar Wang /* external exceptions */
518382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0,
528382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0,
538382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0,
548382e17cSCaesar Wang 0, 0, 0, 0, 0, 0, 0,
558382e17cSCaesar Wang 0, 0, 0, 0
568382e17cSCaesar Wang };
578382e17cSCaesar Wang
588382e17cSCaesar Wang /**
598382e17cSCaesar Wang * This is the code that gets called when the processor first
608382e17cSCaesar Wang * starts execution following a reset event. Only the absolutely
618382e17cSCaesar Wang * necessary set is performed, after which the application
62*af81a91fSChristoph Müllner * supplied m0_main() routine is called.
638382e17cSCaesar Wang */
default_reset_handler(void)648382e17cSCaesar Wang static void default_reset_handler(void)
658382e17cSCaesar Wang {
668382e17cSCaesar Wang /* call the application's entry point */
67*af81a91fSChristoph Müllner m0_main();
688382e17cSCaesar Wang }
698382e17cSCaesar Wang
708382e17cSCaesar Wang /**
718382e17cSCaesar Wang * Provide weak aliases for each Exception handler to the Default_Handler.
728382e17cSCaesar Wang * As they are weak aliases, any function with the same name will override
738382e17cSCaesar Wang * this definition.
748382e17cSCaesar Wang */
758382e17cSCaesar Wang #pragma weak reset_handler = default_reset_handler
768382e17cSCaesar Wang #pragma weak nmi_handler = default_handler
778382e17cSCaesar Wang #pragma weak hardware_fault_handler = default_handler
788382e17cSCaesar Wang #pragma weak svc_handler = default_handler
798382e17cSCaesar Wang #pragma weak pend_sv_handler = default_handler
808382e17cSCaesar Wang #pragma weak systick_handler = default_handler
818382e17cSCaesar Wang
828382e17cSCaesar Wang /**
838382e17cSCaesar Wang * This is the code that gets called when the processor receives
848382e17cSCaesar Wang * an unexpected interrupt. This simply enters an infinite loop,
858382e17cSCaesar Wang * preserving the system state for examination by a debugger.
868382e17cSCaesar Wang */
default_handler(void)878382e17cSCaesar Wang static void default_handler(void)
888382e17cSCaesar Wang {
898382e17cSCaesar Wang /* go into an infinite loop. */
908382e17cSCaesar Wang while (1)
918382e17cSCaesar Wang ;
928382e17cSCaesar Wang }
93