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@206 b871894f-2f95-9b40-918c-086798483c85
206 lines
5.9 KiB
C
206 lines
5.9 KiB
C
/*---------------------------------------------------------------------------*
|
|
Project: CtrBrom - library - init
|
|
File: crt0_misc.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>
|
|
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: __user_initial_stackheap
|
|
|
|
Description: called from __scatterload
|
|
|
|
Arguments: None
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void __user_initial_stackheap( void )
|
|
{
|
|
#ifdef BROM_ENABLE_INITIAL_STACKHEAP
|
|
|
|
INASM_EXTERN( |Image$$ZI$$ZI$$Limit| )
|
|
|
|
ldr r0, =|Image$$ZI$$ZI$$Limit| // heap base
|
|
ldr r1, =HW_BROM_IRQ_STACK_END
|
|
sub r1, r1, #HW_BROM_IRQ_STACK_SIZE
|
|
mov r2, r0
|
|
mov r3, r0
|
|
|
|
#endif // BROM_ENABLE_INITIAL_STACKHEAP
|
|
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: stupInitSections
|
|
|
|
Description: Initialize Sections
|
|
|
|
Arguments: None
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void stupInitSections( void )
|
|
{
|
|
b stupInitStaticSections
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: stupInitStaticSections
|
|
|
|
Description: Initialize Static Sections
|
|
|
|
Arguments: None
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void stupInitStaticSections( void )
|
|
{
|
|
#ifdef BROM_TARGET_BROM
|
|
INASM_EXTERN( |Image$$SEC_RO$$Limit| )
|
|
ldr r0, =|Image$$SEC_RO$$Limit|
|
|
|
|
#else // BROM_TARGET_NORFIRM || BROM_TARGET_APP
|
|
INASM_EXTERN( |Image$$RO$$Limit| )
|
|
ldr r0, =|Image$$RO$$Limit|
|
|
|
|
#endif // BROM_TARGET_NORFIRM || BROM_TARGET_APP
|
|
|
|
INASM_EXTERN( |Image$$RW$$Base| )
|
|
INASM_EXTERN( |Image$$ZI$$ZI$$Base| )
|
|
INASM_EXTERN( |Image$$ZI$$ZI$$Limit| )
|
|
|
|
ldr r1, =|Image$$RW$$Base|
|
|
ldr r3, =|Image$$ZI$$ZI$$Base|
|
|
cmp r0, r1
|
|
beq FSYM(20)
|
|
LSYM(10)
|
|
cmp r1, r3
|
|
ldrcc r2, [r0], #4
|
|
strcc r2, [r1], #4
|
|
bcc BSYM(10)
|
|
LSYM(20)
|
|
ldr r1, =|Image$$ZI$$ZI$$Limit|
|
|
mov r2, #0
|
|
LSYM(30)
|
|
cmp r3, r1
|
|
strcc r2, [r3], #4
|
|
bcc BSYM(30)
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: i_stupCpuCopy32
|
|
|
|
Description: copy memory by CPU
|
|
32bit version
|
|
|
|
Arguments: srcp : source address
|
|
destp : destination address
|
|
size : size (byte)
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void i_stupCpuCopy32( const void *srcp, void *destp, u32 size )
|
|
{
|
|
add r12, r1, r2
|
|
LSYM(10)
|
|
cmp r1, r12
|
|
ldmltia r0!, {r2}
|
|
stmltia r1!, {r2}
|
|
blt BSYM(10)
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: i_stupCpuClear32
|
|
|
|
Description: fill memory with specified data.
|
|
32bit version
|
|
|
|
Arguments: data : fill data
|
|
destp : destination address
|
|
size : size (byte)
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void i_stupCpuClear32( u32 data, void *destp, u32 size )
|
|
{
|
|
add r12, r1, r2
|
|
LSYM(10)
|
|
cmp r1, r12
|
|
stmltia r1!, {r0}
|
|
blt BSYM(10)
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: i_stupNotifyToARM9
|
|
|
|
Description: notify 4bit id to ARM9
|
|
|
|
Arguments: id notifying id
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void i_stupNotifyToARM9( u32 id )
|
|
{
|
|
ldr r3, =REG_SUBPINTF_ADDR
|
|
mov r0, r0, lsl #REG_PXI_SUBPINTF_A11STATUS_SHIFT
|
|
and r0, r0, #REG_PXI_SUBPINTF_A11STATUS_MASK
|
|
str r0, [r3]
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: i_stupWaitARM9
|
|
|
|
Description: Wait 4bit id from ARM9
|
|
|
|
Arguments: id waiting id
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void i_stupWaitARM9( u32 id )
|
|
{
|
|
ldr r3, =REG_SUBPINTF_ADDR
|
|
LSYM(10)
|
|
ldr r1, [r3]
|
|
and r1, r1, #REG_PXI_SUBPINTF_A9STATUS_MASK
|
|
cmp r0, r1
|
|
bne BSYM(10)
|
|
bx lr
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------*
|
|
Name: i_stupWaitCpuCycles
|
|
|
|
Description: Loop and Wait for specified CPU cycles at least
|
|
|
|
Arguments: cycles waiting CPU cycle
|
|
|
|
Returns: None
|
|
*---------------------------------------------------------------------------*/
|
|
asm void i_stupWaitCpuCycles( u32 cycle )
|
|
{
|
|
sub r0, r0, #(6-2) // subtract call-return overhead and add the margin of 2 cycles
|
|
LSYM(10)
|
|
subs r0, r0, #4 // 1 cycle
|
|
bcs BSYM(10) // 3 cycle
|
|
bx lr
|
|
}
|
|
|