microblaze の uclinux

ram で root fs まではかろうじて(とちゅう BUG とわれるが、、、)たちあがる。しかし、Busybox でエラー。

early_printk_console is enabled at 0x50002000
Ramdisk addr 0x00004b7b, Compiled-in FDT at 0x10172a98
Linux version 2.6.34-00671-g91e2c43 (ryos@heavens-door) (gcc version 4.1.2) #18 Wed Sep 15 00:01:21 JST 2010
setup_cpuinfo: initialising
setup_cpuinfo: No PVR support. Using static CPU info from FDT
cache: wt_msr
setup_memory: Main mem: 0x10000000-0x18000000, size 0x08000000
setup_memory: kernel addr=0x10050000-0x101d0000 size=0x00180000
setup_memory: max_mapnr: 0x8000
setup_memory: min_low_pfn: 0x10000
setup_memory: max_low_pfn: 0x18000
On node 0 totalpages: 32768
free_area_init_node: node 0, pgdat 101b191c, node_mem_map 101d1000
  Normal zone: 256 pages used for memmap
  Normal zone: 0 pages reserved
  Normal zone: 32512 pages, LIFO batch:0
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 32512
Kernel command line: console=ttyUL0 root=/dev/ram
PID hash table entries: 512 (order: -1, 2048 bytes)
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 128404k/131072k available
Hierarchical RCU implementation.
RCU-based detection of stalled CPUs is enabled.
NR_IRQS:32
xlnx,xps-intc-1.00.a #0 at 0x50003000, num_irq=5, edge=0xc
Please enable two timers in HW
xlnx,xps-timer-1.00.a #0 at 0x50001000, irq=3
microblaze_timer_set_mode: shutdown
microblaze_timer_set_mode: periodic
Calibrating delay loop... 38.65 BogoMIPS (lpj=77312)
Mount-cache hash table entries: 512
bio: create slab <bio-0> at 0
Switching to clocksource microblaze_clocksource
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (no cpio magic); looks like an initrd
BUG: Bad page state in process swapper  pfn:10000
page:101d1000 count:0 mapcount:0 mapping:(null) index:0x0
page flags: 0x80000(buddy)

Stack:
  17815e18 00003fff 10180b68 101d1000 101d1000 10090044 10180cc0 17813f40
  00010000 00000000 00000000 00000000 10000000 100900a0 10177bf8 178417a0
  178417a0 17400484 100a482c 000459d6 10000000 00000000 100459d6 1780e400
Call Trace:

[<10090044>] free_hot_cold_page+0x1a0/0x1ac
[<100900a0>] __free_pages+0x50/0x64
[<100a482c>] fput+0x28/0x3c
[<100900e0>] free_pages+0x2c/0x40
[<100a07a8>] filp_close+0x6c/0xac
[<10056984>] free_initrd_mem+0x98/0xf4
[<100a2064>] sys_close+0x70/0xc8
[<101b6200>] free_initrd+0x28/0x4c
[<101b6458>] populate_rootfs+0x234/0x28c
[<101b646c>] populate_rootfs+0x248/0x28c
[<100500d4>] do_one_initcall+0x34/0x250
[<101b6224>] populate_rootfs+0x0/0x28c
[<101b3200>] kernel_init+0xfc/0x1d0
[<101b31a8>] kernel_init+0xa4/0x1d0
[<101b319c>] kernel_init+0x98/0x1d0
[<101bc490>] init_tmpfs+0x8/0x48
[<10051d2c>] kernel_thread_helper+0xc/0x20
[<10051d20>] kernel_thread_helper+0x0/0x20

Disabling lock debugging due to kernel taint
BUG: Bad page state in process swapper  pfn:10040
page:101d1800 count:0 mapcount:0 mapping:(null) index:0x0
page flags: 0x80000(buddy)

Stack:
  17815e18 00003fff 10180b68 101d1800 101d1800 10090044 10180cc0 17813f40
  00010040 00000000 101d1400 00000000 10040000 100900a0 10177bf8 178417a0
  178417a0 17400484 100a482c 000459d6 10040000 00000040 100459d6 1780e400
Call Trace:

[<10090044>] free_hot_cold_page+0x1a0/0x1ac
[<100900a0>] __free_pages+0x50/0x64
[<100a482c>] fput+0x28/0x3c
[<100900e0>] free_pages+0x2c/0x40
[<100a07a8>] filp_close+0x6c/0xac
[<10056984>] free_initrd_mem+0x98/0xf4
[<100a2064>] sys_close+0x70/0xc8
[<101b6200>] free_initrd+0x28/0x4c
[<101b6458>] populate_rootfs+0x234/0x28c
[<101b646c>] populate_rootfs+0x248/0x28c
[<100500d4>] do_one_initcall+0x34/0x250
[<101b6224>] populate_rootfs+0x0/0x28c
[<101b3200>] kernel_init+0xfc/0x1d0
[<101b31a8>] kernel_init+0xa4/0x1d0
[<101b319c>] kernel_init+0x98/0x1d0
[<101bc490>] init_tmpfs+0x8/0x48
[<10051d2c>] kernel_thread_helper+0xc/0x20
[<10051d20>] kernel_thread_helper+0x0/0x20

Freeing initrd memory: 280k freed
ROMFS MTD (C) 2007 Red Hat, Inc.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
50002000.serial: ttyUL0 at MMIO 0x50002003 (irq = 2) is a uartlite
console [ttyUL0] enabled
brd: module loaded
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) readonly on device 1:0.
Freeing unused kernel memory: 72k freed
sh: memory exhausted
Kernel panic - not syncing: Attempted to kill init!

どうも microblaze で ram の rootfs はあまり試されていないらしい。dts に

                linux,initrd-start = <0x10000000>;
                linux,initrd-end = <0x100459d6>;

みたいな記述が必要。vmlinux には組み込まれない。(Makefile lds を読むと組み込み手段が用意されていない)

init/initramfs.c には initrd_start がないと ramfs は生成されないようだ。initrd_start があればそこから(cpio でないことを確認する -initramfs でないとき -)gz を展開して /initrd.image とする。のちにそれを ram0 にアサインする。

しかし、initrd_start はちょっとやそっとじゃ設定されない(なんじゃそりゃ)。microblaze では early_init_dt_setup_initrd_arch で設定される。これは drivers/of/fdt.c から呼ばれるが、前述の dts を参照している。powerpc アーキテクチャもそうなっているみたい(未確認。ソースを見ただけ)arm アーキテクチャはどうも kernel の軌道引数で与えるみたい。
以前のようにリンク時に自動判別したほうがスマートな気がするけど、、、
まぁいいか、microblaze の開始位置をちょっとずらして ramfs を配置して、dts に追加して(この辺が手作業だ。前は自動だったのに、、、)
まぁ initrd は使いにくくなりました。initramfs を使えというのだろうか?microblaze にはinitramfs を入れ込む仕組みがないけどね(うそ。あった)。
そっか、どっちにしろ ramfs だからどうしてもデバッグ用なんだ。立ち上がっても、毎回、気を失っているわけだから、、、最終的には rootfs は ram じゃだめなんだ(当たり前か)。だから initramfs を使うのが正解なんだな。