FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VブートのためのSpikeでの検証環境について (2. Linuxのブート環境を構築)

SpikeでBuildbootで生成したLinuxをブートするにあたり、Spikeでシミュレーションして動作を確認している。 SpikeでLinuxのブートを再現するためにはどうすればよいのか、調査している。

基本的に、SpikeにOpenSBIでのブートローダカーネル、rootfsを指定することになるのだが、これの組み合わせでどのようにすればいいのか調査している。

まず単純に、spike向けで生成したイメージを指定するとSpike上でLinuxをブートすることができる。

spike --kernel=output_hifive/images/Image --initrd=output_spike/images/rootfs.cpio output_hifive/images/fw_jump.elf
[    0.083420] loop: module loaded
[    0.084125] libphy: Fixed MDIO Bus: probed
[    0.084775] e1000e: Intel(R) PRO/1000 Network Driver
[    0.085070] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    0.085465] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    0.085850] ehci-pci: EHCI PCI platform driver
[    0.086130] ehci-platform: EHCI generic platform driver
[    0.086460] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    0.086830] ohci-pci: OHCI PCI platform driver
[    0.087105] ohci-platform: OHCI generic platform driver
[    0.087555] usbcore: registered new interface driver uas
[    0.087890] usbcore: registered new interface driver usb-storage
[    0.088305] mousedev: PS/2 mouse device common for all mice
[    0.088905] usbcore: registered new interface driver usbhid
[    0.089235] usbhid: USB HID core driver
[    0.089865] NET: Registered protocol family 10
[    0.090475] Segment Routing with IPv6
[    0.090730] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.091360] NET: Registered protocol family 17
[    0.091735] 9pnet: Installing 9P2000 support
[    0.092030] Key type dns_resolver registered
[    0.092325] debug_vm_pgtable: [debug_vm_pgtable         ]: Validating architecture page table helpers
[    0.093275] Freeing unused kernel memory: 220K
[    0.117385] Run /init as init process
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Saving random seed: [    0.185875] random: dd: uninitialized urandom read (512 bytes read)
OK
Starting network: OK

Welcome to Buildroot
buildroot login:

一方で、hifive向けのrootfsを指定すると、Ethernetの確認が入ってしまうのか、ネットワークの設定の部分でブートが止まってしまった。

spike --kernel=output_hifive/images/Image --initrd=output_hifive/images/rootfs.cpio output_hifive/images/fw_jump.elf
[    0.124745] NET: Registered protocol family 17
[    0.125120] 9pnet: Installing 9P2000 support
[    0.125395] Key type dns_resolver registered
[    0.125690] debug_vm_pgtable: [debug_vm_pgtable         ]: Validating architecture page table helpers
[    0.126635] Freeing unused kernel memory: 220K
[    0.147385] Run /init as init process
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Saving random seed: [    0.214145] random: dd: uninitialized urandom read (512 bytes read)
OK
Starting network: Waiting for interface eth0 to appear............... timeout!
run-parts: /etc/network/if-pre-up.d/wait_iface: exit status 1
FAIL
can't open /dev/ttySIF0: No such file or directory
can't open /dev/ttySIF0: No such file or directory
can't open /dev/ttySIF0: No such file or directory
can't open /dev/ttySIF0: No such file or directory
can't open /dev/ttySIF0: No such file or directory
can't open /dev/ttySIF0: No such file or directory

というわけで、Spike用のrootfsを使えばとりあえず前に進めることができるということが分かった。

次に、UARTの置き換えを試してみる。RISC-Vのhostioを使うのではなく、シリアルデバイスを使うように置き換える。この場合はdtsを置き換えて、Spikeに専用のデバイスライブラリを追加する。

/dts-v1/;

/ {
  #address-cells = <2>;
  #size-cells = <2>;
  compatible = "ucbbar,spike-bare-dev";
  model = "ucbbar,spike-bare";
  chosen {
    /* bootargs = [00]; */
    stdout-path = "/uart@54000000";
  };
  cpus {
    #address-cells = <1>;
    #size-cells = <0>;
    timebase-frequency = <10000000>;

これでLinuxをブートすると、一応シリアルデバイスに書き込むことができるようになった。ただしこの時点でLinuxのブートができなくなってしまっている。

spike --extlib=libserialdevice.so --device=serialdevice,1409286144,uart --dtb=dts/rv64imafdc.dtb --kernel=output_hifive/images/Image --initrd=output_spike/images/rootfs.cpio output_hifive/images/fw_jump.elf

これはdtsにrootfsのオプションがついていないからで、Spikeのデフォルトdtsを確認するとわかる。

spike --dump-dts --kernel=output_hifive/images/Image --initrd=output_hifive/images/rootfs.cpio output_hifive/images/fw_jump.elf

dtsの記述に、linux,initrd-start, linux,initrdbootargsが追加されている。これを自前のdtsにも追加するとよい。

/dts-v1/;

/ {
  #address-cells = <2>;
  #size-cells = <2>;
  compatible = "ucbbar,spike-bare-dev";
  model = "ucbbar,spike-bare";
  chosen {
    linux,initrd-start = <4274410496>;
    linux,initrd-end = <4294963200>;
    bootargs = "root=/dev/ram console=hvc0 earlycon=sbi";
  };
spike --isa=rv64imafdc --extlib=../../msrh/msrh_r2/spike_dpi/libserialdevice.so --device=serialdevice,1409286144,uart --dtb=../../msrh/msrh_r2/dts/rv64imafdc.dtb --kernel=output_hifive/images/Image --initrd=output_spike/images/rootfs.cpio output_hifive/images/fw_jump.elf`

うまくシリアルデバイスにログイン画面を出力することができた。

[    0.086770] usbcore: registered new interface driver usb-storage
[    0.087170] mousedev: PS/2 mouse device common for all mice
[    0.087770] usbcore: registered new interface driver usbhid
[    0.088095] usbhid: USB HID core driver
[    0.088720] NET: Registered protocol family 10
[    0.089335] Segment Routing with IPv6
[    0.089585] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.090210] NET: Registered protocol family 17
[    0.090580] 9pnet: Installing 9P2000 support
[    0.090855] Key type dns_resolver registered
[    0.091150] debug_vm_pgtable: [debug_vm_pgtable         ]: Validating architecture page table helpers
[    0.092085] Freeing unused kernel memory: 220K
[    0.117340] Run /init as init process
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Saving random seed: [    0.185945] random: dd: uninitialized urandom read (512 bytes read)
OK
Starting network: OK

Welcome to Buildroot
buildroot login: