diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index d12e155..e16f81c 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -263,12 +263,16 @@ asm void i_stupSwiHandler( void ) mov sp, r1 // ※SP_svc mov r1, lr mrs r0, spsr - stmfd sp!, {r0, lr} // SPSR_svc、LR_svcを退避 + stmfd sp!, {r0, lr} // SPSR_svc、LR_svcを退避(このLR_svcは最後にPOPするので安全) // 割り込み状態継承 and r0, r0, #(HW_PSR_CPU_MODE_MASK | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) - // ユーザモードならシステムモードへ - tst r0, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE - orreq r0, r0, #HW_PSR_SYS_MODE + // ユーザモードなら割り込み禁止でシステムモードへ + // (割り込み禁止にするのは別スレッドからスタックへ退避したPCを + // 書き換えて、システムモードを乗っ取られないようにするため。 + // 但し、DMAによるハッキングへ対応するにはユーザモードとSVCモードの + // スタックを分ける必要がある(OSのラッパーで対応予定)。) + tst r0, #(HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE) + orreq r0, r0, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE) msr cpsr_fsxc, r0 // 呼び出し元のモード