diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index aedfab8..e204841 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -220,7 +220,9 @@ asm void i_stupDAbtVeneer( void ) asm void i_stupSwiSemihosting( void ) { // 割り込み禁止 - msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + mrs r12, cpsr + orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_cxsf, r12 ldmfd sp!, {r11, r12, lr} add sp, sp, #12 msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) @@ -229,7 +231,7 @@ asm void i_stupSwiSemihosting( void ) msr spsr_cxsf, lr ldmfd sp!, {lr} semi_vector - // セミホスティングアドレスはSVCモード + // セミホスティングアドレスはSVCモードでないとARMデバッガがエラーを出力 movs pc, lr } @@ -238,48 +240,53 @@ asm void i_stupSwiHandler( void ) INASM_EXTERN( _start ) // SVCモード - msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + mrs sp, spsr + // ユーザモードならシステムモードへ + tst sp, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE + orreq sp, sp, #HW_PSR_SYS_MODE + // 割り込み禁止 + orr sp, sp, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_cxsf, sp - // システムモード + // 呼び出し元のモード sub sp, sp, #12 stmfd sp!, {r11, r12, lr} - add r12, sp, #16 // ユーザスタック内のSPSR_svc、LR_svc退避アドレスをコピー + add r12, sp, #24 // ユーザスタック内の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許可 + stmfd sp!, {r11, lr} // SPSR_svc、LR_svcを退避 + // ユーザモードならシステムモードへ + tst r11, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE + orreq r11, r11, #HW_PSR_SYS_MODE + // 割り込み状態継承 msr cpsr_cxsf, r11 - mov lr, r12 - ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) - mov r12, r12, lsl #1 - and r12, r12, #SVC_ID_PREMASK<