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 )
|
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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user