mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
r11,r12はFIQではバンクレジスタになるためCPUモード間の受け渡しはr0,r1へ変更。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@226 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
98ee8bfa67
commit
e728496b11
@ -220,10 +220,10 @@ asm void i_stupDAbtVeneer( void )
|
|||||||
asm void i_stupSwiSemihosting( void )
|
asm void i_stupSwiSemihosting( void )
|
||||||
{
|
{
|
||||||
// 割り込み禁止
|
// 割り込み禁止
|
||||||
mrs r12, cpsr
|
mrs r1, cpsr
|
||||||
orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
orr r1, r1, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
msr cpsr_fsxc, r12
|
msr cpsr_fsxc, r1
|
||||||
ldmfd sp!, {r11, r12, lr}
|
ldmfd sp!, {r0-r1, lr}
|
||||||
add sp, sp, #12
|
add sp, sp, #12
|
||||||
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
// SVCモード
|
// SVCモード
|
||||||
@ -255,45 +255,45 @@ asm void i_stupSwiHandler( void )
|
|||||||
|
|
||||||
// 呼び出し元のモード
|
// 呼び出し元のモード
|
||||||
sub sp, sp, #12
|
sub sp, sp, #12
|
||||||
stmfd sp!, {r11, r12, lr} // このタイミングでデータアボートハンドラがSWIを使用するとSVCレジスタは復帰不能
|
stmfd sp!, {r0-r1, lr} // このタイミングでデータアボートハンドラがSWIを使用するとSVCレジスタは復帰不能
|
||||||
add r12, sp, #24 // 呼び出し元のスタック内へ確保したSPSR_svc、LR_svc用スタックアドレスをコピー
|
add r1, sp, #24 // 呼び出し元のスタック内へ確保したSPSR_svc、LR_svc用スタックアドレスをコピー
|
||||||
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
|
|
||||||
// SVCモード
|
// SVCモード
|
||||||
mov sp, r12 // ※SP_svc
|
mov sp, r1 // ※SP_svc
|
||||||
mov r12, lr
|
mov r1, lr
|
||||||
mrs r11, spsr
|
mrs r0, spsr
|
||||||
stmfd sp!, {r11, lr} // SPSR_svc、LR_svcを退避
|
stmfd sp!, {r0, lr} // SPSR_svc、LR_svcを退避
|
||||||
// 割り込み状態継承
|
// 割り込み状態継承
|
||||||
and r11, r11, #(HW_PSR_CPU_MODE_MASK | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
and r0, r0, #(HW_PSR_CPU_MODE_MASK | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
// ユーザモードならシステムモードへ
|
// ユーザモードならシステムモードへ
|
||||||
tst r11, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE
|
tst r0, #HW_PSR_SYS_MODE ^ HW_PSR_USR_MODE
|
||||||
orreq r11, r11, #HW_PSR_SYS_MODE
|
orreq r0, r0, #HW_PSR_SYS_MODE
|
||||||
msr cpsr_fsxc, r11
|
msr cpsr_fsxc, r0
|
||||||
|
|
||||||
// 呼び出し元のモード
|
// 呼び出し元のモード
|
||||||
ldrh r11, [r12, #-2] // システムコールNo取得
|
ldrh r0, [r1, #-2] // システムコールNo取得
|
||||||
mov r11, r11, lsl #1
|
mov r0, r0, lsl #1
|
||||||
and r11, r11, #SVC_ID_PREMASK<<SVC_ID_SHIFT
|
and r0, r0, #SVC_ID_PREMASK<<SVC_ID_SHIFT
|
||||||
|
|
||||||
cmp r11, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
|
cmp r0, #(SVC_ID_SEMIHOST_ARM & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_ARM = 0x12
|
||||||
cmpne r11, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
|
cmpne r0, #(SVC_ID_SEMIHOST_THUMB & SVC_ID_PREMASK)<<SVC_ID_SHIFT // SVC_ID_SEMIHOST_THUMB = 0xab
|
||||||
beq i_stupSwiSemihosting
|
beq i_stupSwiSemihosting
|
||||||
|
|
||||||
adr r12, SWI_Table // システムコールアドレス 取得
|
adr r1, SWI_Table // システムコールアドレス(2バイトテーブル)取得
|
||||||
ldrh r11, [r12, r11]
|
ldrh r0, [r1, r0]
|
||||||
|
|
||||||
ldr r12, =HW_BROM
|
ldr r1, =HW_BROM
|
||||||
orr r12, r11, r12
|
orr r0, r0, r1
|
||||||
|
|
||||||
blx r12
|
blx r0
|
||||||
|
|
||||||
swi_return
|
swi_return
|
||||||
// 割り込み禁止
|
// 割り込み禁止
|
||||||
mrs r12, cpsr
|
mrs r1, cpsr
|
||||||
orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
orr r1, r1, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
msr cpsr_fsxc, r12
|
msr cpsr_fsxc, r1
|
||||||
ldmfd sp!, {r11, r12, lr}
|
ldmfd sp!, {r0-r1, lr}
|
||||||
add sp, sp, #12
|
add sp, sp, #12
|
||||||
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
msr cpsr_fsxc, #(HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
// SVCモード
|
// SVCモード
|
||||||
|
|||||||
@ -75,13 +75,13 @@ asm void i_osUndefInstHandler( void )
|
|||||||
|
|
||||||
// アボート発生元のモード
|
// アボート発生元のモード
|
||||||
sub sp, sp, #12
|
sub sp, sp, #12
|
||||||
stmfd sp!, {r0, r12, lr}
|
stmfd sp!, {r0-r1, lr}
|
||||||
add r12, sp, #24 // 呼び出し元のスタック内へ確保したSPSR_und、LR_und用スタックアドレスをコピー
|
add r1, sp, #24 // 呼び出し元のスタック内へ確保したSPSR_und、LR_und用スタックアドレスをコピー
|
||||||
msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
|
|
||||||
// UNDEFモード
|
// UNDEFモード
|
||||||
mov sp, r12 // ※SP_und
|
mov sp, r1 // ※SP_und
|
||||||
mov r12, lr
|
mov r1, lr
|
||||||
mrs r0, spsr
|
mrs r0, spsr
|
||||||
stmfd sp!, {r0, lr} // SPSR_und、LR_undを退避
|
stmfd sp!, {r0, lr} // SPSR_und、LR_undを退避
|
||||||
|
|
||||||
@ -105,26 +105,27 @@ asm void i_osUndefInstHandler( void )
|
|||||||
|
|
||||||
// アボート発生元のモード
|
// アボート発生元のモード
|
||||||
tst r0, #HW_PSR_THUMB_STATE
|
tst r0, #HW_PSR_THUMB_STATE
|
||||||
subne r12, r12, #2 // Thumb code return address
|
subne r1, r1, #2 // Thumb code return address
|
||||||
subeq r12, r12, #4 // ARM code return address
|
subeq r1, r1, #4 // ARM code return address
|
||||||
|
|
||||||
ldr r0, [r12, #0] // called from ARM
|
ldr r0, [r1, #0] // called from ARM
|
||||||
mov r12, r0, lsl #4
|
mov r1, r0, lsl #4
|
||||||
sub r12, r12, #0xC0000000
|
sub r1, r1, #0xC0000000
|
||||||
cmp r12, #0x30000000
|
cmp r1, #0x30000000
|
||||||
bhs i_osUndefInstTerminate
|
bhs i_osUndefInstTerminate
|
||||||
|
|
||||||
adr r12, i_osUndefCPHandlerTable
|
adr r1, i_osUndefCPHandlerTable
|
||||||
and r0, r0, #0x00000F00
|
and r0, r0, #0x00000F00
|
||||||
adr lr, i_return
|
ldr r0, [r1, r0, lsr #8-2]
|
||||||
ldr pc, [r12, r0, lsr #8-2]
|
|
||||||
|
blx r0
|
||||||
|
|
||||||
i_return
|
i_return
|
||||||
// 割り込み禁止
|
// 割り込み禁止
|
||||||
mrs r12, cpsr
|
mrs r1, cpsr
|
||||||
orr r12, r12, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
orr r1, r1, #(HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
msr cpsr_fsxc, r12
|
msr cpsr_fsxc, r1
|
||||||
ldmfd sp!, {r0, r12, lr}
|
ldmfd sp!, {r0-r1, lr}
|
||||||
add sp, sp, #12
|
add sp, sp, #12
|
||||||
msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
msr cpsr_fsxc, #(HW_PSR_UNDEF_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE)
|
||||||
// UNDEFモード
|
// UNDEFモード
|
||||||
@ -157,23 +158,23 @@ i_osUndefCPHandlerTable
|
|||||||
asm void i_osUndefInstHandlerVFP( void )
|
asm void i_osUndefInstHandlerVFP( void )
|
||||||
{
|
{
|
||||||
// VFP enable
|
// VFP enable
|
||||||
fmrx r12, fpexc
|
fmrx r1, fpexc
|
||||||
tst r12, #HW_FPEXC_VFP_ENABLE
|
tst r1, #HW_FPEXC_VFP_ENABLE
|
||||||
LSYM(1)
|
LSYM(1)
|
||||||
bne BSYM(1) // Error
|
bne BSYM(1) // Error
|
||||||
|
|
||||||
mov r0, #(HW_FPEXC_EXCEPTION_STATE | HW_FPEXC_FPINST2_VALID)
|
mov r0, #(HW_FPEXC_EXCEPTION_STATE | HW_FPEXC_FPINST2_VALID)
|
||||||
bic r12, r12, r0
|
bic r1, r1, r0
|
||||||
orr r12, r12, #HW_FPEXC_VFP_ENABLE
|
orr r1, r1, #HW_FPEXC_VFP_ENABLE
|
||||||
fmxr fpexc, r12
|
fmxr fpexc, r1
|
||||||
ldr r12, =(HW_FPSCR_ROUND_NEAR_MODE << HW_FPSCR_ROUND_MODE_SFT \
|
ldr r1, =(HW_FPSCR_ROUND_NEAR_MODE << HW_FPSCR_ROUND_MODE_SFT \
|
||||||
| HW_FPSCR_VEC_LENGTH_1 << HW_FPSCR_VEC_LENGTH_SFT \
|
| HW_FPSCR_VEC_LENGTH_1 << HW_FPSCR_VEC_LENGTH_SFT \
|
||||||
| HW_FPSCR_VEC_STRIDE_1 << HW_FPSCR_VEC_STRIDE_SFT \
|
| HW_FPSCR_VEC_STRIDE_1 << HW_FPSCR_VEC_STRIDE_SFT \
|
||||||
| HW_FPSCR_DZE_ENABLE \
|
| HW_FPSCR_DZE_ENABLE \
|
||||||
| HW_FPSCR_DEFAULT_NAN_MODE \
|
| HW_FPSCR_DEFAULT_NAN_MODE \
|
||||||
| HW_FPSCR_FLASH_TO_ZERO_MODE \
|
| HW_FPSCR_FLASH_TO_ZERO_MODE \
|
||||||
)
|
)
|
||||||
fmxr fpscr, r12
|
fmxr fpscr, r1
|
||||||
|
|
||||||
bx lr
|
bx lr
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user