Ports/riscv64
RISC-V
RISC-V является архитектурой с открытым набором комманд (ISA). ISA RISC-V имеют лицензию Creative Commons license (CC BY 4.0). Любой желающий может получить финальную версию ISA пользовательского уровня и черновик ISA привилегированного уровня.
Другая ключевая особенность архитектуры RISC-V - её расширяемость, что позволяет создавать разнообразные реализации. Минимальная спецификация архитектуры RISC-V включает в себя только инструкции для записи, сохранения, переходов и целочисленной арифметики. Код инструкций не зависит от размера регистра, минимальная спецификация обозначается RV32I, RV64I или RV128I ("I" означает integer) для размеров операнда 4, 8 или 16 байт соответственно. На данный момент порт Linux работает со спецификацией "RV64IMAFDC" или "RV64GC" ("G" == "IMAFD"):
- I - целочисленные базовые инструкции;
- M - умножение и деление целых чисел;
- A - атомарные операции;
- F - число с плавающей запятой одинарной точности;
- D - число с плавающей запятой двойной точности;
- C - сжатые 16-битные инструкции.
На данной странице можно найти последнюю информацию о статусе порта ALT на RISC-V (RV64GC). Сборка системы ведётся на плате SiFive HiFive Unleashed. Для целей тестирования выполняется сборка образов для QEMU и платы HiFive Unleashed. Подробнее об этом можно прочитать тут.
Рабочий план
- Следующие ядра Linux были протестированы на SiFive HiFive Unleashed:
- Методы загрузки (boot):
- Berkeley bootloader -- ГОТОВО
- U-BOOT (link) -- ГОТОВО
- Порт Sisyphus -- В ПРОЦЕССЕ
- Toolchain -- ГОТОВО
- Linux Kernel -- ГОТОВО
- X11 -- ГОТОВО
- Desktop Environments -- В ПРОЦЕССЕ
- Образ ALT metaprofile -- ГОТОВО
- Girar Builder -- ГОТОВО
- Образ для QEMU (ссылка) -- ГОТОВО
RPM/SRPM репозиторий можно найти по этой ссылке.
OpenOCD
OpenOCD (docs) это инструмент для отладки, внутрисхемного программирования и периферийного сканирования встраиваемых систем. В частности, этот инструмент полезен для низкоуровневой отладки загрузчиков, ядра Linux, и т.д., при помощи (GDB).
Чтобы выполнить отладку HiFive Unleashed через OpenOCD и GDB, необходимо выполнить следующие шаги:
- Подключить HiFive Unleashed к ПК через USB и включить её. USB интерфейс предоставляет UART0 (/dev/ttyUSB1) и JTAG интерфейсы через FTDI FT2232H (ссылка).
- Запустить (см. простейший конфигурационный файл ниже, а так же не забыть добавить пользователя в группу plugdev): OpenOCD будет слушать порт 3333 в ожидании подключения GDB.
$ openocd -s <путь к директории с hifive-u.cfg> -f hifive-u.cfg
- Запустить GDB собранный с поддержкой цели (target) riscv64.
- Подключить GDB к OpenOCD:
gdb$ target extended-remote localhost:3333
- Теперь можно устанавливать точки останова (breakpoints), исследовать память, дизассемблировать области памяти, и т.д. Для удобства возможно подгружать ELF файлы с отладочной информацией для импорта символов, что даёт возможность устанавливать точки останова на эти символы.
Пример простейшего конфигурационного файла hifive-u.cfg:
adapter_khz 1000
interface ftdi
ftdi_device_desc "Dual RS232-HS"
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 0
ftdi_layout_init 0x0018 0x001b
set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000913
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x80000000 -work-area-size 10000 -work-area-backup 1
init
halt
echo "Ready for Remote Connections"
OpenSBI
QEMU virt
Для запуска образов на QEMU необходимо выполнить следующие шаги:
Шаг 0. Для запуска порта ALT на RISC-V необходимо установить QEMU с поддержкой riscv64. Например, в случае хостовой системы на ALT x86_64: qemu-system-riscv-core.
Шаг 1.a Прошивка OpenSBI для QEMU virt находится внутри qcow2/qcow2c. Скопируем её из образа:
root$ qemu-nbd -c /dev/nbd0 qemu-riscv64.qcow2c
root$ mount /dev/nbd0p1 /mnt
root$ cp -v /mnt/usr/share/opensbi/qemu/virt/firmware/fw_payload.elf .
user$ FIRM=./fw_payload.elf
Шаг 1.b Альтернативный вариант: загрузить и установить последнюю версию пакета прошивки OpenSBI для QEMU virt. После этого прошивка OpenSBI будет находится в /usr/share/opensbi/qemu/virt/firmware/fw_payload.elf
Например:
user$ curl -O http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/opensbi-firmware-qemu-0.6-alt1.noarch.rpm
root$ rpm -i opensbi-firmware-qemu-0.6-alt1.noarch.rpm
user$ FIRM=/usr/share/opensbi/qemu/virt/firmware/fw_payload.elf
Шаг 2. Запуск образа qcow2/qcow2c на QEMU можно осуществить следующей командой, указав в QCOW путь к образу:
$ QCOW=qemu-riscv64.qcow2c
$ qemu-system-riscv64 \
-nographic -machine virt -kernel "$FIRM" \
-m 2G -smp cpus=4 \
-drive file="$QCOW",id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev user,id=eth0,hostfwd=tcp::5900-:5900 -device virtio-net-device,netdev=eth0
Шаг 3. Дальнейшая настройка графической системы выполняется при помощи VNC. При подкючении по VNC установлен стандартный пароль alt, его будет предложено поменять при первоначальной настройке.
HiFive Unleashed
Для запуска образов на SiFive HiFive Unleashed (FU540) SoC необходимо выполнить следующие шаги:
Шаг 0. Предполагается, что microSD карточка находится в /dev/sdb. Выполним разметку microSD и создание файловой системы:
root$ sgdisk -g --clear \
--new=2::+32K --change-name=2:'fsbl' --typecode=2:5B193300-FC78-40CD-8002-E86C45580B47 \
--new=3::+8M: --change-name=3:'opensbi-uboot' --typecode=3:2E54B353-1271-4842-806F-E436D6AF6985 \
--new=1::-0 --change-name=4:'root' --typecode=4:0FC63DAF-8483-4772-8E79-3D69D8477DE4 \
/dev/sdb
root$ mkfs.ext4 /dev/sdb1
root$ mount /dev/sdb1 /mnt
root$ tar -xpvf hifive-unleashed-riscv64.tar.xz -C /mnt
Шаг 1.а. First Stage BootLoader (FSBL) и OpenSBI находятся внутри распакованного дерева /mnt. Запишем их на разделы 2 и 3 соответственно, а затем размонтируем раздел:
root$ dd if=/mnt/usr/share/fu540_boot/fsbl.bin of=/dev/sdb2 bs=1M
root$ dd if=/mnt/usr/share/opensbi/sifive/fu540/firmware/fw_payload.bin of=/dev/sdb3 bs=1M
root$ sync; umount /mnt
Шаг 1.б. Альтернативный вариант: загрузить и установить First Stage BootLoader (FSBL) и OpenSBI для FU540.
Например:
root$ curl -O http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/fu540-bootloaders-0-alt1.git54bfc90.noarch.rpm
root$ curl -O http://ftp.altlinux.org/pub/distributions/ALTLinux/ports/riscv64/Sisyphus/noarch/RPMS.classic/opensbi-firmware-fu540-0.6-alt1.noarch.rpm
root$ rpm -i fu540-bootloaders-0-alt1.git54bfc90.noarch.rpm
root$ rpm -i opensbi-firmware-fu540-0.6-alt1.noarch.rpm
root$ dd if=/usr/share/fu540_boot/fsbl.bin of=/dev/sdb2 bs=1M
root$ dd if=/usr/share/opensbi/sifive/fu540/firmware/fw_payload.bin of=/dev/sdb3 bs=1M
root$ sync; umount /mnt
Шаг 3. Система на microSD каточке готова к загрузке. Дальнейшая настройка графической системы выполняется при помощи VNC. При подключении по VNC установлен стандартный пароль alt, его будет предложено поменять при первоначальной настройке.
Полезные ссылки:
- утилиты для Berkeley bootloader для слияния ядра Linux в bbl.bin с dummy payload.
- RISC-V ISA
- All Aboard -- интересный блог Палмера Даббелта о RISC-V, toolchain, и т.д.
- OSSDEVCONF-2018