/***************************************************************************//**
 * @file    start_gcc.S
 * @brief   Context switch functions
 *  COPYRIGHT (C) 2012, RT-Thread Development Team
 * @author  onelife
 * @version 1.0
 *******************************************************************************
 * @section License
 * The license and distribution terms for this file may be found in the file
 *  LICENSE in this distribution or at http://www.rt-thread.org/license/LICENSE
 *******************************************************************************
 * @section Change Logs
 * Date         Author      Notes
 * 2010-12-21   onelife     Initial creation for EFM32
 * 2011-07-06   onelife     Modify to make use the start code in libraries
 * 2012-05-15   onelife     Modified to compatible with CMSIS v3
 ******************************************************************************/

/***************************************************************************//**
* @addtogroup cortex-m3
* @{
*******************************************************************************/
    .syntax unified
    .cpu    cortex-m3
    .fpu    softvfp
    .thumb

/* start address for the initialization values of the .data section.
defined in linker script */
    .word __etext
/* start address for the .data section. defined in linker script */
    .word __data_start__
/* end address for the .data section. defined in linker script */
    .word __data_end__
/* start address for the .bss section. defined in linker script */
    .word __bss_start__
/* end address for the .bss section. defined in linker script */
    .word __bss_end__

/***************************************************************************//**
 * @brief  This is the code that gets called when the processor first
 *          starts execution following a reset event. Only the absolutely
 *          necessary set is performed, after which the application
 *          supplied main() routine is called.
 * @param  None
 * @retval None
*******************************************************************************/
    .thumb
    .thumb_func
    .section    .cs3.init,"ax", %progbits
    .globl      _start
    .type       _start, %function
_start:
    /* Copy the data segment initializers from flash to SRAM */
    movs  r1, #0
    b  LoopCopyDataInit

CopyDataInit:
    ldr  r3, =__etext
    ldr  r3, [r3, r1]
    str  r3, [r0, r1]
    adds  r1, r1, #4

LoopCopyDataInit:
    ldr  r0, =__data_start__
    ldr  r3, =__data_end__
    adds  r2, r0, r1
    cmp  r2, r3
    bcc  CopyDataInit
    ldr  r2, =__bss_start__
    b  LoopFillZerobss

/* Zero fill the bss segment. */
FillZerobss:
    movs  r3, #0
    str  r3, [r2], #4

LoopFillZerobss:
    ldr  r3, = __bss_end__
    cmp  r2, r3
    bcc  FillZerobss
    /* Call the application's entry point.*/
    bl  main
    bx  lr
    .size _start, .-_start

/***************************************************************************//**
 * @}
*******************************************************************************/