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:
nakasima 2009-01-28 08:30:54 +00:00
parent 98ee8bfa67
commit e728496b11
2 changed files with 60 additions and 59 deletions

View File

@ -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モード

View File

@ -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
} }