diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index a33be4e..aedfab8 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -219,51 +219,75 @@ asm void i_stupDAbtVeneer( void ) *---------------------------------------------------------------------------*/ asm void i_stupSwiSemihosting( void ) { - ldmfd sp!, {r11, r12, lr} + // 割り込み禁止 + msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + ldmfd sp!, {r11, r12, lr} + add sp, sp, #12 + msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + // SVCモード + ldmfd sp!, {lr} // ※SP_svc + msr spsr_cxsf, lr + ldmfd sp!, {lr} semi_vector - movs pc, lr + // セミホスティングアドレスはSVCモード + movs pc, lr } asm void i_stupSwiHandler( void ) { INASM_EXTERN( _start ) - stmfd sp!, {r11, r12, lr} // SVCモード レジスタ退避 - ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) + // SVCモード + msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + + // システムモード + sub sp, sp, #12 + stmfd sp!, {r11, r12, lr} + add r12, sp, #16 // ユーザスタック内のSPSR_svc、LR_svc退避アドレスをコピー + msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + + // SVCモード + mov sp, r12 // ※SP_svc + mov r12, lr + mrs r11, spsr + msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + + // システムモード + add lr, sp, #16 + stmia lr, {r11, r12} // SPSR_svc、LR_svcを退避 + + and r11, r11, #HW_PSR_IRQ_DISABLE // IRQ許可状態 コピー + orr r11, r11, #HW_PSR_SYS_MODE // FIQ許可 + msr cpsr_cxsf, r11 + + mov lr, r12 + ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) mov r12, r12, lsl #1 - and r12, r12, #SVC_ID_PREMASK< -ASM int i_vlink_jtag_com_stat(void) /* bit0==1 受信でデータあり / bit1==0 送信可能 */ +asm int i_vlink_jtag_com_stat(void) /* bit0==1 受信でデータあり / bit1==0 送信可能 */ { mrc p14,0,r0,c0,c0, 0 bx lr } -ASM void i_vlink_jtag_com_put(ULONG r0) +asm void i_vlink_jtag_com_put(ULONG r0) { mcr p14,0,r0,c1,c0, 0 bx lr } -ASM ULONG i_vlink_jtag_com_get(void) +asm ULONG i_vlink_jtag_com_get(void) { mrc p14,0,r0,c1,c0, 0 bx lr } -ASM int i_vlink_jtag_com_stat11(void) /* bit30==1 受信でデータあり / bit29==0 送信可能 */ +asm int i_vlink_jtag_com_stat11(void) /* bit30==1 受信でデータあり / bit29==0 送信可能 */ { mrc p14,0,r0,c0,c1, 0 bx lr } -ASM void i_vlink_jtag_com_put11(ULONG r0) +asm void i_vlink_jtag_com_put11(ULONG r0) { mcr p14,0,r0,c0,c5, 0 bx lr } -ASM ULONG i_vlink_jtag_com_get11(void) +asm ULONG i_vlink_jtag_com_get11(void) { mrc p14,0,r0,c0,c5, 0 bx lr } -ASM int i_vlink_jtag_cpuid(void) +asm int i_vlink_jtag_cpuid(void) { #ifdef SDK_ARM7 mov r0, #0x00050000