mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
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:
parent
5c54d429f3
commit
c06d09c5b4
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user