メッセージ欄

分類 【NetBSD】 で検索

一覧で表示する

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を移植するための記録 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で動くようになりました。

NetBSD on ThinkPad E145
2014/06/29(日) 19:17 NetBSD はてブ情報 はてブに登録 はてブ数

ThinkPad E145買いました。
これまでCore-i5な15inchマシンやAMD C-60なネットブックを持ち出していたのですが、帯に短しタスキに長し状態が続いておりました。Macbook Airあたりをサクッと買えればよいのですが、Retinaモデルが出そうにないし、現行モデルMBAはSSDが遅くなったなどという評判を聞くにあたり、まぁ、そこそこの性能とそこそこの携帯性とそこそこの値段のPCを調達したのでした。

さて、このThinkPad E145にはAMD A4-5000が載ってます。デフォルトのAMD E1-2500だとAMD C-60で色々懲りたこともあり、アップグレードしました。
ストレージはHDDしか選択できず、まぁ、エントリークラスだからしょうがないかなー、と思って買ったのだけど、実際に動作させてみると、CPUがそれなりなのでやっぱり動きのキビキビ感が欲しくなり、SSDに載せ替えました。CFDの256GBのやつ(CSSD-S6T256NHG6Q)です。

例によってbuild.shベンチを走らせてみました。結果は次の表のとおり。先日購入したNUCの結果と合わせて。
CPUbare/vmtoolskernelStorageetc
Core-i5bare4'502,30SSD6.1.4 on ?
Core-i5vmware6'492,46vmdk on SSD6.1.4 on 6.1.4 on Win8.1
A4-5000bare11'296'18SSD6.1.4 on 6.1.4
A4-5000vmware36'1215'54vmdk on SSD6.1.4 on 6.1.4 on Win8
A4-5000vmware37'1616'12vmdk on HDD6.1.4 on 6.1.4 on Win8
なお、仮想マシンの設定は2core, 2GBramです。仮想マシンの場合はbuild.sh -j4でそれ以外の場合は-j8での実行です。

まとめると、対Core-i5だと2.4倍遅い。native vs VMだと3倍遅い。SSDとHDDはVMwareだとあまり効果がない。

うーん、vmwareでの結果がイマイチ信じられず。SSD効果もあまり感じられませんね。むしろ4coreとかにしたほうが良いのかな... しかし、Core-i5速いなぁ。

ちなみに、NetBSDをインストールするためにCDからブートする必要があります。
そのため、工場出荷時の設定から以下の設定を変更する必要がありました。

- SecureBootをdisableに
- UEFI/Legacy BootをBothに

まず、SecureBootをdisableにしないとUEFI/Legacy Bootが触れないので注意が必要です。

http://running-dog.net/2013/11/post_804.htmlの情報が大変参考になりました。

ひとまず、Windows8に戻して、Windows8.1へのアップデートを実行中。
ぼちぼち使っていこうと思います。