ctr_firmware/trunk/bootrom/build/libraries/init/ARM11/crt0_misc.c
nakasima 2317f26e4c MMU初期化コードをマージ。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@206 b871894f-2f95-9b40-918c-086798483c85
2009-01-23 03:02:56 +00:00

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
}