2009-06-30 panic
evbarm で KERNEL_BASE_PHYS が $xx200000 になってて前半2MbyteがMOTTAINAIのは、l1table や stack に使われてるのでMOTTAINAくないんじゃないかとymdさんに教えてもらった。
なるほど、確かにl1tableとstackに使っている。…が、l1tableは16kbyteあればいいし、stackも仮設定で sys/arch/arm/arm32/locore.S の中で svcstk としてちゃんと確保されなおすので、やっぱり 2Mbyte は取りすぎのような気がする。evbarm/orion_nas は 32kbyte だった。これくらいなら納得だ。
メモリレイアウトをどうしようかダラダラ考えていてあまり進んでなかったのだが、kernel を flash に置いたまま実行というのもしたいなぁ、と思って各領域を細かく l1table に登録することも少し考えてみたが、data セクションとかは結局 copy しなきゃならないし ldscript を別にしなきゃいけないしでめんどくさそうなので日和る。
案1。kernelがメモリに置かれた場合(0x21000000)は、0x20000000-0x21FFFFFF および kernel の後ろを VM にする。
とてもめんどくさそう。
案2。起動直後に 0x21000000 (または任意の場所) にロードされた自分自身を 0x20000000 にコピーする。
0x20000000〜 は U-Boot の領域とバッティングするが、割り禁にすればたぶん問題ない。
案3。kernelをflash(ROM)に置いたまま。
起動時に data section を FLASH から RAM へコピーしなければならない。ldscript で text と data の位置を考えて指定する必要がある。
とてもめんどくさそう。やるとしても後から考えよう。
というわけで素直に案2にする。
§ § §
star_start.S と star_machdep.c をガリガリ書いて、デバッグ用のシリアル直書き関数を携えて実行。
再配置のための自分自身のコピーもMMU Enableもできたようだ。デバッグ用のUART直叩きputc関数により、0xC0000000の仮想アドレスで実行できていることは確認。ヮーィ
しかし copyright は未だ表示されない。どうも consinit() で止まっているようだ。
どうやらこのUARTもなんちゃって16C550互換な様子。com.c に場合分けが必要。
でもこのせいではない。どうも bus_space_map が変っぽいなぁ…
とりあえず無理矢理comcnattachを通してやるとpanic()が動いた。
なにそれこわい
§ § §
よく見たら options CPU_FA526 の入れ忘れだった。
気をとり直しして再度ビルドして実行。
むー。star_machdep.c が適当だからっぽいなぁ。もうちょっとちゃんと読もう。
なるほど、確かにl1tableとstackに使っている。…が、l1tableは16kbyteあればいいし、stackも仮設定で sys/arch/arm/arm32/locore.S の中で svcstk としてちゃんと確保されなおすので、やっぱり 2Mbyte は取りすぎのような気がする。evbarm/orion_nas は 32kbyte だった。これくらいなら納得だ。
メモリレイアウトをどうしようかダラダラ考えていてあまり進んでなかったのだが、kernel を flash に置いたまま実行というのもしたいなぁ、と思って各領域を細かく l1table に登録することも少し考えてみたが、data セクションとかは結局 copy しなきゃならないし ldscript を別にしなきゃいけないしでめんどくさそうなので日和る。
案1。kernelがメモリに置かれた場合(0x21000000)は、0x20000000-0x21FFFFFF および kernel の後ろを VM にする。
とてもめんどくさそう。
RAM 0x20000000 (U-Boot) → VM RAM 0x20F00000 → VM RAM 0x21000000 (kernel) → KERNEL(0xC0000000) + VM + msgbuf RAM end 0x22000000
案2。起動直後に 0x21000000 (または任意の場所) にロードされた自分自身を 0x20000000 にコピーする。
0x20000000〜 は U-Boot の領域とバッティングするが、割り禁にすればたぶん問題ない。
RAM 0x20000000 (U-Boot) → KERNEL(0xC0000000) + VM RAM 0x20F00000 → VM RAM 0x21000000 (kernel→copy) → VM + msgbuf RAM end 0x22000000
案3。kernelをflash(ROM)に置いたまま。
起動時に data section を FLASH から RAM へコピーしなければならない。ldscript で text と data の位置を考えて指定する必要がある。
とてもめんどくさそう。やるとしても後から考えよう。
FLASH 0x10000000 (kernel on flash) → KERNEL(0xC0000000) RAM 0x20000000 (U-Boot) → DATA RAM 0x20F00000 → VM RAM 0x21000000 → VM + msgbuf RAM end 0x22000000
というわけで素直に案2にする。
§ § §
star_start.S と star_machdep.c をガリガリ書いて、デバッグ用のシリアル直書き関数を携えて実行。
再配置のための自分自身のコピーもMMU Enableもできたようだ。デバッグ用のUART直叩きputc関数により、0xC0000000の仮想アドレスで実行できていることは確認。ヮーィ
しかし copyright は未だ表示されない。どうも consinit() で止まっているようだ。
どうやらこのUARTもなんちゃって16C550互換な様子。com.c に場合分けが必要。
でもこのせいではない。どうも bus_space_map が変っぽいなぁ…
とりあえず無理矢理comcnattachを通してやるとpanic()が動いた。
Load address: 0x21000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################# done Bytes transferred = 2578976 (275a20 hex) ## Starting application at 0x21000000 ... 0xc010c06c HELLO consinit:start iobase:0x78000000 # 注: このへんは生々しいprintf debugの跡 iot:0xc027b9bc ioh:0xf7800000 consinit:done Hello? NetBSD/evbarm STR81xx/91xx panic: No support for this CPU type (66015260) in kernel
なにそれこわい
§ § §
よく見たら options CPU_FA526 の入れ忘れだった。
気をとり直しして再度ビルドして実行。
NetBSD/evbarm STR81xx/91xx physmemory: 8192 pages at 0x20000000 -> 0x21ffffff freestart = 0x202b4000, free_pages = 7500 (0x00001d4c) Allocating page tables pv_pa = 202b4000, L1_TABLE_SIZE=16384 IRQ stack: p0x202c2000 v0xc02c2000 ABT stack: p0x202c3000 v0xc02c3000 UND stack: p0x202c4000 v0xc02c4000 SVC stack: p0x202c5000 v0xc02c5000 Creating L1 page table at 0x202b4000 Mapping kernel pmap_map_chunk: pa=0x20000000 va=0xc0000000 size=0x20c000 resid=0x20c000 prot=0x3 cache=1 SSPPPPPPPPPPPP pmap_map_chunk: pa=0x2020c000 va=0xc020c000 size=0xa8000 resid=0xa8000 prot=0x3 cache=1 PPPPLLLLLLLLLLPPPP Constructing L2 page tables pmap_map_chunk: pa=0x202c2000 va=0xc02c2000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c3000 va=0xc02c3000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c4000 va=0xc02c4000 size=0x1000 resid=0x1000 prot=0x3 cache=1 P pmap_map_chunk: pa=0x202c5000 va=0xc02c5000 size=0x2000 resid=0x2000 prot=0x3 cache=1 PP pmap_map_chunk: pa=0x202b4000 va=0xc02b4000 size=0x4000 resid=0x4000 prot=0x3 cache=2 PPPP pmap_map_chunk: pa=0x202b8000 va=0xc02b8000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202b9000 va=0xc02b9000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202ba000 va=0xc02ba000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bb000 va=0xc02bb000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bc000 va=0xc02bc000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bd000 va=0xc02bd000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202be000 va=0xc02be000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202bf000 va=0xc02bf000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P pmap_map_chunk: pa=0x202c0000 va=0xc02c0000 size=0x1000 resid=0x1000 prot=0x3 cache=2 P panic: pmap_map_entry: no L2 table for VA 0xffff0000
むー。star_machdep.c が適当だからっぽいなぁ。もうちょっとちゃんと読もう。
EOF