196 lines
6.0 KiB
ArmAsm
Raw Normal View History

2017-05-17 13:15:09 -04:00
;/*********************************************************************
;* SEGGER Microcontroller GmbH & Co. KG *
;* The Embedded Experts *
;**********************************************************************
;* *
;* (c) 1995 - 2016 SEGGER Microcontroller GmbH & Co. KG *
;* *
;* Internet: segger.com Support: support_embos@segger.com *
;* *
;**********************************************************************
;* *
;* embOS * Real time operating system for microcontrollers *
;* *
;* Please note: *
;* *
;* Knowledge of this file may under no circumstances *
;* be used to write a similar product or a real-time *
;* operating system for in-house use. *
;* *
;* Thank you for your fairness ! *
;* *
;**********************************************************************
;* *
;* OS version: Internal *
;* *
;* Current version number will be inserted here *
;* when shipment is built. *
;* *
;**********************************************************************
;
;----------------------------------------------------------------------
;File : HardFaultHandler.S
;Purpose : HardFault exception handler for IAR, Keil and GNU assembler.
; Evaluates used stack (MSP, PSP) and passes appropiate stack
; pointer to the HardFaultHandler "C"-routine.
;------------- END-OF-HEADER ------------------------------------------
;*/
#ifndef __IAR_SYSTEMS_ASM__
#ifndef __CC_ARM
#ifndef __GNUC__
#error "Unsupported assembler!"
#endif
#endif
#endif
;/*********************************************************************
;*
;* Forward declarations of segments used
;*
;**********************************************************************
;*/
#ifdef __IAR_SYSTEMS_ASM__
SECTION CODE:CODE:NOROOT(2)
SECTION CSTACK:DATA:NOROOT(3)
#elif defined __CC_ARM
AREA OSKERNEL, CODE, READONLY, ALIGN=2
PRESERVE8
#endif
;/*********************************************************************
;*
;* Publics
;*
;**********************************************************************
;*/
#ifdef __IAR_SYSTEMS_ASM__
SECTION .text:CODE:NOROOT(2)
PUBLIC HardFault_Handler
#elif defined __CC_ARM
EXPORT HardFault_Handler
#elif defined __GNUC__
.global HardFault_Handler
.type HardFault_Handler, function
#endif
;/*********************************************************************
;*
;* Externals, code
;*
;**********************************************************************
;*/
#ifdef __IAR_SYSTEMS_ASM__
EXTERN HardFaultHandler
#elif defined __CC_ARM
IMPORT HardFaultHandler
#elif defined __GNUC__
.extern HardFaultHandler
#endif
;/*********************************************************************
;*
;* CODE segment
;*
;**********************************************************************
;*/
#ifdef __GNUC__
.syntax unified
.thumb
.balign 4
.text
#else
THUMB
#endif
;/*********************************************************************
;*
;* Global functions
;*
;**********************************************************************
;*/
;/*********************************************************************
;*
;* HardFault_Handler()
;*
;* Function description
;* Evaluates the used stack (MSP, PSP) and passes the appropiate
;* stack pointer to the HardFaultHandler "C"-routine.
;*
;* Notes
;* (1) Ensure that HardFault_Handler is part of the exception table
;*/
#ifdef __GNUC__
HardFault_Handler:
#else
HardFault_Handler
#endif
#if (defined (__IAR_SYSTEMS_ASM__) && (__ARM6M__) && (__CORE__ == __ARM6M__)) || \
(defined (__CC_ARM) && (__TARGET_ARCH_6S_M)) || \
(defined (__GNUC__) && (__ARM_ARCH_6M__))
;// This version is for Cortex M0
movs R0, #4
mov R1, LR
tst R0, R1 ;// Check EXC_RETURN in Link register bit 2.
bne Uses_PSP
mrs R0, MSP ;// Stacking was using MSP.
b Pass_StackPtr
#ifdef __GNUC__
Uses_PSP:
#else
Uses_PSP
#endif
mrs R0, PSP ;// Stacking was using PSP.
#ifdef __GNUC__
Pass_StackPtr:
#else
Pass_StackPtr
#endif
#ifdef __CC_ARM
ALIGN
#endif
ldr R2,=HardFaultHandler
bx R2 ;// Stack pointer passed through R0.
#else
;// This version is for Cortex M3, Cortex M4 and Cortex M4F
tst LR, #4 ;// Check EXC_RETURN in Link register bit 2.
ite EQ
mrseq R0, MSP ;// Stacking was using MSP.
mrsne R0, PSP ;// Stacking was using PSP.
b HardFaultHandler ;// Stack pointer passed through R0.
#endif
#ifdef __GNUC__
.end
#else
END
#endif
;/****** End Of File *************************************************/