ビルドが失敗していたのを修正。

git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@2896 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
(no author) 2009-08-07 12:17:12 +00:00
parent 8efffa5f06
commit 8fc39db192
2 changed files with 2 additions and 801 deletions

View File

@ -26,8 +26,7 @@ override TARGET_CODEGEN = ARM
ifndef TWLSDK_NOCRYPTO
#----------------------------------------------------------------------------
SRCS = crt0.SCFG_NOLOCK.c \
main.c \
SRCS = main.c \
kami_pxi.c
TARGET_NAME = armadillo
@ -37,7 +36,7 @@ LCFILE_SPEC = $(TARGET_NAME).lsf
LCFILE_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).lcf.template
LDRES_TEMPLATE = $(ROOT)/build/components/$(TARGET_NAME).TWL/$(TARGET_NAME).response.template
CRT0_O = crt0.SCFG_NOLOCK.o
CRT0_O = crt0.SCR.TWL.o
# スタック不足防止の為、インライン展開せずにコンパイルする
CCFLAGS_OPT = -O4 -inline off

View File

@ -1,798 +0,0 @@
/*---------------------------------------------------------------------------*
Project: TwlSDK - libraries - init - ARM7.TWL
File: crt0.SCR.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:: 2008-06-23#$
$Rev: 1672 $
$Author: yosiokat $
*---------------------------------------------------------------------------*/
#include <nitro/types.h>
#include <nitro/hw/common/armArch.h>
#include <twl/init/crt0.h>
#include <twl/memorymap_sp.h>
#include <twl/hw/common/mmap_wramEnv.h>
#include <nitro/os/common/emulator.h>
#ifndef SDK_FINALROM
#include <nitro/os/common/printf.h>
#endif
#include "boot_sync.h"
/*---------------------------------------------------------------------------*/
void _start(void);
void _start_AutoloadDoneCallback(void* argv[]);
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
/* リンカスクリプトにより定義されるシンボル参照 */
extern void SDK_AUTOLOAD_LIST(void);
extern void SDK_AUTOLOAD_LIST_END(void);
extern void SDK_AUTOLOAD_START(void);
extern void SDK_STATIC_START(void);
extern void SDK_STATIC_BSS_START(void);
extern void SDK_STATIC_BSS_END(void);
extern void SDK_LTDAUTOLOAD_LIST(void);
extern void SDK_LTDAUTOLOAD_LIST_END(void);
extern void SDK_LTDAUTOLOAD_START(void);
extern void SDK_WRAM_ARENA_LO(void);
/* 外部関数参照 */
extern void OS_IrqHandler(void);
#ifndef SDK_NOINIT
extern void _fp_init(void);
extern void __call_static_initializers(void);
#endif
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
#define SDK_NITROCODE_LE 0x2106c0de
#define SDK_NITROCODE_BE 0xdec00621
#define SDK_TWLCODE_LE 0x6314c0de
#define SDK_TWLCODE_BE 0xdec01463
/* .rodata セクションに配置するロードに必要な情報 */
void* const _start_ModuleParams[] =
{
(void*)0,
(void*)0,
(void*)0,
(void*)SDK_STATIC_BSS_START,
(void*)SDK_STATIC_BSS_END,
(void*)0,
(void*)0,
(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,
(void*)SDK_TWLCODE_BE,
(void*)SDK_TWLCODE_LE,
};
/*---------------------------------------------------------------------------*
Name: ShakeHand
Description: ARM9 ShakeHand
Arguments: r0 - ARM9
r1 - ARM7
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_ShakeHand[10] =
{
0xe1d020b0, /* ldrh r2, [r0] ; 同期変数9を共有メモリから読む */
0xe1d130b0, /* ldrh r3, [r1] ; 同期変数7を共有メモリから読む */
0xe2833001, /* @1: add r3, r3, #1 ; 同期変数7 ++ */
0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */
0xe1d0c0b0, /* ldrh r12, [r0] ; 同期変数9の現状を共有メモリから読む */
0xe152000c, /* cmp r2, r12 ; 同期変数9の変化を判定する */
0x0afffffa, /* beq @1 ; 変化していなければループ */
0xe2833001, /* add r3, r3, #1 ; 同期変数7 ++ */
0xe1c130b0, /* strh r3, [r1] ; 同期変数7を共有メモリに書く */
0xe12fff1e /* bx lr ; ハンドシェイク完了 */
};
/*---------------------------------------------------------------------------*
Name: Stop
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_Stop[2] =
{
0xef000006, /* @1: swi #6 ; SVC_Halt */
0xeafffffd /* b @1 ; ループ */
};
/*---------------------------------------------------------------------------*
Name: GotoMain
Description: ARM9 Main
0
使
Arguments: r0 - 0
4
r1 - 8 bit: ARM9
24 bit: 0
4
r2 -
r3 - Main Main Thumb
bx 1
Returns:
*---------------------------------------------------------------------------*/
static const u32 microcode_GotoMain[10] =
{
0xe59fc01c, /* @1: ldr r12, [pc, #28] ; 下位 24 bit マスクを用意 */
0xe111000c, /* tst r1, r12 ; クリアバッファ残サイズをチェック */
0xe3a0c000, /* mov r12, #0 ; クリア用変数を用意 */
0x1480c004, /* strne r12, [r0], #4 ; 4 バイトクリア */
0x12411004, /* subne r1, r1, #4 ; クリアバッファ残サイズ -= 4 */
0x1afffff9, /* bne @1 ; 残サイズが 0 になるまでループ */
0xe1a01c21, /* mov r1, r1, LSR #24 ; フェーズ管理変数の更新値を用意 */
0xe1c210b0, /* strh r1, [r2] ; フェーズ管理変数を更新 */
0xe12fff13, /* bx r3 ; Main 関数へジャンプ */
0x00fffffc /* <DATA> 0x00fffffc */
};
/*---------------------------------------------------------------------------*
*---------------------------------------------------------------------------*/
static void INITi_CheckSysConfig(void);
static void INITi_DetectMainMemorySize(void);
static void INITi_Stop(void);
static void INITi_DoAutoload(void);
#ifndef SDK_NOINIT
static void INITi_ShelterStaticInitializer(u32* ptr);
static void INITi_CallStaticInitializers(void);
#endif
static void* INITi_Copy32(void* dst, void* src, u32 size);
static void* INITi_Fill32(void* dst, u32 value, u32 size);
/*---------------------------------------------------------------------------*/
#include <twl/code32.h>
/*---------------------------------------------------------------------------*
Name: _start
Description:
Arguments:
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start(void)
{
@000:
/* 割込み禁止 */
mov r12, #HW_REG_BASE
str r12, [r12, #REG_IME_OFFSET]
/* SCFG 設定を確認 */
bl INITi_CheckSysConfig
/* プリロードパラメータアドレスが格納されていない場合は、デフォルト値をセット */
ldr r0, =HW_PRELOAD_PARAMETER_ADDR
ldr r1, [r0]
cmp r1, #0
ldreq r1, =HW_PARAM_TWL_SETTINGS_DATA_DEFAULT
streq r1, [r0]
/* ランチャーから渡された情報を退避 */
ldr r3, =SDK_WRAM_ARENA_LO
sub r2, r3, #0x40
ldr r1, =HW_LAUNCHER_DELIVER_PARAM_BUF
@001:
cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @001
/* ハンドシェイク用マイクロコードを専用 WRAM にコピー */
ldr r1, =microcode_ShakeHand
ldr r2, =HW_PRV_WRAM
add r3, r2, #40 // sizeof(microcode_ShakeHand)
@002: ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @002
/* 専用 WRAM 上のコードで ARM9 とハンドシェイク */
ldr r0, =HW_BOOT_SHAKEHAND_9
ldr r1, =HW_BOOT_SHAKEHAND_7
ldr r2, =HW_PRV_WRAM
mov lr, pc
bx r2
@010:
/* スタックポインタ設定 */
mov r0, #HW_PSR_SVC_MODE // SuperVisor mode
msr cpsr_c, r0
ldr sp, =HW_PRV_WRAM_SVC_STACK_END
mov r0, #HW_PSR_IRQ_MODE // IRQ mode
msr cpsr_c, r0
ldr sp, =HW_PRV_WRAM_IRQ_STACK_END
ldr r1, =SDK_IRQ_STACKSIZE
sub r1, sp, r1
sub sp, sp, #4 // 4 bytes for IRQ stack check code
mov r0, #HW_PSR_SYS_MODE // System mode
msr cpsr_csfx, r0
sub sp, r1, #4 // 4 bytes for SYS stack check code
/* スタック領域をクリア */
ldr r0, =SDK_SYS_STACKSIZE
sub r1, r1, r0
ldr r2, =HW_PRV_WRAM_IRQ_STACK_END
mov r0, #0
@011: cmp r1, r2
strlt r0, [r1], #4
blt @011
/* Autoload を実施 */
bl INITi_DoAutoload
/* STATIC セグメントの .bss セクションを 0 クリア */
mov r1, #0 // r1 = clear value for STATIC bss section
ldr r3, =_start_ModuleParams
ldr r0, [r3, #12] // r0 = start address of STATIC bss section
ldr r2, [r3, #16]
subs r2, r2, r0 // r2 = size of STATIC bss section
blgt INITi_Fill32
/* メインメモリサイズを調査 */
bl INITi_DetectMainMemorySize
#ifndef SDK_FINALROM
/* デバッグ出力ウィンドウを設定 */
ldr r1, =HW_PRINT_OUTPUT_ARM9
mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9
orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7 << 8)
strh r0, [r1]
mov r0, #OS_PRINT_OUTPUT_DEFAULT_ARM9ERR
orr r0, r0, #(OS_PRINT_OUTPUT_DEFAULT_ARM7ERR << 8)
strh r0, [r1, #2]
#endif
/* IRQ 割込みベクタ設定 */
ldr r1, =HW_INTR_VECTOR_BUF
ldr r0, =OS_IrqHandler
str r0, [r1]
#ifndef SDK_NOINIT
/* c++ 用初期化 */
bl _fp_init
bl TwlSpStartUp
bl __call_static_initializers
bl INITi_CallStaticInitializers
#endif
@0f0:
/* Main 関数へのジャンプ用マイクロコードをスタックの底にコピー */
ldr r1, =microcode_GotoMain
sub r2, sp, #40
mov r3, sp
@0f1: cmp r2, r3
ldrlt r0, [r1], #4
strlt r0, [r2], #4
blt @0f1
/* マイクロコードを経由して Main 関数へジャンプ */
ldr r0, =SDK_STATIC_START
bic r0, r0, #0x00000003
ldr r1, =SDK_STATIC_BSS_END
sub r1, r1, r0
add r1, r1, #3
bic r1, r1, #0x00000003
bic r1, r1, #0xff000000
mov r2, #BOOT_SYNC_PHASE_4
mov r2, r2, LSL #24
orr r1, r1, r2
ldr r2, =HW_BOOT_SYNC_PHASE
ldr r3, =TwlSpMain
ldr lr, =HW_RESET_VECTOR
sub r12, sp, #40
bx r12
/* never return */
}
/*---------------------------------------------------------------------------*
Name: _start_AutoloadDoneCallback
Description:
Arguments: argv -
argv[0] = SDK_AUTOLOAD_LIST
argv[1] = SDK_AUTOLOAD_LIST_END
argv[2] = SDK_AUTOLOAD_START
argv[3] = SDK_STATIC_BSS_START
argv[4] = SDK_STATIC_BSS_END
Returns:
*---------------------------------------------------------------------------*/
SDK_WEAK_SYMBOL asm void
_start_AutoloadDoneCallback(void* argv[])
{
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_CheckSysConfig
Description: SCFG I/O
A7-SCFG
ARM7 WRAM I/O
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_CheckSysConfig(void)
{
/* A7-SCFG のアクセス可否判定 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
ldr r2, =HW_PRV_WRAM_SYSRV
tst r0, #REG_SCFG_EXT_CFG_MASK
beq @invalid
@valid:
/* ARM7 Secure-ROM 切り離し */
ldr r1, =REG_A7ROM_ADDR
ldrb r0, [r1]
orr r0, r0, #REG_SCFG_A7ROM_SEC_MASK
strb r0, [r1]
/* ARM9 Secure-ROM 切り離し */
ldr r1, =REG_A9ROM_ADDR
ldrb r0, [r1]
orr r0, r0, #REG_SCFG_A9ROM_SEC_MASK
strb r0, [r1]
/* NITRO 無線を有効化 */
ldr r1, =REG_WL_ADDR
ldrh r0, [r1]
orr r0, r0, #REG_SCFG_WL_OFFB_MASK
strh r0, [r1]
/* ROM 設定、NITRO 無線設定、ボンディングオプション情報を WRAM に展開 */
ldr r3, =REG_OP_ADDR // SCFG-OP
ldrb r1, [r3]
and r0, r1, #(REG_SCFG_OP_OP1_MASK | REG_SCFG_OP_OP0_MASK)
ldr r3, =REG_A9ROM_ADDR // SCFG-ROM:0~7
ldrb r1, [r3]
and r3, r1, #(REG_SCFG_A9ROM_RSEL_MASK | REG_SCFG_A9ROM_SEC_MASK)
orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM9RSEL_SHIFT - REG_SCFG_A9ROM_RSEL_SHIFT)
ldr r3, =REG_A7ROM_ADDR // SCFG-ROM:8~15
ldrb r1, [r3]
and r3, r1, #(REG_SCFG_A7ROM_RSEL_MASK | REG_SCFG_A7ROM_FUSE_MASK)
orr r0, r0, r3, LSL #(HWi_WSYS08_ROM_ARM7RSEL_SHIFT - REG_SCFG_A7ROM_RSEL_SHIFT)
ldr r3, =REG_WL_ADDR // SCFG-WL
ldrb r1, [r3]
and r3, r1, #REG_SCFG_WL_OFFB_MASK
orr r0, r0, r3, LSL #(HWi_WSYS08_WL_OFFB_SHIFT - REG_SCFG_WL_OFFB_SHIFT)
strb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
/* 各新規ブロックへクロックを供給 */
ldr r1, =REG_CLK_ADDR
ldrh r0, [r1]
ldr r3, =REG_SCFG_CLK_SNDMCLK_MASK | REG_SCFG_CLK_WRAMHCLK_MASK | REG_SCFG_CLK_AESHCLK_MASK | REG_SCFG_CLK_SD2HCLK_MASK | REG_SCFG_CLK_SD1HCLK_MASK
orr r0, r0, r3
strh r0, [r1]
/* JTAG 情報を WRAM に展開 */
ldr r3, =REG_JTAG_ADDR // SCFG-JTAG
ldrh r1, [r3]
and r0, r1, #(REG_SCFG_JTAG_CPUJE_MASK | REG_SCFG_JTAG_ARM7SEL_MASK)
and r3, r1, #REG_SCFG_JTAG_DSPJE_MASK
orr r0, r0, r3, LSR #(REG_SCFG_JTAG_DSPJE_SHIFT - HWi_WSYS09_JTAG_DSPJE_SHIFT)
strb r0, [r2, #HWi_WSYS09_WRAMOFFSET]
/* 各拡張機能を有効化 */
ldr r1, =REG_EXT_ADDR // SCFG_EXT
ldr r0, [r1]
ldr r3, =REG_SCFG_EXT_WRAM_MASK | REG_SCFG_EXT_GPIO_MASK | REG_SCFG_EXT_I2C_MASK | REG_SCFG_EXT_I2S_MASK | REG_SCFG_EXT_MIC_MASK | REG_SCFG_EXT_SD2_MASK | REG_SCFG_EXT_SD1_MASK | REG_SCFG_EXT_AES_MASK | REG_SCFG_EXT_DMAC_MASK
orr r0, r0, r3
orr r0, r0, #(REG_SCFG_EXT_DSEL_MASK | REG_SCFG_EXT_INTC_MASK)
bic r0, r0, #REG_SCFG_EXT_MC_B_MASK
str r0, [r1]
/* 各拡張機能の制御設定内容を WRAM に展開 */
str r0, [r2, #HWi_WSYS04_WRAMOFFSET]
/* メモリーカード I/F のスロット選択 */
ldr r1, =REG_MC1_ADDR // SCFG_MC1
ldr r0, [r1]
bic r0, r0, #REG_MI_MC1_SWP_MASK
str r0, [r1]
/* WRAM-A/B/C が ARM7 に割り当たっていることを確認 */
ldr r1, =REG_MBK1_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK2_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK3_ADDR
ldr r0, [r1]
ldr r3, =0x9d999591
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK4_ADDR
ldr r0, [r1]
ldr r3, =0x8d898581
cmp r0, r3
blne INITi_Stop
ldr r1, =REG_MBK5_ADDR
ldr r0, [r1]
ldr r3, =0x9d999591
cmp r0, r3
blne INITi_Stop
/* WRAM-A/B/C のメモリマップを設定 */
ldr r1, =REG_MBK6_ADDR
ldr r0, =0x080037c0
str r0, [r1]
ldr r1, =REG_MBK7_ADDR
ldr r0, =0x07c03780
str r0, [r1]
ldr r1, =REG_MBK8_ADDR
ldr r0, =0x07803740
str r0, [r1]
ldr r1, =REG_MBK9_ADDR
ldr r0, =0x00ffff0f
str r0, [r1]
/* A7-SCFG ブロックへのアクセスを無効化 */
ldr r1, =REG_EXT_ADDR
ldr r0, [r1]
/* bic r0, r0, #REG_SCFG_EXT_CFG_MASK */
str r0, [r1]
@invalid:
/* ROM 設定、NITRO 無線設定内容を確認 */
ldrb r0, [r2, #HWi_WSYS08_WRAMOFFSET]
and r0, r0, #(HWi_WSYS08_ROM_ARM7RSEL_MASK | HWi_WSYS08_ROM_ARM9RSEL_MASK | HWi_WSYS08_ROM_ARM9SEC_MASK)
cmp r0, #HWi_WSYS08_ROM_ARM9SEC_MASK
blne INITi_Stop
/* SCFG レジスタ設定情報を共有領域にコピー */
ldr r2, =HW_PRV_WRAM_SYSRV
ldr r3, =HW_SYS_CONF_BUF
ldr r0, [r2, #HWi_WSYS04_WRAMOFFSET]
str r0, [r3, #HWi_WSYS04_OFFSET]
ldrh r0, [r2, #HWi_WSYS08_WRAMOFFSET]
strh r0, [r3, #HWi_WSYS08_OFFSET]
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_DetectMainMemorySize
Description: 調
調 (u16*)HW_MMEMCHECER_SUB
[OS_CONSOLE_SIZE_16MB|OS_CONSOLE_SIZE_32B]
NOTE: NITRO
Arguments:
Returns:
*---------------------------------------------------------------------------*/
#define OSi_IMAGE_DIFFERENCE2 0xb000000
#define OSi_DETECT_NITRO_MASK (REG_SND_SMX_CNT_E_MASK | REG_SND_SMX_CNT_FSEL_MASK)
#define OSi_DETECT_NITRO_VAL (REG_SND_SMX_CNT_E_MASK)
#define OSi_CHECKNUM1 0x55
#define OSi_CHECKNUM2 0xaa
#define OSi_100usWAIT 3352 // 100us = 3351.4cycles(33.514MHz)
static asm void
INITi_DetectMainMemorySize(void)
{
ldr r2, =HW_MMEMCHECKER_SUB
add r3, r2, #OSi_IMAGE_DIFFERENCE2
mov r0, #OS_CONSOLE_SIZE_16MB
/* OSi_CHECKNUM1 (0x55) 書き込みテスト */
mov r1, #OSi_CHECKNUM1
strb r1, [r3]
ldr r2, =OSi_100usWAIT
@1 subs r2, r2, #4
bcs @1
ldrb r1, [r3]
cmp r1, #OSi_CHECKNUM1
bne @check_smix
/* OSi_CHECKNUM2 (0xaa) を 書き込みテスト */
mov r1, #OSi_CHECKNUM2
strb r1, [r3]
ldr r2, =OSi_100usWAIT
@2 subs r2, r2, #4
bcs @2
ldrb r1, [r3]
cmp r1, #OSi_CHECKNUM2
moveq r0, #OS_CONSOLE_SIZE_32MB
@check_smix:
/* SMIX レジスタを調査 */
ldr r3, =REG_SMX_CNT_ADDR
ldrh r1, [r3]
and r1, r1, #OSi_DETECT_NITRO_MASK
cmp r1, #OSi_DETECT_NITRO_VAL
orreq r0, r0, #OS_CHIPTYPE_SMX_MASK
/* 調査結果を格納 */
ldr r2, =HW_MMEMCHECKER_SUB
strb r0, [r2]
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_Stop
Description: ARM7 WRAM Halt
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_Stop(void)
{
ldr r1, =microcode_Stop
ldr r2, =HW_PRV_WRAM
add r3, r2, #8 // sizeof(microcode_Stop)
@copy_loop:
ldr r0, [r1], #4
str r0, [r2], #4
cmp r2, r3
blt @copy_loop
@stop_loop:
ldr r0, =HW_PRV_WRAM
mov lr, pc
bx r0
b @stop_loop
/* never return */
}
/*---------------------------------------------------------------------------*
Name: INITi_DoAutoload
Description: 沿
0
NITRO TWL
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_DoAutoload(void)
{
stmfd sp!, {lr}
/* オートロードを実施 */
@000:
ldr r0, =_start_LtdModuleParams
ldr r12, [r0] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r3, [r0, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END
ldr r1, [r0, #8] // r1 = SDK_LTDAUTOLOAD_START
@001:
cmp r12, r3
bge @010
/* 固定セクション */
ldr r0, [r12], #4 // r0 = start address of destination range of fixed section
ldr r2, [r12], #4 // r2 = size of fixed section
bl INITi_Copy32
stmfd sp!, {r0, r1}
/* static initializer テーブル */
ldr r0, [r12], #4
#ifndef SDK_NOINIT
stmfd sp!, {r3, r12}
bl INITi_ShelterStaticInitializer
ldmfd sp!, {r3, r12}
#endif
/* bss セクション */
ldmfd sp!, {r0} // r0 = start address of destination range of bss section
mov r1, #0 // r1 = clear value for bss section
ldr r2, [r12], #4 // r2 = sizeo of bss section
bl INITi_Fill32
ldmfd sp!, {r1}
b @001
/* オートロードリスト・オートロード元バッファをクリア */
@010:
ldr r1, =_start_LtdModuleParams
ldr r12, [r1] // r12 = SDK_LTDAUTOLOAD_LIST
ldr r3, [r1, #4] // r3 = SDK_LTDAUTOLOAD_LIST_END
ldr r0, [r1, #8] // r0 = SDK_LTDAUTOLOAD_START
@011:
cmp r12, r3
bge @0f0
mov r1, #0 // r1 = clear value
str r1, [r12], #4
ldr r2, [r12] // r2 = size of fixed section
str r1, [r12], #4
str r1, [r12], #4
str r1, [r12], #4
bl INITi_Fill32
b @011
@0f0:
/* オートロード完了コールバック呼び出し */
ldr r0, =_start_ModuleParams
ldr r1, =_start_LtdModuleParams
ldmfd sp!, {lr}
b _start_AutoloadDoneCallback
}
#ifndef SDK_NOINIT
static asm void
/*---------------------------------------------------------------------------*
Name: INITi_ShelterStaticInitializer
Description: static initializer
IRQ 退
Arguments: ptr -
NULL
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_ShelterStaticInitializer(u32* ptr)
{
/* 引数確認 */
cmp r0, #0
bxeq lr
/* 退避場所先頭アドレスを計算 */
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
@001:
/* 退避場所先頭から空き場所を調査 */
ldr r2, [r1]
cmp r2, #0
addne r1, r1, #4
bne @001
@002:
/* 空き場所にテーブルをコピー */
ldr r2, [r0], #4
str r2, [r1], #4
cmp r2, #0
bne @002
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_CallStaticInitializers
Description: static initializer
IRQ 退
Arguments:
Returns:
*---------------------------------------------------------------------------*/
static asm void
INITi_CallStaticInitializers(void)
{
stmdb sp!, {lr}
/* テーブル退避場所先頭アドレスを計算 */
ldr r1, =HW_PRV_WRAM_IRQ_STACK_END
ldr r2, =SDK_IRQ_STACKSIZE
sub r1, r1, r2
add r1, r1, #4
@001:
/* テーブルに管理されているポインタを一つずつ呼び出し */
ldr r0, [r1]
cmp r0, #0
beq @002
stmfd sp!, {r1}
mov lr, pc
bx r0
ldmfd sp!, {r1}
/* 一旦呼び出したポインタはゼロクリア (IRQスタックを間借りしている為) */
mov r0, #0
str r0, [r1], #4
b @001
@002:
ldmia sp!, {lr}
bx lr
}
#endif
/*---------------------------------------------------------------------------*
Name: INITi_Copy32
Description: 32 bit 36
r3 - r12
Arguments: r0 - ( 4 )
r1 - ( 4 )
r2 - ( 4 )
Returns: r0 - ( r0 + r2 )
r1 - ( r1 + r2 )
*---------------------------------------------------------------------------*/
static asm void*
INITi_Copy32(void* dst, void* src, u32 size)
{
stmfd sp!, {r3-r11}
bics r3, r2, #0x0000001f
beq @next
add r3, r0, r3
@loop:
ldmia r1!, {r4-r11}
stmia r0!, {r4-r11}
cmp r3, r0
bgt @loop
@next:
tst r2, #0x00000010
ldmneia r1!, {r4-r7}
stmneia r0!, {r4-r7}
tst r2, #0x00000008
ldmneia r1!, {r4-r5}
stmneia r0!, {r4-r5}
tst r2, #0x00000004
ldmneia r1!, {r4}
stmneia r0!, {r4}
ldmfd sp!, {r3-r11}
bx lr
}
/*---------------------------------------------------------------------------*
Name: INITi_Fill32
Description: 32 bit 36
r3 - r12
Arguments: r0 - ( 4 )
r1 - 32 bit
r2 - ( 4 )
Returns: r0 - ( r0 + r2 )
*---------------------------------------------------------------------------*/
static asm void*
INITi_Fill32(void* dst, u32 value, u32 size)
{
stmfd sp!, {r3-r11}
mov r4, r1
mov r5, r1
mov r6, r1
mov r7, r1
mov r8, r1
mov r9, r1
mov r10, r1
mov r11, r1
bics r3, r2, #0x0000001f
beq @next
add r3, r0, r3
@loop:
stmia r0!, {r4-r11}
cmp r3, r0
bgt @loop
@next:
tst r2, #0x00000010
stmneia r0!, {r4-r7}
tst r2, #0x00000008
stmneia r0!, {r4-r5}
tst r2, #0x00000004
stmneia r0!, {r4}
ldmfd sp!, {r3-r11}
bx lr
}
#include <twl/codereset.h>