SVC専用スタック領域を不要に。コードサイズとオーバーヘッドは若干大きくなった。

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@219 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
nakasima 2009-01-28 01:59:23 +00:00
parent 5c54d429f3
commit c06d09c5b4
2 changed files with 57 additions and 33 deletions

View File

@ -219,51 +219,75 @@ asm void i_stupDAbtVeneer( void )
*---------------------------------------------------------------------------*/ *---------------------------------------------------------------------------*/
asm void i_stupSwiSemihosting( 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 semi_vector
movs pc, lr // セミホスティングアドレスはSVCモード
movs pc, lr
} }
asm void i_stupSwiHandler( void ) asm void i_stupSwiHandler( void )
{ {
INASM_EXTERN( _start ) INASM_EXTERN( _start )
stmfd sp!, {r11, r12, lr} // SVCモード レジスタ退避 // SVCモード
ldrh r12, [lr, #-2] // システムコールNo取得ハーフワードアクセス対応 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 mov r12, r12, lsl #1
and r12, r12, #SVC_ID_PREMASK<<SVC_ID_SHIFT and r12, r12, #SVC_ID_PREMASK<<SVC_ID_SHIFT
cmp r12, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12 cmp r12, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
cmpne r12, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab cmpne r12, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
beq i_stupSwiSemihosting beq i_stupSwiSemihosting
adr r11, SWI_Table // システムコールアドレス 取得 adr r11, SWI_Table // システムコールアドレス 取得
ldrh r12, [r11, r12] ldrh r12, [r11, r12]
ldr r11, =HW_BROM ldr r11, =HW_BROM
orr r12, r12, r11 orr r12, r12, r11
mrs r11, spsr // SVCモード SPSR退避合計4ワード blx r12
stmfd sp!, {r11}
and r11, r11, #HW_PSR_IRQ_DISABLE // IRQ許可状態 コピー
orr r11, r11, #HW_PSR_SYS_MODE // システムモードへ切り換え & FIQ許可
msr cpsr_cxsf,r11
stmfd sp!, {r2, lr} // システムモード レジスタ退避2ワード
blx r12
swi_return swi_return
ldmfd sp!, {r2, lr} // システムモード レジスタ復帰 // 割り込み禁止
mov r12, #0xc0 | HW_PSR_SVC_MODE // SVCモードへ切り換え msr cpsr_cxsf, #(HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
msr cpsr_cxsf, r12 // & IRQ/FIQ不許可 ldmfd sp!, {r11, r12, lr}
add sp, sp, #12
ldmfd sp!, {r11} // SVCモード レジスタ復帰 msr cpsr_cxsf, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
msr spsr_cxsf, r11 // SVCモード
ldmfd sp!, {lr} // ※SP_svc
semi_return msr spsr_cxsf, lr
ldmfd sp!, {r11, r12, lr} ldmfd sp!, {lr}
movs pc, lr movs pc, lr
LTORG LTORG

View File

@ -105,43 +105,43 @@ static unsigned vlink_not_use_osemu;
#include <brom/code32.h> #include <brom/code32.h>
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 mrc p14,0,r0,c0,c0, 0
bx lr 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 mcr p14,0,r0,c1,c0, 0
bx lr 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 mrc p14,0,r0,c1,c0, 0
bx lr 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 mrc p14,0,r0,c0,c1, 0
bx lr 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 mcr p14,0,r0,c0,c5, 0
bx lr 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 mrc p14,0,r0,c0,c5, 0
bx lr bx lr
} }
ASM int i_vlink_jtag_cpuid(void) asm int i_vlink_jtag_cpuid(void)
{ {
#ifdef SDK_ARM7 #ifdef SDK_ARM7
mov r0, #0x00050000 mov r0, #0x00050000