diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index e204841..7303dea 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -239,6 +239,10 @@ asm void i_stupSwiHandler( void ) { INASM_EXTERN( _start ) + // 不正確データアボート有効化(clear HW_PSR_IMPRECISE_ABORT) + // FIQハンドラでのSWI使用時のSP_svc上書き防止のため最初にFIQを禁止(IRQはHWが禁止する) + msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + // SVCモード mrs sp, spsr // ユーザモードならシステムモードへ @@ -250,8 +254,8 @@ asm void i_stupSwiHandler( void ) // 呼び出し元のモード sub sp, sp, #12 - stmfd sp!, {r11, r12, lr} - add r12, sp, #24 // ユーザスタック内のSPSR_svc、LR_svc退避アドレスをコピー + stmfd sp!, {r11, r12, lr} // このタイミングでデータアボートハンドラがSWIを使用すると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モード