NetBSD/evbarm (APC8750) 2013/8/16
2013/08/16(金) 26:53 NetBSD はてブ情報 はてブに登録 はてブ数

少しだけ進みました。
NetBSD/evbarm (APC) booting ...
[ Kernel symbol table missing! ]
Loaded initial symtab at 0xc01b4364, strtab at 0xc01d3494, # entries 7940
pmap_postinit: Allocated 35 static L1 descriptor tables
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 6.99.23 (APC) #16: Fri Aug 16 16:42:14 UTC 2013
        root@builder.localdomain:/usr/obj/sys/arch/evbarm/compile/APC
total memory = 512 MB
avail memory = 499 MB
mainbus0 (root)
cpu0 at mainbus0 core 0: ARM1176JZ-S r0p7 (ARM11J V6ZK core)
cpu0: DC enabled IC enabled WB enabled LABT
cpu0: 16KB/32B 4-way L1 Instruction cache
cpu0: 16KB/32B 4-way write-back-locking-C L1 Data cache
vfp0 at cpu0: VFP11
obio0 at mainbus0
wmicu0 at obio0 addr 0xd8140000-0xd814ffff
com0 at obio0 addr 0xd8200000-0xd820ffff intr 322: ns8250 or ns16450, no fifo
com0: console
wmtmr0 at obio0 addr 0xd8100000-0xd810ffff intr 48: VC System Timer
rn_init: radix functions require max_keylen be set
boot device: <unknown>
root device:
えらい苦労して、割り込みコントローラ(wmicu)をシリアル(com)の前にアタッチさせて、表示上はうまく動いているように見えますが、肝心のシリアルで入力ができないです。

昨日からの変更点をつらつらまとめておきます。

comがxintを使っていたのをintrに変えました。xintをIRQと勘違いしていました。sizeも指定が必要で64kB (0x10000) を使っています。intrは32です。サイズ指定に伴い、bus_space_mapの第三引数を8の即値からoba->oba_sizeに変更しました。

addrに仮想アドレスを指定していたものを物理アドレスに変更しました。昨日の、Fatal kernel mode data abortのエラーは、これで収まりました。いい加減な話ですが、エラーメッセージで検索すると、物理・仮想アドレス周りが怪しいということで。

これ以外にもdata abort関連のエラーに遭遇しました。大げさなエラーですが、たいていはゼロで割ったり、NULLを参照したり、自分で書いたプログラムが大抵バグを引き起こしていました。多くは、コンパイルを通すためにコメントアウトしたり、中身を見ないで適当な辻褄合わせをしたところでした。結局は負債となって、自分に帰ってくるだけですね。

obioはcomよりもwmicuを先にattachさせるために、obio_attach_criticalという関数を一つ書きました。そこでconfig_foundを呼ぶことでwmicuを先に呼び出します。kern/subr_autoconf.cの中をさまよって、結局のところXXX_matchが呼ばれた時の戻り値の大きいものをattachするということがわかったので、wm8750_intr.cのmatchの戻り値を(とりあえず)10にしておきました。

obio_attach_criticalの方法は、@nonakapさんからxscale/pxa2x0.cでも同様のことをやっていることを教えてもらい、それを真似したものです。とはいえ、なんとなく強引な気もします。きっと、attachの順序のルールを読み解けば、なんとかなるんじゃないかと思って、あれこれやってみたのですが、結局はダメでした。たとえば、デバイス名のアルファベット順にattachするのでは、などと思いましたが、まったく関係がありません。完全には追えていませんが、files.XXXXのインクルードされた順、というのが現時点での「だいたいあってる」回答のようです。実際には、configされた時点で決まるようで、自動生成されるevbarm/compile/obj/APC/ioconf.cの記述が手掛かりのようです。ちなみに、これを手で直すのはやめといたほうがよいそうです。このあたりは、@cvsyncさんにもアドバイスをいただきました。

wmtmrはコンパイルを通すために削除していたbus_space_mapを復活させました。ちなみに、comが先にattachされている時代に、wm8750_tmr.cのdelayが呼ばれて落ちるという事象がありました。delayの中でscのNULLチェックに引っかかってpanicしていました。attachされる前なので当然です。仕方がないので、NULLであれば黙ってreturnするという処理でごまかしました。matchの戻り値でコントロールすれば、このごまかし処理も不要になりそうですね。

wmintrもwmtmrと同様にbus_space_mapを復活させました。ぐらいかな。matchの戻り値の増加は先の説明のとおりです。実は、割り込みコントローラが2個あるのですが、二つ目のコントローラ分はサボっています。そもそも、ちゃんと動いているのかわからないし。

com, obioをevbarm/apcからarm/wmtに移しました。com, obioはもともとevbarm/hdl_gからコピーしてきたものなのでevbarm/apcにありましたが、WM8750的にはオンボードということでarm/wmtがいいかなぁということで。

全体的に、モグラたたきをしながらボチボチ進めている感じです。
シリアルがちゃんと動くようになれば、mdで/sbin/initぐらいまで行けたりしますかね。シリアルは、入力だけでなく出力も遅すぎなので、いろいろ足りてない感じなんでしょうね。

名前:  非公開コメント   

  • TB-URL  http://www.tokuda.net/diary/0799/tb/