1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2015-2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <cmsis_compiler.h>
9 
10 #include <fwk_arch.h>
11 #include <fwk_assert.h>
12 #include <fwk_macros.h>
13 
14 #include <arch_nvic.h>
15 
16 #include <fmw_cmsis.h>
17 
18 #include <stdbool.h>
19 #include <stdint.h>
20 
21 /*
22  * This variable is used to ensure spurious nested calls won't
23  * enable interrupts. This is been accessed from inline function defined in
24  * arch_helpers.h
25  */
26 unsigned int critical_section_nest_level;
27 
28 #ifdef __NEWLIB__
29 /* Platform-dependent backend for the _Exit() function */
_exit(int status)30 void _exit(int status)
31 {
32     while (true) {
33         __WFI();
34     }
35 }
36 #endif
37 
38 static const struct fwk_arch_init_driver arch_init_driver = {
39     .interrupt = arch_nvic_init,
40 };
41 
arch_init_ccr(void)42 static void arch_init_ccr(void)
43 {
44     /*
45      * Set up the Configuration Control Register (CCR) in the System Control
46      * Block (1) by setting the following flag bits:
47      *
48      * DIV_0_TRP   [4]: Enable trapping on division by zero. (1)(2)
49      * STKALIGN    [9]: Enable automatic DWORD stack-alignment on exception
50      *                  entry (3).
51      *
52      * All other bits are left in their default state.
53      *
54      * (1) ARM® v7-M Architecture Reference Manual, section B3.2.8.
55      * (2) Arm® v8-M Architecture Reference Manual, section D1.2.9.
56      * (3) ARM® v7-M Architecture Reference Manual, section B1.5.7.
57      */
58 
59     SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk;
60 #ifdef ARMV7M
61     SCB->CCR |= SCB_CCR_STKALIGN_Msk;
62 #endif
63 }
64 
main(void)65 int main(void)
66 {
67     arch_init_ccr();
68 
69     return fwk_arch_init(&arch_init_driver);
70 }
71