diff --git a/trunk/bootrom/build/libraries/os/common/os_exception.c b/trunk/bootrom/build/libraries/os/common/os_exception.c index 07df6b9..c1fa31a 100644 --- a/trunk/bootrom/build/libraries/os/common/os_exception.c +++ b/trunk/bootrom/build/libraries/os/common/os_exception.c @@ -32,7 +32,14 @@ void i_osUndefInstHandler( void ); void osInitException( void ) { #ifdef SDK_ARM11 - *(OSExcpHandler*)HW_UDEF_VECTOR_BUF = i_osUndefInstHandler; + static BOOL isInit; + + if ( isInit == FALSE ) + { + isInit = TRUE; + + *(OSExcpHandler*)HW_UDEF_VECTOR_BUF = i_osUndefInstHandler; + } #endif // SDK_ARM11 } @@ -77,18 +84,18 @@ ASM void i_osUndefInstHandler( void ) adr lr, i_return tst r0, #HW_PSR_THUMB_STATE - bne i_stupUndefInstHandlerDummy + bne i_osUndefInstTerminate tst r0, #HW_PSR_JAVA_STATE - bne i_stupUndefInstHandlerDummy + bne i_osUndefInstTerminate ldr r0, [r12, #0] // called from ARM mov r12, r0, lsl #4 sub r12, r12, #0xC0000000 cmp r12, #0x30000000 - bhs i_stupUndefInstHandlerDummy + bhs i_osUndefInstTerminate - adr r12, i_return + adr r12, i_osUndefCPHandlerTable and r0, r0, #0x00000F00 ldr pc, [r12, r0, lsr #8-2] @@ -99,26 +106,26 @@ i_return INASM_EXTERN( _VFP_Computation_Engine ) -i_stupUndefCPHandlerTable - DCD i_stupUndefInstHandlerDummy // CP 0 - DCD i_stupUndefInstHandlerDummy // CP 1 - DCD i_stupUndefInstHandlerDummy // CP 2 - DCD i_stupUndefInstHandlerDummy // CP 3 - DCD i_stupUndefInstHandlerDummy // CP 4 - DCD i_stupUndefInstHandlerDummy // CP 5 - DCD i_stupUndefInstHandlerDummy // CP 6 - DCD i_stupUndefInstHandlerDummy // CP 7 - DCD i_stupUndefInstHandlerDummy // CP 8 - DCD i_stupUndefInstHandlerDummy // CP 9 - DCD i_vfpUndefInstHandler // CP 10 - DCD i_vfpUndefInstHandler // CP 11 - DCD i_stupUndefInstHandlerDummy // CP 12 - DCD i_stupUndefInstHandlerDummy // CP 13 - DCD i_stupUndefInstHandlerDummy // CP 14 - DCD i_stupUndefInstHandlerDummy // CP 15 +i_osUndefCPHandlerTable + DCD i_osUndefInstTerminate // CP 0 + DCD i_osUndefInstTerminate // CP 1 + DCD i_osUndefInstTerminate // CP 2 + DCD i_osUndefInstTerminate // CP 3 + DCD i_osUndefInstTerminate // CP 4 + DCD i_osUndefInstTerminate // CP 5 + DCD i_osUndefInstTerminate // CP 6 + DCD i_osUndefInstTerminate // CP 7 + DCD i_osUndefInstTerminate // CP 8 + DCD i_osUndefInstTerminate // CP 9 + DCD i_osUndefInstHandlerVFP // CP 10 + DCD i_osUndefInstHandlerVFP // CP 11 + DCD i_osUndefInstTerminate // CP 12 + DCD i_osUndefInstTerminate // CP 13 + DCD i_osUndefInstTerminate // CP 14 + DCD i_osUndefInstTerminate // CP 15 } -ASM void i_vfpUndefInstHandler( void ) +ASM void i_osUndefInstHandlerVFP( void ) { // VFP enable fmrx r12, fpexc @@ -142,7 +149,7 @@ LSYM(1) bx lr } -ASM void i_stupUndefInstHandlerDummy( void ) +ASM void i_osUndefInstTerminate( void ) { LSYM(1) b BSYM(1)