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