mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
ユーザモードとシステムモードのみVFPを使用可能に。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@144 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
f4f2ed0cfc
commit
4345604172
@ -58,21 +58,29 @@ void osInitException( void )
|
|||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
ASM void i_osUndefInstHandler( void )
|
ASM void i_osUndefInstHandler( void )
|
||||||
{
|
{
|
||||||
// change into previous mode
|
// change into system mode
|
||||||
mrs sp, spsr
|
msr cpsr_fsxc, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||||||
orr sp, sp, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
|
||||||
msr cpsr_fsxc, sp
|
|
||||||
|
|
||||||
stmfd sp!, {r0, r12, lr, pc} // push to previous mode stack (8byte alignment)
|
stmfd sp!, {r0, r12, lr, pc} // push to previous mode stack (8byte alignment)
|
||||||
|
|
||||||
// get LR and SPSR into UNDEF mode
|
// get LR and SPSR of UNDEF mode
|
||||||
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
|
||||||
mov r12, lr
|
mov r12, lr
|
||||||
mrs r0, spsr
|
mrs r0, spsr
|
||||||
|
|
||||||
// change into previous mode
|
tst r0, #HW_PSR_THUMB_STATE
|
||||||
orr sp, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
bne i_osUndefInstTerminate
|
||||||
msr cpsr_fsxc, sp
|
|
||||||
|
tst r0, #HW_PSR_JAVA_STATE
|
||||||
|
bne i_osUndefInstTerminate
|
||||||
|
|
||||||
|
// permit for only system and user mode to use VFP
|
||||||
|
and lr, r0, #HW_PSR_CPU_MODE_MASK
|
||||||
|
cmp lr, #HW_PSR_SYS_MODE
|
||||||
|
cmpne lr, #HW_PSR_USR_MODE
|
||||||
|
bne i_osUndefInstTerminate
|
||||||
|
|
||||||
|
// change into system mode
|
||||||
|
msr cpsr_fsxc, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||||||
|
|
||||||
tst r0, #HW_PSR_THUMB_STATE
|
tst r0, #HW_PSR_THUMB_STATE
|
||||||
subne r12, r12, #2 // Thumb code return address
|
subne r12, r12, #2 // Thumb code return address
|
||||||
@ -83,12 +91,6 @@ ASM void i_osUndefInstHandler( void )
|
|||||||
|
|
||||||
adr lr, i_return
|
adr lr, i_return
|
||||||
|
|
||||||
tst r0, #HW_PSR_THUMB_STATE
|
|
||||||
bne i_osUndefInstTerminate
|
|
||||||
|
|
||||||
tst r0, #HW_PSR_JAVA_STATE
|
|
||||||
bne i_osUndefInstTerminate
|
|
||||||
|
|
||||||
ldr r0, [r12, #0] // called from ARM
|
ldr r0, [r12, #0] // called from ARM
|
||||||
mov r12, r0, lsl #4
|
mov r12, r0, lsl #4
|
||||||
sub r12, r12, #0xC0000000
|
sub r12, r12, #0xC0000000
|
||||||
@ -101,6 +103,7 @@ ASM void i_osUndefInstHandler( void )
|
|||||||
|
|
||||||
i_return
|
i_return
|
||||||
ldmfd sp!, {r0-r3} // pop spsr
|
ldmfd sp!, {r0-r3} // pop spsr
|
||||||
|
// restore into previous mode
|
||||||
msr cpsr_fsxc, r0
|
msr cpsr_fsxc, r0
|
||||||
ldmfd sp!, {r0, r12, lr, pc} // pop from USR stack
|
ldmfd sp!, {r0, r12, lr, pc} // pop from USR stack
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user