LoginSignup
1
0

NetBSDポートの最初の一歩

Last updated at Posted at 2022-11-01

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)の実装が必要です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0