Documentation/Platforms/RISCV: Difference between revisions
(Add Debian boot instructions) |
(Update to use -bios correctly) |
||
Line 1: | Line 1: | ||
== Description == | == Description == | ||
RISC-V is an open source instruction set. It is a modular with only a small set of mandatory instructions. Every other module might be implemented by vendors | RISC-V is an open source instruction set. It is a modular with only a small set of mandatory instructions. Every other module might be implemented by vendors | ||
allowing RISC-V to be suitable for small | allowing RISC-V to be suitable for small embedded systems up to large supercomputers. | ||
== Build Directions == | == Build Directions == | ||
For | For RV64: | ||
./configure --target-list=riscv64-softmmu && make | ./configure --target-list=riscv64-softmmu && make | ||
For | For RV32: | ||
./configure --target-list=riscv32-softmmu && make | ./configure --target-list=riscv32-softmmu && make | ||
Line 28: | Line 28: | ||
-m 2G \ | -m 2G \ | ||
-kernel Fedora-Minimal-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \ | -kernel Fedora-Minimal-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \ | ||
-bios none \ | |||
-object rng-random,filename=/dev/urandom,id=rng0 \ | -object rng-random,filename=/dev/urandom,id=rng0 \ | ||
-device virtio-rng-device,rng=rng0 \ | -device virtio-rng-device,rng=rng0 \ | ||
Line 45: | Line 46: | ||
Once the images are build you can boot them using: | Once the images are build you can boot them using: | ||
qemu-system-riscv32 \ | qemu-system-riscv32 \ | ||
- | -bios ./tmp-glibc/deploy/images/qemuriscv32/fw_jump.elf \ | ||
-device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ | -device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ | ||
-drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv32.ext4,if=none,format=raw \ | -drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv32.ext4,if=none,format=raw \ | ||
Line 64: | Line 65: | ||
Once the images are build you can boot them using: | Once the images are build you can boot them using: | ||
qemu-system-riscv64 \ | qemu-system-riscv64 \ | ||
- | -bios ./tmp-glibc/deploy/images/qemuriscv64/fw_jump.elf \ | ||
-device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ | -device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ | ||
-drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv64.ext4,if=none,format=raw \ | -drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv64.ext4,if=none,format=raw \ | ||
Line 90: | Line 91: | ||
qemu-system-riscv32 \ | qemu-system-riscv32 \ | ||
-M virt -nographic \ | -M virt -nographic \ | ||
- | -bios output/images/fw_jump.elf \ | ||
- | -kernel output/images/Image \ | ||
-append "root=/dev/vda ro" \ | -append "root=/dev/vda ro" \ | ||
-drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ | -drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ | ||
Line 109: | Line 110: | ||
qemu-system-riscv64 \ | qemu-system-riscv64 \ | ||
-M virt -nographic \ | -M virt -nographic \ | ||
- | -bios output/images/fw_jump.elf \ | ||
- | -kernel output/images/Image \ | ||
-append "root=/dev/vda ro" \ | -append "root=/dev/vda ro" \ | ||
-drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ | -drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ | ||
Line 145: | Line 146: | ||
*[mailto:palmer@sifive.com Palmer Dabbelt] | *[mailto:palmer@sifive.com Palmer Dabbelt] | ||
*[mailto:alistair.francis@wdc.com Alistair Francis] | *[mailto:alistair.francis@wdc.com Alistair Francis] | ||
Revision as of 17:26, 2 July 2020
Description
RISC-V is an open source instruction set. It is a modular with only a small set of mandatory instructions. Every other module might be implemented by vendors allowing RISC-V to be suitable for small embedded systems up to large supercomputers.
Build Directions
For RV64:
./configure --target-list=riscv64-softmmu && make
For RV32:
./configure --target-list=riscv32-softmmu && make
Booting Linux
Booting 64-bit Debian
Follow the instructions on the Debian wiki to boot Debian on QEMU: https://wiki.debian.org/RISC-V
Booting 64-bit Fedora
Download the Fedora prebuilt images from: https://dl.fedoraproject.org/pub/alt/risc-v/repo/virt-builder-images/images/ You will want to download Fedora-Minimal-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf and Fedora-Minimal-Rawhide-*-sda.raw.xz images
Decompress the rootFS:
unxz Fedora-Minimal-Rawhide-*-sda.raw.xz
Boot linux using RV64GC qemu:
qemu-system-riscv64 \ -nographic \ -machine virt \ -smp 4 \ -m 2G \ -kernel Fedora-Minimal-Rawhide-*-fw_payload-uboot-qemu-virt-smode.elf \ -bios none \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -device virtio-blk-device,drive=hd0 \ -drive file=Fedora-Minimal-Rawhide-20200108.n.0-sda.raw,format=raw,id=hd0 \ -device virtio-net-device,netdev=usernet \ -netdev user,id=usernet,hostfwd=tcp::10000-:22
- Login: root
- Password: riscv
For more details on running Fedora see the Fedora Wiki: https://fedoraproject.org/wiki/Architectures/RISC-V/Installing
Booting 32-bit OpenEmbedded Images
Follow the usual OpenEmbedded build flow using meta-riscv to build for the qemuriscv32 machine. More details on doing this can be found here: https://github.com/riscv/meta-riscv/#build-image
Once the images are build you can boot them using:
qemu-system-riscv32 \ -bios ./tmp-glibc/deploy/images/qemuriscv32/fw_jump.elf \ -device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ -drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv32.ext4,if=none,format=raw \ -device virtio-blk-device,drive=disk0 \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -kernel ./tmp-glibc/deploy/images/qemuriscv32/Image \ -append 'root=/dev/vda rw highres=off console=ttyS0 mem=512M ip=dhcp earlycon=sbi ' \ -show-cursor -nographic -machine virt -m 512 -serial mon:stdio -serial null
The above command will open up SSH and telnet ports which can be used to communicate with the guest. It will also pass in host entropy to the guest, allowing entropy to be available on boot.
NOTE: When using OpenEmbedded it is recommended to use the runqemu script to boot QEMU. It will dynamically handle display options as well as advanced networking
Booting 64-bit OpenEmbedded Images
Follow the usual OpenEmbedded build flow using meta-riscv to build for the qemuriscv64 machine. More details on doing this can be found here: https://github.com/riscv/meta-riscv/#build-image
Once the images are build you can boot them using:
qemu-system-riscv64 \ -bios ./tmp-glibc/deploy/images/qemuriscv64/fw_jump.elf \ -device virtio-net-device,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2323-:23 \ -drive id=disk0,file=./tmp-glibc/deploy/images/qemuriscv64/core-image-minimal-qemuriscv64.ext4,if=none,format=raw \ -device virtio-blk-device,drive=disk0 \ -object rng-random,filename=/dev/urandom,id=rng0 \ -device virtio-rng-device,rng=rng0 \ -kernel ./tmp-glibc/deploy/images/qemuriscv64/Image \ -append 'root=/dev/vda rw highres=off console=ttyS0 mem=512M ip=dhcp earlycon=sbi ' \ -show-cursor -nographic -machine virt -m 512 -serial mon:stdio -serial null
The above command will open up SSH and telnet ports which can be used to communicate with the guest. It will also pass in host entropy to the guest, allowing entropy to be available on boot.
NOTE: When using OpenEmbedded it is recommended to use the runqemu script to boot QEMU. It will dynamically handle display options as well as advanced networking
Booting 32-bit Buildroot Images
Clone the Buildroot source code and cd into the directory.
Generate the default config:
make qemu_riscv32_virt_defconfig
Build the images
make
Boot the images:
qemu-system-riscv32 \ -M virt -nographic \ -bios output/images/fw_jump.elf \ -kernel output/images/Image \ -append "root=/dev/vda ro" \ -drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0 -device virtio-net-device,netdev=net0
Booting 64-bit Buildroot Images
Clone the Buildroot source code and cd into the directory.
Generate the default config:
make qemu_riscv64_virt_defconfig
Build the images
make
Boot the images:
qemu-system-riscv64 \ -M virt -nographic \ -bios output/images/fw_jump.elf \ -kernel output/images/Image \ -append "root=/dev/vda ro" \ -drive file=output/images/rootfs.ext2,format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0 -device virtio-net-device,netdev=net0
Attaching GDB
To attach GDB to a QEMU RISC-V instance with only a single cluster (every machine except the sifive_u) run these commands from GDB:
target extended-remote :1234 info threads
To attach GDB to a QEMU RISC-V instance with multiple clusters (the sifive_u) run these commands from GDB:
target extended-remote :1234 add-inferior inferior 2 attach 2 set schedule-multiple info threads
The above commands assume the default GDB port exposed from QEMU of 1234. This will happen when you run QEMU with the '-s' command line argument.
If you would like QEMU to not run the guest until you have connected GDB, you can specify the '-S' command line argument as well.
Links
- Fedora RISC-V wiki
- OpenEmbedded meta-riscv
- Video: QEMU Support for the RISC-V Instruction Set Architecture
Contacts
Maintainers: