mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@188 b871894f-2f95-9b40-918c-086798483c85
282 lines
9.5 KiB
C
282 lines
9.5 KiB
C
/*---------------------------------------------------------------------------*
|
||
Project: CtrBrom - library - init
|
||
File: crt0_app.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 <brom/code32.h>
|
||
#include <brom/os.h>
|
||
|
||
#define STUPi_HW_DTCM |Image$$DTCM$$Base|
|
||
|
||
void _start(void);
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
Name: _start
|
||
|
||
Description: Start up
|
||
|
||
Arguments: None
|
||
|
||
Returns: None.
|
||
*---------------------------------------------------------------------------*/
|
||
asm void _start( void )
|
||
PRESERVE8
|
||
|
||
INASM_EXTERN( STUPi_HW_DTCM )
|
||
INASM_EXTERN( BromSpMain )
|
||
INASM_EXTERN( main )
|
||
|
||
//---- initialize stack pointer
|
||
// SVC mode
|
||
mov r0, #HW_PSR_SVC_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||
msr cpsr_fsxc, r0
|
||
ldr sp, =HW_BROM_SVC_STACK_END
|
||
|
||
// IRQ mode
|
||
mov r0, #HW_PSR_IRQ_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||
msr cpsr_fsxc, r0
|
||
ldr r0, =HW_BROM_IRQ_STACK_END
|
||
mov sp, r0
|
||
|
||
// System mode
|
||
mov r0, #HW_PSR_SYS_MODE | HW_PSR_IRQ_DISABLE | HW_PSR_FIQ_DISABLE
|
||
msr cpsr_fsxc, r0
|
||
ldr r0, =HW_BROM_SYS_STACK_END
|
||
mov sp, r0
|
||
|
||
//---- initialize cp15
|
||
bl i_stupInitCP15
|
||
|
||
//---- clear wram
|
||
// DTCM (16KB)
|
||
mov r0, #0
|
||
ldr r1, =STUPi_HW_DTCM
|
||
mov r2, #HW_DTCM_SIZE
|
||
bl i_stupCpuClear32
|
||
|
||
// 64B
|
||
mov r0, #0
|
||
ldr r1, =HW_PRV_WRAM_SYSRV
|
||
ldr r2, =HW_EXCP_VENEER_BUF
|
||
sub r2, r2, r1
|
||
bl i_stupCpuClear32
|
||
|
||
ldr r1, =HW_EXCP_VENEER_BUF_END
|
||
ldr r2, =HW_PRV_WRAM_SYSRV_END
|
||
sub r2, r2, r1
|
||
bl i_stupCpuClear32
|
||
|
||
//---- lnitialize sections
|
||
bl stupInitSections
|
||
|
||
//---- start (to 16bit code)
|
||
ldr r1, =BromSpMain
|
||
adr lr, terminate
|
||
|
||
bx r1
|
||
|
||
terminate
|
||
b terminate
|
||
}
|
||
|
||
//-----------------------------------------------------------------------
|
||
// <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>v<EFBFBD><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
//-----------------------------------------------------------------------
|
||
asm void i_stupInitCP15(void)
|
||
{
|
||
// <20>v<EFBFBD><76><EFBFBD>e<EFBFBD>N<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>b<EFBFBD>g/<2F>L<EFBFBD><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56>/TCM <20>f<EFBFBD>B<EFBFBD>Z<EFBFBD>[<5B>u<EFBFBD><75>
|
||
|
||
mrc p15, 0, r0, c1, c0, 0
|
||
ldr r1, =HW_C1_IC_ENABLE | HW_C1_DC_ENABLE \
|
||
| HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \
|
||
| HW_C1_ITCM_LOAD_MODE | HW_C1_DTCM_LOAD_MODE \
|
||
| HW_C1_LD_INTERWORK_DISABLE \
|
||
| HW_C1_PROTECT_UNIT_ENABLE
|
||
#ifdef SDK_MG20EMU
|
||
bic r1, r1, #HW_C1_ITCM_ENABLE
|
||
#endif // SDK_MG20EMU
|
||
bic r0, r0, r1
|
||
mcr p15, 0, r0, c1, c0, 0
|
||
|
||
// <20>L<EFBFBD><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
mov r0, #0
|
||
mcr p15, 0, r0, c7, c5, 0 // <20><><EFBFBD>߃L<DF83><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56>
|
||
mcr p15, 0, r0, c7, c6, 0 // <20>f<EFBFBD>[<5B>^<5E>L<EFBFBD><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56>
|
||
|
||
// <20><><EFBFBD>C<EFBFBD>g<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@ <20>G<EFBFBD><47><EFBFBD>v<EFBFBD>e<EFBFBD>B<EFBFBD>҂<EFBFBD>
|
||
mcr p15, 0, r0, c7, c10, 4
|
||
|
||
/*
|
||
; Region G: BACK_GROUND: Base = 0x0, Size = 4GB, I:NC NB / D:NC NB, I:NA / D:NA
|
||
; Region 0: MAIN_MEM: Base = 0x20000000, Size = 128MB, I:NC NB / D:NC NB, I:NA / D:RW
|
||
; Region 1: IO_AXIRAM: Base = 0x10000000, Size = 256MB, I:NC NB / D:NC NB, I:NA / D:RW
|
||
; Region 2: PRV_WRAM: Base = 0x08000000, Size = 1MB, I:Cach Buf / D:Cach Buf, I:NA / D:RW
|
||
; Region 3: PRV_WRAM_SYSRV:Base = 0x08000000, Size = 4KB, I:Cach Buf / D:Cach Buf, I:RO / D:RW
|
||
; Region 4: DTCM: Base = 0xfffe0000, Size = 16KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||
; Region 5: ITCM: Base = 0x07ff8000, Size = 32KB, I:Cach Buf / D:NC NB, I:RO / D:RW
|
||
; Region 6: BIOS: Base = 0xffff0000, Size = 64KB, I:Cach NB / D:Cach NB, I:RO / D:RO
|
||
; Region 7: SHARED_WORK: Base = 0x17fff000, Size = 8KB, I:NC NB / D:NC NB, I:NA / D:RW
|
||
*/
|
||
#define SET_PROTECTION_A( id, adr, siz ) ldr r0, =(adr|HW_C6_PR_##siz|HW_C6_PR_ENABLE)
|
||
#define SET_PROTECTION_B( id, adr, siz ) mcr p15, 0, r0, c6, id, 0
|
||
#define REGION_BIT(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<1)|((c)<<2)|((d)<<3)|((e)<<4)|((f)<<5)|((g)<<6)|((h)<<7))
|
||
#define REGION_ACC(a,b,c,d,e,f,g,h) (((a)<<0)|((b)<<4)|((c)<<8)|((d)<<12)|((e)<<16)|((f)<<20)|((g)<<24)|((h)<<28))
|
||
#define NA 0
|
||
#define RW 1
|
||
#define RO 5
|
||
|
||
|
||
//
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
//
|
||
//---- <20><><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
SET_PROTECTION_A( c0, HW_MAIN_MEM, 128MB )
|
||
SET_PROTECTION_B( c0, HW_MAIN_MEM, 128MB )
|
||
|
||
//---- I/O<><4F><EFBFBD>W<EFBFBD>X<EFBFBD>^ & VRAM & AXI-WRAM
|
||
SET_PROTECTION_A( c1, HW_IOREG, 256MB )
|
||
SET_PROTECTION_B( c1, HW_IOREG, 256MB )
|
||
|
||
//---- PRV_WRAM
|
||
SET_PROTECTION_A( c2, HW_PRV_WRAM, 1MB )
|
||
SET_PROTECTION_B( c2, HW_PRV_WRAM, 1MB )
|
||
|
||
//---- PRV_WRAM_SYSRV
|
||
#ifndef SDK_MG20EMU
|
||
SET_PROTECTION_A( c3, HW_PRV_WRAM_SYSRV, 4KB )
|
||
SET_PROTECTION_B( c3, HW_PRV_WRAM_SYSRV, 4KB )
|
||
#else // SDK_MG20EMU
|
||
SET_PROTECTION_A( c3, HW_MG20IOP_REG, 1MB )
|
||
SET_PROTECTION_B( c3, HW_MG20IOP_REG, 1MB )
|
||
#endif // SDK_MG20EMU
|
||
|
||
//---- <20>f<EFBFBD>[<5B>^ TCM
|
||
ldr r0, =STUPi_HW_DTCM
|
||
orr r0, r0, #HW_C6_PR_16KB
|
||
orr r0, r0, #HW_C6_PR_ENABLE
|
||
SET_PROTECTION_B( c4, HW_DTCM, 16KB )
|
||
|
||
//---- <20><><EFBFBD><EFBFBD> TCM
|
||
// <20>f<EFBFBD>[<5B>^ TCM <20><><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>悪<EFBFBD><E682AA><EFBFBD><EFBFBD>
|
||
SET_PROTECTION_A( c5, HW_ITCM, 32KB )
|
||
SET_PROTECTION_B( c5, HW_ITCM, 32KB )
|
||
|
||
//---- BIOS
|
||
SET_PROTECTION_A( c6, HW_BIOS, 64KB )
|
||
SET_PROTECTION_B( c6, HW_BIOS, 64KB )
|
||
|
||
//---- SHARED CPU <20>ԒʐM<CA90><4D><EFBFBD>[<5B>N<EFBFBD>̈<EFBFBD>
|
||
SET_PROTECTION_A( c7, HW_AXI_WRAM_SHARED, 8KB )
|
||
SET_PROTECTION_B( c7, HW_AXI_WRAM_SHARED, 8KB )
|
||
|
||
//
|
||
// <20><><EFBFBD>߂s<DF82>b<EFBFBD>l <20>ݒ<EFBFBD>
|
||
//
|
||
mov r0, #HW_C9_TCMR_128MB
|
||
mcr p15, 0, r0, c9, c1, 1
|
||
|
||
//
|
||
// <20>f<EFBFBD>[<5B>^<5E>s<EFBFBD>b<EFBFBD>l <20>ݒ<EFBFBD>
|
||
//
|
||
ldr r0, =STUPi_HW_DTCM
|
||
orr r0, r0, #HW_C9_TCMR_16KB
|
||
mcr p15, 0, r0, c9, c1, 0
|
||
|
||
//
|
||
// <20><><EFBFBD>߃L<DF83><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56> <20>C<EFBFBD>l<EFBFBD>[<5B>u<EFBFBD><75> (<28><><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD>)
|
||
// 6: BIOS
|
||
//
|
||
mov r0, #REGION_BIT(0,0,0,0,0,0,1,0)
|
||
mcr p15, 0, r0, c2, c0, 1
|
||
|
||
//
|
||
// <20>f<EFBFBD>[<5B>^<5E>L<EFBFBD><4C><EFBFBD>b<EFBFBD>V<EFBFBD><56> <20>C<EFBFBD>l<EFBFBD>[<5B>u<EFBFBD><75> (<28><><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD>)
|
||
// 0: HW_MAIN_MEM
|
||
// 2: PRV_WRAM
|
||
// 6: BIOS
|
||
//
|
||
mov r0, #REGION_BIT(1,0,1,0,0,0,1,0)
|
||
mcr p15, 0, r0, c2, c0, 0
|
||
|
||
//
|
||
// <20><><EFBFBD>C<EFBFBD>g<EFBFBD>o<EFBFBD>b<EFBFBD>t<EFBFBD>@ <20>C<EFBFBD>l<EFBFBD>[<5B>u<EFBFBD><75>(<28><><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD>)
|
||
// 0: HW_MAIN_MEM
|
||
// 2: PRV_WRAM
|
||
// 6: BIOS
|
||
//
|
||
mov r0, #REGION_BIT(1,0,1,0,0,0,1,0)
|
||
mcr p15, 0, r0, c3, c0, 0
|
||
|
||
//
|
||
// <20><><EFBFBD>߃A<DF83>N<EFBFBD>Z<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD> (<28><><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD>)
|
||
// MAIN_MEM : NA
|
||
// IO_AXIRAM : NA
|
||
// PRV_WRAM : NA
|
||
// PRV_WRAM_SYSRV: RO
|
||
// DTCM : NA
|
||
// ITCM : RO
|
||
// BIOS : RO
|
||
// SHARED : NA
|
||
//
|
||
#ifndef SDK_MG20EMU
|
||
ldr r0, =REGION_ACC(NA,NA,NA,RO,NA,RO,RO,NA)
|
||
#else // SDK_MG20EMU
|
||
ldr r0, =REGION_ACC(NA,NA,RO,NA,NA,RO,RO,NA)
|
||
#endif // SDK_MG20EMU
|
||
mcr p15, 0, r0, c5, c0, 3
|
||
|
||
//
|
||
// <20>f<EFBFBD>[<5B>^<5E>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD><58><EFBFBD>i<C281><69><EFBFBD>[<5B>W<EFBFBD><57><EFBFBD><EFBFBD><EFBFBD>ݒ<EFBFBD><DD92>j
|
||
// MAIN_MEM : RW
|
||
// IO_AXIRAM : RW
|
||
// PRV_WRAM : RW
|
||
// PRV_WRAM_SYSRV: RW
|
||
// DTCM : RW
|
||
// ITCM : RW
|
||
// BIOS : RO
|
||
// SHARED : RW
|
||
//
|
||
#ifdef BROM_ENABLE_BOOTROM_WRITE
|
||
ldr r0, =REGION_ACC(RW,RW,RW,RW,RW,RW,RW,RW)
|
||
#else // BROM_ENABLE_BOOTROM_WRITE
|
||
ldr r0, =REGION_ACC(RW,RW,RW,RW,RW,RW,RO,RW)
|
||
#endif // BROM_ENABLE_BOOTROM_WRITE
|
||
mcr p15, 0, r0, c5, c0, 2
|
||
|
||
//
|
||
// <20>V<EFBFBD>X<EFBFBD>e<EFBFBD><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>v<EFBFBD><76><EFBFBD>Z<EFBFBD>b<EFBFBD>T <20>}<7D>X<EFBFBD>^<5E>[<5B>ݒ<EFBFBD>
|
||
//
|
||
mrc p15, 0, r0, c1, c0, 0
|
||
ldr r1,=HW_C1_IC_ENABLE | HW_C1_DC_ENABLE | HW_C1_CACHE_ROUND_ROBIN \
|
||
| HW_C1_ITCM_ENABLE | HW_C1_DTCM_ENABLE \
|
||
| HW_C1_SB1_BITSET | HW_C1_EXCEPT_VEC_UPPER \
|
||
| HW_C1_PROTECT_UNIT_ENABLE
|
||
orr r0, r0, r1
|
||
#ifdef SDK_MG20EMU
|
||
bic r0, r0, #HW_C1_EXCEPT_VEC_UPPER
|
||
#endif // SDK_MG20EMU
|
||
mcr p15, 0, r0, c1, c0, 0
|
||
|
||
bx lr
|
||
|
||
LTORG
|
||
|
||
EXPORT i_stupInitCP15_End
|
||
i_stupInitCP15_End
|
||
}
|
||
|
||
#undef BROM_TARGET_BROM
|
||
#include <./crt0_misc_sp.c>
|
||
|