[ TOP | Recently ]

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 にする。
とてもめんどくさそう。

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