NetBSD/evbarm on Radxa Rock USB編
2014/11/09(日) 24:29 NetBSD はてブ情報 はてブに登録 はてブ数

デバイスが認識される程度に動いたよ!

root hubから先に進まず悩んでいたのですが、ふかうみさんに4port usb hubの電源を入れないとダメというヒントが大きかったですー。

オンボードの無線LANチップがugenで見えています。
sd0として見えているのは2GBのUSBメモリです。NetBSD/evbarmのbase.tgz, etc.tgz, modules.tgzが展開されているのですが、root deviceとしてマウントしようとするも、あえなくpanicしております。
Loaded initial symtab at 0x8077e7e8, strtab at 0x807b32a8, # entries 13465
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 7.99.1 (RADXA) #194: Sun Nov  9 14:38:23 UTC 2014
        root@aug:/usr/obj/sys/arch/evbarm/compile/RADXA
total memory = 1024 MB
avail memory = 1009 MB
sysctl_createv: sysctl_create(machine_arch) returned 17
kern.module.path=/stand/evbarm/7.99.1/modules
mainbus0 (root)
cpu0 at mainbus0 core 0: 1600 MHz Cortex-A9 r4p0 (Cortex V7A core)
cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu0: 32KB/32B 4-way L1 VIPT Instruction cache
cpu0: 32KB/32B 4-way write-back-locking-C L1 PIPT Data cache
cpu0: 64KB/32B 8-way write-through L2 PIPT Unified cache
vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
armperiph0 at mainbus0: mapping registers at 0x1013c000 size 12288 memh feb3c000
arml2cc0 at armperiph0: ARM PL310 r3p2 L2 Cache Controller (disabled)
arml2cc0: cache enabled
armgic0 at armperiph0: Generic Interrupt Controller, 160 sources (149 valid)
armgic0: 32 Priorities, 128 SPIs, 5 PPIs, 16 SGIs
a9tmr0 at armperiph0: A9 Global 64-bit Timer (800 MHz)
a9tmr0: interrupting on irq 27
a9wdt0 at armperiph0: A9 Watchdog Timer, default period is 12 seconds
obio0 at mainbus0: On-board I/O
grf iomux: old 00005554, new ffff5555, renew 00005555
grf iomux: old 00000000, new ffff0004, renew 00000004
grf iomux: old 00001000, new ffff1400, renew 00001400
gpio: 0x2000a000 0x00000100 -> 0x00000108
gpio: 0x2000a004 0x00000104 -> 0x0000010c
com0 at obio0: addr 0x20064000-0x200643ff intr 68  mult 4
: ns16550a, working fifo
com0: console
dwctwo0 at obio0: addr 0x10180000-0x101bffff intr 48  mult 1
: USB controller
dwctwo1 at obio0: addr 0x101c0000-0x101fffff intr 49  mult 1
: USB controller
usb0 at dwctwo0: USB revision 2.0
usb1 at dwctwo1: USB revision 2.0
uhub0 at usb0: vendor 0x0000 DWC2 root hub, class 9/0, rev 2.00/1.00, addr 1
uhub1 at usb1: vendor 0x0000 DWC2 root hub, class 9/0, rev 2.00/1.00, addr 1
uhub2 at uhub1 port 1: Genesys Logic USB2.0 Hub, class 9/0, rev 2.00/85.36, addr 2
uhub2: single transaction translator
ugen0 at uhub2 port 1
ugen0: Realtek 802.11n WLAN Adapter, rev 2.00/2.00, addr 3
umass0 at uhub2 port 3 configuration 1 interface 0
umass0: SMI Corporation USB DISK, rev 2.00/11.00, addr 4
scsibus0 at umass0: 2 targets, 1 lun per target
sd0 at scsibus0 target 0 lun 0: <S31B0807, USB DISK, 1100> disk removable
sd0: 1983 MB, 3936 cyl, 16 head, 63 sec, 512 bytes/sect x 4061184 sectors
boot device: <unknown>
root device: sd0a
dump device (default sd0b):
file system (default generic):
root on sd0a dumps on sd0b
mountroot: trying ffs...
root file system type: ffs
WARNING: no TOD clock present
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!
Undefined instruction 0xdeadbeef in kernel at 0x80dfacb0 (LR 0x805db50c SP 0xbfd
c9c18)
Stopped in pid 1.1 (init) at    80dfacb0:       cdple   p14, 10, c11, c13, c15, 7

0xbfdc9ccc: netbsd:ufs_lookup+0x10
0xbfdc9d04: netbsd:VOP_LOOKUP+0xa0
0xbfdc9d54: netbsd:lookup_once+0x19c
0xbfdc9e24: netbsd:namei_tryemulroot+0x524
0xbfdc9e5c: netbsd:namei+0x34
0xbfdc9ebc: netbsd:nameiat_simple_kernel+0x64
0xbfdc9fac: netbsd:start_init+0x94
db>

Intel Edisonでシリアル文字出力
2014/11/03(月) 22:03 NetBSD はてブ情報 はてブに登録 はてブ数

さて、EdisonでもNetBSDやりたいねと。

まずは、シリアルから一文字出して気分を盛り上げたいところです。

u-bootのコマンドプロンプトから行った、シリアルコンソールのアドレス0xff010180に0x40を書き込んで@を出しましょう。

sys/arch/i386/i386/locore.Sにベタな感じで書いてみました。
--- sys/arch/i386/i386/locore.S.orig    2014-10-29 03:49:31.000000000 +0000
+++ sys/arch/i386/i386/locore.S 2014-11-03 11:37:11.000000000 +0000
@@ -304,6 +304,10 @@
        jmp     2f
 #endif

+       /* serial console put '@' */
+       movl    $0xff010180, %eax
+       movb    $0x40, (%eax)
+
 1:
        /*
         * At this point, we know that a NetBSD-specific boot loader
./build.sh -m i386 kernel=EDISONなんて感じでkernelを作って
# /usr/obj/tooldir.NetBSD-7.99.1-amd64/i486--netbsdelf/bin/objcopy -I elf32-i386 -O binary /usr/obj/sys/arch/i386/compile/EDISON/netbsd /tmp/netbsd.bin
って感じでbinary形式のkenrelを作ります。

EdisonをLinuxで起動し、scpを使ってnetbsd.binを転送後、/にコピーして再起動。
Poky (Yocto Project Reference Distro) 1.6 edison ttyMFD2

edison login: root
root@edison:~# scp tokuda@192.168.0.106:/tmp/netbsd.bin .
netbsd.bin                                    100%   14MB 614.6KB/s   00:23
root@edison:~# cp netbsd.bin /
root@edison:~# md5sum /netbsd.bin ./netbsd.bin
5d8163b95315ca2944d5a3be89ccefb7  /netbsd.bin
5d8163b95315ca2944d5a3be89ccefb7  ./netbsd.bin
root@edison:~# sync
root@edison:~# reboot
さきほど書き込んだ/netbsd.binはmmcblk0p8なのでu-boot的にはmmc 0:8って感じになるようで、次のような手順でブートしました。
U-Boot 2014.04 (Sep 08 2014 - 14:09:10)

       Watchdog enabled
DRAM:  980.6 MiB
MMC:   tangier_sdhci: 0
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
boot >
boot > ext4load mmc 0:8 100000 netbsd.bin
14473916 bytes read in 12736 ms (1.1 MiB/s)
boot > go 100000
## Starting application at 0x00100000 ...
@
おー、ちゃんと@が表示されましたねー。

実は、u-bootのときに気付いたのですが、0xff010180に0x40を書き込む際に、以前はmm.lを使って書き込んでいたのですが、それだとうまくいきません。

mm.bを使わなければなりませんでした。

u-bootでmd.l 0xff010180してみるとこんな感じです。
boot > md.l 0xff010180 4
ff010180: 03c10200 00110003 00000000 00000000    ................
レジスタの最初のほうに0x03c102が入っています。
なので、32bit単位で書き込むとおかしな表示になってしまいます。
boot > mm.l 0xff010180
ff010180: 03c10200 ? 40
&1,8M
      ア
       0l
で、うーんと思って試しに0x03c102を変更せず、下位8bitだけを変更してうまくいったわけです。
boot > mm.l 0xff010180
ff010180: 03c10200 ? 03c10240
@ff010184: 00110003 ? .
boot >
もしかすると、このシリアルコンソールってcomドライバではないってことですかね。

だとしたら、シリアルコンソールドライバをcomでラクできないってことに...

1: Andy 『Have you seen this one: https://www.reddit.com/r/freebsd/comment...』 (2016/01/20 7:14)

Intel Edison買いました
2014/11/03(月) 21:31 NetBSD はてブ情報 はてブに登録 はてブ数

Intel Edison買いました。

最新のファームにアップデート。
root@edison:~# uname -a
Linux edison 3.10.17-poky-edison+ #1 SMP PREEMPT Mon Sep 8 14:09:55 CEST 2014 i686 GNU/Linux
内蔵MMCはこんな感じでマウントされてる。
root@edison:~# mount|grep mmcblk
/dev/mmcblk0p8 on / type ext4 (rw,nodev,noatime,discard,noauto_da_alloc,data=ordered)
/dev/mmcblk0p5 on /factory type ext4 (ro,nosuid,nodev,noatime,discard,noauto_da_alloc)
/dev/mmcblk0p10 on /home type ext4 (rw,nosuid,nodev,noatime,discard,noauto_da_alloc,data=ordered)
mmcblk0p7はマウントされていないが、ここからブートしているようだ。
root@edison:~# mount -t msdos /dev/mmcblk0p7 /mnt
root@edison:~# mount | grep msdos
/dev/mmcblk0p7 on /mnt type msdos (rw,relatime,fmask=0022,dmask=0022,codepage=437,errors=remount-ro)
root@edison:~# ls /mnt
ldlinux.c32   ldlinux.sys   syslinux.cfg  vmlinuz
root@edison:~# df /mnt
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mmcblk0p7            5638      5182       456  92% /mnt
rootパーティションは10MB程度の空きがあるようだ。kernelを置くぐらいならできそうだ。
root@edison:/mnt# df -m /
Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/root                  464       454         0 100% /
Windowsからドライブとして見える領域がLinuxから簡単に参照できるのだろうか。

ブートローダはu-boot。起動時に素早くキー入力を行うとu-bootプロンプトが表示され、コマンド入力を受け付ける。
-Boot 2014.04 (Sep 08 2014 - 14:09:10)

       Watchdog enabled
DRAM:  980.6 MiB
MMC:   tangier_sdhci: 0
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0
boot > help
?       - alias for 'help'
askenv  - get environment variables from stdin
base    - print or set address offset
bdinfo  - print Board Info structure
boot    - boot default, i.e., run 'bootcmd'
bootd   - boot default, i.e., run 'bootcmd'
bootelf - Boot from an ELF image in memory
bootm   - boot application image from memory
bootvx  - Boot vxWorks from an ELF image
cmp     - memory compare
coninfo - print console devices and information
cp      - memory copy
crc32   - checksum calculation
dcache  - enable or disable data cache
dfu     - Device Firmware Upgrade
echo    - echo args to console
editenv - edit environment variable
env     - environment handling commands
exit    - exit script
ext4load- load binary file from a Ext4 filesystem
ext4ls  - list files in a directory (default /)
ext4write- create a file in the root directory
false   - do nothing, unsuccessfully
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls   - list files in a directory (default /)
fatwrite- write file into a dos filesystem
gettime - get timer val elapsed,

go      - start application at address 'addr'
gpt     - GUID Partition Table
grepenv - search environment variables
hash    - compute message digest
help    - print command description/usage
icache  - enable or disable instruction cache
in      - read data from an IO port
ini     - parse an ini file in memory and merge the specified section into the env
interrupts- enable or disable interrupts
irqinfo - print information about IRQs
itest   - return true/false on integer compare
load    - load binary file from a filesystem
loadb   - load binary file over serial line (kermit mode)
loads   - load S-Record file over serial line
loadx   - load binary file over serial line (xmodem mode)
loady   - load binary file over serial line (ymodem mode)
loop    - infinite loop on address range
ls      - list files in a directory (default /)
md      - memory display
meminfo - display memory information
mm      - memory modify (auto-incrementing address)
mmc     - MMC sub system
mmcinfo - display MMC info
mw      - memory write (fill)
nm      - memory modify (constant address)
out     - write datum to IO port
part    - disk partition related commands
pci     - list and access PCI Configuration Space
printenv- print environment variables
read    - Load binary data from a partition
reginfo - print register information
reset   - Perform RESET of the CPU
run     - run commands in an environment variable
saveenv - save environment variables to persistent storage
setenv  - set environment variables
setexpr - set environment variable as the result of eval expression
sha1sum - compute SHA1 message digest
showvar - print local hushshell variables
sleep   - delay execution for some time
source  - run script from memory
test    - minimal test like /bin/sh
timer   - access the system timer
true    - do nothing, successfully
version - print monitor, compiler and linker version
zboot   - Boot bzImage
シリアルコンソールはLinuxのdmesgからttyMFD2でアドレスは0xff010180、IRQは54の模様。
root@edison:~# dmesg | grep ttyMFD2
[    0.000000] Kernel command line: root=PARTUUID=012b3303-34ac-284d-99b4-34e03a2335f4 rootfstype=ext4 console=ttyMFD2 earlyprintk=ttyMFD2,keep loglevel=4 systemd.unit=multi-user.target hardware_id=00 g_multi.iSerialNumber=c6305d42cdcc9203bf0c6a2901a70a5a
[    0.727379] 0000:00:04.3: ttyMFD2 at MMIO 0xff010180 (irq = 54) is a hsu_debug_port_p
[    0.734998] console [ttyMFD2] enabled
[    2.368030] systemd[1]: Expecting device dev-ttyMFD2.device...
u-bootからシリアルコンソールとおぼしきアドレスに直接書き込んでみる。40を書き込んでいるが、これはアットマークのASCIIコード。
boot > mm.b 0xff010180
ff010180: 00 ? 40
@ff010181: 02 ? .
ちゃんとアットマークが表示された。

u-bootがどのようにvmlinuzを実行しているのか、u-bootからprintを実行して重要そうなところを記録しておく。
boot_target_cmd=run do_flash_os;run do_probe_dfu;run do_compute_target;run mmc-bootargs;run load_kernel;zboot ${loadaddr}
load_kernel=fatload mmc 0:7 ${loadaddr} vmlinuz
loadaddr=0x100000
MMCのパーティション7から0x100000にvmlinuzをロードし、zboot 0x100000しているようだ。

zbootはbzImage形式のファイルを処理するもののようだ。bzImage形式は、http://wiki.bit-hive.com/linuxkernelmemo/pg/bzImageに書いてある情報を参考にすると、カーネルのbinaryイメージの前にbootsect.o, setup.oというのがくっついている形式らしい。

startup_32が0x100000にあるのかと思ったが、/proc/kallsymsを見ると0xc1200000にあるようだ。
root@edison:/proc# head kallsyms
c1200000 T startup_32
c1200000 T _text
c12000b8 T start_cpu0
c12000c8 T _stext
c12000d0 T do_one_initcall
c1200230 t match_dev_by_uuid
c1200260 T name_to_dev_t
c12005d0 t init_linuxrc
c1200670 t set_ti_thread_flag
c1200680 T start_thread

APC8750にNetBSD/evbarmを移植するための記録 8/31
2014/09/01(月) 21:42 未分類 はてブ情報 はてブに登録 はてブ数

NetBSDも7.99.1になったので動くか試してみようと思い立つ。

wmt_com.cのコンパイルでコケるので、ほかのcomドライバをまねてこんなパッチ。
diff --git a/arm/wmt/wmt_com.c b/arm/wmt/wmt_com.c
index 939b60c..09e9258 100644
--- a/arm/wmt/wmt_com.c
+++ b/arm/wmt/wmt_com.c
@@ -134,8 +134,17 @@ dev_type_tty(wmtcomtty);
 dev_type_poll(wmtcompoll);

 const struct cdevsw wmtcom_cdevsw = {
-       wmtcomopen, wmtcomclose, wmtcomread, wmtcomwrite, wmtcomioctl,
-       wmtcomstop, wmtcomtty, wmtcompoll, nommap, ttykqfilter, D_TTY
+       .d_open = wmtcomopen,
+       .d_close = wmtcomclose,
+       .d_read = wmtcomread,
+       .d_write = wmtcomwrite,
+       .d_ioctl = wmtcomioctl,
+       .d_stop = wmtcomstop,
+       .d_tty = wmtcomtty,
+       .d_poll = wmtcompoll,
+       .d_mmap = nommap,
+       .d_kqfilter = ttykqfilter,
+       .d_flag = D_TTY
 };

 struct consdev wmtcomcons = {
無事に起動しましたとさ。
NetBSD/evbarm (APC) booting ...
arm32_bootmem_init: memstart=0, memsize=0x20000000, kernelstart=0x8000
arm32_bootmem_init: kernelend=0x616000
arm32_bootmem_init: adding 64757 free pages: [0x616000..0x1fffffff] (VA 0xc0616000)
arm32_bootmem_init: adding 4 free pages: [0..0x7fff] (VA 0xc0000000)
arm32_kernel_vm_init: 1 L2 pages are needed to map 0x64c000 kernel bytes
arm32_kernel_vm_init: allocating page tables for vectoradd_pages: adding pv 0xc060151c (pa 0x616000, va 0xc0616000, 1 pages) at tail
 kerneladd_pages: appending pv 0xc060c168 (0x618000..0x61bfff) to 0x616000..0x617fff
add_pages: appending pv 0xc06017b0 (0x61c000..0x61dfff) to 0x616000..0x61bfff
 vmadd_pages: appending pv 0xc06017c4 (0x61e000..0x61ffff) to 0x616000..0x61dfff
add_pages: appending pv 0xc06017d8 (0x620000..0x621fff) to 0x616000..0x61ffff
add_pages: appending pv 0xc06017ec (0x622000..0x623fff) to 0x616000..0x621fff
add_pages: appending pv 0xc0601800 (0x624000..0x625fff) to 0x616000..0x623fff
add_pages: appending pv 0xc0601814 (0x626000..0x627fff) to 0x616000..0x625fff
add_pages: appending pv 0xc0601828 (0x628000..0x629fff) to 0x616000..0x627fff
add_pages: appending pv 0xc060183c (0x62a000..0x62bfff) to 0x616000..0x629fff
add_pages: appending pv 0xc0601850 (0x62c000..0x62dfff) to 0x616000..0x62bfff
arm32_kernel_vm_init: allocating stacks
add_pages: appending pv 0xc0601af4 (0x62e000..0x62ffff) to 0x616000..0x62dfff
add_pages: appending pv 0xc0601ae0 (0x630000..0x631fff) to 0x616000..0x62ffff
add_pages: appending pv 0xc0601acc (0x632000..0x633fff) to 0x616000..0x631fff
add_pages: appending pv 0xc0601ab8 (0x634000..0x635fff) to 0x616000..0x633fff
add_pages: appending pv 0xc0601aa4 (0x636000..0x637fff) to 0x616000..0x635fff
add_pages: appending pv 0xc0601b08 (0x638000..0x639fff) to 0x616000..0x637fff
add_pages: appending pv 0xc0601558 (0x63a000..0x63dfff) to 0x616000..0x639fff
Creating L1 page table at 0x00618000
arm32_kernel_vm_init: adding L2 pt (VA 0xc0616000, PA 0x616000) for VA 0xffff0000
 (vectors)arm32_kernel_vm_init: adding L2 pt (VA 0xc061c000, PA 0x61c000) for VA 0xc0000000 (kernel)
arm32_kernel_vm_init: adding L2 pt (VA 0xc061e000, PA 0x61e000) for VA 0xc1000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0620000, PA 0x620000) for VA 0xc1800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0622000, PA 0x622000) for VA 0xc2000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0624000, PA 0x624000) for VA 0xc2800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0626000, PA 0x626000) for VA 0xc3000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc0628000, PA 0x628000) for VA 0xc3800000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc062a000, PA 0x62a000) for VA 0xc4000000 (vm)
arm32_kernel_vm_init: adding L2 pt (VA 0xc062c000, PA 0x62c000) for VA 0xc4800000 (vm)
Mapping kernel
arm32_kernel_vm_init: adding chunk for kernel text 0x8000..0x201fff (VA 0xc0008000)
add_pages: adding pv 0xc0601508 (pa 0x8000, va 0xc0008000, 253 pages) before pa 0x616000
arm32_kernel_vm_init: adding chunk for kernel data/bss 0x202000..0x615fff (VA 0xc0202000)
add_pages: appending pv 0xc0601580 (0x202000..0x615fff) to 0x8000..0x201fff
add_pages: merging pv 0xc060151c (0x616000..0x63dfff) to 0x8000..0x615fff
Listing Chunks
arm32_kernel_vm_init: pv 0xc0601508: chunk VA 0xc0008000..0xc063dfff (PA 0x8000, prot 3, cache 1)

Mapping Chunks
arm32_kernel_vm_init: mapping last chunk VA 0xc0008000..0xc063dfff (PA 0x8000, prot 3, cache 1)
pmap_map_chunk: pa=0x8000 va=0xc0008000 size=0x636000 resid=0x636000 prot=0x3 cache=1
PPPPLLLLLLLLLLLLLLLSSSSSLLLPPPPPPP
devmap: d8000000 -> d8ffffff @ fe000000
pmap_map_chunk: pa=0xd8000000 va=0xfe000000 size=0x1000000 resid=0x1000000 prot=0x3 cache=0
sS
                             Physical              Virtual        Num
                       Starting    Ending    Starting    Ending   Pages
               SDRAM: 0x00000000 0x1fffffff 0xc0000000 0xdfffffff 65536
        text section: 0x00008000 0x00201fff 0xc0008000 0xc0201fff 253
        data section: 0x00210000 0x00600e00 0xc0210000 0xc0600e00 505
         bss section: 0x00600e00 0x006145f8 0xc0600e00 0xc06145f8 11
   L1 page directory: 0x00618000 0x0061bfff 0xc0618000 0xc061bfff 2
   ABT stack (CPU 0): 0x0062e000 0x0062ffff 0xc062e000 0xc062ffff 1
   FIQ stack (CPU 0): 0x00630000 0x00631fff 0xc0630000 0xc0631fff 1
   IRQ stack (CPU 0): 0x00632000 0x00633fff 0xc0632000 0xc0633fff 1
   UND stack (CPU 0): 0x00634000 0x00635fff 0xc0634000 0xc0635fff 1
  IDLE stack (CPU 0): 0x00636000 0x00637fff 0xc0636000 0xc0637fff 1
           SVC stack: 0x00638000 0x00639fff 0xc0638000 0xc0639fff 1
      Message Buffer: 0x0063a000 0x0063dfff 0xc063a000 0xc063dfff 2
   Exception Vectors: 0x0063e000 0x0063ffff 0xffff0000 0xffff1fff 1
         Free Memory: 0x00640000 0x1fffffff                       64736
         Free Memory: 0x00000000 0x00007fff                       4
TTBR0=0x4000 TTBR1=0 TTBCR=0 CONTEXTIDR=0
switching to new L1 page table @0x618000... ttb (TTBR0=0x618000) OK
nfreeblocks = 2, free_pages = 64740 (0xfce4)
bootstrap done.
vectors 0xffff0000
init subsystems: stacks vectors undefined page pmap_physload pmap kpm locks l1pt cache(l1pt) specials pools [ Kernel symbol table missing! ]
done.
pmap_postinit: Allocated 35 static L1 descriptor tables
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
    2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
    The NetBSD Foundation, Inc.  All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
    The Regents of the University of California.  All rights reserved.

NetBSD 7.99.1 (APC) #0: Fri Aug 29 17:28:30 UTC 2014
        root@aug:/usr/obj/sys/arch/evbarm/compile/APC
total memory = 512 MB
avail memory = 500 MB
sysctl_createv: sysctl_create(machine_arch) returned 17
kern.module.path=/stand/evbarm/7.99.1/modules
mainbus0 (root)
cpu0 at mainbus0 core 0: ARM1176JZ-S r0p7 (ARM11J V6ZK core)
cpu0: DC enabled IC enabled WB enabled LABT
cpu0: 16KB/32B 4-way L1 VIPT Instruction cache
cpu0: 16KB/32B 4-way write-back-locking-C L1 VIPT Data cache
vfp0 at cpu0: VFP11, rounding, exceptions
obio0 at mainbus0
wmicu0 at obio0 addr 0xd8140000-0xd814ffff
wmtmr0 at obio0 addr 0xd8130100-0xd81301ff intr 37 : WMT OS Timer
wmtcom0 at obio0 addr 0xd8200000-0xd820ffff intr 32 : WMT UART
wmtcom0: console
rn_init: radix functions require max_keylen be set
boot device: <unknown>
root on md0a dumps on md0b
mountroot: trying nfs...
mountroot: trying msdos...
mountroot: trying ffs...
root file system type: ffs
WARNING: no TOD clock present
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!
init: copying out flags `-s' 3
init: copying out path `/sbin/init' 11
erase ^?, werase ^W, kill ^U, intr ^C

# ls
.profile        kern            sbin            sysinstmsgs.fr  usr
bin             libexec         sysinst         sysinstmsgs.pl  var
dev             mnt             sysinstmsgs.de  targetroot
etc             mnt2            sysinstmsgs.es  tmp
#
そういえば、6.99.44を動かすために
diff --git a/evbarm/conf/std.apc b/evbarm/conf/std.apc
index d29200b..ee8ec66 100644
--- a/evbarm/conf/std.apc
+++ b/evbarm/conf/std.apc
@@ -15,6 +15,7 @@ options       EXEC_SCRIPT
 options        ARM32
 #options       ARM11_CACHE_WRITE_THROUGH

+options                ARM11_COMPAT_MMU
 #options       __HAVE_CPU_COUNTER
 options        __HAVE_FAST_SOFTINTS            # should be in types.h
 options        KERNEL_BASE_EXT=0xc0000000
とかいう変更もしたのでした。

やっぱり、ちょいちょい最新のソースで動かさないと、原因がわからなくなるからいけませんね。

APC8750にNetBSD/evbarmを移植するための記録 7/8
2014/07/08(火) 26:48 NetBSD はてブ情報 はてブに登録 はてブ数

5月にはコードの整形やらehciを動かそうとしたりと格闘していたのですが、挫折して放置をしていました。唯一進んだのはapc_machdep.cにapc_system_resetを実装し、リブートできるようになったことぐらいでしょうか。

その辺の記録はさておき、ひさびさに手を付けようかと思いたち新しめのcurrentで動くかなーと軽い気持ちで試してみたら、そもそもコンパイルが通りません。

wmt_intr.cに
#include <arm/cpufunc.h>
を追加したり、wmt_com.cで代入しかしていない変数を削ったり、どうにかこうにかカーネルが作れるようになりました。

いざ、起動してみると、こんな感じで止まります。
switching to new L1 page table @0x68c000... ttbpanic: kernel diagnostic assertion "armreg_ttbcr_read() == __SHIFTIN(1, TTBCR_S_N)" failed: "/usr/src/sys/arch/arm/arm32/arm32_kvminit.c", line 978
なんか、arm32_kvminit.cというARM共通っぽいところでこけています。
    973 #ifdef ARM_MMU_EXTENDED
    974 	/*
    975 	 * TTBCR should have been initialized by the MD start code.
    976 	 */
    977 	KASSERT((armreg_contextidr_read() & 0xff) == 0);
    978 	KASSERT(armreg_ttbcr_read() == __SHIFTIN(1, TTBCR_S_N));
    979 	/*
    980 	 * Disable lookups via TTBR0 until there is an activated pmap.
    981 	 */
    982 	armreg_ttbcr_write(armreg_ttbcr_read() | TTBCR_S_PD0);
    983 	cpu_setttb(l1pt_pa, KERNEL_PID);
    984 	arm_isb();
    985 #else
過去の差分を見てみると、動いていた当時のソースには全く存在しない部分のようです。加えて、ARM_MMU_EXTENDEDというifdefに囲まれていることから、どうもこのあたりが臭そうです。

ARM_MMU_EXTENDEDを定義しているのはsys/arch/arm/include/cpuconf.hの次の部分でしょう。
    232 /*
    233  * Can we use the ASID support in armv6+ MMUs?
    234  */
    235 #if !defined(_LOCORE)
    236 #define	ARM_MMU_EXTENDED	((ARM_MMU_MEMC + ARM_MMU_GENERIC	\
    237 				  + ARM_MMU_SA1 + ARM_MMU_XSCALE	\
    238 				  + ARM_MMU_V6C) == 0			\
    239 				 && (ARM_MMU_V6N + ARM_MMU_V7) > 0)
    240 #if ARM_MMU_EXTENDED == 0
    241 #undef ARM_MMU_EXTENDED
    242 #endif
    243 #endif
つまり、define文の右辺が怪しいなー、という感じです。

一方、ARM_MMU_EXTENDEDで処理を分岐させているカーネルはいくつかあり、armadaxp, imx31あたりのスタートアップルーチンが関係しています。ところが、APCのお手本にしたRPIではARM_MMU_EXTENDEDは関係ないようです。

うーん、じゃぁ、うまくARM_MMU_EXTENDEDから逃げているんだろうなぁ。あるとしたら、configで何かしていないだろうかと思い立ち、evbarm/confの下にあるRPI関連のファイルをあさっていると、std.rpiのコミットログに"Define ARM11_COMPAT_MMU (for now) to keep inline with cpuconf.h changes "という記述がありました。MMUというのがいかにも関係しそうです。

ARM_MMU_EXTENDEDの定義でもコミットログにも出てきたcpuconf.hに戻ってみると、
    209 #if !defined(_KERNEL_OPT) ||						\
    210 	(defined(CPU_ARM11) && defined(ARM11_COMPAT_MMU))
    211 #define	ARM_MMU_V6C		1
    212 #else
    213 #define	ARM_MMU_V6C		0
    214 #endif
    215 
    216 #if !defined(_KERNEL_OPT) ||						\
    217 	(defined(CPU_ARM11) && !defined(ARM11_COMPAT_MMU))
    218 #define	ARM_MMU_V6N		1
    219 #else
    220 #define	ARM_MMU_V6N		0
    221 #endif
なるほど。ARM11_COMPAT_MMUは、いかにもARM_MMU_EXTENDEDの定義に絡みそうな分岐をしています。

ARM11_COMPAT_MMUが定義されると、ARM_MMU_V6C, ARM_MMU_V6Nに影響を与えます。結果として、ARM_MMU_EXTENDEDが0となり、結果としてARM_MMU_EXTENDEDがundefされるようです。

ということで、APCのstd.acpにも
options 	ARM11_COMPAT_MMU
を加え、カーネルを作り直して起動してみました。

見事、起動です!

これで、新しめのcurrentで動くようになりました。