RISC-V vs. MIPS

riscV

OpenBSDのRISCについての対応マシンの案内。

The following machines are targeted by OpenBSD/riscv64:

	Microsemi PolarFire SoC Icicle Kit
	SiFive HiFive Unmatched

PolarFire SoC Icicle Kit ファーストインプレッション

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

石の全般について当って(砕けろ)。

RISC-V OSを作ろう (1) ~ブート処理

裸のマシンにOSを作る、仕様書のリンクがあって参考になるな。

Risc-V

ここに濃い話が集っているなあ。

RISC-V Instruction Set Specifications

Supervisor-Level ISA, Version 1.12

RISC-VのDebianイメージをQEMUで動かす

RISC Vに従うCPUの上で動作するOSをRustで書く(CPU実験余興)

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#

管理レジスターが何の目的か分れば、全貌が掴めるな。

RISC-VでLinuxを動かすためのレジスタ制御

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 A MIPS32 Simulator

Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念

何で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)

こちらは重厚そうだな。入れるのが憚れますよ。

RISC-V vs. MIPS