/*---------------------------------------------------------------------------* 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) bx lr i_stupExcpVennerCode DCD i_stupExcpTerminateCode // IRQ DCD i_stupExcpTerminateCode // FIQ DCD i_stupSwiVeneerCode // SWI DCD i_stupExcpTerminateCode // UNDEF 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_stupUndefInstVeneer Description: Undefine Instruction veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ ASM void i_stupUndefInstVeneer( void ) { ldr pc, =HW_UDEF_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupPrefetchAbortVeneer Description: Prefetch Abort veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ ASM void i_stupPrefetchAbortVeneer( void ) { ldr pc, =HW_IABT_VENEER_BUF LTORG } /*---------------------------------------------------------------------------* Name: i_stupDataAbortVeneer Description: Data Abort veneer Arguments: None Returns: None. *---------------------------------------------------------------------------*/ ASM void i_stupDataAbortVeneer( 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< }