mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
TwlSDKにかなり合わせた (大半がコメントアウトだが)
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@80 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
925985e4c4
commit
f482f9d6b1
@ -19,32 +19,66 @@
|
|||||||
|
|
||||||
#define FIRM_ENABLE_JTAG
|
#define FIRM_ENABLE_JTAG
|
||||||
|
|
||||||
extern void TwlMain(void);
|
|
||||||
extern void OS_IrqHandler(void);
|
|
||||||
extern void *const _start_ModuleParams[];
|
|
||||||
static void do_autoload(void);
|
|
||||||
static void detect_main_memory_size(void);
|
|
||||||
void _start(void);
|
void _start(void);
|
||||||
void _start_AutoloadDoneCallback(void *argv[]);
|
void _start_AutoloadDoneCallback(void *argv[]);
|
||||||
|
|
||||||
extern void __call_static_initializers(void);
|
#define SDK_NITROCODE_LE 0x2106c0de
|
||||||
extern void _fp_init(void);
|
#define SDK_NITROCODE_BE 0xdec00621
|
||||||
|
|
||||||
// from LCF
|
#define SDK_TWLCODE_LE 0x6314c0de
|
||||||
extern unsigned long SDK_IRQ_STACKSIZE[];
|
#define SDK_TWLCODE_BE 0xdec01463
|
||||||
extern void SDK_STATIC_BSS_START(void); // static bss start address
|
|
||||||
extern void SDK_STATIC_BSS_END(void); // static bss start address
|
|
||||||
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
|
|
||||||
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information
|
|
||||||
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
|
|
||||||
|
|
||||||
// volatile parameters in IPL's work memory
|
// volatile parameters in IPL's work memory
|
||||||
#define IPL_PARAM_CARD_ROM_HEADER 0x023FE940
|
#define IPL_PARAM_CARD_ROM_HEADER 0x023FE940
|
||||||
#define IPL_PARAM_DOWNLOAD_PARAMETER 0x023FE904
|
#define IPL_PARAM_DOWNLOAD_PARAMETER 0x023FE904
|
||||||
|
|
||||||
|
extern void OS_IrqHandler(void);
|
||||||
|
extern void _fp_init(void);
|
||||||
|
extern void __call_static_initializers(void);
|
||||||
|
extern void TwlMain(void);
|
||||||
|
|
||||||
|
static void INITi_DoAutoload(void);
|
||||||
|
static void INITi_ShelterLtdBinary(void);
|
||||||
|
static void detect_main_memory_size(void);
|
||||||
|
|
||||||
|
// from LCF
|
||||||
|
extern unsigned long SDK_IRQ_STACKSIZE[];
|
||||||
|
|
||||||
|
extern void SDK_STATIC_BSS_START(void); // static bss start address
|
||||||
|
extern void SDK_STATIC_BSS_END(void); // static bss start address
|
||||||
|
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information
|
||||||
|
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
|
||||||
|
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
|
||||||
|
extern void SDK_LTDAUTOLOAD_LIST(void); // start pointer to autoload information
|
||||||
|
extern void SDK_LTDAUTOLOAD_LIST_END(void); // end pointer to autoload information
|
||||||
|
extern void SDK_LTDAUTOLOAD_START(void); // autoload data will start from here
|
||||||
|
|
||||||
//---- IRQ+SVC stack size in boot (this area is not cleared)
|
//---- IRQ+SVC stack size in boot (this area is not cleared)
|
||||||
#define INITi_Initial_Stack 0x100
|
#define INITi_Initial_Stack 0x100
|
||||||
|
|
||||||
|
void *const _start_ModuleParams[] =
|
||||||
|
{
|
||||||
|
(void *)SDK_AUTOLOAD_LIST,
|
||||||
|
(void *)SDK_AUTOLOAD_LIST_END,
|
||||||
|
(void *)SDK_AUTOLOAD_START,
|
||||||
|
(void *)SDK_STATIC_BSS_START,
|
||||||
|
(void *)SDK_STATIC_BSS_END,
|
||||||
|
(void*)0, // CompressedStaticEnd. This fixed number will be updated by compstatic tool.
|
||||||
|
(void*)0, // SDK_VERSION_ID // SDK version info /* [TODO] ビルドを通すため */
|
||||||
|
(void*)SDK_NITROCODE_BE,
|
||||||
|
(void*)SDK_NITROCODE_LE,
|
||||||
|
};
|
||||||
|
|
||||||
|
void* const _start_LtdModuleParams[] =
|
||||||
|
{
|
||||||
|
(void*)SDK_LTDAUTOLOAD_LIST,
|
||||||
|
(void*)SDK_LTDAUTOLOAD_LIST_END,
|
||||||
|
(void*)SDK_LTDAUTOLOAD_START,
|
||||||
|
(void*)0, // CompressedLtdautoloadEnd. This fixed number will be updated by compstatic tool.
|
||||||
|
(void*)SDK_TWLCODE_BE,
|
||||||
|
(void*)SDK_TWLCODE_LE,
|
||||||
|
};
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: _start
|
Name: _start
|
||||||
|
|
||||||
@ -127,7 +161,7 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//---- load autoload block and initialize bss
|
//---- load autoload block and initialize bss
|
||||||
//bl do_autoload
|
//bl INITi_DoAutoload
|
||||||
|
|
||||||
//---- fill static static bss with 0
|
//---- fill static static bss with 0
|
||||||
ldr r0, =_start_ModuleParams
|
ldr r0, =_start_ModuleParams
|
||||||
@ -159,90 +193,140 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
|
|
||||||
bx r1
|
bx r1
|
||||||
}
|
}
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: INITi_DoAutoload
|
||||||
|
Description: リンク情報に沿って、各オートロードブロックの固定データ部の展開
|
||||||
|
及び変数部の 0 クリアを行う。
|
||||||
|
Arguments: なし。
|
||||||
|
Returns: なし。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* < 二段階オートロード >
|
||||||
|
* 0x02f88000 に crt0 及び一段目ロード元バイナリが配置されている。
|
||||||
|
* NITRO と共有可能な WRAM 上に配置されるべきバイナリデータを 0x037c0000 にロードする。
|
||||||
|
* TWL でしか動作しない WRAM 上に配置されるべきバイナリデータを続きのアドレスにロードする。
|
||||||
|
* 0x02e80000 に二段目ロード元バイナリが配置されている。
|
||||||
|
* 0x04000 バイト分はカード ROM から再読み出し不可なので、0x02f84000 - 0x02f88000 に退避する。
|
||||||
|
* NITRO と共有可能な MAIN 上に配置されるべきバイナリデータを 0x02f88000 + sizeof(crt0) にロードする。
|
||||||
|
* TWL でしか動作しない MAIN 上に配置されるべきバイナリデータを続きのアドレスにロードする。
|
||||||
|
*/
|
||||||
|
static asm void
|
||||||
|
INITi_DoAutoload(void)
|
||||||
|
{
|
||||||
|
@000:
|
||||||
|
stmdb sp!, {lr}
|
||||||
|
/* WRAM 用ブロックをオートロード */
|
||||||
|
ldr r1, =_start_ModuleParams
|
||||||
|
ldr r12, [r1] // r12 = SDK_AUTOLOAD_LIST
|
||||||
|
ldr r0, [r1, #4] // r0 = SDK_AUTOLOAD_LIST_END
|
||||||
|
ldr r1, [r1, #8] // r1 = SDK_AUTOLOAD_START
|
||||||
|
@001: cmp r12, r0
|
||||||
|
bge @010
|
||||||
|
/* 固定セクションをロード */
|
||||||
|
stmdb sp!, {r0}
|
||||||
|
ldr r2, [r12], #4 // r2 = start address of destination range
|
||||||
|
ldr r3, [r12], #4 // r3 = size of fixed section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of fixed section
|
||||||
|
@002: cmp r2, r3
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @002
|
||||||
|
/* .bss セクションを 0 クリア */
|
||||||
|
mov r0, #0
|
||||||
|
ldr r3, [r12], #4 // r3 = size of .bss section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of .bss section
|
||||||
|
@003: cmp r2, r3
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @003
|
||||||
|
@004: ldmia sp!, {r0}
|
||||||
|
b @001
|
||||||
|
|
||||||
|
@010: /* メインメモリ用ブロックの存在を確認 */
|
||||||
|
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1dc /* ARM7 用拡張常駐モジュール ROM サイズ */
|
||||||
|
ldr r0, [r1]
|
||||||
|
cmp r0, #0
|
||||||
|
beq @020
|
||||||
|
|
||||||
|
/* 再読み出し不可部分を退避 */
|
||||||
|
bl INITi_ShelterLtdBinary
|
||||||
|
|
||||||
|
/* メインメモリ用ブロックをオートロード */
|
||||||
|
ldr r1, =_start_LtdModuleParams
|
||||||
|
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
|
||||||
|
ldr r0, [r1, #4] // r0 = SDK_LTDAUTOLOAD_LIST_END
|
||||||
|
ldr r1, [r1, #8] // r1 = SDK_LTDAUTOLOAD_START
|
||||||
|
@011: cmp r12, r0
|
||||||
|
bge @020
|
||||||
|
/* 固定セクションをロード */
|
||||||
|
stmdb sp!, {r0}
|
||||||
|
ldr r2, [r12], #4 // r2 = start address of destination range
|
||||||
|
ldr r3, [r12], #4 // r3 = size of fixed section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of fixed section
|
||||||
|
@012: cmp r2, r3
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @012
|
||||||
|
/* .bss セクションを 0 クリア */
|
||||||
|
mov r0, #0
|
||||||
|
ldr r3, [r12], #4 // r3 = size of .bss section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of .bss section
|
||||||
|
@013: cmp r2, r3
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @013
|
||||||
|
@014: ldmia sp!, {r0}
|
||||||
|
b @011
|
||||||
|
|
||||||
|
@020: /* オートロード完了コールバック関数呼び出し */
|
||||||
|
ldr r0, =_start_ModuleParams
|
||||||
|
ldr r1, =_start_LtdModuleParams
|
||||||
|
ldmia sp!, {lr}
|
||||||
|
b _start_AutoloadDoneCallback
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: do_autoload
|
Name: INITi_ShelterLtdBinary
|
||||||
|
Description: TWL 専用のオートロード元バイナリデータの内、カード ROM から
|
||||||
Description: put autoload data block according to autoload information,
|
再読み出しできない領域のデータを退避エリアに退避する。
|
||||||
and clear static bss by filling with 0.
|
再読み出しできない領域のデータは ARM7 用と ARM9 用の拡張常駐
|
||||||
|
モジュールの2つに分かれている可能性があるので、冗長ではあるが
|
||||||
Arguments: None.
|
両方の先頭から 0x4000 分をそれぞれ退避する。
|
||||||
|
Arguments: なし。
|
||||||
Returns: None.
|
Returns: なし。
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void *const _start_ModuleParams[] = {
|
static asm void
|
||||||
(void *)SDK_AUTOLOAD_LIST,
|
INITi_ShelterLtdBinary(void)
|
||||||
(void *)SDK_AUTOLOAD_LIST_END,
|
|
||||||
(void *)SDK_AUTOLOAD_START,
|
|
||||||
(void *)SDK_STATIC_BSS_START,
|
|
||||||
(void *)SDK_STATIC_BSS_END,
|
|
||||||
};
|
|
||||||
|
|
||||||
static asm void do_autoload( void )
|
|
||||||
{
|
{
|
||||||
#define ptable r0
|
/* 退避元・先アドレスを調査 */
|
||||||
#define infop r1
|
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1d8 /* ARM7 用拡張常駐モジュール RAM アドレス */
|
||||||
#define infop_end r2
|
ldr r1, [r1]
|
||||||
#define src r3
|
ldr r3, =HW_TWL_ROM_HEADER_BUF + 0x038 /* ARM7 用常駐モジュール RAM アドレス */
|
||||||
#define dest r4
|
ldr r3, [r3]
|
||||||
#define dest_size r5
|
sub r2, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM7 用退避エリア */
|
||||||
#define dest_end r6
|
|
||||||
#define tmp r7
|
|
||||||
|
|
||||||
ldr ptable, =_start_ModuleParams
|
/* コピー */
|
||||||
ldr infop, [ptable, #0] // r1 = start pointer to autoload_info
|
@loop: ldr r0, [r1], #4
|
||||||
ldr infop_end, [ptable, #4] // r2 = end pointer to autoload_info
|
str r0, [r2], #4
|
||||||
ldr src, [ptable, #8] // r3 = autoload block
|
cmp r2, r3
|
||||||
|
blt @loop
|
||||||
|
|
||||||
//---- put each blocks according to autoload information
|
bx lr
|
||||||
@2:
|
|
||||||
cmp infop, infop_end // reach to end?
|
|
||||||
beq @skipout
|
|
||||||
|
|
||||||
ldr dest, [infop], #4 // dest
|
|
||||||
ldr dest_size, [infop], #4 // size
|
|
||||||
add dest_end, dest, dest_size // dest_end
|
|
||||||
#if 1
|
|
||||||
mov dest, dest_end
|
|
||||||
#else
|
|
||||||
@1:
|
|
||||||
cmp dest, dest_end
|
|
||||||
ldrmi tmp, [src], #4 // [dest++] <- [src++]
|
|
||||||
strmi tmp, [dest], #4
|
|
||||||
bmi @1
|
|
||||||
#endif
|
|
||||||
//---- fill bss with 0
|
|
||||||
ldr dest_size, [infop], #4 // size
|
|
||||||
add dest_end, dest, dest_size // bss end
|
|
||||||
mov tmp, #0
|
|
||||||
@4:
|
|
||||||
cmp dest, dest_end
|
|
||||||
strcc tmp, [dest], #4
|
|
||||||
bcc @4
|
|
||||||
beq @2
|
|
||||||
|
|
||||||
@skipout:
|
|
||||||
// r0 = autoload_params
|
|
||||||
b _start_AutoloadDoneCallback // Jump into the callback
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: _start_AutoloadDoneCallback
|
Name: _start_AutoloadDoneCallback
|
||||||
|
Description: オートロード完了コールバック。
|
||||||
Description: hook for end of autoload (This is dummy target for DEBUGGER)
|
Arguments: argv - オートロードパラメータを保持している配列。
|
||||||
|
argv[0] = SDK_AUTOLOAD_LIST
|
||||||
Arguments: argv: pointer for autoload parameters
|
argv[1] = SDK_AUTOLOAD_LIST_END
|
||||||
argv[0] = SDK_AUTOLOAD_LIST
|
argv[2] = SDK_AUTOLOAD_START
|
||||||
argv[1] = SDK_AUTOLOAD_LIST_END
|
argv[3] = SDK_STATIC_BSS_START
|
||||||
argv[2] = SDK_AUTOLOAD_START
|
argv[4] = SDK_STATIC_BSS_END
|
||||||
argv[3] = SDK_STATIC_BSS_START
|
Returns: なし。
|
||||||
argv[4] = SDK_STATIC_BSS_END
|
|
||||||
|
|
||||||
Returns: None.
|
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
SDK_WEAK_SYMBOL asm void _start_AutoloadDoneCallback( void* argv[] )
|
SDK_WEAK_SYMBOL asm void
|
||||||
|
_start_AutoloadDoneCallback(void* argv[])
|
||||||
{
|
{
|
||||||
bx lr
|
bx lr
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -283,6 +367,13 @@ static asm void detect_main_memory_size( void )
|
|||||||
add r1, r1, #1
|
add r1, r1, #1
|
||||||
cmp r1, #2 // check 2 loop
|
cmp r1, #2 // check 2 loop
|
||||||
bne @1
|
bne @1
|
||||||
|
|
||||||
|
//---- 4MB
|
||||||
|
// check SMX_CNT
|
||||||
|
ldr r2, =REG_SMX_CNT_ADDR
|
||||||
|
ldrh r1, [r2]
|
||||||
|
tst r1, #0
|
||||||
|
orrne r0, r0, #OS_CHIPTYPE_SMX_MASK
|
||||||
b @4
|
b @4
|
||||||
|
|
||||||
//---- 8MB or 16MB or 32MB
|
//---- 8MB or 16MB or 32MB
|
||||||
|
|||||||
@ -17,34 +17,73 @@
|
|||||||
#include <nitro/code32.h>
|
#include <nitro/code32.h>
|
||||||
#include <firm.h>
|
#include <firm.h>
|
||||||
|
|
||||||
extern void TwlMain(void);
|
|
||||||
extern void OS_IrqHandler(void);
|
|
||||||
static void do_autoload(void);
|
|
||||||
static void INITi_InitCoprocessor(void);
|
|
||||||
static void INITi_InitRegion(void);
|
|
||||||
void _start(void);
|
void _start(void);
|
||||||
static void INITi_CpuClear32(register u32 data, register void *destp, register u32 size);
|
|
||||||
extern void *const _start_ModuleParams[];
|
|
||||||
void _start_AutoloadDoneCallback(void *argv[]);
|
void _start_AutoloadDoneCallback(void *argv[]);
|
||||||
|
|
||||||
extern void __call_static_initializers(void);
|
#define SDK_NITROCODE_LE 0x2106c0de
|
||||||
|
#define SDK_NITROCODE_BE 0xdec00621
|
||||||
|
|
||||||
|
#define SDK_TWLCODE_LE 0x6314c0de
|
||||||
|
#define SDK_TWLCODE_BE 0xdec01463
|
||||||
|
|
||||||
|
extern void OS_IrqHandler(void);
|
||||||
extern void _fp_init(void);
|
extern void _fp_init(void);
|
||||||
|
extern void __call_static_initializers(void);
|
||||||
|
extern void TwlMain(void);
|
||||||
|
|
||||||
|
static void INITi_CpuClear32(register u32 data, register void *destp, register u32 size);
|
||||||
|
static void INITi_InitCoprocessor(void);
|
||||||
|
static void INITi_InitRegion(void);
|
||||||
|
static void INITi_DoAutoload(void);
|
||||||
|
static void INITi_ShelterLtdBinary(void);
|
||||||
|
|
||||||
// from LCF
|
// from LCF
|
||||||
extern unsigned long SDK_IRQ_STACKSIZE[];
|
extern unsigned long SDK_IRQ_STACKSIZE[];
|
||||||
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
|
|
||||||
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information
|
|
||||||
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
|
|
||||||
extern void SDK_STATIC_BSS_START(void); // static bss start address
|
|
||||||
extern void SDK_STATIC_BSS_END(void); // static bss end address
|
|
||||||
|
|
||||||
#include <nitro/version.h>
|
extern void SDK_AUTOLOAD_LIST(void); // start pointer to autoload information
|
||||||
|
extern void SDK_AUTOLOAD_LIST_END(void); // end pointer to autoload information
|
||||||
|
extern void SDK_AUTOLOAD_START(void); // autoload data will start from here
|
||||||
|
extern void SDK_STATIC_BSS_START(void); // static bss start address
|
||||||
|
extern void SDK_STATIC_BSS_END(void); // static bss end address
|
||||||
|
extern void SDK_LTDAUTOLOAD_LIST(void); // start pointer to autoload information
|
||||||
|
extern void SDK_LTDAUTOLOAD_LIST_END(void); // end pointer to autoload information
|
||||||
|
extern void SDK_LTDAUTOLOAD_START(void); // autoload data will start from here
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: _start_ModuleParams
|
||||||
|
|
||||||
|
Description: autoload/compress/arguments data block
|
||||||
|
|
||||||
|
Arguments: None.
|
||||||
|
|
||||||
|
Returns: None.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
//#include <nitro/version.h>
|
||||||
#define SDK_VERSION_ID ((u32)SDK_VERSION_MAJOR<<24|\
|
#define SDK_VERSION_ID ((u32)SDK_VERSION_MAJOR<<24|\
|
||||||
(u32)SDK_VERSION_MINOR<<16|\
|
(u32)SDK_VERSION_MINOR<<16|\
|
||||||
(u32)SDK_VERSION_RELSTEP)
|
(u32)SDK_VERSION_RELSTEP)
|
||||||
|
|
||||||
#define SDK_NITROCODE_LE 0x2106c0de
|
void *const _start_ModuleParams[] =
|
||||||
#define SDK_NITROCODE_BE 0xdec00621
|
{
|
||||||
|
(void *)SDK_AUTOLOAD_LIST,
|
||||||
|
(void *)SDK_AUTOLOAD_LIST_END,
|
||||||
|
(void *)SDK_AUTOLOAD_START,
|
||||||
|
(void *)SDK_STATIC_BSS_START,
|
||||||
|
(void *)SDK_STATIC_BSS_END,
|
||||||
|
(void *)0, // CompressedStaticEnd
|
||||||
|
(void *)SDK_VERSION_ID, // SDK version info
|
||||||
|
(void *)SDK_NITROCODE_BE, // Checker 1
|
||||||
|
(void *)SDK_NITROCODE_LE, // Checker 2
|
||||||
|
};
|
||||||
|
void* const _start_LtdModuleParams[] =
|
||||||
|
{
|
||||||
|
(void*)SDK_LTDAUTOLOAD_LIST,
|
||||||
|
(void*)SDK_LTDAUTOLOAD_LIST_END,
|
||||||
|
(void*)SDK_LTDAUTOLOAD_START,
|
||||||
|
(void*)0, // CompressedLtdautoloadEnd. This fixed number will be updated by compstatic tool.
|
||||||
|
(void*)SDK_TWLCODE_BE,
|
||||||
|
(void*)SDK_TWLCODE_LE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -139,20 +178,15 @@ SDK_WEAK_SYMBOL asm void _start( void )
|
|||||||
bl INITi_CpuClear32
|
bl INITi_CpuClear32
|
||||||
|
|
||||||
//---- load autoload block and initialize bss
|
//---- load autoload block and initialize bss
|
||||||
// ldr r1, =_start_ModuleParams
|
// bl INITi_DoAutoload
|
||||||
// ldr r0, [r1, #20] // r0 = bottom of compressed data
|
|
||||||
// bl MIi_UncompressBackward
|
|
||||||
// bl do_autoload
|
|
||||||
|
|
||||||
//---- fill static static bss with 0
|
//---- fill static static bss with 0
|
||||||
ldr r0, =_start_ModuleParams
|
mov r0, #0
|
||||||
ldr r1, [r0, #12] // BSS segment start
|
ldr r3, =_start_ModuleParams
|
||||||
ldr r2, [r0, #16] // BSS segment end
|
ldr r1, [r3, #12] // SDK_STATIC_BSS_START
|
||||||
mov r3, r1 // for next step(flush bss)
|
ldr r2, [r3, #16] // SDK_STATIC_BSS_END
|
||||||
mov r0, #0
|
sub r2, r2, r1
|
||||||
@1: cmp r1, r2
|
bl INITi_CpuClear32
|
||||||
strcc r0, [r1], #4
|
|
||||||
bcc @1
|
|
||||||
|
|
||||||
//---- flush static bss region
|
//---- flush static bss region
|
||||||
// (r0 == #0, r3 == _start_ModuleParams::BSS_segment_start)
|
// (r0 == #0, r3 == _start_ModuleParams::BSS_segment_start)
|
||||||
@ -214,33 +248,215 @@ static asm void INITi_CpuClear32( register u32 data, register void *destp, regi
|
|||||||
bx lr
|
bx lr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: INITi_DoAutoload
|
||||||
|
Description: リンク情報に沿って、各オートロードブロックの固定データ部の展開
|
||||||
|
及び変数部の 0 クリアを行う。4M bytes を越える PSRAM メモリ空間
|
||||||
|
に配置されるオートロードブロックの展開は、ハードウェアが TWL で
|
||||||
|
ある場合にだけ行う。オートロード元データとオートロード先が一部
|
||||||
|
重なる場合もあるので、後方から展開を行う。
|
||||||
|
Arguments: なし。
|
||||||
|
Returns: なし。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* < 二段階オートロード >
|
||||||
|
* 0x02000000 に Static セグメント及び一段目ロード元バイナリが(必要に応じて後半が圧縮されて)配置されている。
|
||||||
|
* 圧縮されている場合は、まず 0x02000000 に後方から上書きしつつ解凍する。
|
||||||
|
* NITRO と共有可能な ITCM 上に配置されるべきバイナリデータを 0x01ff8000 にロードする。
|
||||||
|
* NITRO と共有可能な DTCM 上に配置されるべきバイナリデータを 0x02fe0000 にロードする。
|
||||||
|
* 0x02400000 に二段目ロード元バイナリが(必要に応じて全て圧縮されて)配置されている。
|
||||||
|
* 0x04000 バイト分はカード ROM から再読み出し不可なので、0x02f80000 - 0x02f84000 に退避する。
|
||||||
|
* 圧縮されている場合は、まず 0x02400000 に後方から上書きしつつ解凍する。
|
||||||
|
* TWL でしか動作しない WRAM 上に配置されるべきバイナリデータをそれぞれ指定アドレスにロードする。
|
||||||
|
* TWL でしか動作しないメインメモリ上に配置されるべきバイナリデータを前方からコピーすることでロードする。
|
||||||
|
* これは、NITRO と共有可能なメインメモリ上に配置されるデータが 0x02400000 を越えないはずであるため、
|
||||||
|
* 配置すべきアドレスは 0x02400000 より小さいアドレスになるはずである為。
|
||||||
|
* また、オートロード情報リストの実体がメインメモリへのオートロードブロックの .bss セクションのクリアの過程で
|
||||||
|
* 破壊される可能性があるが、一連のオートロード処理の最後の段階なので、破壊されても問題ない。
|
||||||
|
*/
|
||||||
|
static asm void
|
||||||
|
INITi_DoAutoload(void)
|
||||||
|
{
|
||||||
|
@000:
|
||||||
|
stmdb sp!, {lr}
|
||||||
|
/* NITRO 共用ブロックの解凍 */
|
||||||
|
ldr r1, =_start_ModuleParams
|
||||||
|
ldr r0, [r1, #20] // r0 = bottom of compressed data
|
||||||
|
bl MIi_UncompressBackward
|
||||||
|
|
||||||
|
@010:
|
||||||
|
/* NITRO 共用ブロックをオートロード */
|
||||||
|
ldr r1, =_start_ModuleParams
|
||||||
|
ldr r12, [r1] // r12 = SDK_AUTOLOAD_LIST
|
||||||
|
ldr r0, [r1, #4] // r0 = SDK_AUTOLOAD_LIST_END
|
||||||
|
ldr r1, [r1, #8] // r1 = SDK_AUTOLOAD_START
|
||||||
|
@011: cmp r12, r0
|
||||||
|
bge @020
|
||||||
|
/* 固定セクションをロード */
|
||||||
|
stmdb sp!, {r0}
|
||||||
|
ldr r2, [r12], #4 // r2 = start address of destination range
|
||||||
|
stmdb sp!, {r2}
|
||||||
|
ldr r3, [r12], #4 // r3 = size of fixed section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of fixed section
|
||||||
|
@012: cmp r2, r3
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @012
|
||||||
|
/* .bss セクションを 0 クリア */
|
||||||
|
mov r0, #0 // r0 = number to fill .bss section
|
||||||
|
ldr r3, [r12], #4 // r3 = size of .bss section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of .bss section
|
||||||
|
@013: cmp r2, r3
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @013
|
||||||
|
/* キャッシュを調整 */
|
||||||
|
ldmia sp!, {r2} // r2 = start address of destination range
|
||||||
|
mov r0, #HW_ITCM_IMAGE
|
||||||
|
cmp r2, r0
|
||||||
|
addge r0, r0, #HW_ITCM_SIZE
|
||||||
|
cmpge r0, r2
|
||||||
|
bgt @015 // If I-TCM autoload block, skip cache control logic.
|
||||||
|
ldr r0, =SDK_AUTOLOAD_DTCM_START
|
||||||
|
cmp r2, r0
|
||||||
|
addge r0, r0, #HW_DTCM_SIZE
|
||||||
|
cmpge r0, r2
|
||||||
|
bgt @015 // If D-TCM autoload block, skip cache control logic.
|
||||||
|
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
|
||||||
|
@014: cmp r2, r3
|
||||||
|
bge @015
|
||||||
|
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
|
||||||
|
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
|
||||||
|
add r2, r2, #HW_CACHE_LINE_SIZE
|
||||||
|
b @014
|
||||||
|
@015: ldmia sp!, {r0}
|
||||||
|
b @011
|
||||||
|
|
||||||
|
@020:
|
||||||
|
/* TWL ハードウェア上で動作しているかどうかを調査 */
|
||||||
|
ldr r1, =REG_CLK_ADDR
|
||||||
|
ldrh r0, [r1]
|
||||||
|
tst r0, #REG_SCFG_CLK_WRAMHCLK_MASK
|
||||||
|
beq @030
|
||||||
|
|
||||||
|
/* TWL 専用ブロックの存在を確認 */
|
||||||
|
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1cc /* ARM9 用拡張常駐モジュール ROM サイズ */
|
||||||
|
ldr r0, [r1]
|
||||||
|
cmp r0, #0
|
||||||
|
beq @030
|
||||||
|
|
||||||
|
/* 再読み出し不可部分を退避 */
|
||||||
|
bl INITi_ShelterLtdBinary
|
||||||
|
|
||||||
|
/* TWL 専用ブロックの解凍 */
|
||||||
|
ldr r1, =_start_LtdModuleParams
|
||||||
|
ldr r0, [r1, #12]
|
||||||
|
bl MIi_UncompressBackward
|
||||||
|
|
||||||
|
/* TWL 専用ブロックをオートロード */
|
||||||
|
ldr r1, =_start_LtdModuleParams
|
||||||
|
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
|
||||||
|
ldr r0, [r1, #4] // r0 = SDK_LTDAUTOLOAD_LIST_END
|
||||||
|
ldr r1, [r1, #8] // r1 = SDK_LTDAUTOLOAD_START
|
||||||
|
@021: cmp r12, r0
|
||||||
|
bge @030
|
||||||
|
/* 固定セクションをロード */
|
||||||
|
stmdb sp!, {r0}
|
||||||
|
ldr r2, [r12], #4 // r2 = start address of destination range
|
||||||
|
stmdb sp!, {r2}
|
||||||
|
ldr r3, [r12], #4 // r3 = size of fixed section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of fixed section
|
||||||
|
@022: cmp r2, r3
|
||||||
|
ldrlt r0, [r1], #4
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @022
|
||||||
|
/* .bss セクションを 0 クリア */
|
||||||
|
mov r0, #0 // r0 = number to fill .bss section
|
||||||
|
ldr r3, [r12], #4 // r3 = size of .bss section
|
||||||
|
add r3, r3, r2 // r3 = end address of destination range of .bss section
|
||||||
|
@023: cmp r2, r3
|
||||||
|
strlt r0, [r2], #4
|
||||||
|
blt @023
|
||||||
|
/* キャッシュを調整 */
|
||||||
|
ldmia sp!, {r2} // r2 = start address of destination range
|
||||||
|
mov r0, #HW_ITCM_IMAGE
|
||||||
|
cmp r2, r0
|
||||||
|
addge r0, r0, #HW_ITCM_SIZE
|
||||||
|
cmpge r0, r2
|
||||||
|
bgt @025 // If I-TCM autoload block, skip cache control logic.
|
||||||
|
ldr r0, =SDK_AUTOLOAD_DTCM_START
|
||||||
|
cmp r2, r0
|
||||||
|
addge r0, r0, #HW_DTCM_SIZE
|
||||||
|
cmpge r0, r2
|
||||||
|
bgt @025 // If D-TCM autoload block, skip cache control logic.
|
||||||
|
bic r2, r2, #HW_CACHE_LINE_SIZE - 1 // RoundDown32
|
||||||
|
@024: cmp r2, r3
|
||||||
|
bge @025
|
||||||
|
mcr p15, 0, r2, c7, c14, 1 // Store and Invalidate D-Cache
|
||||||
|
mcr p15, 0, r2, c7, c5, 1 // Invalidate I-Cache
|
||||||
|
add r2, r2, #HW_CACHE_LINE_SIZE
|
||||||
|
b @024
|
||||||
|
@025: ldmia sp!, {r0}
|
||||||
|
b @021
|
||||||
|
|
||||||
|
@030: /* ライトバッファが空になるのを待つ */
|
||||||
|
mov r0, #0
|
||||||
|
mcr p15, 0, r0, c7, c10, 4
|
||||||
|
|
||||||
|
/* オートロード完了コールバック関数呼び出し */
|
||||||
|
ldr r0, =_start_ModuleParams
|
||||||
|
ldr r1, =_start_LtdModuleParams
|
||||||
|
ldmia sp!, {lr}
|
||||||
|
b _start_AutoloadDoneCallback
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: _start_ModuleParams
|
Name: INITi_ShelterLtdBinary
|
||||||
|
Description: TWL 専用のオートロード元バイナリデータの内、カード ROM から
|
||||||
Description: autoload/compress/arguments data block
|
再読み出しできない領域のデータを退避エリアに退避する。
|
||||||
|
再読み出しできない領域のデータは ARM7 用と ARM9 用の拡張常駐
|
||||||
Arguments: None.
|
モジュールの2つに分かれている可能性があるので、冗長ではあるが
|
||||||
|
両方の先頭から 0x4000 分をそれぞれ退避する。
|
||||||
Returns: None.
|
Arguments: なし。
|
||||||
|
Returns: なし。
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
void *const _start_ModuleParams[] = {
|
static asm void
|
||||||
(void *)SDK_AUTOLOAD_LIST,
|
INITi_ShelterLtdBinary(void)
|
||||||
(void *)SDK_AUTOLOAD_LIST_END,
|
{
|
||||||
(void *)SDK_AUTOLOAD_START,
|
/* ARM7 専用メインメモリ空間保護リージョンを一旦アクセス可能に変更 */
|
||||||
(void *)SDK_STATIC_BSS_START,
|
mrc p15, 0, r0, c5, c0, 3
|
||||||
(void *)SDK_STATIC_BSS_END,
|
mrc p15, 0, r1, c5, c0, 2
|
||||||
(void *)0, // CompressedStaticEnd
|
stmdb sp!, {r0, r1}
|
||||||
(void *)SDK_VERSION_ID, // SDK version info
|
bic r0, r0, #(0xf << 8)
|
||||||
(void *)SDK_NITROCODE_BE, // Checker 1
|
orr r0, r0, #(0x1 << 8)
|
||||||
(void *)SDK_NITROCODE_LE, // Checker 2
|
bic r1, r1, #(0xf << 8)
|
||||||
};
|
orr r1, r1, #(0x1 << 8)
|
||||||
|
mcr p15, 0, r0, c5, c0, 3
|
||||||
|
mcr p15, 0, r1, c5, c0, 2
|
||||||
|
|
||||||
|
/* 退避元・先アドレスを調査 */
|
||||||
|
ldr r1, =HW_TWL_ROM_HEADER_BUF + 0x1c8 /* ARM9 用拡張常駐モジュール RAM アドレス */
|
||||||
|
ldr r1, [r1]
|
||||||
|
ldr r3, =HW_TWL_ROM_HEADER_BUF + 0x038 /* ARM7 用常駐モジュール RAM アドレス */
|
||||||
|
ldr r3, [r3]
|
||||||
|
sub r3, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM7 用退避エリア */
|
||||||
|
sub r2, r3, #0x4000 /* 再読み出し不可領域サイズ */ /* ARM9 用退避エリア */
|
||||||
|
|
||||||
|
/* コピー */
|
||||||
|
@loop: ldr r0, [r1], #4
|
||||||
|
str r0, [r2], #4
|
||||||
|
cmp r2, r3
|
||||||
|
blt @loop
|
||||||
|
|
||||||
|
/* ARM7 専用メインメモリ空間保護リージョン設定を元に戻す */
|
||||||
|
ldmia sp!, {r0, r1}
|
||||||
|
mcr p15, 0, r0, c5, c0, 3
|
||||||
|
mcr p15, 0, r1, c5, c0, 2
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: MIi_UncompressBackward
|
Name: MIi_UncompressBackward
|
||||||
|
Description: Uncompress special archive for module compression.
|
||||||
Description: Uncompress special archive for module compression
|
|
||||||
|
|
||||||
Arguments: bottom = Bottom adrs of packed archive + 1
|
Arguments: bottom = Bottom adrs of packed archive + 1
|
||||||
bottom[-8..-6] = offset for top of compressed data
|
bottom[-8..-6] = offset for top of compressed data
|
||||||
inp_top = bottom - bottom[-8..-6]
|
inp_top = bottom - bottom[-8..-6]
|
||||||
@ -248,17 +464,16 @@ void *const _start_ModuleParams[] = {
|
|||||||
inp = bottom - bottom[-5]
|
inp = bottom - bottom[-5]
|
||||||
bottom[-4..-1] = offset for bottom of original data
|
bottom[-4..-1] = offset for bottom of original data
|
||||||
outp = bottom + bottom[-4..-1]
|
outp = bottom + bottom[-4..-1]
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
u32 bufferTop:24;
|
u32 bufferTop:24;
|
||||||
u32 compressBottom:8;
|
u32 compressBottom:8;
|
||||||
u32 originalBottom;
|
u32 originalBottom;
|
||||||
} CompFooter;
|
} CompFooter;
|
||||||
|
|
||||||
Returns: None.
|
Returns: None.
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
asm void MIi_UncompressBackward( register void* bottom )
|
asm void
|
||||||
|
MIi_UncompressBackward(register void* bottom)
|
||||||
{
|
{
|
||||||
#define data r0
|
#define data r0
|
||||||
#define inp_top r1
|
#define inp_top r1
|
||||||
@ -269,163 +484,79 @@ asm void MIi_UncompressBackward( register void* bottom )
|
|||||||
#define count8 r6
|
#define count8 r6
|
||||||
#define index r7
|
#define index r7
|
||||||
#define len r12
|
#define len r12
|
||||||
cmp bottom, #0
|
|
||||||
beq @exit
|
cmp bottom, #0
|
||||||
stmfd sp!, {r4-r7}
|
beq @exit
|
||||||
ldmdb bottom, {r1-r2}
|
stmfd sp!, {r4-r7}
|
||||||
add outp, bottom, outp
|
ldmdb bottom, {r1-r2}
|
||||||
sub inp, bottom, inp_top, LSR #24
|
add outp, bottom, outp
|
||||||
bic inp_top, inp_top, #0xff000000
|
sub inp, bottom, inp_top, LSR #24
|
||||||
sub inp_top, bottom, inp_top
|
bic inp_top, inp_top, #0xff000000
|
||||||
mov outp_save, outp
|
sub inp_top, bottom, inp_top
|
||||||
|
mov outp_save, outp
|
||||||
@loop:
|
@loop:
|
||||||
cmp inp, inp_top // exit if inp==inp_top
|
cmp inp, inp_top // exit if inp==inp_top
|
||||||
ble @end_loop
|
ble @end_loop
|
||||||
ldrb flag, [inp, #-1]! // r4 = compress_flag = *--inp
|
ldrb flag, [inp, #-1]! // r4 = compress_flag = *--inp
|
||||||
mov count8, #8
|
mov count8, #8
|
||||||
@loop8:
|
@loop8:
|
||||||
subs count8, count8, #1
|
subs count8, count8, #1
|
||||||
blt @loop
|
blt @loop
|
||||||
tst flag, #0x80
|
tst flag, #0x80
|
||||||
bne @blockcopy
|
bne @blockcopy
|
||||||
@bytecopy:
|
@bytecopy:
|
||||||
ldrb data, [inp, #-1]!
|
ldrb data, [inp, #-1]!
|
||||||
#ifdef SDK_TEG
|
strb data, [outp, #-1]! // Copy 1 byte
|
||||||
sub outp, outp, #1
|
b @joinhere
|
||||||
swpb data, data, [outp]
|
|
||||||
#else
|
|
||||||
strb data, [outp, #-1]! // Copy 1 byte
|
|
||||||
#endif
|
|
||||||
b @joinhere
|
|
||||||
@blockcopy:
|
@blockcopy:
|
||||||
ldrb len, [inp, #-1]!
|
ldrb len, [inp, #-1]!
|
||||||
ldrb index, [inp, #-1]!
|
ldrb index, [inp, #-1]!
|
||||||
orr index, index, len, LSL #8
|
orr index, index, len, LSL #8
|
||||||
bic index, index, #0xf000
|
bic index, index, #0xf000
|
||||||
add index, index, #0x0002
|
add index, index, #0x0002
|
||||||
add len, len, #0x0020
|
add len, len, #0x0020
|
||||||
@patterncopy:
|
@patterncopy:
|
||||||
ldrb data, [outp, index]
|
ldrb data, [outp, index]
|
||||||
#ifdef SDK_TEG
|
strb data, [outp, #-1]!
|
||||||
sub outp, outp, #1
|
subs len, len, #0x0010
|
||||||
swpb data, data, [outp]
|
bge @patterncopy
|
||||||
#else
|
|
||||||
strb data, [outp, #-1]!
|
|
||||||
#endif
|
|
||||||
subs len, len, #0x0010
|
|
||||||
bge @patterncopy
|
|
||||||
|
|
||||||
@joinhere:
|
@joinhere:
|
||||||
cmp inp, inp_top
|
cmp inp, inp_top
|
||||||
mov flag, flag, LSL #1
|
mov flag, flag, LSL #1
|
||||||
bgt @loop8
|
bgt @loop8
|
||||||
@end_loop:
|
@end_loop:
|
||||||
|
|
||||||
// DC_FlushRange & IC_InvalidateRange
|
// DC_FlushRange & IC_InvalidateRange
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
bic inp, inp_top, #HW_CACHE_LINE_SIZE - 1
|
bic inp, inp_top, #HW_CACHE_LINE_SIZE - 1
|
||||||
@cacheflush:
|
@cacheflush:
|
||||||
mcr p15, 0, r0, c7, c10, 4 // wait writebuffer empty
|
mcr p15, 0, r0, c7, c10, 4 // wait writebuffer empty
|
||||||
mcr p15, 0, inp, c7, c5, 1 // ICache
|
mcr p15, 0, inp, c7, c5, 1 // ICache
|
||||||
mcr p15, 0, inp, c7, c14, 1 // DCache
|
mcr p15, 0, inp, c7, c14, 1 // DCache
|
||||||
add inp, inp, #HW_CACHE_LINE_SIZE
|
add inp, inp, #HW_CACHE_LINE_SIZE
|
||||||
cmp inp, outp_save
|
cmp inp, outp_save
|
||||||
blt @cacheflush
|
blt @cacheflush
|
||||||
|
|
||||||
ldmfd sp!, {r4-r7}
|
ldmfd sp!, {r4-r7}
|
||||||
@exit bx lr
|
@exit bx lr
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
|
||||||
Name: do_autoload
|
|
||||||
|
|
||||||
Description: put autoload data block according to autoload information,
|
|
||||||
and clear static bss by filling with 0.
|
|
||||||
|
|
||||||
Arguments: None.
|
|
||||||
|
|
||||||
Returns: None.
|
|
||||||
*---------------------------------------------------------------------------*/
|
|
||||||
static asm void do_autoload( void )
|
|
||||||
{
|
|
||||||
#define ptable r0
|
|
||||||
#define infop r1
|
|
||||||
#define infop_end r2
|
|
||||||
#define src r3
|
|
||||||
#define dest r4
|
|
||||||
#define dest_begin r5
|
|
||||||
#define dest_end r6
|
|
||||||
#define tmp r7
|
|
||||||
|
|
||||||
ldr ptable, =_start_ModuleParams
|
|
||||||
ldr infop, [ptable, #0] // r1 = start pointer to autoload_info
|
|
||||||
ldr infop_end, [ptable, #4] // r2 = end pointer to autoload_info
|
|
||||||
ldr src, [ptable, #8] // r3 = autoload block
|
|
||||||
|
|
||||||
@2:
|
|
||||||
cmp infop, infop_end // reach to end?
|
|
||||||
beq @skipout
|
|
||||||
|
|
||||||
ldr dest_begin,[infop], #4 // dest_begin
|
|
||||||
ldr tmp, [infop], #4 // size
|
|
||||||
add dest_end, dest_begin, tmp // dest_end
|
|
||||||
mov dest, dest_begin // dest working pointer
|
|
||||||
#if 1
|
|
||||||
mov dest, dest_end
|
|
||||||
#else
|
|
||||||
@1:
|
|
||||||
cmp dest, dest_end
|
|
||||||
ldrmi tmp, [src], #4 // [dest++] <- [src++]
|
|
||||||
strmi tmp, [dest], #4
|
|
||||||
bmi @1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//---- fill bss with 0
|
|
||||||
ldr tmp, [infop], #4 // size
|
|
||||||
add dest_end, dest, tmp // bss end
|
|
||||||
mov tmp, #0
|
|
||||||
@3:
|
|
||||||
cmp dest, dest_end
|
|
||||||
strcc tmp, [dest], #4
|
|
||||||
bcc @3
|
|
||||||
|
|
||||||
//---- cache work (DC_FlushRange & IC_InvalidateRange)
|
|
||||||
bic dest, dest_begin, #HW_CACHE_LINE_SIZE - 1
|
|
||||||
@cacheflush:
|
|
||||||
mcr p15, 0, dest, c7, c5, 1 // ICache
|
|
||||||
mcr p15, 0, dest, c7, c14, 1 // DCache
|
|
||||||
add dest, dest, #HW_CACHE_LINE_SIZE
|
|
||||||
cmp dest, dest_end
|
|
||||||
blt @cacheflush
|
|
||||||
|
|
||||||
b @2
|
|
||||||
|
|
||||||
// wait writebuffer empty
|
|
||||||
mcr p15, 0, tmp, c7, c10, 4
|
|
||||||
|
|
||||||
@skipout:
|
|
||||||
// r0 = _start_ModuleParams
|
|
||||||
b _start_AutoloadDoneCallback // Jump into the callback
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: _start_AutoloadDoneCallback
|
Name: _start_AutoloadDoneCallback
|
||||||
|
Description: オートロード完了コールバック。
|
||||||
Description: hook for end of autoload (This is dummy target for DEBUGGER)
|
Arguments: argv - オートロードパラメータを保持している配列。
|
||||||
|
argv[0] = SDK_AUTOLOAD_LIST
|
||||||
Arguments: argv: pointer for autoload parameters
|
argv[1] = SDK_AUTOLOAD_LIST_END
|
||||||
argv[0] = SDK_AUTOLOAD_LIST
|
argv[2] = SDK_AUTOLOAD_START
|
||||||
argv[1] = SDK_AUTOLOAD_LIST_END
|
argv[3] = SDK_STATIC_BSS_START
|
||||||
argv[2] = SDK_AUTOLOAD_START
|
argv[4] = SDK_STATIC_BSS_END
|
||||||
argv[3] = SDK_STATIC_BSS_START
|
Returns: なし。
|
||||||
argv[4] = SDK_STATIC_BSS_END
|
|
||||||
|
|
||||||
Returns: None.
|
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
SDK_WEAK_SYMBOL asm void _start_AutoloadDoneCallback( void* argv[] )
|
SDK_WEAK_SYMBOL asm void
|
||||||
|
_start_AutoloadDoneCallback(void* argv[])
|
||||||
{
|
{
|
||||||
bx lr
|
bx lr
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user