/*---------------------------------------------------------------------------* Project: CtrBrom - library - init File: crt0_excpHandler.c Copyright 2008 Nintendo. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Date:: $ $Rev$ $Author$ *---------------------------------------------------------------------------*/ #include #include #include /*---------------------------------------------------------------------------* Name: stupInitExceptions Description: Initialize Exceptions Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void stupInitExceptions( void ) { adr r2, i_stupExcpVennerCode ldr r3, =HW_EXCP_VENEER_BUF add r12, r3, #HW_EXCP_VENEER_BUF_SIZE LSYM(0) ldr r0, [r2], #4 ldm r0, {r0-r1} stm r3!,{r0-r1} cmp r3, r12 blt BSYM(0) #ifdef SDK_ARM11 // disable VFP #ifndef SDK_NE1EMU fmrx r12, fpexc bic r12, r12, #HW_FPEXC_VFP_ENABLE fmxr fpexc, r12 #endif // SDK_NE1EMU #endif // SDK_ARM11 bx lr i_stupExcpVennerCode DCD i_stupExcpTerminateCode // IRQ DCD i_stupExcpTerminateCode // FIQ DCD i_stupSwiVeneerCode // SWI osInit前にprint文を出したい可能性があるためここで設定 #ifdef BROM_ENABLE_SCATLD_VFP INASM_EXTERN( i_osUndefInstHandler ) DCD i_osUndefInstHandler // UNDEF #else // BROM_ENABLE_SCATLD_VFP DCD i_stupExcpTerminateCode // UNDEF #endif // BROM_ENABLE_SCATLD_VFP DCD i_stupIAbtTerminateCode // IABT 命令アボートとデータアボートを区別するため別関数に DCD i_stupExcpTerminateCode // DABT LTORG } /*---------------------------------------------------------------------------* Name: i_stupExcpTerminateCode Description: exception veneer code Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void i_stupExcpTerminateCode( void ) { ldr pc, =i_stupExcpTerminateCode LTORG } /*---------------------------------------------------------------------------* Name: i_stupIAbtTerminateCode Description: Prefetch Abort veneer code Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void i_stupIAbtTerminateCode( void ) { ldr pc, =i_stupIAbtTerminateCode LTORG } /*---------------------------------------------------------------------------* Name: i_stupSwiVeneerCode Description: SWI veneer code Arguments: None Returns: None *---------------------------------------------------------------------------*/ asm void i_stupSwiVeneerCode( void ) { ldr pc, =i_stupSwiHandler LTORG } /*---------------------------------------------------------------------------* Name: i_stupIrqVeneer Description: IRQ veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupIrqVeneer( void ) { ldr pc, =HW_INTR_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupFiqVeneer Description: FIQ veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupFiqVeneer( void ) { ldr pc, =HW_FIQ_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupSwiVeneer Description: SWI veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupSwiVeneer( void ) { ldr pc, =HW_SWI_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupUndefVeneer Description: Undefine Instruction veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupUndefVeneer( void ) { ldr pc, =HW_UDEF_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupIAbtVeneer Description: Prefetch Abort veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupIAbtVeneer( void ) { ldr pc, =HW_IABT_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupDAbtVeneer Description: Data Abort veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupDAbtVeneer( void ) { ldr pc, =HW_DABT_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupSwiHandler Description: SWI handler Arguments: None Returns: None. *---------------------------------------------------------------------------*/ asm void i_stupSwiSemihosting( void ) { ldmfd sp!, {r11, r12, lr} semi_vector movs pc, lr } asm void i_stupSwiHandler( void ) { INASM_EXTERN( _start ) stmfd sp!, {r11, r12, lr} // SVCモード レジスタ退避 ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) mov r12, r12, lsl #1 and r12, r12, #SVC_ID_PREMASK< }