From 98ee8bfa67768749710307f7dc87dad92acba3e8 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 28 Jan 2009 07:38:11 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9C=AA=E5=AE=9A=E7=BE=A9=E5=91=BD=E4=BB=A4?= =?UTF-8?q?=E4=BE=8B=E5=A4=96=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9=E3=81=AB?= =?UTF-8?q?=E3=81=A6=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E5=9B=BA=E5=AE=9A=E3=81=A7=E3=81=AF=E3=81=AA=E3=81=8F?= =?UTF-8?q?=E3=82=A2=E3=83=9C=E3=83=BC=E3=83=88=E7=99=BA=E7=94=9F=E5=85=83?= =?UTF-8?q?=E3=81=AE=E3=82=B9=E3=82=BF=E3=83=83=E3=82=AF=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E5=A4=89?= =?UTF-8?q?=E6=9B=B4=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@225 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/init/common/crt0_excp.c | 22 +++---- .../build/libraries/os/common/os_exception.c | 64 +++++++++++++------ 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index 66285ec..72be906 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -222,13 +222,13 @@ asm void i_stupSwiSemihosting( void ) // 割り込み禁止 mrs r12, cpsr orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) - msr cpsr_cxsf, r12 + msr cpsr_fsxc, 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) + msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) // SVCモード ldmfd sp!, {lr} // ※SP_svc - msr spsr_cxsf, lr + msr spsr_fsxc, lr ldmfd sp!, {lr} semi_vector // セミホスティングアドレスはSVCモードでないとARMデバッガがエラーを出力 @@ -241,23 +241,23 @@ asm void i_stupSwiHandler( void ) // 不正確データアボート有効化(clear HW_PSR_IMPR_ABORT_DISABLE) // FIQハンドラでのSWI使用時のSP_svc上書き防止のため最初にFIQを禁止(IRQはHWが禁止する) - msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) // SVCモード mrs sp, spsr // ※SP_svc - and sp, #HW_PSR_CPU_MODE_MASK + and sp, sp, #HW_PSR_CPU_MODE_MASK // ユーザモードならシステムモードへ cmp sp, #HW_PSR_USR_MODE moveq sp, #HW_PSR_SYS_MODE // 割り込み禁止 orr sp, sp, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) - msr cpsr_cxsf, sp + msr cpsr_fsxc, sp // 呼び出し元のモード sub sp, sp, #12 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) + msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) // SVCモード mov sp, r12 // ※SP_svc @@ -269,7 +269,7 @@ asm void i_stupSwiHandler( void ) // ユーザモードならシステムモードへ tst r11, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE orreq r11, r11, #HW_PSR_SYS_MODE - msr cpsr_cxsf, r11 + msr cpsr_fsxc, r11 // 呼び出し元のモード ldrh r11, [r12, #-2] // システムコールNo取得 @@ -292,13 +292,13 @@ swi_return // 割り込み禁止 mrs r12, cpsr orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) - msr cpsr_cxsf, r12 + msr cpsr_fsxc, 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) + msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) // SVCモード ldmfd sp!, {lr} // ※SP_svc - msr spsr_cxsf, lr + msr spsr_fsxc, lr ldmfd sp!, {lr} movs pc, lr diff --git a/trunk/bootrom/build/libraries/os/common/os_exception.c b/trunk/bootrom/build/libraries/os/common/os_exception.c index 88190e9..f96c2ad 100644 --- a/trunk/bootrom/build/libraries/os/common/os_exception.c +++ b/trunk/bootrom/build/libraries/os/common/os_exception.c @@ -58,14 +58,32 @@ void osInitException( void ) *---------------------------------------------------------------------------*/ asm void i_osUndefInstHandler( void ) { - // change into system mode - msr cpsr_fsxc, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE - stmfd sp!, {r0, r12, lr, pc} // push to previous mode stack (8byte alignment) +#ifdef SDK_ARM11 + // 不正確データアボート有効化(clear HW_PSR_IMPR_ABORT_DISABLE) + msr cpsr_fsxc, #(HW_PSR_IRQ_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) +#endif // SDK_ARM11 - // get LR and SPSR of UNDEF mode - msr cpsr_fsxc, #HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + // UNDEFモード + mrs sp, spsr // ※SP_und + and sp, #HW_PSR_CPU_MODE_MASK + // ユーザモードならシステムモードへ + cmp sp, #HW_PSR_USR_MODE + moveq sp, #HW_PSR_SYS_MODE + // 割り込み禁止 + orr sp, sp, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_fsxc, sp + + // アボート発生元のモード + sub sp, sp, #12 + stmfd sp!, {r0, r12, lr} + add r12, sp, #24 // 呼び出し元のスタック内へ確保したSPSR_und、LR_und用スタックアドレスをコピー + msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + + // UNDEFモード + mov sp, r12 // ※SP_und mov r12, lr - mrs r0, spsr + mrs r0, spsr + stmfd sp!, {r0, lr} // SPSR_und、LR_undを退避 tst r0, #HW_PSR_THUMB_STATE bne i_osUndefInstTerminate @@ -73,23 +91,22 @@ asm void i_osUndefInstHandler( void ) tst r0, #HW_PSR_JAVA_STATE bne i_osUndefInstTerminate - // permit for only system and user mode to use VFP + // ユーザモードもしくはシステムモードのみVFP使用を許可 and lr, r0, #HW_PSR_CPU_MODE_MASK + // ユーザモードならシステムモードへ + cmp lr, #HW_PSR_USR_MODE + moveq lr, #HW_PSR_SYS_MODE cmp lr, #HW_PSR_SYS_MODE - cmpne lr, #HW_PSR_USR_MODE bne i_osUndefInstTerminate - // change into system mode - msr cpsr_fsxc, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE + // 割り込み禁止 + orr lr, lr, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_fsxc, lr + // アボート発生元のモード tst r0, #HW_PSR_THUMB_STATE subne r12, r12, #2 // Thumb code return address subeq r12, r12, #4 // ARM code return address - str r12, [sp, #4*3] // store LR_svc to return PC - - stmfd sp!, {r0-r3} // push spsr (8byte alignment) - - adr lr, i_return ldr r0, [r12, #0] // called from ARM mov r12, r0, lsl #4 @@ -99,13 +116,22 @@ asm void i_osUndefInstHandler( void ) adr r12, i_osUndefCPHandlerTable and r0, r0, #0x00000F00 + adr lr, i_return ldr pc, [r12, r0, lsr #8-2] i_return - ldmfd sp!, {r0-r3} // pop spsr - // restore into previous mode - msr cpsr_fsxc, r0 - ldmfd sp!, {r0, r12, lr, pc} // pop from USR stack + // 割り込み禁止 + mrs r12, cpsr + orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + msr cpsr_fsxc, r12 + ldmfd sp!, {r0, r12, lr} + add sp, sp, #12 + msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + // UNDEFモード + ldmfd sp!, {lr} // ※SP_und + msr spsr_fsxc, lr + ldmfd sp!, {lr} + movs pc, lr INASM_EXTERN( _VFP_Computation_Engine )