マジックナンバーの中身を見る気を取り直してマジックナンバー0x10000004を考えてみます。0x10000004で立っているビットからステータスレジスタのどのフィールドなのかを確認してみると、CU0とERLです。コプロセッサ0へのアクセスを制御する。プロセッサがカーネルモードで動作しているときは、CU0ビットの状態に関係なくコプロセッサ0を常に使うことができる。キャッシュエラー例外が発生した際プロセッサによってセットされる。ERLがセットされた場合、プロセッサはカーネルモードで動作する、割り込みは禁止されている、ERET命令はEPCの代わりにErrorEPCに保持された戻り先アドレスを使う、KUSEGの下位2^29バイトは未マップかつ非キャッシュ領域として扱われる。24Kがサポートしているモードの一つだそうです。24Kプロセッサは四つのモードをサポートしているようです。modeDebugモードはDebugレジスタのDMビットが1の場合、そうでない場合はステータスレジスタのKSU、EXL、ERLの値によってそれぞれのモードが判別できるようです。ERL=0ここでKSUフィールドの説明を見てみると次のような記述があります。このフィールドはプロセッサのベースのモードを示します。KSUフィールドのステータスにかかわらず、ERLかEXLがセットされるとプロセッサはカーネルモードになります。したがって、マジックナンバーの0x10000004の0004についてはERLを1にしていることから、どうやらプロセッサをカーネルモードに設定しているということがわかりました。カーネルモードであればCU0フィールドの値にかかわらずCU0が使えるのに。FreeBSDはどうなの煮詰まったので気分を変えたいと思います。いえばFreeBSDはどうやっているんでしょう。思って確認すると../src-freebsd/sys/mips/mips/locore.Sに似たような処理があるのを見つけました。t1に値をセットしているだけに見えますが、後続の処理でステータスレジスタに対してt0のANDとt1のORを取っています。レジスタt0にクリアしたいもの、t1にセットしたいものを設定しているようです。NetBSDと同様にステータスレジスタへの初期化処理ではif-else-endifを使ってMIPS_CNMIPS、CPU_RMI・CPU_NLM、それ以外の三つのパターン分けがされています。セットしているものとクリアしているものを一覧表にしてみましょう。○マジックナンバーでもセットしていたCU0をセットしているのがありますね。CNMIPSはmips64なのでちょっと関係なさそうです。Microsystems)はどちらもAtherosじゃないですね。うーん、AtherosでセットしていてくれればFreeBSDと同じだと安心できたのですが。最後のotherはCU1つまりFPUを有効にしています。24kcのばあいFPUは存在しないので無視される、といったところでしょうか。Atherosの場合もこのルートに入るのでCU0はセットしていないようです。つぎは、クリアしているもの。BEVとSRを保持してすべてクリアAtherosはotherのルートなのでCU0はクリアされてしうまうようです。ERLもクリアしちゃってます。FreeBSDではマジックナンバーに相当するフィールドは何も同じところはなかったということになります。整理してみようステータスレジスタの状態をまとめると次のようになります。やったことないBEVを保持している部分に共通点は見られますが見事にバラバラです。24Kcでは無視されます。したがって、素のNetBSDとFreeBSDの違いは、SRを保持するか否か、といえるのではないか、という気がしてきました。FreeBSDではAR9331は健やかに動いているように見えるので、もしかしたらSRを保持すれば動くのかもしれません。一方で、やはりu-bootのマジックナンバーだけが異彩を放っています。まとめ今回は時間切れでここまでしかわかりませんでした。NetBSDでBEVとSRを保持するとどうなるか、そもそも処理に入る前のステータスレジスタの値はどうなっているのか、など追加の調査をしてみようかと思います。当時は、カーネルをシリアル転送するだけで疲れ果てていたのですが、ネットワークブートができるようになった今では気軽に試せるようになったので、じっくり取り組んでみようかと思います。2014の22日目の記事です。NanoでNetBSD/evbarmを動かしてみました。会場では4,500円で売られており、オマケでアクリル板のケースを付けてもらいました。秋月電子では6,480円で売っているようなので、けっこうお得に入手したかもしれません。Nanoの基本スペックまずはスペックです。AllwinnerのA20を積んだシングルボードコンピュータです。4,500円とは思えない豊富なインタフェースですね。Nano■シリアルコンソールなにはなくともシリアルコンソールです。通信するためのシリアルポート設定は次のとおりです。ブートローダはu-bootNetBSDカーネルを読ませるための重要な要素であるところのブートローダ。u-bootが使われています。コマンド一覧を見てみましょう。fatlsあたりはありますね。一方で、ネットワーク経由でファイルを取ってきてメモリに展開するtftp関連のコマンドはないようです。うーん、ネットワーク経由が使えないとなると、SDHCやらUSBメモリの抜き差しが多発して面倒なんですよね。u-bootでSDHCにアクセスできないどうやらu-bootからSDHCが見えていないようです。SDHCからカーネルを読んでくるという手は使えなさそうです。flashにはu-bootからアクセスできます。flashにNetBSDカーネルを置けば、u-bootからロードできるというわけです。SDHCは壊れているわけではないSDHCがハード的に壊れているのかと思ったのですが、どうやらそうではないようです。いうのも、Linuxを起動するとSDHCには問題なくアクセスできるのです。flashを介してNetBSDカーネルを起動できるはずです。PCなどで(買ったときそのままの)MS-DOSフォーマットされたSDHCカードを用意し、NetBSDカーネルをコピーします。この際、コピーするのはbinary形式のnetbsd.binとなります。今回は、ftp.jaist.ac.jpからダウンロードした201412190900ZなNetBSD-currentを使いました。rebootコピーが終わったら、一旦リブートしてu-bootに戻ります。flashからNetBSDカーネルをロードします。思った人もいるかもしれません。Allwinnerの設定ファイルevbarm/conf/std.awinを見て、ここかなー、って感じですね。起動!ロードしたNetBSDカーネルの先頭アドレスである0x40007800から実行します。SDHCカードを取り除くとまともな速度で動くはずです。SDHCカードを刺しっぱなしにしていると、次のようなログが表示され続けるはずです。マルチユーザモードSDHCは残念な感じですが、USBデバイスは問題ありません。いうことで、USBメモリ上にルートファイルシステムを展開して、マルチユーザモードで起動してみます。modules.tgzなどお好み)を展開し、デバイスファイルを作ったりfstabを書いたりと、NetBSDとしては共通のプロセスを実行します。16日目の記事に詳しく解説されているのでそちらをご参照ください。マルチユーザでの起動です。まとめここ最近のNetBSDにおけるAllwinnerのサポートの充実の恩恵をバッチリ享受して、大きな苦労なくNetBSDが動いています。NICやSDHCなど動いておらず、まだまだやることはありそうです。あ、あとマルチプロセッサが動いてませんね。HDMIやSATAについては試していません。このあたりも動いてくれるとかなり楽しそうですね。Tweetなんか、動くようになってました。};すごい不安定だから、まったく同じカーネルでも起動したりpanicしたり。deviceとして、USB無線LANアダプタでネットワークも使えています。いえ、すごい遅いんですけど。手持ちのUSB有線LANアダプタが二つあったのですが、認識されるけどパケットが出ていかない、認識する途中でポートから切り離される、など残念な感じでした。template「nature。