ウォンツテック

そでやまのーと

PowerPC系のブートストラップ調査

とりあえずLinuxのブートコードを参照してみる。(Linux 2.5.70)
http://tamacom.com/tour-j.htmlが便利なので参照。
/root/arch/ppc/boot/
ブートファイルとなりそうなのは以下のファイルである。

openfirmware/misc.S
prep/head.S
simple/head.S

疑問)openfirmwareはPC/ATでいうところのBIOSの役割だろうか?
 それでprep/head.Sはその後に読み込まれる所謂firstboot?
simple/head.Sはその両者の役割を担っている?

よくわからないのでFreeBSDのブートコードを参照してみる。(FreeBSD 5.1)
/root/boot/powerpc/loader/
start.c
ふむ。Linuxより分かりやすい。
start.cでインラインアセンブラにより特殊レジスタ等の初期設定を行った後にopenfirmを呼び出している模様。
/root/boot/ofw/libofw/*
のファイル群がopenfirmのようでその後のカーネルのロード処理やデバイスの初期化などを行っている。


u-bootのブートストラップ調査
/cpu/mpc824x/start.S

/cpu/mpc824x/cpu_init.c
レジスターの初期設定後、/cpu/mpc824x/cpu_init.cにて続きの設定を行う
その後board_init_f 関数を呼び出す(/lib_ppc/board.c)
ここでシリアルデバイスの初期化とRAMの初期化を行う。最後にrelocate_codeを呼び出すが、この関数は最初のstart.Sファイルに含まれている。

/*
* We are done. Do not return, instead branch to second part of board
* initialization, now running from RAM.
*/

addi r0, r10, in_ram - _start + EXC_OFF_SYS_RESET
mtlr r0
blr

最終的に上のコードを呼び出しRAM上からの動かすようにする。
※#define EXC_OFF_SYS_RESET 0x0100 /* System reset */