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)30void _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)42static 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)65int main(void) 66 { 67 arch_init_ccr(); 68 69 return fwk_arch_init(&arch_init_driver); 70 } 71