NetBSD/armではhoge_start.Sから始まります。
実際始まってるか確認してみましょう。
m83xxxのuartは0x10090000の物理アドレスにあります。
u-bootで確認してみましょう。
Comcerto-1000 > mw.b 10090000 4e
NComcerto-1000 >
文字が出ますね。
ではカーネルコードで同じことをしてみます。
--- a/sys/arch/evbarm/mindspeed/m83xxx_start.S
+++ b/sys/arch/evbarm/mindspeed/m83xxx_start.S
@@ -48,6 +48,9 @@ RCSID("$NetBSD: m83xxx_start.S,v 1.7 2020/11/28 14:29:31 skrll Exp $")
.global _C_LABEL(m83xxx_start)
ENTRY_NP(m83xxx_start)
+ ldr r2, .Luart
+ mov r1, #78
+ strb r1, [r2]
cpsid if, #PSR_SVC32_MODE
/*
@@ -126,4 +129,6 @@ ENTRY_NP(m83xxx_start)
.word 0x80000000|L1_S_AP_KRW|L1_S_C|L1_S_B|L1_TYPE_S
.Lio_pde:
.word 0x43f00000|L1_S_AP_KRW|L1_TYPE_S
+.Luart:
+ .word 0x10090000
END(m83xxx_start)
これでビルドしたカーネルを起動してみます。
## Booting image at 81000000 ...
Image Name: NetBSD/m83xxx
Image Type: ARM NetBSD Kernel Image (uncompressed)
Data Size: 3850320 Bytes = 3.7 MB
Load Address: 80100000
Entry Point: 80100000
Verifying Checksum ... OK
OK
## Transferring control to NetBSD stage-2 loader (at address 80100000) ...
N
文字が出たので、ちゃんと実行が移っていることが確認できました。これでビルドシステムが正常なことが分かります。
"## Transferring..."はu-bootのNetBSDサポートコードが出しているようです。
この後のstartは/sys/arch/arm/arm32/locore.Sにあります。
実はこれは古い方法で、arm/arm/armv6_start.Sというv6以降の共通ルーチンが用意されたようです。こちらに変更してm83xxx_start.Sは消しました。
v5以前ついては個別のstart.Sが必要です。
古い実装はhoge_start.Sとhoge_machdep.cというコードをそれぞれのターゲットごとに用意していたようです。hoge_machdep.cにはinitarmがあり、かなりがりがり書かれていました。ほとんど同じ処理なのでarm/arm32/arm32_*.cに共通化したコードがあるので、これを呼ぶだけでよくなっています。
実はcomcertoの実装で同じ1136なimx31をコピーしていじったのですが、imx31はまだがりがり書かれたままのコードでした。なぜかv5なimx21の方は共通コードになっていたので、こちらも参考にしました。
arm32_*.cは後から作られた物っぽいですがFDTの非対応でも使えるようです。
すでに対応のあるアーキテクチャのSOCをポートする時はuart,割り込み,timerがあればrootのマウントまでたどり着けます。
uartは設定はu-bootがおこなっているので、まずはputcだけを用意すればよいです。
アーキテクチャ固有の処理が終ると、kern/init_main.cのmain()が実行されます。
新しいSOCにポートする時は既存のコードをコピーして始めますが、コピー元がメンテされてて筋が良いものを選ぶのが重要です。また対象のターゲットのアーキテクチャがシンプルなものがいいです。見極めるのは結構難しいです。NetBSDは疎いので結構はまりました。
Redbootでputcharはこうします。
RedBoot> mfill -b 0xc8001000 -l 4 -p 0x4e
NRedBoot>
c2kではこうでした。
Barebox-C2K >/ memset 0x96400000 0x4e 1
NBarebox-C2K >/
現実的に使えるようにするには最小限、uart,割り込み,タイマー,Ether,ストレージ(USB)の実装が必要です。