1#include "k_config.h"
2
3;******************************************************************************
4;                                 EQUATES
5;******************************************************************************
6CONTEXT_REGION  EQU  88   ;bigger than sizeof(PANIC_CONTEXT)
7
8;******************************************************************************
9;                        CODE GENERATION DIRECTIVES
10;******************************************************************************
11    SECTION   .text:CODE(2)
12    THUMB
13    REQUIRE8
14    PRESERVE8
15
16#if AOS_COMP_DEBUG
17
18;******************************************************************************
19;                            EXTERN PARAMETERS
20;******************************************************************************
21    EXTERN panicHandler
22    EXTERN g_crash_steps
23    EXTERN _first_task_restore
24    EXTERN panicRestoreCheck
25
26;******************************************************************************
27;                            EXPORT FUNCTIONS
28;******************************************************************************
29    PUBLIC HardFault_Handler
30    PUBLIC MemManage_Handler
31    PUBLIC BusFault_Handler
32    PUBLIC UsageFault_Handler
33
34;******************************************************************************
35;                             FAULT FUNCTIONS
36;******************************************************************************
37HardFault_Handler:
38MemManage_Handler:
39BusFault_Handler:
40UsageFault_Handler:
41    PUSH    {R1, LR}
42    BL      panicRestoreCheck
43    POP     {R1, LR}
44    CBZ     R0, unrecoverable_crash
45    BL     _first_task_restore
46
47unrecoverable_crash:
48    ;check double crash
49    LDR     R1, =g_crash_steps
50    LDR     R2, [R1]
51    ADD     R3, R2, #1
52    STR     R3, [R1]
53    CBZ     R2, first_panic
54    ;return from exc to handle panic
55    MRS     R1, PSP
56    AND     R2, LR, #4          ;EXC_RETURN:bit2, 0 MSP, 1 PSP
57    CBNZ    R2, double_panic
58    MRS     R1, MSP
59double_panic:
60    LDR     R0, =double_panic_entry
61    STR     R0, [R1, #24]
62    LDR     R0, [R1, #28]
63    ORR     R0, R0, #0x1000000
64    STR     R0, [R1, #28]       ;set thumb mode
65    BX      LR
66
67double_panic_entry:
68    MOV     R0, #0              ;double crash, do not save context
69    BL      panicHandler
70    B       .
71
72first_panic:
73    ;R0 as PANIC_CONTEXT
74    SUB     R0, SP, #CONTEXT_REGION
75
76    ;R1 as CONTEXT saved by hardware
77    MRS     R1, PSP
78    AND     R2, LR, #4          ;EXC_RETURN:bit2, 0 MSP, 1 PSP
79    CBNZ    R2, context_save
80    MRS     R1, MSP
81context_save:
82
83    ADD     R2, R0, #16
84    STM     R2!,{R4-R11}        ;ctx save, R4~R11
85
86    LDM     R1, {R4-R11}
87    STM     R0, {R4-R7}         ;ctx save, R0~R3
88
89    STM     R2!,{R8-R11}        ;ctx save, R12 LR PC xPSR
90
91    ;xPSR[9] and EXC_RETURN[4] to determine whether
92    ;the previous top-of-stack was at offset 0x20, 0x24, 0x68, or0x6C
93    ADD     R4, R1, #0x20
94#if defined(__ARMVFP__)
95    AND     R3, LR, #0x10       ;EXC_RETURN:bit4, 0 floating, 1 non-floating
96    CBNZ    R3, check_aligner
97    ADD     R4, R4, #0x48
98check_aligner:
99#endif
100    LDR     R3, [R1, #28]
101    AND     R3, R3, #0x200      ;xPSR:bit9, 0 no-aligner, 1 aligner
102    CBZ     R3, sp_save
103    ADD     R4, R4, #0x4
104sp_save:
105    STM     R2!,{R4}            ;ctx save, SP
106
107    MOV     R4, LR
108    STM     R2!,{R4}            ;ctx save, EXC_RETURN
109
110    MRS     R4, IPSR
111    STM     R2!,{R4}            ;ctx save, EXC_NUMBER
112
113    MRS     R4, PRIMASK
114    STM     R2!,{R4}            ;ctx save, PRIMASK
115
116    MRS     R4, FAULTMASK
117    STM     R2!,{R4}            ;ctx save, FAULTMASK
118
119    MRS     R4, BASEPRI
120    STM     R2!,{R4}            ;ctx save, BASEPRI
121
122    ;return from exc to handle panic
123    STR     R0, [R1, #0]
124    LDR     R0, =panic_entry
125    STR     R0, [R1, #24]
126    LDR     R0, [R1, #28]
127    ORR     R0, R0, #0x1000000
128    STR     R0, [R1, #28]       ;set thumb mode
129    CPSID   I
130    BX      LR
131
132panic_entry:
133#if DEBUG_PANIC_PRT_INT
134    MRS     R1, CONTROL
135    MOVS    R2, #2
136    BICS    R1, R2
137    MSR     CONTROL, R1
138    ISB
139    ;printf use interrupt, so here enable it
140    CPSIE   I
141#endif
142
143    MOV     SP, R0
144    BL      panicHandler
145    B       .
146
147#endif
148    END
149
150