RISC-V vs. MIPS
riscV
OpenBSDのRISCについての対応マシンの案内。
The following machines are targeted by OpenBSD/riscv64: Microsemi PolarFire SoC Icicle Kit SiFive HiFive Unmatched
RISCーVを取り巻く現状
bios
QEMUからbootした時のログ。BIOSからも報告が有るって新鮮。HARTってあるけど、CPUの事らしい。
https://static.dev.sifive.com/U54-MC-RVCoreIP.pdf では、HARdware Thread て表現してる、業界言葉だなあ。(from sys/arch/riscv64/dev/plic.c)
ob$ sh boot OpenSBI v0.9 Platform Name : riscv-virtio,qemu Platform Features : timer,mfdeleg Platform HART Count : 2 Firmware Base : 0x80000000 Firmware Size : 108 KB Runtime SBI Version : 0.2 Domain0 Name : root Domain0 Boot HART : 0 Domain0 HARTs : 0*,1* Domain0 Region00 : 0x0000000080000000-0x000000008001ffff () Domain0 Region01 : 0x0000000000000000-0xffffffffffffffff (R,W,X) Domain0 Next Address : 0x0000000080200000 Domain0 Next Arg1 : 0x0000000082200000 Domain0 Next Mode : S-mode Domain0 SysReset : yes :
u-boot
次は重厚なBOOTのプログラム。素早くスペースを叩くと、メニューの選択が出来る。リナ方面で重用されてるgrubの別実装と思えばいいんだな。
U-Boot 2021.10 (Apr 09 2022 - 02:54:35 -0600) CPU: rv64imafdcsu Model: riscv-virtio,qemu DRAM: 512 MiB Flash: 32 MiB Loading Environment from nowhere... OK In: uart@10000000 Out: uart@10000000 Err: uart@10000000 Net: eth0: virtio-net#1 Hit any key to stop autoboot: 0 ;;; 3秒の余裕しかないので、お早めに Device 0: QEMU VirtIO Block Device Type: Hard Disk Capacity: 4096.0 MB = 4.0 GB (8388608 x 512) ... is now current device Scanning virtio 0:1... ** Unable to read file / ** Failed to load '/' libfdt fdt_check_header(): FDT_ERR_BADMAGIC Scanning disk virtio-blk#0... Found 3 disks No EFI system partition BootOrder not defined EFI boot manager: Cannot load any image Found EFI removable media binary efi/boot/bootriscv64.efi 152954 bytes read in 5 ms (29.2 MiB/s) libfdt fdt_check_header(): FDT_ERR_BADMAGIC Booting /efi\boot\bootriscv64.efi disks: sd0*
bootrisc64.efiを見付たので、それを起動するとな。
booting
そいつが、OpenBSDを起動する。勿論、bootrisc64.efiはOpenBSDが用意して、DISKのMSDOSエリアに配置したものだ。で、やっと見慣れた風景が出てきた。
>> OpenBSD/riscv64 BOOTRISCV64 1.4 boot> booting sd0a:/bsd: 5295632+1298808+203816+699544 [346640+122+473736+339288]=0x9f7ef0 bootargs: all mapped type 0x4 pa 0x80000000 va 0x80000000 pages 0x20 attr 0x8 type 0x7 pa 0x80020000 va 0x80020000 pages 0x1e0 attr 0x8 type 0x2 pa 0x80200000 va 0x80200000 pages 0x4000 attr 0x8 type 0x7 pa 0x84200000 va 0x84200000 pages 0x3cfb attr 0x8 : [ using 1160752 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2022 OpenBSD. All rights reserved. https://www.OpenBSD.org OpenBSD 7.2 (GENERIC.MP) #188: Wed Sep 28 04:06:11 MDT 2022 deraadt@riscv64.openbsd.org:/usr/src/sys/arch/riscv64/compile/GENERIC.MP real mem = 536870912 (512MB) avail mem = 467066880 (445MB) random: good seed from bootblocks :
mmu
ふと、MMUとかの機構がどうなってるか、軽く調べてみた。
RISC-Vの仮想アドレス→物理アドレス変換機構の構成と実装について (Ver.1.10版)
それっぽいのが有るか、sys/arch/riscv64/riscv64の中で検索。対象はアセンブラね。特殊なやつは、アセンブラで記述されてるから。
vbox$ grep satp *.S cpuswitch.S: la t0, pmap_set_satp locore.S: csrw satp, s2 locore.S: csrw satp, s2 locore.S: csrw satp, a2 vbox$ grep tval *.S exception.S: csrr t0, stval
出てきたな。
spec
石の全般について当って(砕けろ)。
裸のマシンにOSを作る、仕様書のリンクがあって参考になるな。
ここに濃い話が集っているなあ。
RISC-V Instruction Set Specifications
qemu monitor
ddbが動いていたので、そこに落ちてからレジスターの値を表示。
riscv# inddb Stopped at ddb_sysctl+0xaa: c.li s1,0 ddb{1}> show register ra 0xffffffc00041077a ddb_sysctl+0xaa sp 0xffffffc03cc0dd10 gp 0xffffffc03cc0dc40 tp 0xffffffc00067cfa6 plic_splx+0x76 t0 0x3fffffc000 t1 0xffffffc000287462 rw_exit+0x3c t2 0xffffffc00088f908 rw_ops+0x20 s0 0xffffffc03cc0dd20 : s11 0x29d39f9b8 t3 0x7 t4 0x2 t5 0xffffffffffffffff t6 0x8 ddb_sysctl+0xaa: c.li s1,0 ddb{1}> machine cpuinfo 0: stopped * 1: ddb
今度はQEMUのレベルで確認。
riscv# sync ;; C-a c riscv# QEMU 6.2.0 monitor - type 'help' for more information (qemu) info registers (qemu) info registers pc ffffffc00021b394 mhartid 0000000000000000 mstatus 0000000a000000a2 mip 0000000000000000 mie 00000000000000aa mideleg 0000000000000222 medeleg 000000000000b109 mtvec 0000000080000520 stvec ffffffc000625a70 mepc ffffffc00029a3d2 sepc ffffffc00021b394 mcause 0000000000000009 scause 8000000000000005 mtval 0000000000000000 stval 0000000000000000 mscratch 000000008001a000 sscratch 0000000000000000 satp 8000000000080df8 x0/zero 0000000000000000 x1/ra ffffffc00047f518 x2/sp ffffffc03cb87e30 x3/gp ffffffc000a31e68 x4/tp ffffffc00309e800 x5/t0 ffffffc000281984 x6/t1 ffffffc0004c75c0 x7/t2 ffffffc00088f930 : f28/ft8 0000000000000000 f29/ft9 0000000000000000 f30/ft10 0000000000000000 f31/ft11 0000000000000000 (qemu) ;;; C-a c RET riscv#
管理レジスターが何の目的か分れば、全貌が掴めるな。
riscV on FreeBSD and ArchLinux
OpenBSDで動いているriscVをバックアップを兼ねてFreeBSDに持ってきた。ひょっとしてちゃんと環境を整ると動くかも知れない。*.binもコピー。下記の設定で無事に動いた。なお、qemu-gaを動かしておく必要は無いみたい。謹んで訂正します。いわゆる早とちりだね。
qemu-system-riscv64 \ -machine virt \ -nographic \ -m 512M \ -bios fw_jump.bin \ -kernel u-boot.bin \ -drive file=disk.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0,ipv6=off -device virtio-net-device,netdev=net0
ならばひょっとしてDebianでも動くんじゃ? やってみたら、途中で刺さった。
: com0 at simplebus0: ns16550, no working fifo com0: console pciecam0 at simplebus0 pci0 at pciecam0 "Red Hat Host" rev 0x00 at pci0 dev 0 function 0 not configured virtio0 at simplebus0: Virtio Block Device vioblk0 at virtio0 scsibus0 at vioblk0: 1 targets sd0 at scsibus0 targ 0 lun 0: <VirtIO, Block Device, > sd0: 4096MB, 512 bytes/sector, 8388608 sectors virtio1 at simplebus0: Virtio Network Device vio0 at virtio1: address 52:54:00:12:34:56 virtio2 at simplebus0: Virtio Unknown (0) Device virtio3 at simplebus0: Virtio Unknown (0) Device virtio4 at simplebus0: Virtio Unknown (0) Device virtio5 at simplebus0: Virtio Unknown (0) Device virtio6 at simplebus0: Virtio Unknown (0) Device virtio7 at simplebus0: Virtio Unknown (0) Device "clint" at simplebus0 not configured Killed
しょうがないので、殺した。FreeBSDのqemuは6.2.0。それに対してDebianはバージョン控えめの5.2.0だった。このせいなのかなあ?
sakae@deb:~$ qemu-system-riscv64 -M ? Supported machines are: microchip-icicle-kit Microchip PolarFire SoC Icicle Kit none empty machine sifive_e RISC-V Board compatible with SiFive E SDK sifive_u RISC-V Board compatible with SiFive U SDK spike RISC-V Spike board (default) virt RISC-V VirtIO board sakae@deb:~$ qemu-system-riscv64 -cpu ? any rv64 sifive-e51 sifive-u54
この情報は6.2.0と一緒だ。何か闇がありそうだな。どなたか追試を希望。*.binは下記のようにして入手出来る。パッケージは単なるtar玉だ。
sakae@deb:/tmp/t$ curl -O -L https://ftp.riken.jp/OpenBSD/7.2/packages/i386/opensbi-0.9p0.tgz sakae@deb:/tmp/t$ tar xvf opensbi-0.9p0.tgz +CONTENTS +DESC share/opensbi/generic/fw_dynamic.bin share/opensbi/generic/fw_jump.bin sakae@deb:/tmp/t$ curl -O -L https://ftp.riken.jp/OpenBSD/7.2/packages/i386/u-boot-riscv64-2021.10p4.tgz :
後は、
https://ftp.riken.jp/OpenBSD/7.2/riscv64/install72.img を取ってくる。ネットワークインストールでよければ、https://ftp.riken.jp/OpenBSD/7.2/riscv64/miniroot72.img だ。インストール手順は、前回の投稿を参考に。
少しは自助努力せいという事で、禁欲敵なDebianを離れ、先端を走るArchLinuxで試してみた。 パッケージ名前にqemu-system-riscv64が無くて焦ったけど、qemu-system-riscvで、32,64Bit版の両方が入るのね。
[sakae@arch ~]$ qemu-system-riscv64 -version QEMU emulator version 7.1.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
これで無事に動いたよ。
色々な環境で動く事が確認出来ので、そろそろOpenBSD(64bit)の版数を上げておくかな。何か問題が出ても、riscv64 for OpenBSD は動いているからね。で、糞石とはおさらばするのさ。
まあ、本当に見るべき所は、arch/{i386,risc64} の部分だけだけどね。OSは動いてしまえば、石が何であろうと、そんなの関係ねぇー(ddbを除く)。面白いのは、OSが起動するまでのゴタゴタと、石って言うか、マシン独自の部分だけだ。
ob$ du -sh i386 riscv64 2.3M i386 946K riscv64
マシンに固有の部分のソース容量。riscv64はすっきりしてる。逆に言えば糞石は無闇に複雑すぎるって事。Q.E.D.
octeon
riscvの先輩に当るMIPS系もOSが提供されてる。
Install octeon on Qemu question(s)
若し動けば mips64 が手に入るはずなんだけど、どうも無理っぽい。bootさせるのに特殊な設備が必要だろう。そう、risc-V や arm64 みたいに注目を集つめている石じゃないからね。
潔く諦めよう。変わりにmipsのシュミレータ君を呼んでみる。
spim
何でspimなんてのを知ってるかと言うと、昔購入した本に出ていたから。
vbox$ spim SPIM Version 8.0 of January 8, 2010 Copyright 1990-2010, James R. Larus. All Rights Reserved. See the file README for a full copyright notice. Loaded: /usr/local/share/spim/exceptions.s (spim)
アセンブラーのソースを与えると、即実行してくれる。勉強には丁度いいかな。
gxemul
MIPSアーキテクチャ に紹介されてた GXemul
GXemul is a free instruction-level machine emulator, emulating not only the CPU, but also other hardware components, making it possible to use the emulator to run unmodified operating systems such as NetBSD, OpenBSD, or Linux. A few different machine types are emulated. The following machine types are emulated well enough to run at least one "guest OS": * ARM: CATS (NetBSD/cats, OpenBSD/cats), IQ80321 (NetBSD/evbarm), NetWinder (NetBSD/netwinder) * MIPS: DECstation 5000/200 (NetBSD/pmax, OpenBSD/pmax, Ultrix, Linux/DECstation, Sprite), Acer Pica-61 (NetBSD/arc), NEC MobilePro 770, 780, 800, 880 (NetBSD/hpcmips), Cobalt (NetBSD/cobalt), Malta (NetBSD/evbmips, Linux/Malta) Algorithmics P5064 (NetBSD/algor), SGI O2 (aka IP32) (NetBSD/sgi) * PowerPC: IBM 6050/6070 (PReP, PowerPC Reference Platform) (NetBSD/prep), MacPPC (generic "G4" Macintosh) (NetBSD/macppc) * SuperH: Sega Dreamcast (NetBSD/dreamcast, Linux/dreamcast), Landisk (OpenBSD/landisk)
こちらは重厚そうだな。入れるのが憚れますよ。