1; 2; Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3; Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 4; 5; Redistribution and use in source and binary forms, with or without modification, 6; are permitted provided that the following conditions are met: 7; 8; 1. Redistributions of source code must retain the above copyright notice, this list of 9; conditions and the following disclaimer. 10; 11; 2. Redistributions in binary form must reproduce the above copyright notice, this list 12; of conditions and the following disclaimer in the documentation and/or other materials 13; provided with the distribution. 14; 15; 3. Neither the name of the copyright holder nor the names of its contributors may be used 16; to endorse or promote products derived from this software without specific prior written 17; permission. 18; 19; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30; 31 32 PRESERVE8 33 SECTION .text:CODE(2) 34 THUMB 35 36 EXPORT HalExcNMI 37 EXPORT HalExcHardFault 38 EXPORT HalExcMemFault 39 EXPORT HalExcBusFault 40 EXPORT HalExcUsageFault 41 EXPORT HalExcSvcCall 42 43 IMPORT HalExcHandleEntry 44 IMPORT g_uwExcTbl 45 IMPORT g_taskScheduled 46 47OS_FLG_BGD_ACTIVE EQU 0x0002 48 49OS_EXC_CAUSE_NMI EQU 16 50OS_EXC_CAUSE_HARDFAULT EQU 17 51 52HF_DEBUGEVT EQU 20 53HF_VECTBL EQU 21 54 55FLAG_ADDR_VALID EQU 0x10000 56FLAG_HWI_ACTIVE EQU 0x20000 57FLAG_NO_FLOAT EQU 0x10000000 58 59OS_NVIC_FSR EQU 0xE000ED28 ;include BusFault/MemFault/UsageFault State Register 60OS_NVIC_HFSR EQU 0xE000ED2C ;HardFault State Register 61OS_NVIC_BFAR EQU 0xE000ED38 62OS_NVIC_MMAR EQU 0xE000ED34 63OS_NVIC_ACT_BASE EQU 0xE000E300 64OS_NVIC_SHCSRS EQU 0xE000ED24 65OS_NVIC_SHCSR_MASK EQU 0xC00 66 67HalExcNMI 68 MOV R0, #OS_EXC_CAUSE_NMI 69 MOV R1, #0 70 B osExcDispatch 71 72HalExcHardFault 73 MOV R0, #OS_EXC_CAUSE_HARDFAULT 74 LDR R2, =OS_NVIC_HFSR 75 LDR R2, [R2] 76 77 MOV R1, #HF_DEBUGEVT 78 ORR R0, R0, R1, LSL #0x8 79 TST R2, #0x80000000 80 BNE osExcDispatch ; DEBUGEVT 81 82 AND R0, R0 , #0x000000FF 83 MOV R1, #HF_VECTBL 84 ORR R0, R0, R1, LSL #0x8 85 TST R2, #0x00000002 86 BNE osExcDispatch ; VECTBL 87 88 ;if not DEBUGEVT and VECTBL then is FORCED 89 AND R0, R0, #0x000000FF 90 91 LDR R2, =OS_NVIC_FSR 92 LDR R2, [R2] 93 94 TST R2, #0x8000 ; BFARVALID 95 BNE _HFBusFault ; BusFault 96 97 TST R2, #0x80 ; MMARVALID 98 BNE _HFMemFault ; MemFault 99 100 MOV R12,#0 101 B osHFExcCommonBMU 102 103_HFBusFault 104 LDR R1, =OS_NVIC_BFAR 105 LDR R1, [R1] 106 MOV R12, #FLAG_ADDR_VALID 107 B osHFExcCommonBMU 108 109_HFMemFault 110 LDR R1, =OS_NVIC_MMAR 111 LDR R1, [R1] 112 MOV R12, #FLAG_ADDR_VALID 113 114osHFExcCommonBMU 115 CLZ R2, R2 116 LDR R3, =g_uwExcTbl 117 ADD R3, R3, R2 118 LDRB R2, [R3] 119 ORR R0, R0, R2, LSL #0x8 120 ORR R0, R0 ,R12 121 B osExcDispatch 122 123HalExcSvcCall 124 TST LR, #0x4 125 ITE EQ 126 MRSEQ R0, MSP 127 MRSNE R0, PSP 128 LDR R1, [R0,#24] 129 LDRB R0, [R1,#-2] 130 MOV R1, #0 131 B osExcDispatch 132 133HalExcBusFault 134 LDR R0, =OS_NVIC_FSR 135 LDR R0, [R0] 136 137 TST R0, #0x8000 ; BFARVALID 138 BEQ _ExcBusNoADDR 139 LDR R1, =OS_NVIC_BFAR 140 LDR R1, [R1] 141 MOV R12, #FLAG_ADDR_VALID 142 AND R0, R0, #0x1F00 143 144 B osExcCommonBMU 145 146_ExcBusNoADDR 147 MOV R12,#0 148 B osExcCommonBMU 149 150HalExcMemFault 151 LDR R0, =OS_NVIC_FSR 152 LDR R0, [R0] 153 154 TST R0, #0x80 ; MMARVALID 155 BEQ _ExcMemNoADDR 156 LDR R1, =OS_NVIC_MMAR 157 LDR R1, [R1] 158 MOV R12, #FLAG_ADDR_VALID 159 AND R0, R0, #0x1B 160 161 B osExcCommonBMU 162 163_ExcMemNoADDR 164 MOV R12,#0 165 B osExcCommonBMU 166 167HalExcUsageFault 168 LDR R0, =OS_NVIC_FSR 169 LDR R0, [R0] 170 171 MOV R1, #0x030F 172 LSL R1, R1, #16 173 AND R0, R0, R1 174 MOV R12, #0 175 176osExcCommonBMU 177 CLZ R0, R0 178 LDR R3, =g_uwExcTbl 179 ADD R3, R3, R0 180 LDRB R0, [R3] 181 ORR R0, R0, R12 182 183; R0 -- EXCCAUSE(bit 16 is 1 if EXCADDR valid), R1 -- EXCADDR 184osExcDispatch 185 LDR R2, =OS_NVIC_ACT_BASE 186 MOV R12, #8 ; R12 is hwi check loop counter 187 188_hwiActiveCheck 189 LDR R3, [R2] ; R3 store active hwi register when exc 190 CMP R3, #0 191 BEQ _hwiActiveCheckNext 192 193 ; exc occurred in IRQ 194 ORR R0, R0, #FLAG_HWI_ACTIVE 195 RBIT R2, R3 196 CLZ R2, R2 197 AND R12, R12, #1 198 ADD R2, R2, R12, LSL #5 ; calculate R2 (hwi number) as pid 199 200_ExcInMSP 201 CMP LR, #0xFFFFFFE9 202 BNE _NoFloatInMsp 203 ADD R3, R13, #104 204 PUSH {R3} 205 MRS R12, PRIMASK ; store message-->exc: disable int? 206 PUSH {R4-R12} ; store message-->exc: {R4-R12} 207 VPUSH {D8-D15} 208 B _handleEntry 209 210_NoFloatInMsp 211 ADD R3, R13, #32 212 PUSH {R3} ; save IRQ SP ; store message-->exc: MSP(R13) 213 214 MRS R12, PRIMASK ; store message-->exc: disable int? 215 PUSH {R4-R12} ; store message-->exc: {R4-R12} 216 ORR R0, R0, #FLAG_NO_FLOAT 217 B _handleEntry 218 219_hwiActiveCheckNext 220 ADD R2, R2, #4 ; next NVIC ACT ADDR 221 SUBS R12, R12, #1 222 BNE _hwiActiveCheck 223 224 ;/*NMI interrupt excption*/ 225 LDR R2, =OS_NVIC_SHCSRS 226 LDRH R2,[R2] 227 LDR R3,=OS_NVIC_SHCSR_MASK 228 AND R2, R2,R3 229 CMP R2,#0 230 BNE _ExcInMSP 231 ; exc occurred in Task or Init or exc 232 ; reserved for register info from task stack 233 234 LDR R2, =g_taskScheduled 235 LDR R2, [R2] 236 TST R2, #1 ; OS_FLG_BGD_ACTIVE 237 BEQ _ExcInMSP ; if exc occurred in Init then branch 238 239 240 CMP LR, #0xFFFFFFED ;auto push floating registers 241 BNE _NoFloatInPsp 242 243 ; exc occurred in Task 244 MOV R2, R13 245 SUB R13, #96 ; add 8 Bytes reg(for STMFD) 246 247 MRS R3, PSP 248 ADD R12, R3, #104 249 PUSH {R12} ; save task SP 250 251 MRS R12, PRIMASK 252 PUSH {R4-R12} 253 VPUSH {D8-D15} 254 255 ; copy auto saved task register 256 257 LDMFD R3!, {R4-R11} ; R4-R11 store PSP reg(auto push when exc in task) 258 VLDMIA R3!, {D8-D15} 259 VSTMDB R2!, {D8-D15} 260 STMFD R2!, {R4-R11} 261 B _handleEntry 262 263_NoFloatInPsp 264 MOV R2, R13 ;no auto push floating registers 265 SUB R13, #32 ; add 8 Bytes reg(for STMFD) 266 267 MRS R3, PSP 268 ADD R12, R3, #32 269 PUSH {R12} ; save task SP 270 271 MRS R12, PRIMASK 272 PUSH {R4-R12} 273 274 LDMFD R3, {R4-R11} ; R4-R11 store PSP reg(auto push when exc in task) 275 STMFD R2!, {R4-R11} 276 ORR R0, R0, #FLAG_NO_FLOAT 277 278_handleEntry 279 MOV R3, R13 ; R13:the 4th param 280 CPSID I 281 CPSID F 282 B HalExcHandleEntry 283 284 NOP 285 END 286