1*10465441SEvalZero;------------------------------------------------------------------------------- 2*10465441SEvalZero; sys_core.asm 3*10465441SEvalZero; 4*10465441SEvalZero; (c) Texas Instruments 2009-2013, All rights reserved. 5*10465441SEvalZero; 6*10465441SEvalZero 7*10465441SEvalZero .text 8*10465441SEvalZero .arm 9*10465441SEvalZero 10*10465441SEvalZero .ref _c_int00 11*10465441SEvalZero 12*10465441SEvalZero .def _reset 13*10465441SEvalZero .asmfunc 14*10465441SEvalZero_reset 15*10465441SEvalZero;------------------------------------------------------------------------------- 16*10465441SEvalZero; Initialize CPU Registers 17*10465441SEvalZero; After reset, the CPU is in the Supervisor mode (M = 10011) 18*10465441SEvalZero mov r0, lr 19*10465441SEvalZero mov r1, #0x0000 20*10465441SEvalZero mov r2, #0x0000 21*10465441SEvalZero mov r3, #0x0000 22*10465441SEvalZero mov r4, #0x0000 23*10465441SEvalZero mov r5, #0x0000 24*10465441SEvalZero mov r6, #0x0000 25*10465441SEvalZero mov r7, #0x0000 26*10465441SEvalZero mov r8, #0x0000 27*10465441SEvalZero mov r9, #0x0000 28*10465441SEvalZero mov r10, #0x0000 29*10465441SEvalZero mov r11, #0x0000 30*10465441SEvalZero mov r12, #0x0000 31*10465441SEvalZero mov r13, #0x0000 32*10465441SEvalZero mrs r1, cpsr 33*10465441SEvalZero msr spsr_cxsf, r1 34*10465441SEvalZero ; Switch to FIQ mode (M = 10001) 35*10465441SEvalZero cps #17 36*10465441SEvalZero mov lr, r0 37*10465441SEvalZero mov r8, #0x0000 38*10465441SEvalZero mov r9, #0x0000 39*10465441SEvalZero mov r10, #0x0000 40*10465441SEvalZero mov r11, #0x0000 41*10465441SEvalZero mov r12, #0x0000 42*10465441SEvalZero mrs r1, cpsr 43*10465441SEvalZero msr spsr_cxsf, r1 44*10465441SEvalZero ; Switch to IRQ mode (M = 10010) 45*10465441SEvalZero cps #18 46*10465441SEvalZero mov lr, r0 47*10465441SEvalZero mrs r1,cpsr 48*10465441SEvalZero msr spsr_cxsf, r1 49*10465441SEvalZero ; Switch to Abort mode (M = 10111) 50*10465441SEvalZero cps #23 51*10465441SEvalZero mov lr, r0 52*10465441SEvalZero mrs r1,cpsr 53*10465441SEvalZero msr spsr_cxsf, r1 54*10465441SEvalZero ; Switch to Undefined Instruction Mode (M = 11011) 55*10465441SEvalZero cps #27 56*10465441SEvalZero mov lr, r0 57*10465441SEvalZero mrs r1,cpsr 58*10465441SEvalZero msr spsr_cxsf, r1 59*10465441SEvalZero ; Switch to System Mode ( Shares User Mode registers ) (M = 11111) 60*10465441SEvalZero cps #31 61*10465441SEvalZero mov lr, r0 62*10465441SEvalZero mrs r1,cpsr 63*10465441SEvalZero msr spsr_cxsf, r1 64*10465441SEvalZero ; Switch back to Supervisor Mode (M = 10011) 65*10465441SEvalZero cps #19 66*10465441SEvalZero 67*10465441SEvalZero ; Turn on FPV coprocessor 68*10465441SEvalZero mrc p15, #0x00, r2, c1, c0, #0x02 69*10465441SEvalZero orr r2, r2, #0xF00000 70*10465441SEvalZero mcr p15, #0x00, r2, c1, c0, #0x02 71*10465441SEvalZero 72*10465441SEvalZero .if (RT_VFP_LAZY_STACKING) = 0 73*10465441SEvalZero fmrx r2, fpexc 74*10465441SEvalZero orr r2, r2, #0x40000000 75*10465441SEvalZero fmxr fpexc, r2 76*10465441SEvalZero 77*10465441SEvalZero fmdrr d0, r1, r1 78*10465441SEvalZero fmdrr d1, r1, r1 79*10465441SEvalZero fmdrr d2, r1, r1 80*10465441SEvalZero fmdrr d3, r1, r1 81*10465441SEvalZero fmdrr d4, r1, r1 82*10465441SEvalZero fmdrr d5, r1, r1 83*10465441SEvalZero fmdrr d6, r1, r1 84*10465441SEvalZero fmdrr d7, r1, r1 85*10465441SEvalZero fmdrr d8, r1, r1 86*10465441SEvalZero fmdrr d9, r1, r1 87*10465441SEvalZero fmdrr d10, r1, r1 88*10465441SEvalZero fmdrr d11, r1, r1 89*10465441SEvalZero fmdrr d12, r1, r1 90*10465441SEvalZero fmdrr d13, r1, r1 91*10465441SEvalZero fmdrr d14, r1, r1 92*10465441SEvalZero fmdrr d15, r1, r1 93*10465441SEvalZero .endif 94*10465441SEvalZero 95*10465441SEvalZero;------------------------------------------------------------------------------- 96*10465441SEvalZero; Initialize Stack Pointers 97*10465441SEvalZero cps #17 98*10465441SEvalZero ldr sp, fiqSp 99*10465441SEvalZero cps #18 100*10465441SEvalZero ldr sp, irqSp 101*10465441SEvalZero cps #23 102*10465441SEvalZero ldr sp, abortSp 103*10465441SEvalZero cps #27 104*10465441SEvalZero ldr sp, undefSp 105*10465441SEvalZero cps #31 106*10465441SEvalZero ldr sp, userSp 107*10465441SEvalZero cps #19 108*10465441SEvalZero ldr sp, svcSp 109*10465441SEvalZero 110*10465441SEvalZero bl next1 111*10465441SEvalZeronext1 112*10465441SEvalZero bl next2 113*10465441SEvalZeronext2 114*10465441SEvalZero bl next3 115*10465441SEvalZeronext3 116*10465441SEvalZero bl next4 117*10465441SEvalZeronext4 118*10465441SEvalZero ldr lr, int00ad 119*10465441SEvalZero bx lr 120*10465441SEvalZero 121*10465441SEvalZeroint00ad .word _c_int00 122*10465441SEvalZerouserSp .word 0x08000000+0x00001000 123*10465441SEvalZerosvcSp .word 0x08000000+0x00001000+0x00000100 124*10465441SEvalZerofiqSp .word 0x08000000+0x00001000+0x00000100+0x00000100 125*10465441SEvalZeroirqSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100 126*10465441SEvalZeroabortSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100 127*10465441SEvalZeroundefSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100 128*10465441SEvalZero 129*10465441SEvalZero .endasmfunc 130*10465441SEvalZero 131*10465441SEvalZero;------------------------------------------------------------------------------- 132*10465441SEvalZero; Enable RAM ECC Support 133*10465441SEvalZero 134*10465441SEvalZero .def _coreEnableRamEcc_ 135*10465441SEvalZero .asmfunc 136*10465441SEvalZero 137*10465441SEvalZero_coreEnableRamEcc_ 138*10465441SEvalZero 139*10465441SEvalZero stmfd sp!, {r0} 140*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 141*10465441SEvalZero orr r0, r0, #0x0C000000 142*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 143*10465441SEvalZero ldmfd sp!, {r0} 144*10465441SEvalZero bx lr 145*10465441SEvalZero 146*10465441SEvalZero .endasmfunc 147*10465441SEvalZero 148*10465441SEvalZero 149*10465441SEvalZero;------------------------------------------------------------------------------- 150*10465441SEvalZero; Disable RAM ECC Support 151*10465441SEvalZero 152*10465441SEvalZero .def _coreDisableRamEcc_ 153*10465441SEvalZero .asmfunc 154*10465441SEvalZero 155*10465441SEvalZero_coreDisableRamEcc_ 156*10465441SEvalZero 157*10465441SEvalZero stmfd sp!, {r0} 158*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 159*10465441SEvalZero bic r0, r0, #0x0C000000 160*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 161*10465441SEvalZero ldmfd sp!, {r0} 162*10465441SEvalZero bx lr 163*10465441SEvalZero 164*10465441SEvalZero .endasmfunc 165*10465441SEvalZero 166*10465441SEvalZero 167*10465441SEvalZero;------------------------------------------------------------------------------- 168*10465441SEvalZero; Enable Flash ECC Support 169*10465441SEvalZero 170*10465441SEvalZero .def _coreEnableFlashEcc_ 171*10465441SEvalZero .asmfunc 172*10465441SEvalZero 173*10465441SEvalZero_coreEnableFlashEcc_ 174*10465441SEvalZero 175*10465441SEvalZero stmfd sp!, {r0} 176*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 177*10465441SEvalZero orr r0, r0, #0x02000000 178*10465441SEvalZero dmb 179*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 180*10465441SEvalZero ldmfd sp!, {r0} 181*10465441SEvalZero bx lr 182*10465441SEvalZero 183*10465441SEvalZero .endasmfunc 184*10465441SEvalZero 185*10465441SEvalZero 186*10465441SEvalZero;------------------------------------------------------------------------------- 187*10465441SEvalZero; Disable Flash ECC Support 188*10465441SEvalZero 189*10465441SEvalZero .def _coreDisableFlashEcc_ 190*10465441SEvalZero .asmfunc 191*10465441SEvalZero 192*10465441SEvalZero_coreDisableFlashEcc_ 193*10465441SEvalZero 194*10465441SEvalZero stmfd sp!, {r0} 195*10465441SEvalZero mrc p15, #0x00, r0, c1, c0, #0x01 196*10465441SEvalZero bic r0, r0, #0x02000000 197*10465441SEvalZero mcr p15, #0x00, r0, c1, c0, #0x01 198*10465441SEvalZero ldmfd sp!, {r0} 199*10465441SEvalZero bx lr 200*10465441SEvalZero 201*10465441SEvalZero .endasmfunc 202*10465441SEvalZero 203*10465441SEvalZero;------------------------------------------------------------------------------- 204*10465441SEvalZero; Get data fault status register 205*10465441SEvalZero 206*10465441SEvalZero .def _coreGetDataFault_ 207*10465441SEvalZero .asmfunc 208*10465441SEvalZero 209*10465441SEvalZero_coreGetDataFault_ 210*10465441SEvalZero 211*10465441SEvalZero mrc p15, #0, r0, c5, c0, #0 212*10465441SEvalZero bx lr 213*10465441SEvalZero 214*10465441SEvalZero .endasmfunc 215*10465441SEvalZero 216*10465441SEvalZero 217*10465441SEvalZero;------------------------------------------------------------------------------- 218*10465441SEvalZero; Clear data fault status register 219*10465441SEvalZero 220*10465441SEvalZero .def _coreClearDataFault_ 221*10465441SEvalZero .asmfunc 222*10465441SEvalZero 223*10465441SEvalZero_coreClearDataFault_ 224*10465441SEvalZero 225*10465441SEvalZero stmfd sp!, {r0} 226*10465441SEvalZero mov r0, #0 227*10465441SEvalZero mcr p15, #0, r0, c5, c0, #0 228*10465441SEvalZero ldmfd sp!, {r0} 229*10465441SEvalZero bx lr 230*10465441SEvalZero 231*10465441SEvalZero .endasmfunc 232*10465441SEvalZero 233*10465441SEvalZero 234*10465441SEvalZero;------------------------------------------------------------------------------- 235*10465441SEvalZero; Get instruction fault status register 236*10465441SEvalZero 237*10465441SEvalZero .def _coreGetInstructionFault_ 238*10465441SEvalZero .asmfunc 239*10465441SEvalZero 240*10465441SEvalZero_coreGetInstructionFault_ 241*10465441SEvalZero 242*10465441SEvalZero mrc p15, #0, r0, c5, c0, #1 243*10465441SEvalZero bx lr 244*10465441SEvalZero 245*10465441SEvalZero .endasmfunc 246*10465441SEvalZero 247*10465441SEvalZero 248*10465441SEvalZero;------------------------------------------------------------------------------- 249*10465441SEvalZero; Clear instruction fault status register 250*10465441SEvalZero 251*10465441SEvalZero .def _coreClearInstructionFault_ 252*10465441SEvalZero .asmfunc 253*10465441SEvalZero 254*10465441SEvalZero_coreClearInstructionFault_ 255*10465441SEvalZero 256*10465441SEvalZero stmfd sp!, {r0} 257*10465441SEvalZero mov r0, #0 258*10465441SEvalZero mcr p15, #0, r0, c5, c0, #1 259*10465441SEvalZero ldmfd sp!, {r0} 260*10465441SEvalZero bx lr 261*10465441SEvalZero 262*10465441SEvalZero .endasmfunc 263*10465441SEvalZero 264*10465441SEvalZero 265*10465441SEvalZero;------------------------------------------------------------------------------- 266*10465441SEvalZero; Get data fault address register 267*10465441SEvalZero 268*10465441SEvalZero .def _coreGetDataFaultAddress_ 269*10465441SEvalZero .asmfunc 270*10465441SEvalZero 271*10465441SEvalZero_coreGetDataFaultAddress_ 272*10465441SEvalZero 273*10465441SEvalZero mrc p15, #0, r0, c6, c0, #0 274*10465441SEvalZero bx lr 275*10465441SEvalZero 276*10465441SEvalZero .endasmfunc 277*10465441SEvalZero 278*10465441SEvalZero 279*10465441SEvalZero;------------------------------------------------------------------------------- 280*10465441SEvalZero; Clear data fault address register 281*10465441SEvalZero 282*10465441SEvalZero .def _coreClearDataFaultAddress_ 283*10465441SEvalZero .asmfunc 284*10465441SEvalZero 285*10465441SEvalZero_coreClearDataFaultAddress_ 286*10465441SEvalZero 287*10465441SEvalZero stmfd sp!, {r0} 288*10465441SEvalZero mov r0, #0 289*10465441SEvalZero mcr p15, #0, r0, c6, c0, #0 290*10465441SEvalZero ldmfd sp!, {r0} 291*10465441SEvalZero bx lr 292*10465441SEvalZero 293*10465441SEvalZero .endasmfunc 294*10465441SEvalZero 295*10465441SEvalZero 296*10465441SEvalZero;------------------------------------------------------------------------------- 297*10465441SEvalZero; Get instruction fault address register 298*10465441SEvalZero 299*10465441SEvalZero .def _coreGetInstructionFaultAddress_ 300*10465441SEvalZero .asmfunc 301*10465441SEvalZero 302*10465441SEvalZero_coreGetInstructionFaultAddress_ 303*10465441SEvalZero 304*10465441SEvalZero mrc p15, #0, r0, c6, c0, #2 305*10465441SEvalZero bx lr 306*10465441SEvalZero 307*10465441SEvalZero .endasmfunc 308*10465441SEvalZero 309*10465441SEvalZero 310*10465441SEvalZero;------------------------------------------------------------------------------- 311*10465441SEvalZero; Clear instruction fault address register 312*10465441SEvalZero 313*10465441SEvalZero .def _coreClearInstructionFaultAddress_ 314*10465441SEvalZero .asmfunc 315*10465441SEvalZero 316*10465441SEvalZero_coreClearInstructionFaultAddress_ 317*10465441SEvalZero 318*10465441SEvalZero stmfd sp!, {r0} 319*10465441SEvalZero mov r0, #0 320*10465441SEvalZero mcr p15, #0, r0, c6, c0, #2 321*10465441SEvalZero ldmfd sp!, {r0} 322*10465441SEvalZero bx lr 323*10465441SEvalZero 324*10465441SEvalZero .endasmfunc 325*10465441SEvalZero 326*10465441SEvalZero 327*10465441SEvalZero;------------------------------------------------------------------------------- 328*10465441SEvalZero; Get auxiliary data fault status register 329*10465441SEvalZero 330*10465441SEvalZero .def _coreGetAuxiliaryDataFault_ 331*10465441SEvalZero .asmfunc 332*10465441SEvalZero 333*10465441SEvalZero_coreGetAuxiliaryDataFault_ 334*10465441SEvalZero 335*10465441SEvalZero mrc p15, #0, r0, c5, c1, #0 336*10465441SEvalZero bx lr 337*10465441SEvalZero 338*10465441SEvalZero .endasmfunc 339*10465441SEvalZero 340*10465441SEvalZero 341*10465441SEvalZero;------------------------------------------------------------------------------- 342*10465441SEvalZero; Clear auxiliary data fault status register 343*10465441SEvalZero 344*10465441SEvalZero .def _coreClearAuxiliaryDataFault_ 345*10465441SEvalZero .asmfunc 346*10465441SEvalZero 347*10465441SEvalZero_coreClearAuxiliaryDataFault_ 348*10465441SEvalZero 349*10465441SEvalZero stmfd sp!, {r0} 350*10465441SEvalZero mov r0, #0 351*10465441SEvalZero mcr p15, #0, r0, c5, c1, #0 352*10465441SEvalZero ldmfd sp!, {r0} 353*10465441SEvalZero bx lr 354*10465441SEvalZero 355*10465441SEvalZero .endasmfunc 356*10465441SEvalZero 357*10465441SEvalZero 358*10465441SEvalZero;------------------------------------------------------------------------------- 359*10465441SEvalZero; Get auxiliary instruction fault status register 360*10465441SEvalZero 361*10465441SEvalZero .def _coreGetAuxiliaryInstructionFault_ 362*10465441SEvalZero .asmfunc 363*10465441SEvalZero 364*10465441SEvalZero_coreGetAuxiliaryInstructionFault_ 365*10465441SEvalZero 366*10465441SEvalZero mrc p15, #0, r0, c5, c1, #1 367*10465441SEvalZero bx lr 368*10465441SEvalZero 369*10465441SEvalZero .endasmfunc 370*10465441SEvalZero 371*10465441SEvalZero;------------------------------------------------------------------------------- 372*10465441SEvalZero; Clear auxiliary instruction fault status register 373*10465441SEvalZero 374*10465441SEvalZero .def _coreClearAuxiliaryInstructionFault_ 375*10465441SEvalZero .asmfunc 376*10465441SEvalZero 377*10465441SEvalZero_coreClearAuxiliaryInstructionFault_ 378*10465441SEvalZero 379*10465441SEvalZero stmfd sp!, {r0} 380*10465441SEvalZero mov r0, #0 381*10465441SEvalZero mrc p15, #0, r0, c5, c1, #1 382*10465441SEvalZero ldmfd sp!, {r0} 383*10465441SEvalZero bx lr 384*10465441SEvalZero 385*10465441SEvalZero .endasmfunc 386*10465441SEvalZero 387*10465441SEvalZero;------------------------------------------------------------------------------- 388*10465441SEvalZero; Clear ESM CCM errorss 389*10465441SEvalZero 390*10465441SEvalZero .def _esmCcmErrorsClear_ 391*10465441SEvalZero .asmfunc 392*10465441SEvalZero 393*10465441SEvalZero_esmCcmErrorsClear_ 394*10465441SEvalZero 395*10465441SEvalZero stmfd sp!, {r0-r2} 396*10465441SEvalZero ldr r0, ESMSR1_REG ; load the ESMSR1 status register address 397*10465441SEvalZero ldr r2, ESMSR1_ERR_CLR 398*10465441SEvalZero str r2, [r0] ; clear the ESMSR1 register 399*10465441SEvalZero 400*10465441SEvalZero ldr r0, ESMSR2_REG ; load the ESMSR2 status register address 401*10465441SEvalZero ldr r2, ESMSR2_ERR_CLR 402*10465441SEvalZero str r2, [r0] ; clear the ESMSR2 register 403*10465441SEvalZero 404*10465441SEvalZero ldr r0, ESMSSR2_REG ; load the ESMSSR2 status register address 405*10465441SEvalZero ldr r2, ESMSSR2_ERR_CLR 406*10465441SEvalZero str r2, [r0] ; clear the ESMSSR2 register 407*10465441SEvalZero 408*10465441SEvalZero ldr r0, ESMKEY_REG ; load the ESMKEY register address 409*10465441SEvalZero mov r2, #0x5 ; load R2 with 0x5 410*10465441SEvalZero str r2, [r0] ; clear the ESMKEY register 411*10465441SEvalZero 412*10465441SEvalZero ldr r0, VIM_INTREQ ; load the INTREQ register address 413*10465441SEvalZero ldr r2, VIM_INT_CLR 414*10465441SEvalZero str r2, [r0] ; clear the INTREQ register 415*10465441SEvalZero ldr r0, CCMR4_STAT_REG ; load the CCMR4 status register address 416*10465441SEvalZero ldr r2, CCMR4_ERR_CLR 417*10465441SEvalZero str r2, [r0] ; clear the CCMR4 status register 418*10465441SEvalZero ldmfd sp!, {r0-r2} 419*10465441SEvalZero bx lr 420*10465441SEvalZero 421*10465441SEvalZeroESMSR1_REG .word 0xFFFFF518 422*10465441SEvalZeroESMSR2_REG .word 0xFFFFF51C 423*10465441SEvalZeroESMSR3_REG .word 0xFFFFF520 424*10465441SEvalZeroESMKEY_REG .word 0xFFFFF538 425*10465441SEvalZeroESMSSR2_REG .word 0xFFFFF53C 426*10465441SEvalZeroCCMR4_STAT_REG .word 0xFFFFF600 427*10465441SEvalZeroERR_CLR_WRD .word 0xFFFFFFFF 428*10465441SEvalZeroCCMR4_ERR_CLR .word 0x00010000 429*10465441SEvalZeroESMSR1_ERR_CLR .word 0x80000000 430*10465441SEvalZeroESMSR2_ERR_CLR .word 0x00000004 431*10465441SEvalZeroESMSSR2_ERR_CLR .word 0x00000004 432*10465441SEvalZeroVIM_INT_CLR .word 0x00000001 433*10465441SEvalZeroVIM_INTREQ .word 0xFFFFFE20 434*10465441SEvalZero 435*10465441SEvalZero .endasmfunc 436*10465441SEvalZero 437*10465441SEvalZero;------------------------------------------------------------------------------- 438*10465441SEvalZero; Work Around for Errata CORTEX-R4#57: 439*10465441SEvalZero; 440*10465441SEvalZero; Errata Description: 441*10465441SEvalZero; Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags 442*10465441SEvalZero; Workaround: 443*10465441SEvalZero; Disable out-of-order single-precision floating point 444*10465441SEvalZero; multiply-accumulate instruction completion 445*10465441SEvalZero 446*10465441SEvalZero .def _errata_CORTEXR4_57_ 447*10465441SEvalZero .asmfunc 448*10465441SEvalZero 449*10465441SEvalZero_errata_CORTEXR4_57_ 450*10465441SEvalZero 451*10465441SEvalZero push {r0} 452*10465441SEvalZero mrc p15, #0, r0, c15, c0, #0 ; Read Secondary Auxiliary Control Register 453*10465441SEvalZero orr r0, r0, #0x10000 ; Set BIT 16 (Set DOOFMACS) 454*10465441SEvalZero mcr p15, #0, r0, c15, c0, #0 ; Write Secondary Auxiliary Control Register 455*10465441SEvalZero pop {r0} 456*10465441SEvalZero bx lr 457*10465441SEvalZero .endasmfunc 458*10465441SEvalZero 459*10465441SEvalZero;------------------------------------------------------------------------------- 460*10465441SEvalZero; Work Around for Errata CORTEX-R4#66: 461*10465441SEvalZero; 462*10465441SEvalZero; Errata Description: 463*10465441SEvalZero; Register Corruption During A Load-Multiple Instruction At 464*10465441SEvalZero; an Exception Vector 465*10465441SEvalZero; Workaround: 466*10465441SEvalZero; Disable out-of-order completion for divide instructions in 467*10465441SEvalZero; Auxiliary Control register 468*10465441SEvalZero 469*10465441SEvalZero .def _errata_CORTEXR4_66_ 470*10465441SEvalZero .asmfunc 471*10465441SEvalZero 472*10465441SEvalZero_errata_CORTEXR4_66_ 473*10465441SEvalZero 474*10465441SEvalZero push {r0} 475*10465441SEvalZero mrc p15, #0, r0, c1, c0, #1 ; Read Auxiliary Control register 476*10465441SEvalZero orr r0, r0, #0x80 ; Set BIT 7 (Disable out-of-order completion 477*10465441SEvalZero ; for divide instructions.) 478*10465441SEvalZero mcr p15, #0, r0, c1, c0, #1 ; Write Auxiliary Control register 479*10465441SEvalZero pop {r0} 480*10465441SEvalZero bx lr 481*10465441SEvalZero .endasmfunc 482*10465441SEvalZero 483*10465441SEvalZero .def turnon_VFP 484*10465441SEvalZero .asmfunc 485*10465441SEvalZeroturnon_VFP 486*10465441SEvalZero ; Enable FPV 487*10465441SEvalZero STMDB sp!, {r0} 488*10465441SEvalZero fmrx r0, fpexc 489*10465441SEvalZero orr r0, r0, #0x40000000 490*10465441SEvalZero fmxr fpexc, r0 491*10465441SEvalZero LDMIA sp!, {r0} 492*10465441SEvalZero subs pc, lr, #4 493*10465441SEvalZero .endasmfunc 494*10465441SEvalZero 495*10465441SEvalZero_push_svc_reg .macro 496*10465441SEvalZero sub sp, sp, #17 * 4 ;/* Sizeof(struct rt_hw_exp_stack) */ 497*10465441SEvalZero stmia sp, {r0 - r12} ;/* Calling r0-r12 */ 498*10465441SEvalZero mov r0, sp 499*10465441SEvalZero mrs r6, spsr ;/* Save CPSR */ 500*10465441SEvalZero str lr, [r0, #15*4] ;/* Push PC */ 501*10465441SEvalZero str r6, [r0, #16*4] ;/* Push CPSR */ 502*10465441SEvalZero cps #0x13 503*10465441SEvalZero str sp, [r0, #13*4] ;/* Save calling SP */ 504*10465441SEvalZero str lr, [r0, #14*4] ;/* Save calling PC */ 505*10465441SEvalZero .endm 506*10465441SEvalZero 507*10465441SEvalZero .ref rt_hw_trap_svc 508*10465441SEvalZero .def vector_svc 509*10465441SEvalZero .asmfunc 510*10465441SEvalZerovector_svc: 511*10465441SEvalZero _push_svc_reg 512*10465441SEvalZero bl rt_hw_trap_svc 513*10465441SEvalZero sub pc, pc, #-4 514*10465441SEvalZero .endasmfunc 515*10465441SEvalZero 516*10465441SEvalZero .ref rt_hw_trap_pabt 517*10465441SEvalZero .def vector_pabort 518*10465441SEvalZero .asmfunc 519*10465441SEvalZerovector_pabort: 520*10465441SEvalZero _push_svc_reg 521*10465441SEvalZero bl rt_hw_trap_pabt 522*10465441SEvalZero sub pc, pc, #-4 523*10465441SEvalZero .endasmfunc 524*10465441SEvalZero 525*10465441SEvalZero .ref rt_hw_trap_dabt 526*10465441SEvalZero .def vector_dabort 527*10465441SEvalZero .asmfunc 528*10465441SEvalZerovector_dabort: 529*10465441SEvalZero _push_svc_reg 530*10465441SEvalZero bl rt_hw_trap_dabt 531*10465441SEvalZero sub pc, pc, #-4 532*10465441SEvalZero .endasmfunc 533*10465441SEvalZero 534*10465441SEvalZero .ref rt_hw_trap_resv 535*10465441SEvalZero .def vector_resv 536*10465441SEvalZero .asmfunc 537*10465441SEvalZerovector_resv: 538*10465441SEvalZero _push_svc_reg 539*10465441SEvalZero bl rt_hw_trap_resv 540*10465441SEvalZero sub pc, pc, #-4 541*10465441SEvalZero .endasmfunc 542*10465441SEvalZero 543*10465441SEvalZero;------------------------------------------------------------------------------- 544*10465441SEvalZero; C++ construct table pointers 545*10465441SEvalZero 546*10465441SEvalZero .def __TI_PINIT_Base, __TI_PINIT_Limit 547*10465441SEvalZero .weak SHT$$INIT_ARRAY$$Base, SHT$$INIT_ARRAY$$Limit 548*10465441SEvalZero 549*10465441SEvalZero__TI_PINIT_Base .long SHT$$INIT_ARRAY$$Base 550*10465441SEvalZero__TI_PINIT_Limit .long SHT$$INIT_ARRAY$$Limit 551*10465441SEvalZero 552*10465441SEvalZero;------------------------------------------------------------------------------- 553