From 340ab42c26a03ecd86022bf75e595d92432e3a27 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 28 Jan 2009 02:47:02 +0000 Subject: [PATCH] =?UTF-8?q?SWI=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9?= =?UTF-8?q?=E3=81=AB=E3=81=A6=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0=E3=83=A2?= =?UTF-8?q?=E3=83=BC=E3=83=89=E5=9B=BA=E5=AE=9A=E3=81=A7=E3=81=AF=E3=81=AA?= =?UTF-8?q?=E3=81=8F=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E5=85=83=E3=81=AE?= =?UTF-8?q?=E3=83=A2=E3=83=BC=E3=83=89=E3=81=AE=E3=82=B9=E3=82=BF=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E5=A4=89=E6=9B=B4=20=EF=BC=88=E5=89=B2?= =?UTF-8?q?=E3=82=8A=E8=BE=BC=E3=81=BF=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9?= =?UTF-8?q?=E3=81=8B=E3=82=89=E5=91=BC=E3=81=B3=E5=87=BA=E3=81=97=E3=81=9F?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=AF=E5=89=B2=E3=82=8A=E8=BE=BC=E3=81=BF?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9=E3=81=AE=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=81=A8=E3=81=84=E3=81=86=E3=81=93=E3=81=A8=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@220 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/init/common/crt0_excp.c | 55 +++++++----- trunk/tools/axd/mg20/ARM9/ARM9.ses | 88 +++++++------------ 2 files changed, 61 insertions(+), 82 deletions(-) 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<