LinkStation-MIPSel NetBSDカーネル移植作業メモ:2006-05
作業メモランダム
(2006-05-02)
- maltaディレクトリ以下の構造をメモ。(*.cのみ,グローバルのみ)
- autoconf.c
- cpu_configure()
- cpu_rootconf()
- device_register()
- cpu.c
- CFATTACH_DECL(cpu, ...)
- leds.c (MALTA専用)(デバイス化もせず、生でアドレスを叩いているお下品;-) なコード)
- led_bar()
- led_display_word()
- led_display_str()
- led_display_char()
- machdep.c
- mach_init()
- consinit()
- cpu_startup()
- cpu_reboot()
- malta_bus_io.c(実体はmips/mips/bus_space_alignstride_chipdep.c)
- malta_bus_io_*()
- malta_bus_mem.c(同上)
- malta_bus_mem_*()
- malta_dma.c
- malta_dma_init()
- malta_intr.c
- evbmips_intr_init()
- malta_cal_timer()
- evbmips_intr_establish()
- evbmips_intr_disestablish()
- evbmips_iointr()
- malta_pciide_compat_intr_establish()
- dev/gt.c
- gt_pci_init()
- CFATTACH_DECL(gt, ...)
- dev/mainbus.c
- CFATTACH_DECL(mainbus, ...)
- (dev/com_mainbus.c)
- CFATTACH_DECL(com_mainbus, ...)
- pci/pchb.c
- CFATTACH_DECL(pchb, ...)
- pci/pci_machdep.c
- struct mips_bus_dma_tag pci_bus_dma_tag;
- pci/pcib.c
- CFATTACH_DECL(pcib, ...)
- pci/pciide_machdep.c
- pciide_machdep_compat_intr_establish()
- こんなものかな...
(2006-05-13)
- やっと気力が少し溜まったので少しだけ...
- machdep.c::mach_init()にデバッグメッセージを埋め込んでどこまで進めたか確かめる。
- yamon_setcpufreq()を復旧させる。cpuの設定をここでしているため。
- 周波数を400にしたらMIPS_SET_CI_RECIPRICALL()でKASSERT()に引っかかった。400 * 1000 * 1000が正解。 orz
- comcnattach()の手前まで進んだ。この中ってことは多分I/Oスペースの割り当てが間違っている。
- やっぱりprintfが使いたい。前にコードを書いていたはずだが、組み込む前にどこかへ行ってしまった...
(2006-05-14)
- やっぱり見つからないので引き続き...
- I/Oスペースを0xb8000000から2MB割り当て。オンチップペリフェラル用。
- シリアルポートはここからのオフセットなので0x58000。
- を、copyrightまで表示したぞ。でもなんだかノロノロ。何かおかしい。
BUFFALO:~# insmod nbloader_v2.o
NetBSD loader module loaded
kernel=netbsd.bin
boot device=0x00000000
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
&*Loaded initial symtab at 0x8022d914, strtab at 0x8023bc74, # entries 3550
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
trap: address error (load or I-fetch) in kernel mode
status=0x2, cause=0x1080a410, epc=0x801f8b38, vaddr=0xdeadbef3
pid=0 cmd= usp=0x0 ksp=0x8027fd58
Stopped in pid 0.1 () at netbsd:pmap_enter_pv+0x190: lw v0,4(a0)
db>
- '&'はローダー側、'*'はカーネル側のデバッグ出力。
- copyrightが表示されたのでmain()に入っている。
- 当然ながらprintf()も使えるようになっている。
- でも、db>プロンプトへの反応は無い。入力出来ない。やはり初期化がなんだか変なのかな。
- メモリスペースはまだ割り当てていないのでこの辺も問題かも。まだまだ。
- main()にどこまで進んだか表示するためにprintfを入れる。
- 今のところuvm_init()を抜けていないのを確認。この中にもprintfを入れる。
- kmeminit()を抜けていないのを確認。ここにもprintfを入れる。
- uvm_km_zalloc()を抜けていない。これはuvm_km_alloc1の#define。
- ... まあ、ぼちぼち。
(2006-05-15)
- options UVMHISTを追加。
- メモリサイズの間違いを修正。btocが必要か...。
- 現在のブート状況。(あいかわらず表示はノロノロ。1200bpsじゃあ無いのだから...)
BUFFALO:~# insmod nbloader_v2.o
NetBSD loader module loaded
kernel=netbsd.bin
boot device=0x00000000
boot flags=0x00000000
start address=0x80100000
flushing ide devices: hda
&*MIPS32/64 params3
Loaded initial symtab at 0x802453f4, strtab at 0x802537c4, # entries 3557
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
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 3.0 (LS2) #4: Mon May 15 22:41:37 JST 2006
root@BUFFALO:/mnt/hda/NetBSD/work/usr/src/sys/arch/evbmips/compile/obj/L
S2
total memory = 65536 KB
avail memory = 61240 KB
mainbus0 (root)
cpu0 at mainbus0: 400.00MHz (hz cycles = 2000000, delay divisor = 200)
cpu0: MIPS 4Kc (0x1800a) Rev. 10 with software emulated floating point
cpu0: 8KB/16B 4-way set-associative L1 Instruction cache, 16 TLB entries
cpu0: 8KB/16B 4-way set-associative write-back L1 Data cache
com0 at mainbus0 addr 0x58000trap: TLB miss (load or instr. fetch) in kernel mod
e
status=0x2, cause=0x10808408, epc=0x80274f1c, vaddr=0x0
pid=0 cmd=swapper usp=0x0 ksp=0x802ead08
Stopped in pid 0.1 (swapper) at netbsd:bswap32+0x4fb2c: lb a3,15136(at)
db>
- com0のベースアドレスが間違っているらしい。kseg1のアドレスを直で入れるのが良いのかな?
- よく見たらvaddr=0だ。mainbusのiotが設定されていない?というか、設定した記憶が無い...orz
- 一時的には良いかも知れないが、mainbusにiotはマズイ気がする。何かバスをでっち上げる?
(2006-05-16)
- comをそのまま使うのはマズい。マニュアルをちゃんと読んでいないのがバレバレ。 orz
- 16550とは配置がまったく違う。全部4バイトアラインになっている感じ。
- 同様なドライバはarmの下にいくつか有るので、これらを参考にとっととでっち上げるべし。
- コンソールが遅いのもたぶんこのせい。(表示だけでもよく動いていたというべきか?)
- MIPS32 4Kcの割り込みまわりをちょっと調査。
- 0: ソフト割り込み
- 1: ソフト割り込み
- 2~6: 外部割込み
- 7: 内蔵タイマ
- 2~6はRC32434では32個の原因ビットに割り振られている。
- 4はチップのバグで使えないらしい。なので32×4=128個。
- LinkStationオリジナルLinuxでは0~7の8つに加えて32×5=160個、計168個の割り込みとして扱っている(らしい)。
- dmesgの"Initializing IRQ's: 168 out of 256"がこの値。
- で、このdmesgを良く見ると次のようになっているのがわかる。
- ttyS00(シリアル): 104
- IT8212(ATAコントローラ; 実際はIT8211): 146
- Ethernet(受信): 40
- Ethernet(送信): 41
- USB: 148
- (Mini-PCIは不明;たぶん147か149?)
- これらの値は実際は2~6にマッピングされるが、これは(x-8)/32 + 2で求まる。
この式も間違っているっぽい
- ttyS00: 5
- IT8211: 6
- Ethernet: 3(送受信共)
- USB: 6
- PCIの割り込みは6に集まる。Ethernetも送受信共通にすれば3だけで良い。シリアルは5を独占的に使える。
- (これで合っているだろうか...?)
- かなり間違っている (x_x;)
- (これで合っているだろうか...?)
(2006-05-28)
- ブートローダーの質問の嵐(英語)が過ぎ去ったのでやっとこちらを進められる(かも)。(気力がだいぶ削がれたが)
- comはsa11x0_com.c(arm配下)を参考にして書き直すことにした。
(2006-05-30)
- comのほうはぼちぼち...
- 割り込みのほうをマニュアルを読んでもうすこしまじめに調査。
- IP[2]に割り当てられているのは12個
- IP[3]には6個
- IP[4]は無し
- IP[5]は12個
- IP[6]は14個
- タイマ・カウンタ類はIP[2]。
- DMAはIP[3]。
- 内蔵ペリフェラルはIP[5]にまとまっている。
- シリアル, SPI, I2C, Ethernetはここ。
- IP[6]はGPIOだが、これは上のLinux側の情報とつき合わせるとPCIの割り込みと繋がっている?
- 割り込み番号は連続値として扱いたいなぁ。うまくコードを書かなくては。
(2006-05-31)
- Linuxの割り込み番号の扱いが良く分からなかったので、仕方なく(?)ソースで確認。
- 対象関数は rc32434_irqdispatch()
- 動きはこんな感じ
- CP0 Cause Registerを受け取って0x7c00でマスクする。
- clzで立っているビット位置を数える。最上位ビットが0で、最下位が31なので注意。
- この結果、値は21(IP[2]), 20(IP[3]), 19(IP[4]), 18(IP[5]), 17(IP[6])となる。
- IP4は未使用。
- 割り込みグループは21からこの値を引いたものなので、0(IP[2]), 1(IP[3]), 3(IP[5]), 4(IP[6])となる。
- グループのペンディングレジスタから読み出してビットをclzで数える。
- (39 - 上記ビット) + グループ x 32 がお目当ての割り込み番号。有効ビット幅を加味すると以下の範囲となる。
- IP[2]: 8~19
- IP[3]: 40~45
- IP[5]: 104~115
- IP[6]: 136~149
- この値をLinuxのdmesgと突合せるとこんな感じ。
- ttyS00: 104 : UART General Interrupt
- IT8211: 146 : GPIO 10
- Ethernet(受信): 40 : DMA Channel 0
- Ethernet(送信): 41 : DMA Channel 1
- USB: 148 : GPIO 12
- PCIの割り込みはGPIOに繋がっているのが確認出来た。
- Ethernetの割り込みがDMAだったのはちょっと意外。
20330
このwikiの更新情報RSS