www.pudn.com > arch.rar > start.S
/*
* TOPPERS Software
* Toyohashi Open Platform for Embedded Real-Time Systems
*
* Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
* Toyohashi Univ. of Technology, JAPAN
* Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory
* Graduate School of Information Science, Nagoya Univ., JAPAN
*
* 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
* ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
* 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
* (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
* 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
* スコード中に含まれていること.
* (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
* 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
* 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
* の無保証規定を掲載すること.
* (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
* 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
* と.
* (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
* 作権表示,この利用条件および下記の無保証規定を掲載すること.
* (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
* 報告すること.
* (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
* 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
* また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
* 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
* 免責すること.
*
* 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
* よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
* に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
* アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
* の責任を負わない.
*
* @(#) $Id: start.S 972 2008-04-15 03:53:01Z ertl-honda $
*/
/*
* カーネル用のスタートアップモジュール(ARM用)
*/
#define TOPPERS_MACRO_ONLY
#define UINT_C(val) (val) /* uint_t型の定数を作るマクロ */
#define ULONG_C(val) (val) /* ulong_t型の定数を作るマクロ */
#include "kernel_impl.h"
.text
.code 32
.align 2
.global start
start:
/*
* プロセッサモードの初期化
* スーパーバイザーモード,FIQ/IRQ禁止
*/
msr cpsr, #(CPSR_SVC|CPSR_INTLOCK)
/*
* スタックポインタと,フレームポインタの初期化
* sl(スタック上限レジスタr10)は設定する必要があるか?
* gccはディフォルトでは-mapcsなので必要ない
*/
ldr r0, =_kernel_istkpt
ldr sp, [r0]
mov fp, #0 /* ARMモード用フレームポインタ(r11) */
mov r7, #0 /* Thumbモード用フレームポインタ */
/*
* hardware_init_hookの呼び出し (0でない場合)
*
* ターゲットハードウェアに依存して必要な初期化処理がある場合
* は,hardware_init_hook という関数を用意する
*/
ldr r0, =hardware_init_hook
cmp r0, #0x00
movne lr, pc
movne pc, r0
start_1:
#ifndef TOPPERS_OMIT_BSS_INIT
/*
* bssセクションのクリア
*/
ldr r1, =__bss_start
ldr r2, =__bss_end
cmp r1,r2
bhs start_3
mov r0,#0
start_2:
str r0,[r1],#4
cmp r1, r2
blo start_2
#endif /* TOPPERS_OMIT_BSS_INIT */
start_3:
#ifndef TOPPERS_OMIT_DATA_INIT
/*
* dataセクションの初期化(ROM化対応)
* __idata_start から __idata_end までを,__data_start 以降に
* コピーする
*/
ldr r1, =__idata_start
ldr r3, =__idata_end
cmp r1, r3
bhs start_5
ldr r2, =__data_start
start_4:
ldr r0, [r1],#4
str r0, [r2],#4
cmp r1, r3
blo start_4
#endif /* TOPPERS_OMIT_DATA_INIT */
/*
* software_init_hook を呼出し(0 でない場合)
*
* ソフトウェア環境(特にライブラリ)に依存して必要な初期化処
* 理がある場合は,software_init_hook という関数を用意すれば
* よい.
*/
start_5:
ldr r0, =software_init_hook
cmp r0, #0x00
movne lr, pc
movne pc, r0
/*
* カーネルを起動する
*/
start_6:
bl sta_ker