/*---------------------------------------------------------------------------* 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 #include /*---------------------------------------------------------------------------* 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: STUPi_CpuCopy32 Description: copy memory by CPU 32bit version Arguments: srcp : source address destp : destination address size : size (byte) Returns: None *---------------------------------------------------------------------------*/ ASM void STUPi_CpuCopy32( 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: STUPi_CpuClear32 Description: fill memory with specified data. 32bit version Arguments: data : fill data destp : destination address size : size (byte) Returns: None *---------------------------------------------------------------------------*/ ASM void STUPi_CpuClear32( u32 data, void *destp, u32 size ) { add r12, r1, r2 LSYM(10) cmp r1, r12 stmltia r1!, {r0} blt BSYM(10) bx lr } /*---------------------------------------------------------------------------* Name: STUPi_NotifyToARM9 Description: notify 4bit id to ARM9 Arguments: id notifying id Returns: None *---------------------------------------------------------------------------*/ ASM void STUPi_NotifyToARM9( 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: STUPi_WaitARM9 Description: Wait 4bit id from ARM9 Arguments: id waiting id Returns: None *---------------------------------------------------------------------------*/ ASM void STUPi_WaitARM9( 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: STUPi_WaitCpuCycles Description: Loop and Wait for specified CPU cycles at least Arguments: cycles waiting CPU cycle Returns: None *---------------------------------------------------------------------------*/ ASM void STUPi_WaitCpuCycles( 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 }