From c06d09c5b4b6996fdf6d658d611f08614814caf3 Mon Sep 17 00:00:00 2001 From: nakasima Date: Wed, 28 Jan 2009 01:59:23 +0000 Subject: [PATCH] =?UTF-8?q?SVC=E5=B0=82=E7=94=A8=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=83=E3=82=AF=E9=A0=98=E5=9F=9F=E3=82=92=E4=B8=8D=E8=A6=81?= =?UTF-8?q?=E3=81=AB=E3=80=82=E3=82=B3=E3=83=BC=E3=83=89=E3=82=B5=E3=82=A4?= =?UTF-8?q?=E3=82=BA=E3=81=A8=E3=82=AA=E3=83=BC=E3=83=90=E3=83=BC=E3=83=98?= =?UTF-8?q?=E3=83=83=E3=83=89=E3=81=AF=E8=8B=A5=E5=B9=B2=E5=A4=A7=E3=81=8D?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=9F=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@219 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/init/common/crt0_excp.c | 76 ++++++++++++------- .../build/libraries/vlink/common/osemu.c | 14 ++-- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index a33be4e..aedfab8 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -219,51 +219,75 @@ asm void i_stupDAbtVeneer( void ) *---------------------------------------------------------------------------*/ asm void i_stupSwiSemihosting( void ) { - ldmfd sp!, {r11, r12, lr} + // 割り込み禁止 + msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + ldmfd sp!, {r11, r12, lr} + add sp, sp, #12 + msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + // SVCモード + ldmfd sp!, {lr} // ※SP_svc + msr spsr_cxsf, lr + ldmfd sp!, {lr} semi_vector - movs pc, lr + // セミホスティングアドレスはSVCモード + movs pc, lr } asm void i_stupSwiHandler( void ) { INASM_EXTERN( _start ) - stmfd sp!, {r11, r12, lr} // SVCモード レジスタ退避 - ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) + // SVCモード + msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE) + + // システムモード + sub sp, sp, #12 + stmfd sp!, {r11, r12, lr} + add r12, sp, #16 // ユーザスタック内の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許可 + msr cpsr_cxsf, r11 + + mov lr, r12 + ldrh r12, [lr, #-2] // システムコールNo取得(ハーフワードアクセス対応) mov r12, r12, lsl #1 - and r12, r12, #SVC_ID_PREMASK< -ASM int i_vlink_jtag_com_stat(void) /* bit0==1 受信でデータあり / bit1==0 送信可能 */ +asm int i_vlink_jtag_com_stat(void) /* bit0==1 受信でデータあり / bit1==0 送信可能 */ { mrc p14,0,r0,c0,c0, 0 bx lr } -ASM void i_vlink_jtag_com_put(ULONG r0) +asm void i_vlink_jtag_com_put(ULONG r0) { mcr p14,0,r0,c1,c0, 0 bx lr } -ASM ULONG i_vlink_jtag_com_get(void) +asm ULONG i_vlink_jtag_com_get(void) { mrc p14,0,r0,c1,c0, 0 bx lr } -ASM int i_vlink_jtag_com_stat11(void) /* bit30==1 受信でデータあり / bit29==0 送信可能 */ +asm int i_vlink_jtag_com_stat11(void) /* bit30==1 受信でデータあり / bit29==0 送信可能 */ { mrc p14,0,r0,c0,c1, 0 bx lr } -ASM void i_vlink_jtag_com_put11(ULONG r0) +asm void i_vlink_jtag_com_put11(ULONG r0) { mcr p14,0,r0,c0,c5, 0 bx lr } -ASM ULONG i_vlink_jtag_com_get11(void) +asm ULONG i_vlink_jtag_com_get11(void) { mrc p14,0,r0,c0,c5, 0 bx lr } -ASM int i_vlink_jtag_cpuid(void) +asm int i_vlink_jtag_cpuid(void) { #ifdef SDK_ARM7 mov r0, #0x00050000