/*
    ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

/**
 * @file    ARM/compilers/GCC/vectors.s
 * @brief   Interrupt vectors for ARM devices.
 *
 * @defgroup ARM_VECTORS ARM Exception Vectors
 * @{
 */

#if defined(__DOXYGEN__)
/**
 * @brief   Unhandled exceptions handler.
 * @details Any undefined exception vector points to this function by default.
 *          This function simply stops the system into an infinite loop.
 * @note    The default implementation is a weak symbol, the application
 *          can override the default implementation.
 *
 * @notapi
 */
void _unhandled_exception(void) {}
#endif

#if !defined(__DOXYGEN__)

                .section .vectors, "ax"
                .code   32
                .balign 4

/*
 * System entry points.
 */
                .global _start
_start:
                ldr     pc, _reset
                ldr     pc, _undefined
                ldr     pc, _swi
                ldr     pc, _prefetch
                ldr     pc, _abort
                nop
                ldr     pc, _irq
                ldr     pc, _fiq

_reset:
                .word   Reset_Handler
_undefined:
                .word   Und_Handler
_swi:
                .word   Swi_Handler
_prefetch:
                .word   Prefetch_Handler
_abort:
                .word   Abort_Handler
_fiq:
                .word   Fiq_Handler
_irq:
                .word   Irq_Handler

/*
 * Default exceptions handlers. The handlers are declared weak in order to be
 * replaced by the real handling code. Everything is defaulted to an infinite
 * loop.
 */
                .weak   Reset_Handler
Reset_Handler:
                .weak   Und_Handler
Und_Handler:
                .weak   Swi_Handler
Swi_Handler:
                .weak   Prefetch_Handler
Prefetch_Handler:
                .weak   Abort_Handler
Abort_Handler:
                .weak   Fiq_Handler
Fiq_Handler:
                .weak   Irq_Handler
Irq_Handler:
                .weak   _unhandled_exception
_unhandled_exception:
                b       _unhandled_exception

#endif

/** @} */
