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 )
{
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<<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
cmpne r12, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
beq i_stupSwiSemihosting
adr r11, SWI_Table // システムコールアドレス 取得
ldrh r12, [r11, r12]
adr r11, SWI_Table // システムコールアドレス 取得
ldrh r12, [r11, r12]
ldr r11, =HW_BROM
orr r12, r12, r11
mrs r11, spsr // SVCモード SPSR退避合計4ワード
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
blx r12
swi_return
ldmfd sp!, {r2, lr} // システムモード レジスタ復帰
mov r12, #0xc0 | HW_PSR_SVC_MODE // SVCモードへ切り換え
msr cpsr_cxsf, r12 // & IRQ/FIQ不許可
ldmfd sp!, {r11} // SVCモード レジスタ復帰
msr spsr_cxsf, r11
semi_return
ldmfd sp!, {r11, r12, lr}
movs pc, 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}
movs pc, lr
LTORG

View File

@ -105,43 +105,43 @@ static unsigned vlink_not_use_osemu;
#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
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