From 94ac873d2cd9af28685ed154ebc4a2ba21d12fb2 Mon Sep 17 00:00:00 2001 From: nakasima Date: Thu, 25 Dec 2008 10:34:43 +0000 Subject: [PATCH] =?UTF-8?q?ARM11=E6=9C=AA=E5=AE=9A=E7=BE=A9=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E4=BE=8B=E5=A4=96=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=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@141 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/init/common/crt0_excp.c | 102 +++++------- .../bootrom/build/libraries/os/ARM11/Makefile | 1 + .../bootrom/build/libraries/os/ARM9/Makefile | 1 + .../build/libraries/os/common/os_exception.c | 155 ++++++++++++++++++ .../build/libraries/os/common/os_init.c | 5 +- .../build/libraries/os/common/os_interrupt.c | 24 +-- trunk/bootrom/include/brom/os.h | 2 +- .../include/brom/os/common/exception.h | 49 ++++++ .../include/brom/os/common/interrupt.h | 1 - trunk/include/ctr/hw/ARM11/arm11_reg.h | 1 + trunk/include/ctr/hw/ARM11/mmap_axi_wram.h | 6 + trunk/include/ctr/hw/ARM9/mmap_prv_wram.h | 6 + 12 files changed, 266 insertions(+), 87 deletions(-) create mode 100644 trunk/bootrom/build/libraries/os/common/os_exception.c create mode 100644 trunk/bootrom/include/brom/os/common/exception.h diff --git a/trunk/bootrom/build/libraries/init/common/crt0_excp.c b/trunk/bootrom/build/libraries/init/common/crt0_excp.c index 5588a98..4f36f61 100644 --- a/trunk/bootrom/build/libraries/init/common/crt0_excp.c +++ b/trunk/bootrom/build/libraries/init/common/crt0_excp.c @@ -42,12 +42,12 @@ LSYM(0) bx lr i_stupExcpVennerCode - DCD i_stupExcpTerminateCode - DCD i_stupExcpTerminateCode - DCD i_stupSwiVeneerCode - DCD i_stupExcpTerminateCode - DCD i_stupIAbtTerminateCode - DCD i_stupExcpTerminateCode + DCD i_stupExcpTerminateCode // IRQ + DCD i_stupExcpTerminateCode // FIQ + DCD i_stupSwiVeneerCode // SWI + DCD i_stupExcpTerminateCode // UNDEF + DCD i_stupIAbtTerminateCode // IABT + DCD i_stupExcpTerminateCode // DABT LTORG } @@ -55,7 +55,7 @@ i_stupExcpVennerCode /*---------------------------------------------------------------------------* Name: i_stupExcpTerminateCode - Description: Prefetch Abort veneer code + Description: exception veneer code Arguments: None @@ -70,7 +70,7 @@ ASM void i_stupExcpTerminateCode( void ) /*---------------------------------------------------------------------------* Name: i_stupIAbtTerminateCode - Description: exception veneer code + Description: Prefetch Abort veneer code Arguments: None @@ -97,27 +97,6 @@ ASM void i_stupSwiVeneerCode( void ) LTORG } -/*---------------------------------------------------------------------------* - Name: i_stupDbgHandler - - Description: Debug (FIQ, etc) handler - - Arguments: None - - Returns: None. - *---------------------------------------------------------------------------*/ -ASM void i_stupDbgHandler( void ) -{ - mrs sp, cpsr // IRQ/FIQ•s‹–‰Â - orr sp, sp, #HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE - msr cpsr_cxsf, sp - -dbg_m - b dbg_m - - LTORG -} - /*---------------------------------------------------------------------------* Name: i_stupIrqVeneer @@ -150,6 +129,38 @@ ASM void i_stupFiqVeneer( void ) LTORG } +/*---------------------------------------------------------------------------* + Name: i_stupSwiVeneer + + Description: SWI veneer + + Arguments: None + + Returns: None. + *---------------------------------------------------------------------------*/ +ASM void i_stupSwiVeneer( void ) +{ + ldr pc, =HW_SWI_VENEER_BUF + + LTORG +} + +/*---------------------------------------------------------------------------* + Name: i_stupUndefInstVeneer + + Description: Undefine Instruction veneer + + Arguments: None + + Returns: None. + *---------------------------------------------------------------------------*/ +ASM void i_stupUndefInstVeneer( void ) +{ + ldr pc, =HW_UDEF_VENEER_BUF + + LTORG +} + /*---------------------------------------------------------------------------* Name: i_stupPrefetchAbortVeneer @@ -182,39 +193,6 @@ ASM void i_stupDataAbortVeneer( void ) LTORG } -/*---------------------------------------------------------------------------* - Name: i_stupUndefInstVeneer - - Description: Undefine Instruction veneer - - Arguments: None - - Returns: None. - *---------------------------------------------------------------------------*/ -ASM void i_stupUndefInstVeneer( void ) -{ - ldr pc, =HW_UDEF_VENEER_BUF - - LTORG -} - -/*---------------------------------------------------------------------------* - Name: i_stupSwiVeneer - - Description: SWI veneer - - Arguments: None - - Returns: None. - *---------------------------------------------------------------------------*/ -ASM void i_stupSwiVeneer( void ) -{ - ldr pc, =HW_SWI_VENEER_BUF - - LTORG -} - - /*---------------------------------------------------------------------------* Name: i_stupSwiHandler diff --git a/trunk/bootrom/build/libraries/os/ARM11/Makefile b/trunk/bootrom/build/libraries/os/ARM11/Makefile index fb5a5cc..e0bba32 100644 --- a/trunk/bootrom/build/libraries/os/ARM11/Makefile +++ b/trunk/bootrom/build/libraries/os/ARM11/Makefile @@ -36,6 +36,7 @@ SRCS = \ os_alarm.c \ os_irqHandler.c \ os_interrupt.c \ + os_exception.c \ os_thread.c \ os_context.c \ diff --git a/trunk/bootrom/build/libraries/os/ARM9/Makefile b/trunk/bootrom/build/libraries/os/ARM9/Makefile index c46cf5f..b8aea91 100644 --- a/trunk/bootrom/build/libraries/os/ARM9/Makefile +++ b/trunk/bootrom/build/libraries/os/ARM9/Makefile @@ -39,6 +39,7 @@ SRCS = \ os_alarm.c \ os_irqHandler.c \ os_interrupt.c \ + os_exception.c \ os_thread.c \ os_context.c \ diff --git a/trunk/bootrom/build/libraries/os/common/os_exception.c b/trunk/bootrom/build/libraries/os/common/os_exception.c new file mode 100644 index 0000000..07df6b9 --- /dev/null +++ b/trunk/bootrom/build/libraries/os/common/os_exception.c @@ -0,0 +1,155 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - library - os + File: os_exception.c + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ +#include +#include + + +void i_osUndefInstHandler( void ); + +/*---------------------------------------------------------------------------* + Name: osInitException + + Description: Initialize Exceptions for Application + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void osInitException( void ) +{ +#ifdef SDK_ARM11 + *(OSExcpHandler*)HW_UDEF_VECTOR_BUF = i_osUndefInstHandler; +#endif // SDK_ARM11 +} + +#ifdef SDK_ARM11 + +#include + +/*---------------------------------------------------------------------------* + Name: i_osUndefInstHandler + + Description: Undefine Instruction handler + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +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 + + stmfd sp!, {r0, r12, lr, pc} // push to previous mode stack (8byte alignment) + + // get LR and SPSR into 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 + subne r12, r12, #2 // Thumb code return address + subeq r12, r12, #4 // ARM code return address + str r12, [sp, #4*3] // store LR_svc to return PC + + stmfd sp!, {r0-r3} // push spsr (8byte alignment) + + adr lr, i_return + + tst r0, #HW_PSR_THUMB_STATE + bne i_stupUndefInstHandlerDummy + + tst r0, #HW_PSR_JAVA_STATE + bne i_stupUndefInstHandlerDummy + + ldr r0, [r12, #0] // called from ARM + mov r12, r0, lsl #4 + sub r12, r12, #0xC0000000 + cmp r12, #0x30000000 + bhs i_stupUndefInstHandlerDummy + + adr r12, i_return + and r0, r0, #0x00000F00 + ldr pc, [r12, r0, lsr #8-2] + +i_return + ldmfd sp!, {r0-r3} // pop spsr + msr cpsr_fsxc, r0 + ldmfd sp!, {r0, r12, lr, pc} // pop from USR stack + + INASM_EXTERN( _VFP_Computation_Engine ) + +i_stupUndefCPHandlerTable + DCD i_stupUndefInstHandlerDummy // CP 0 + DCD i_stupUndefInstHandlerDummy // CP 1 + DCD i_stupUndefInstHandlerDummy // CP 2 + DCD i_stupUndefInstHandlerDummy // CP 3 + DCD i_stupUndefInstHandlerDummy // CP 4 + DCD i_stupUndefInstHandlerDummy // CP 5 + DCD i_stupUndefInstHandlerDummy // CP 6 + DCD i_stupUndefInstHandlerDummy // CP 7 + DCD i_stupUndefInstHandlerDummy // CP 8 + DCD i_stupUndefInstHandlerDummy // CP 9 + DCD i_vfpUndefInstHandler // CP 10 + DCD i_vfpUndefInstHandler // CP 11 + DCD i_stupUndefInstHandlerDummy // CP 12 + DCD i_stupUndefInstHandlerDummy // CP 13 + DCD i_stupUndefInstHandlerDummy // CP 14 + DCD i_stupUndefInstHandlerDummy // CP 15 +} + +ASM void i_vfpUndefInstHandler( void ) +{ + // VFP enable + fmrx r12, fpexc + tst r12, #HW_FPEXC_VFP_ENABLE +LSYM(1) + bne BSYM(1) // Error + + mov r0, #(HW_FPEXC_EXCEPTION_STATE | HW_FPEXC_FPINST2_VALID) + bic r12, r12, r0 + orr r12, r12, #HW_FPEXC_VFP_ENABLE + fmxr fpexc, r12 + ldr r12, =(HW_FPSCR_ROUND_NEAR_MODE << HW_FPSCR_ROUND_MODE_SFT \ + | HW_FPSCR_VEC_LENGTH_1 << HW_FPSCR_VEC_LENGTH_SFT \ + | HW_FPSCR_VEC_STRIDE_1 << HW_FPSCR_VEC_STRIDE_SFT \ + | HW_FPSCR_DZE_ENABLE \ + | HW_FPSCR_DEFAULT_NAN_MODE \ + | HW_FPSCR_FLASH_TO_ZERO_MODE \ + ) + fmxr fpscr, r12 + + bx lr +} + +ASM void i_stupUndefInstHandlerDummy( void ) +{ +LSYM(1) + b BSYM(1) + bx lr +} + +#include + +#endif // SDK_ARM11 + diff --git a/trunk/bootrom/build/libraries/os/common/os_init.c b/trunk/bootrom/build/libraries/os/common/os_init.c index 3b0deef..da54be5 100644 --- a/trunk/bootrom/build/libraries/os/common/os_init.c +++ b/trunk/bootrom/build/libraries/os/common/os_init.c @@ -40,11 +40,14 @@ void osInitBROM(void) #ifdef SDK_ARM9 #ifdef BROM_DEBUG_ITCM - MI_CpuFillFast( (void*)HW_ITCM, 0, HW_ITCM_SIZE ); + MI_CpuFillFast( (void*)HW_ITCM, 0, HW_ITCM_SIZE ); #endif // BROM_DEBUG_ITCM #endif // SDK_ARM9 + //---- Init Timer + osInitTimer(); + //---- Init Interrupt osInitInterrupt(); diff --git a/trunk/bootrom/build/libraries/os/common/os_interrupt.c b/trunk/bootrom/build/libraries/os/common/os_interrupt.c index fca774c..875b193 100644 --- a/trunk/bootrom/build/libraries/os/common/os_interrupt.c +++ b/trunk/bootrom/build/libraries/os/common/os_interrupt.c @@ -24,7 +24,7 @@ OSIntrFunction osIntrTable[OS_INTR_ID_NUM] ATTRIBUTE_SECTION(.dtcm); #endif // SDK_ARM9 -asm void i_osIrqVeneer( void ); +void osIrqHandler( void ); /*---------------------------------------------------------------------------* Name: osInitInterrupt @@ -47,8 +47,7 @@ void osInitInterrupt( void ) i_osInitInterruptTable(); - ((u32*)HW_INTR_VENEER_BUF)[0] = ((u32*)i_osIrqVeneer)[0]; - ((u32*)HW_INTR_VENEER_BUF)[1] = ((u32*)i_osIrqVeneer)[1]; + *(OSIntrHandler*)HW_INTR_VECTOR_BUF = osIrqHandler; #ifdef SDK_ARM11 reg_OS_CPUI_CNT = 0; @@ -101,25 +100,6 @@ void osInitInterrupt( void ) } } -/*---------------------------------------------------------------------------* - Name: i_osIrqVeneer - - Description: Interrupt Vevver - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ -#include -asm void i_osIrqVeneer( void ) -{ - INASM_EXTERN( osIrqHandler ) - - ldr pc, =osIrqHandler - LTORG -} -#include - /*---------------------------------------------------------------------------* Name: i_osInitInterruptTable diff --git a/trunk/bootrom/include/brom/os.h b/trunk/bootrom/include/brom/os.h index e2a8c8d..548a127 100644 --- a/trunk/bootrom/include/brom/os.h +++ b/trunk/bootrom/include/brom/os.h @@ -37,10 +37,10 @@ extern "C" { #include #include #include +#include #include #if 0 #include -#include #include #include #include diff --git a/trunk/bootrom/include/brom/os/common/exception.h b/trunk/bootrom/include/brom/os/common/exception.h new file mode 100644 index 0000000..5842db2 --- /dev/null +++ b/trunk/bootrom/include/brom/os/common/exception.h @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - OS - include + File: exception.h + + Copyright 2008 Nintendo. All rights reserved. + + These coded instructions, statements, and computer programs contain + proprietary information of Nintendo of America Inc. and/or Nintendo + Company Ltd., and are protected by Federal copyright law. They may + not be disclosed to third parties or copied or duplicated in any form, + in whole or in part, without the prior written consent of Nintendo. + + $Date:: $ + $Rev$ + $Author$ + *---------------------------------------------------------------------------*/ +#ifndef BROM_OS_EXCEPTION_H_ +#define BROM_OS_EXCEPTION_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +//---- exception handler type +typedef void (*OSExcpHandler) (void); + + +/*---------------------------------------------------------------------------* + Name: osInitException + + Description: Initialize Exceptions for Application + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void osInitException( void ); + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +/* BROM_OS_EXCEPTION_H_ */ +#endif diff --git a/trunk/bootrom/include/brom/os/common/interrupt.h b/trunk/bootrom/include/brom/os/common/interrupt.h index 12e115f..2b9f0e4 100644 --- a/trunk/bootrom/include/brom/os/common/interrupt.h +++ b/trunk/bootrom/include/brom/os/common/interrupt.h @@ -53,7 +53,6 @@ OSFiqMode; //---- interrupt handler type //typedef IRQ void (*OSIntrHandler) (void); -typedef void (*OSExcpHandler) (void); typedef void (*OSIntrHandler) (void); typedef void (*OSIntrFunction) (void); diff --git a/trunk/include/ctr/hw/ARM11/arm11_reg.h b/trunk/include/ctr/hw/ARM11/arm11_reg.h index f69b9cf..782eb6b 100644 --- a/trunk/include/ctr/hw/ARM11/arm11_reg.h +++ b/trunk/include/ctr/hw/ARM11/arm11_reg.h @@ -19,6 +19,7 @@ #ifndef SDK_ASM #include +#include #endif #ifdef __cplusplus diff --git a/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h b/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h index e6d3453..3225200 100644 --- a/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h +++ b/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h @@ -45,11 +45,17 @@ extern "C" { #define HW_EXCP_VENEER_BUF_END (HW_EXCP_VENEER_BUF + HW_EXCP_VENEER_BUF_SIZE) #define HW_EXCP_VENEER_BUF_SIZE (8 * 6) #define HW_INTR_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_VENEER) +#define HW_INTR_VECTOR_BUF (HW_INTR_VENEER_BUF + 4) #define HW_FIQ_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_FIQ_VENEER) +#define HW_FIQ_VECTOR_BUF (HW_FIQ_VENEER_BUF + 4) #define HW_SWI_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_SWI_VENEER) +#define HW_SWI_VECTOR_BUF (HW_SWI_VENEER_BUF + 4) #define HW_UDEF_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_UDEF_VENEER) +#define HW_UDEF_VECTOR_BUF (HW_UDEF_VENEER_BUF + 4) #define HW_IABT_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_IABT_VENEER) +#define HW_IABT_VECTOR_BUF (HW_IABT_VENEER_BUF + 4) #define HW_DABT_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_DABT_VENEER) +#define HW_DABT_VECTOR_BUF (HW_DABT_VENEER_BUF + 4) #define HW_START_VECTOR1_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1) #define HW_INTR_CHECK0_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK0) #define HW_INTR_CHECK1_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1) diff --git a/trunk/include/ctr/hw/ARM9/mmap_prv_wram.h b/trunk/include/ctr/hw/ARM9/mmap_prv_wram.h index d0e6d88..0956703 100644 --- a/trunk/include/ctr/hw/ARM9/mmap_prv_wram.h +++ b/trunk/include/ctr/hw/ARM9/mmap_prv_wram.h @@ -42,11 +42,17 @@ extern "C" { #define HW_EXCP_VENEER_BUF_END (HW_EXCP_VENEER_BUF + HW_EXCP_VENEER_BUF_SIZE) #define HW_EXCP_VENEER_BUF_SIZE (8 * 6) #define HW_INTR_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_INTR_VENEER) +#define HW_INTR_VECTOR_BUF (HW_INTR_VENEER_BUF + 4) #define HW_FIQ_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_FIQ_VENEER) +#define HW_FIQ_VECTOR_BUF (HW_FIQ_VENEER_BUF + 4) #define HW_SWI_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_SWI_VENEER) +#define HW_SWI_VECTOR_BUF (HW_SWI_VENEER_BUF + 4) #define HW_UDEF_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_UDEF_VENEER) +#define HW_UDEF_VECTOR_BUF (HW_UDEF_VENEER_BUF + 4) #define HW_IABT_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_IABT_VENEER) +#define HW_IABT_VECTOR_BUF (HW_IABT_VENEER_BUF + 4) #define HW_DABT_VENEER_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_DABT_VENEER) +#define HW_DABT_VECTOR_BUF (HW_DABT_VENEER_BUF + 4) #define HW_INTR_CHECK_BUF (HW_PRV_WRAM_SYSRV + HW_PRV_WRAM_SYSRV_OFS_INTR_CHECK)