1*10465441SEvalZero/* 2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team 3*10465441SEvalZero * 4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0 5*10465441SEvalZero * 6*10465441SEvalZero * Change Logs: 7*10465441SEvalZero * Date Author Notes 8*10465441SEvalZero */ 9*10465441SEvalZero@------------------------------------------------------------------------------- 10*10465441SEvalZero@ sys_core.asm 11*10465441SEvalZero@ 12*10465441SEvalZero@ (c) Texas Instruments 2009-2013, All rights reserved. 13*10465441SEvalZero@ 14*10465441SEvalZero 15*10465441SEvalZero#include <rtconfig.h> 16*10465441SEvalZero 17*10465441SEvalZero.equ Mode_USR, 0x10 18*10465441SEvalZero.equ Mode_FIQ, 0x11 19*10465441SEvalZero.equ Mode_IRQ, 0x12 20*10465441SEvalZero.equ Mode_SVC, 0x13 21*10465441SEvalZero.equ Mode_ABT, 0x17 22*10465441SEvalZero.equ Mode_UND, 0x1B 23*10465441SEvalZero.equ Mode_SYS, 0x1F 24*10465441SEvalZero 25*10465441SEvalZero.equ I_Bit, 0x80 @ when I bit is set, IRQ is disabled 26*10465441SEvalZero.equ F_Bit, 0x40 @ when F bit is set, FIQ is disabled 27*10465441SEvalZero 28*10465441SEvalZero.equ UND_Stack_Size, 0x00000000 29*10465441SEvalZero.equ SVC_Stack_Size, 0x00000000 30*10465441SEvalZero.equ ABT_Stack_Size, 0x00000000 31*10465441SEvalZero.equ FIQ_Stack_Size, 0x00001000 32*10465441SEvalZero.equ IRQ_Stack_Size, 0x00001000 33*10465441SEvalZero 34*10465441SEvalZero.section .bss.noinit 35*10465441SEvalZero/* stack */ 36*10465441SEvalZero.globl stack_start 37*10465441SEvalZero.globl stack_top 38*10465441SEvalZero 39*10465441SEvalZerostack_start: 40*10465441SEvalZero.rept (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size) 41*10465441SEvalZero.byte 0 42*10465441SEvalZero.endr 43*10465441SEvalZerostack_top: 44*10465441SEvalZero 45*10465441SEvalZero.section .text, "ax" 46*10465441SEvalZero .text 47*10465441SEvalZero .arm 48*10465441SEvalZero 49*10465441SEvalZero .globl _c_int00 50*10465441SEvalZero 51*10465441SEvalZero.globl _reset 52*10465441SEvalZero_reset: 53*10465441SEvalZero@------------------------------------------------------------------------------- 54*10465441SEvalZero@ Initialize CPU Registers 55*10465441SEvalZero@ After reset, the CPU is in the Supervisor mode (M = 10011) 56*10465441SEvalZero cpsid if, #19 57*10465441SEvalZero 58*10465441SEvalZero#if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING) 59*10465441SEvalZero @ Turn on FPV coprocessor 60*10465441SEvalZero mrc p15, #0x00, r2, c1, c0, #0x02 61*10465441SEvalZero orr r2, r2, #0xF00000 62*10465441SEvalZero mcr p15, #0x00, r2, c1, c0, #0x02 63*10465441SEvalZero 64*10465441SEvalZero fmrx r2, fpexc 65*10465441SEvalZero orr r2, r2, #0x40000000 66*10465441SEvalZero fmxr fpexc, r2 67*10465441SEvalZero#endif 68*10465441SEvalZero 69*10465441SEvalZero@------------------------------------------------------------------------------- 70*10465441SEvalZero@ Initialize Stack Pointers 71*10465441SEvalZero ldr r0, =stack_top 72*10465441SEvalZero 73*10465441SEvalZero @ Set the startup stack for svc 74*10465441SEvalZero mov sp, r0 75*10465441SEvalZero 76*10465441SEvalZero @ Enter Undefined Instruction Mode and set its Stack Pointer 77*10465441SEvalZero msr cpsr_c, #Mode_UND|I_Bit|F_Bit 78*10465441SEvalZero mov sp, r0 79*10465441SEvalZero sub r0, r0, #UND_Stack_Size 80*10465441SEvalZero 81*10465441SEvalZero @ Enter Abort Mode and set its Stack Pointer 82*10465441SEvalZero msr cpsr_c, #Mode_ABT|I_Bit|F_Bit 83*10465441SEvalZero mov sp, r0 84*10465441SEvalZero sub r0, r0, #ABT_Stack_Size 85*10465441SEvalZero 86*10465441SEvalZero @ Enter FIQ Mode and set its Stack Pointer 87*10465441SEvalZero msr cpsr_c, #Mode_FIQ|I_Bit|F_Bit 88*10465441SEvalZero mov sp, r0 89*10465441SEvalZero sub r0, r0, #FIQ_Stack_Size 90*10465441SEvalZero 91*10465441SEvalZero @ Enter IRQ Mode and set its Stack Pointer 92*10465441SEvalZero msr cpsr_c, #Mode_IRQ|I_Bit|F_Bit 93*10465441SEvalZero mov sp, r0 94*10465441SEvalZero sub r0, r0, #IRQ_Stack_Size 95*10465441SEvalZero 96*10465441SEvalZero @ Switch back to SVC 97*10465441SEvalZero msr cpsr_c, #Mode_SVC|I_Bit|F_Bit 98*10465441SEvalZero 99*10465441SEvalZero bl next1 100*10465441SEvalZeronext1: 101*10465441SEvalZero bl next2 102*10465441SEvalZeronext2: 103*10465441SEvalZero bl next3 104*10465441SEvalZeronext3: 105*10465441SEvalZero bl next4 106*10465441SEvalZeronext4: 107*10465441SEvalZero ldr lr, =_c_int00 108*10465441SEvalZero bx lr 109*10465441SEvalZero 110*10465441SEvalZero.globl data_init 111*10465441SEvalZerodata_init: 112*10465441SEvalZero /* copy .data to SRAM */ 113*10465441SEvalZero ldr r1, =_sidata /* .data start in image */ 114*10465441SEvalZero ldr r2, =_edata /* .data end in image */ 115*10465441SEvalZero ldr r3, =_sdata /* sram data start */ 116*10465441SEvalZerodata_loop: 117*10465441SEvalZero ldr r0, [r1, #0] 118*10465441SEvalZero str r0, [r3] 119*10465441SEvalZero 120*10465441SEvalZero add r1, r1, #4 121*10465441SEvalZero add r3, r3, #4 122*10465441SEvalZero 123*10465441SEvalZero cmp r3, r2 /* check if data to clear */ 124*10465441SEvalZero blo data_loop /* loop until done */ 125*10465441SEvalZero 126*10465441SEvalZero /* clear .bss */ 127*10465441SEvalZero mov r0,#0 /* get a zero */ 128*10465441SEvalZero ldr r1,=__bss_start /* bss start */ 129*10465441SEvalZero ldr r2,=__bss_end /* bss end */ 130*10465441SEvalZero 131*10465441SEvalZerobss_loop: 132*10465441SEvalZero cmp r1,r2 /* check if data to clear */ 133*10465441SEvalZero strlo r0,[r1],#4 /* clear 4 bytes */ 134*10465441SEvalZero blo bss_loop /* loop until done */ 135*10465441SEvalZero 136*10465441SEvalZero /* call C++ constructors of global objects */ 137*10465441SEvalZero ldr r0, =__ctors_start__ 138*10465441SEvalZero ldr r1, =__ctors_end__ 139*10465441SEvalZero 140*10465441SEvalZeroctor_loop: 141*10465441SEvalZero cmp r0, r1 142*10465441SEvalZero beq ctor_end 143*10465441SEvalZero ldr r2, [r0], #4 144*10465441SEvalZero stmfd sp!, {r0-r3, ip, lr} 145*10465441SEvalZero mov lr, pc 146*10465441SEvalZero bx r2 147*10465441SEvalZero ldmfd sp!, {r0-r3, ip, lr} 148*10465441SEvalZero b ctor_loop 149*10465441SEvalZeroctor_end: 150*10465441SEvalZero bx lr 151*10465441SEvalZero 152*10465441SEvalZero@------------------------------------------------------------------------------- 153*10465441SEvalZero@ Enable RAM ECC Support 154*10465441SEvalZero 155*10465441SEvalZero .globl _coreEnableRamEcc_ 156*10465441SEvalZero_coreEnableRamEcc_: 157*10465441SEvalZero 158*10465441SEvalZero stmfd sp!, {r0} 159*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 160*10465441SEvalZero orr r0, r0, #0x0C000000 161*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 162*10465441SEvalZero ldmfd sp!, {r0} 163*10465441SEvalZero bx lr 164*10465441SEvalZero 165*10465441SEvalZero@------------------------------------------------------------------------------- 166*10465441SEvalZero@ Disable RAM ECC Support 167*10465441SEvalZero 168*10465441SEvalZero .globl _coreDisableRamEcc_ 169*10465441SEvalZero_coreDisableRamEcc_: 170*10465441SEvalZero 171*10465441SEvalZero stmfd sp!, {r0} 172*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 173*10465441SEvalZero bic r0, r0, #0x0C000000 174*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 175*10465441SEvalZero ldmfd sp!, {r0} 176*10465441SEvalZero bx lr 177*10465441SEvalZero 178*10465441SEvalZero 179*10465441SEvalZero@------------------------------------------------------------------------------- 180*10465441SEvalZero@ Enable Flash ECC Support 181*10465441SEvalZero 182*10465441SEvalZero .globl _coreEnableFlashEcc_ 183*10465441SEvalZero_coreEnableFlashEcc_: 184*10465441SEvalZero 185*10465441SEvalZero stmfd sp!, {r0} 186*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 187*10465441SEvalZero orr r0, r0, #0x02000000 188*10465441SEvalZero dmb 189*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 190*10465441SEvalZero ldmfd sp!, {r0} 191*10465441SEvalZero bx lr 192*10465441SEvalZero 193*10465441SEvalZero@------------------------------------------------------------------------------- 194*10465441SEvalZero@ Disable Flash ECC Support 195*10465441SEvalZero 196*10465441SEvalZero .globl _coreDisableFlashEcc_ 197*10465441SEvalZero_coreDisableFlashEcc_: 198*10465441SEvalZero 199*10465441SEvalZero stmfd sp!, {r0} 200*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 201*10465441SEvalZero bic r0, r0, #0x02000000 202*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 203*10465441SEvalZero ldmfd sp!, {r0} 204*10465441SEvalZero bx lr 205*10465441SEvalZero 206*10465441SEvalZero 207*10465441SEvalZero@------------------------------------------------------------------------------- 208*10465441SEvalZero@ Get data fault status register 209*10465441SEvalZero 210*10465441SEvalZero .globl _coreGetDataFault_ 211*10465441SEvalZero_coreGetDataFault_: 212*10465441SEvalZero 213*10465441SEvalZero mrc p15, #0, r0, c5, c0, #0 214*10465441SEvalZero bx lr 215*10465441SEvalZero 216*10465441SEvalZero 217*10465441SEvalZero 218*10465441SEvalZero@------------------------------------------------------------------------------- 219*10465441SEvalZero@ Clear data fault status register 220*10465441SEvalZero 221*10465441SEvalZero .globl _coreClearDataFault_ 222*10465441SEvalZero_coreClearDataFault_: 223*10465441SEvalZero 224*10465441SEvalZero stmfd sp!, {r0} 225*10465441SEvalZero mov r0, #0 226*10465441SEvalZero mcr p15, #0, r0, c5, c0, #0 227*10465441SEvalZero ldmfd sp!, {r0} 228*10465441SEvalZero bx lr 229*10465441SEvalZero 230*10465441SEvalZero 231*10465441SEvalZero 232*10465441SEvalZero@------------------------------------------------------------------------------- 233*10465441SEvalZero@ Get instruction fault status register 234*10465441SEvalZero 235*10465441SEvalZero .globl _coreGetInstructionFault_ 236*10465441SEvalZero_coreGetInstructionFault_: 237*10465441SEvalZero 238*10465441SEvalZero mrc p15, #0, r0, c5, c0, #1 239*10465441SEvalZero bx lr 240*10465441SEvalZero 241*10465441SEvalZero 242*10465441SEvalZero 243*10465441SEvalZero@------------------------------------------------------------------------------- 244*10465441SEvalZero@ Clear instruction fault status register 245*10465441SEvalZero 246*10465441SEvalZero .globl _coreClearInstructionFault_ 247*10465441SEvalZero_coreClearInstructionFault_: 248*10465441SEvalZero 249*10465441SEvalZero stmfd sp!, {r0} 250*10465441SEvalZero mov r0, #0 251*10465441SEvalZero mcr p15, #0, r0, c5, c0, #1 252*10465441SEvalZero ldmfd sp!, {r0} 253*10465441SEvalZero bx lr 254*10465441SEvalZero 255*10465441SEvalZero 256*10465441SEvalZero 257*10465441SEvalZero@------------------------------------------------------------------------------- 258*10465441SEvalZero@ Get data fault address register 259*10465441SEvalZero 260*10465441SEvalZero .globl _coreGetDataFaultAddress_ 261*10465441SEvalZero_coreGetDataFaultAddress_: 262*10465441SEvalZero 263*10465441SEvalZero mrc p15, #0, r0, c6, c0, #0 264*10465441SEvalZero bx lr 265*10465441SEvalZero 266*10465441SEvalZero 267*10465441SEvalZero 268*10465441SEvalZero@------------------------------------------------------------------------------- 269*10465441SEvalZero@ Clear data fault address register 270*10465441SEvalZero 271*10465441SEvalZero .globl _coreClearDataFaultAddress_ 272*10465441SEvalZero_coreClearDataFaultAddress_: 273*10465441SEvalZero 274*10465441SEvalZero stmfd sp!, {r0} 275*10465441SEvalZero mov r0, #0 276*10465441SEvalZero mcr p15, #0, r0, c6, c0, #0 277*10465441SEvalZero ldmfd sp!, {r0} 278*10465441SEvalZero bx lr 279*10465441SEvalZero 280*10465441SEvalZero 281*10465441SEvalZero 282*10465441SEvalZero@------------------------------------------------------------------------------- 283*10465441SEvalZero@ Get instruction fault address register 284*10465441SEvalZero 285*10465441SEvalZero .globl _coreGetInstructionFaultAddress_ 286*10465441SEvalZero_coreGetInstructionFaultAddress_: 287*10465441SEvalZero 288*10465441SEvalZero mrc p15, #0, r0, c6, c0, #2 289*10465441SEvalZero bx lr 290*10465441SEvalZero 291*10465441SEvalZero 292*10465441SEvalZero 293*10465441SEvalZero@------------------------------------------------------------------------------- 294*10465441SEvalZero@ Clear instruction fault address register 295*10465441SEvalZero 296*10465441SEvalZero .globl _coreClearInstructionFaultAddress_ 297*10465441SEvalZero_coreClearInstructionFaultAddress_: 298*10465441SEvalZero 299*10465441SEvalZero stmfd sp!, {r0} 300*10465441SEvalZero mov r0, #0 301*10465441SEvalZero mcr p15, #0, r0, c6, c0, #2 302*10465441SEvalZero ldmfd sp!, {r0} 303*10465441SEvalZero bx lr 304*10465441SEvalZero 305*10465441SEvalZero 306*10465441SEvalZero 307*10465441SEvalZero@------------------------------------------------------------------------------- 308*10465441SEvalZero@ Get auxiliary data fault status register 309*10465441SEvalZero 310*10465441SEvalZero .globl _coreGetAuxiliaryDataFault_ 311*10465441SEvalZero_coreGetAuxiliaryDataFault_: 312*10465441SEvalZero 313*10465441SEvalZero mrc p15, #0, r0, c5, c1, #0 314*10465441SEvalZero bx lr 315*10465441SEvalZero 316*10465441SEvalZero 317*10465441SEvalZero 318*10465441SEvalZero@------------------------------------------------------------------------------- 319*10465441SEvalZero@ Clear auxiliary data fault status register 320*10465441SEvalZero 321*10465441SEvalZero .globl _coreClearAuxiliaryDataFault_ 322*10465441SEvalZero_coreClearAuxiliaryDataFault_: 323*10465441SEvalZero 324*10465441SEvalZero stmfd sp!, {r0} 325*10465441SEvalZero mov r0, #0 326*10465441SEvalZero mcr p15, #0, r0, c5, c1, #0 327*10465441SEvalZero ldmfd sp!, {r0} 328*10465441SEvalZero bx lr 329*10465441SEvalZero 330*10465441SEvalZero 331*10465441SEvalZero 332*10465441SEvalZero@------------------------------------------------------------------------------- 333*10465441SEvalZero@ Get auxiliary instruction fault status register 334*10465441SEvalZero 335*10465441SEvalZero .globl _coreGetAuxiliaryInstructionFault_ 336*10465441SEvalZero_coreGetAuxiliaryInstructionFault_: 337*10465441SEvalZero 338*10465441SEvalZero mrc p15, #0, r0, c5, c1, #1 339*10465441SEvalZero bx lr 340*10465441SEvalZero 341*10465441SEvalZero 342*10465441SEvalZero@------------------------------------------------------------------------------- 343*10465441SEvalZero@ Clear auxiliary instruction fault status register 344*10465441SEvalZero 345*10465441SEvalZero .globl _coreClearAuxiliaryInstructionFault_ 346*10465441SEvalZero_coreClearAuxiliaryInstructionFault_: 347*10465441SEvalZero 348*10465441SEvalZero stmfd sp!, {r0} 349*10465441SEvalZero mov r0, #0 350*10465441SEvalZero mrc p15, #0, r0, c5, c1, #1 351*10465441SEvalZero ldmfd sp!, {r0} 352*10465441SEvalZero bx lr 353*10465441SEvalZero 354*10465441SEvalZero 355*10465441SEvalZero@------------------------------------------------------------------------------- 356*10465441SEvalZero@ Clear ESM CCM errorss 357*10465441SEvalZero 358*10465441SEvalZero .globl _esmCcmErrorsClear_ 359*10465441SEvalZero_esmCcmErrorsClear_: 360*10465441SEvalZero 361*10465441SEvalZero stmfd sp!, {r0-r2} 362*10465441SEvalZero ldr r0, ESMSR1_REG @ load the ESMSR1 status register address 363*10465441SEvalZero ldr r2, ESMSR1_ERR_CLR 364*10465441SEvalZero str r2, [r0] @ clear the ESMSR1 register 365*10465441SEvalZero 366*10465441SEvalZero ldr r0, ESMSR2_REG @ load the ESMSR2 status register address 367*10465441SEvalZero ldr r2, ESMSR2_ERR_CLR 368*10465441SEvalZero str r2, [r0] @ clear the ESMSR2 register 369*10465441SEvalZero 370*10465441SEvalZero ldr r0, ESMSSR2_REG @ load the ESMSSR2 status register address 371*10465441SEvalZero ldr r2, ESMSSR2_ERR_CLR 372*10465441SEvalZero str r2, [r0] @ clear the ESMSSR2 register 373*10465441SEvalZero 374*10465441SEvalZero ldr r0, ESMKEY_REG @ load the ESMKEY register address 375*10465441SEvalZero mov r2, #0x5 @ load R2 with 0x5 376*10465441SEvalZero str r2, [r0] @ clear the ESMKEY register 377*10465441SEvalZero 378*10465441SEvalZero ldr r0, VIM_INTREQ @ load the INTREQ register address 379*10465441SEvalZero ldr r2, VIM_INT_CLR 380*10465441SEvalZero str r2, [r0] @ clear the INTREQ register 381*10465441SEvalZero ldr r0, CCMR4_STAT_REG @ load the CCMR4 status register address 382*10465441SEvalZero ldr r2, CCMR4_ERR_CLR 383*10465441SEvalZero str r2, [r0] @ clear the CCMR4 status register 384*10465441SEvalZero ldmfd sp!, {r0-r2} 385*10465441SEvalZero bx lr 386*10465441SEvalZero 387*10465441SEvalZeroESMSR1_REG: .word 0xFFFFF518 388*10465441SEvalZeroESMSR2_REG: .word 0xFFFFF51C 389*10465441SEvalZeroESMSR3_REG: .word 0xFFFFF520 390*10465441SEvalZeroESMKEY_REG: .word 0xFFFFF538 391*10465441SEvalZeroESMSSR2_REG: .word 0xFFFFF53C 392*10465441SEvalZeroCCMR4_STAT_REG: .word 0xFFFFF600 393*10465441SEvalZeroERR_CLR_WRD: .word 0xFFFFFFFF 394*10465441SEvalZeroCCMR4_ERR_CLR: .word 0x00010000 395*10465441SEvalZeroESMSR1_ERR_CLR: .word 0x80000000 396*10465441SEvalZeroESMSR2_ERR_CLR: .word 0x00000004 397*10465441SEvalZeroESMSSR2_ERR_CLR: .word 0x00000004 398*10465441SEvalZeroVIM_INT_CLR: .word 0x00000001 399*10465441SEvalZeroVIM_INTREQ: .word 0xFFFFFE20 400*10465441SEvalZero 401*10465441SEvalZero 402*10465441SEvalZero@------------------------------------------------------------------------------- 403*10465441SEvalZero@ Work Around for Errata CORTEX-R4#57: 404*10465441SEvalZero@ 405*10465441SEvalZero@ Errata Description: 406*10465441SEvalZero@ Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags 407*10465441SEvalZero@ Workaround: 408*10465441SEvalZero@ Disable out-of-order single-precision floating point 409*10465441SEvalZero@ multiply-accumulate instruction completion 410*10465441SEvalZero 411*10465441SEvalZero .globl _errata_CORTEXR4_57_ 412*10465441SEvalZero_errata_CORTEXR4_57_: 413*10465441SEvalZero 414*10465441SEvalZero push {r0} 415*10465441SEvalZero mrc p15, #0, r0, c15, c0, #0 @ Read Secondary Auxiliary Control Register 416*10465441SEvalZero orr r0, r0, #0x10000 @ Set BIT 16 (Set DOOFMACS) 417*10465441SEvalZero mcr p15, #0, r0, c15, c0, #0 @ Write Secondary Auxiliary Control Register 418*10465441SEvalZero pop {r0} 419*10465441SEvalZero bx lr 420*10465441SEvalZero 421*10465441SEvalZero@------------------------------------------------------------------------------- 422*10465441SEvalZero@ Work Around for Errata CORTEX-R4#66: 423*10465441SEvalZero@ 424*10465441SEvalZero@ Errata Description: 425*10465441SEvalZero@ Register Corruption During A Load-Multiple Instruction At 426*10465441SEvalZero@ an Exception Vector 427*10465441SEvalZero@ Workaround: 428*10465441SEvalZero@ Disable out-of-order completion for divide instructions in 429*10465441SEvalZero@ Auxiliary Control register 430*10465441SEvalZero 431*10465441SEvalZero .globl _errata_CORTEXR4_66_ 432*10465441SEvalZero_errata_CORTEXR4_66_: 433*10465441SEvalZero 434*10465441SEvalZero push {r0} 435*10465441SEvalZero mrc p15, #0, r0, c1, c0, #1 @ Read Auxiliary Control register 436*10465441SEvalZero orr r0, r0, #0x80 @ Set BIT 7 (Disable out-of-order completion 437*10465441SEvalZero @ for divide instructions.) 438*10465441SEvalZero mcr p15, #0, r0, c1, c0, #1 @ Write Auxiliary Control register 439*10465441SEvalZero pop {r0} 440*10465441SEvalZero bx lr 441*10465441SEvalZero 442*10465441SEvalZero .globl turnon_VFP 443*10465441SEvalZeroturnon_VFP: 444*10465441SEvalZero @ Enable FPV 445*10465441SEvalZero STMDB sp!, {r0} 446*10465441SEvalZero fmrx r0, fpexc 447*10465441SEvalZero orr r0, r0, #0x40000000 448*10465441SEvalZero fmxr fpexc, r0 449*10465441SEvalZero LDMIA sp!, {r0} 450*10465441SEvalZero subs pc, lr, #4 451*10465441SEvalZero 452*10465441SEvalZero .macro push_svc_reg 453*10465441SEvalZero sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */ 454*10465441SEvalZero stmia sp, {r0 - r12} @/* Calling r0-r12 */ 455*10465441SEvalZero mov r0, sp 456*10465441SEvalZero mrs r6, spsr @/* Save CPSR */ 457*10465441SEvalZero str lr, [r0, #15*4] @/* Push PC */ 458*10465441SEvalZero str r6, [r0, #16*4] @/* Push CPSR */ 459*10465441SEvalZero cps #Mode_SVC 460*10465441SEvalZero str sp, [r0, #13*4] @/* Save calling SP */ 461*10465441SEvalZero str lr, [r0, #14*4] @/* Save calling PC */ 462*10465441SEvalZero .endm 463*10465441SEvalZero 464*10465441SEvalZero .globl vector_svc 465*10465441SEvalZerovector_svc: 466*10465441SEvalZero push_svc_reg 467*10465441SEvalZero bl rt_hw_trap_svc 468*10465441SEvalZero b . 469*10465441SEvalZero 470*10465441SEvalZero .globl vector_pabort 471*10465441SEvalZerovector_pabort: 472*10465441SEvalZero push_svc_reg 473*10465441SEvalZero bl rt_hw_trap_pabt 474*10465441SEvalZero b . 475*10465441SEvalZero 476*10465441SEvalZero .globl vector_dabort 477*10465441SEvalZerovector_dabort: 478*10465441SEvalZero push_svc_reg 479*10465441SEvalZero bl rt_hw_trap_dabt 480*10465441SEvalZero b . 481*10465441SEvalZero 482*10465441SEvalZero .globl vector_resv 483*10465441SEvalZerovector_resv: 484*10465441SEvalZero push_svc_reg 485*10465441SEvalZero bl rt_hw_trap_resv 486*10465441SEvalZero b . 487