| /* |
| * Copyright (c) 2016, The OpenThread Authors. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. Neither the name of the copyright holder nor the |
| * names of its contributors may be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| /** |
| * @file cortex-m_cstartup.c |
| * ARM Cortex-M generic cstartup. |
| * |
| * Setup RAM as needed based on GCC linker script sections. |
| */ |
| |
| #include <stdint.h> |
| //#include <tool.h> |
| #define __NAKED __attribute__((naked)) |
| #define __USED __attribute__((used)) |
| #define __NO_RETURN __attribute__((noreturn)) |
| // forward declaration |
| extern void main(void); |
| extern void __cpu_startup(void); |
| extern void __gcc_program_start(void); |
| |
| extern uint32_t _sdata; // Start of .data region in RAM |
| extern uint32_t _edata; // End of .data region in RAM |
| extern uint32_t __bss_start__; |
| extern uint32_t __bss_end__; |
| extern uint32_t __init_array_start; |
| extern uint32_t __init_array_end; |
| extern uint32_t __rwdata_start__; // End of .text region in FLASH |
| |
| /********************************************************************/ |
| void cstartup_rwdata() |
| { |
| |
| // Get the addresses for the .data section (initialized data section) |
| uint32_t *data_rom = (uint32_t *) &__rwdata_start__; |
| uint32_t *data_ram = (uint32_t *) &_sdata; |
| uint32_t *data_ram_end = (uint32_t *) &_edata; |
| |
| // Copy initialized data from ROM to RAM |
| while (data_ram < data_ram_end) |
| { |
| *data_ram++ = *data_rom++; |
| } |
| } |
| |
| void cstartup_bss() |
| { |
| |
| /* Clear the zero-initialized data section */ |
| uint32_t *bss_start = (uint32_t *) &__bss_start__; |
| uint32_t *bss_end = (uint32_t *) &__bss_end__; |
| |
| while (bss_start < bss_end) |
| { |
| *bss_start++ = 0; |
| } |
| } |
| |
| void cstartup(void) |
| { |
| cstartup_rwdata(); |
| cstartup_bss(); |
| } |
| |
| /********************************************************************/ |
| |
| /** |
| * ARM Cortex-M Start |
| * |
| * This function calls all of the needed startup routines and then |
| * branches to the main process. |
| * |
| * This contains the very first instructions that are run on boot. |
| */ |
| void __USED __NAKED __NO_RETURN __gcc_program_start(void) |
| { |
| // early platform initialization - configure clocks, etc. |
| __cpu_startup(); |
| |
| // C/C++ runtime initialization (BSS, Data, relocation, etc.) |
| cstartup(); |
| |
| // TBD we should pass parameters here. |
| main(); |
| |
| // No actions to perform after this so wait forever |
| while (1); |
| } |
| |
| |