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@135 b871894f-2f95-9b40-918c-086798483c85
124 lines
3.6 KiB
C
124 lines
3.6 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: CtrBrom - library - init
|
|
File: crt0.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>
|
|
|
|
void _start(void);
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: _start
|
|
|
|
Description: Start up
|
|
|
|
Arguments: None
|
|
|
|
Returns: None.
|
|
*---------------------------------------------------------------------------*/
|
|
asm void _start( void )
|
|
{
|
|
PRESERVE8
|
|
|
|
CODE32 // for _start reference
|
|
|
|
INASM_EXTERN( i_stupIrqVeneer )
|
|
INASM_EXTERN( i_stupFiqVeneer )
|
|
INASM_EXTERN( i_stupSwiVeneer )
|
|
INASM_EXTERN( i_stupUndefInstVeneer )
|
|
INASM_EXTERN( i_stupPrefetchAbortVeneer )
|
|
INASM_EXTERN( i_stupDataAbortVeneer )
|
|
|
|
b stupStartHandlerVeneer // don't change for NULL access compatibility
|
|
undef b i_stupUndefInstVeneer
|
|
swi b i_stupSwiVeneer
|
|
iabt b i_stupPrefetchAbortVeneer
|
|
dabt b i_stupDataAbortVeneer
|
|
reserve b reserve
|
|
irq b i_stupIrqVeneer
|
|
fiq b i_stupFiqVeneer
|
|
|
|
#ifdef SDK_MG20EMU
|
|
// MG20_CONFIG
|
|
DCD 0x3105
|
|
#endif // SDK_MG20EMU
|
|
|
|
INASM_EXTERN( i_stupSwiHandler )
|
|
|
|
DCD i_stupSwiHandler
|
|
|
|
#ifdef SDK_MG20EMU
|
|
SPACE 0x20 - 8
|
|
#endif // SDK_MG20EMU
|
|
|
|
stupStartHandlerVeneer
|
|
// NULLジャンプ時のデータアボート有効時はリテラルプールアクセスにてアボート
|
|
ldr r12, =HW_BROM_SEC
|
|
// NULLデータアボート無効時はセキュアROM切り離しチェック
|
|
ldr r12, [r12]
|
|
cmp r12, #0
|
|
cmpne r12, #~0
|
|
LSYM(1) beq BSYM(1)
|
|
|
|
//---- enable performance monitor
|
|
mrc p15, 0, r0, c15, c12, 0
|
|
ldr r1, =HW_C15_PMN_ENABLE | HW_C15_CYCLE_COUNT_RESET | HW_C15_COUNT01_RESET | \
|
|
(HW_C15_EVT_INC_EACH_CYCLE << HW_C15_COUNT0_EVT_SFT) | \
|
|
(HW_C15_EVT_INC_EACH_CYCLE << HW_C15_COUNT1_EVT_SFT) | \
|
|
HW_C15_CYCLE_COUNT_D64
|
|
orr r0, r0, r1
|
|
// bic r0, r0, #HW_C15_CYCLE_COUNT_D64
|
|
mcr p15, 0, r0, c15, c12, 0
|
|
|
|
//---- check CPU-ID
|
|
mrc p15,0, r0, c0, c0, 5
|
|
tst r0, #HW_C0_AP_CPU_ID_MASK
|
|
beq core0_start
|
|
|
|
//---- Wait for IPI
|
|
#ifdef BROM_USE_MPCORE_EXTEND_OP
|
|
cpsid i
|
|
#else
|
|
mrs r0, cpsr
|
|
orr r1, r0, #HW_PSR_IRQ_DISABLE
|
|
msr cpsr_c, r1
|
|
#endif
|
|
ldr r3, =REG_IDR_CNT_ADDR
|
|
mov r0, #REG_OS_IDR_CNT_E_MASK
|
|
str r0, [r3]
|
|
ldr r3, =REG_IDR_CLR_PND0_ADDR
|
|
ldr r1, =REG_OS_IDR_CLR_PND0_IPI_ALL_MASK
|
|
mov r0, #~0
|
|
str r0, [r3]
|
|
LSYM(10)
|
|
ldr r0, [r3]
|
|
tst r0, r1
|
|
wfieq
|
|
nop
|
|
beq BSYM(10)
|
|
ldr lr, =HW_START_VECTOR1_BUF
|
|
ldr lr, [lr]
|
|
bx lr
|
|
|
|
core0_start
|
|
|
|
INASM_EXTERN( i_stupStartHandler )
|
|
|
|
b i_stupStartHandler
|
|
|
|
LTORG
|
|
}
|
|
|