From 4345604172172efb3de4198daa2ef7a8440a1d13 Mon Sep 17 00:00:00 2001 From: nakasima Date: Thu, 25 Dec 2008 12:01:35 +0000 Subject: [PATCH] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=A2=E3=83=BC?= =?UTF-8?q?=E3=83=89=E3=81=A8=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0=E3=83=A2?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=AE=E3=81=BFVFP=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=8F=AF=E8=83=BD=E3=81=AB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@144 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/os/common/os_exception.c | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/trunk/bootrom/build/libraries/os/common/os_exception.c b/trunk/bootrom/build/libraries/os/common/os_exception.c index c1fa31a..3419551 100644 --- a/trunk/bootrom/build/libraries/os/common/os_exception.c +++ b/trunk/bootrom/build/libraries/os/common/os_exception.c @@ -58,21 +58,29 @@ void osInitException( void ) *---------------------------------------------------------------------------*/ ASM void i_osUndefInstHandler( void ) { - // change into previous mode - mrs sp, spsr - orr sp, sp, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE - msr cpsr_fsxc, sp - + // change into system mode + msr cpsr_fsxc, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE 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 mov r12, lr mrs r0, spsr - // change into previous mode - orr sp, r0, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE - msr cpsr_fsxc, sp + tst r0, #HW_PSR_THUMB_STATE + bne i_osUndefInstTerminate + + 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 subne r12, r12, #2 // Thumb code return address @@ -83,12 +91,6 @@ ASM void i_osUndefInstHandler( void ) 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 mov r12, r0, lsl #4 sub r12, r12, #0xC0000000 @@ -101,6 +103,7 @@ ASM void i_osUndefInstHandler( void ) i_return ldmfd sp!, {r0-r3} // pop spsr + // restore into previous mode msr cpsr_fsxc, r0 ldmfd sp!, {r0, r12, lr, pc} // pop from USR stack