[ TOP | Recently ]

2009-07-09 pmap


serialがうまく動かなかったのは単に bus_space_tag が違っただけだった。8bit I/O を 32bit に map するべく a4x_space を使えば ok。comのクロックの設定の所だけ com.c の中で微妙に場合分け。
しかし arm の bus_space まわりも同じファイルがいろいろコピペされてるなぁ。bus幅変換はbus_spaceの基本機能として汎用的に作れそうな気がするのだが。

そして

panic: pmap_map_entry: no L2 table for VA 0xffff0000

は、「0xffff0000 に対応する L2 table entry が L1 table に無い」ということだった。
それくらい自動でやってよ pmap! とも思ったけど l2 table 領域の確保とかもあるからそうもいかないのか。

ちなみに STR81xx/91xx は 0x00080000 または 0x001000000 バイト毎に I/O が広く分布していてなかなか大変で、
star/star_machdep.c では pmap_devmap[] 以下のぶんだけ30エントリほど並べて書いている。
L1 table のサイズは 0x00100000 なので、ほぼ1デバイスで1エントリ分L1 tableを消費してしまう。

                                        PA         VA
--------------------------------------- ---------- -----------
STR8100_FLASH_SRAM_MEMORY_BANK0         0x10000000 0xE1000000
STR8100_FLASH_SRAM_MEMORY_BANK1         0x11000000 0xE1100000
STR8100_FLASH_SRAM_MEMORY_BANK2         0x12000000 0xE1200000
STR8100_FLASH_SRAM_MEMORY_BANK3         0x13000000 0xE1300000
STR8100_IDE_DEVICE_REGISTER_SPACE       0x18000000 0xE1800000
STR8100_SPI_SERIAL_FLASH_MEMORY         0x30000000 0xE3000000
STRx100_GENERIC_DMA_REGISTER            0x60000000 0xE6000000
STR8100_NIC_REGISTER                    0x70000000 0xE7000000
STR8100_SPI_PCM_TWI_IS_REGISTER         0x71000000 0xE7100000
STR8100_SDR_DDR_SDRAM_CONTROL_REGISTER  0x72000000 0xE7200000
STR8100_STATIC_MEMORY_CONTROL_REGISTER  0x73000000 0xE7300000
STR8100_IDE_CONTROL_REGISTER            0x74000000 0xE7400000
STRx100_MISC_REGISTER                   0x76000000 0xE7600000
STRx100_POWER_MANAGEMENT_REGISTER       0x77000000 0xE7700000
STRx100_UART0_REGISTER                  0x78000000 0xE7800000
STR8100_UART1_REGISTER                  0x78800000 0xE7880000
STRx100_TIMER_REGISTER                  0x79000000 0xE7900000
STRx100_WATCH_DOG_TIMER_REGISTER        0x7A000000 0xE7A00000
STRx100_REAL_TIME_CLOCK_REGISTER        0x7B000000 0xE7B00000
STRx100_GPIOA_REGISTER                  0x7C000000 0xE7C00000
STR8100_GPIOB_REGISTER                  0x7C800000 0xE7C80000
STRx100_PCI_CONFIGURATION_DATA_REGISTER 0xA0000000 0xEA000000
STRx100_PCI_CONFIGURATION_ADDR_REGISTER 0xA4000000 0xEA400000
STRx100_PCI_IO_SPACE                    0xA8000000 0xEA800000
STRx100_PCI_MEMORY_SPACE                0xB0000000 0xEB000000
STRx100_USB11_CONFIGURATION_REGISTER    0xC0000000 0xEC000000
STRx100_USB11_OPERATION_REGISTER        0xC4000000 0xEC400000
STRx100_USB20_CONFIGURATION_REGISTER    0xC8000000 0xEC800000
STRx100_USB20_OPERATION_REGISTER        0xCC000000 0xECC00000
STR8100_USB11_20_DEVICE_REGISTER        0xD0000000 0xED000000
STR8100_INTERRUPT_CONTROL_REGISTER      0xFFFFF000 0xEFFFF000

たくさんあるとTLBのパフォーマンスにも影響しそうな気が。それともcacheするのはpage単位だからそうでもない?
FlashとPCI(STR8132には無いけど)はともかく、その他のデバイスは1MByteも領域要らないので、もっと小さな領域にまとめてL1 tableのエントリ2〜3個で済ましたほうがいいのかな。

さて、おかしかった所を修正して実行。

## Starting application at 0x21000000 ...

NetBSD/evbarm STR81xx/91xx
kerneldatasize=2835336
physmemory: 8192 pages at 0x20000000 -> 0x21ffffff
freestart = 0x202b5000, free_pages = 7499 (0x00001d4b)
Allocating page tables
FIQ stack: p0x202e2000 v0xc02e2000
IRQ stack: p0x202e3000 v0xc02e3000
ABT stack: p0x202e4000 v0xc02e4000
UND stack: p0x202e5000 v0xc02e5000
SVC stack: p0x202e6000 v0xc02e6000
Creating L1 page table at 0x202b8000
Mapping kernel
Constructing L2 page tables
Mapping the vector page
devmap_bootstrap
switching to new L1 page table  @0x202b8000...done.
init subsystems: stacks vectors undefined page pmap irq done.


…の後固まった。むーん。
printfで調べてみると、どうも initarm() → main() → cpu_startup() まではちゃんと来ていて、
cpu_startup() からさらに pmap_postinit() の中で pool_grow した後の pool_item を触る所で固まっている。
これは fault が起こるべきなのに起きていないということか?
ARM_VECTORS_HI も ARM_VECTORS_LOW も試したのだがダメだった。arch/evbarm/star/star_machdep.c にはもうおかしな個所は無いはずだ。
何故だろう。arch/arm の方も読んでいかないとダメか…。

pdfともにらめっこ。


EOF