514 lines
38 KiB
HTML
514 lines
38 KiB
HTML
<!DOCTYPE html>
|
||
<html class="writer-html5" lang="en" data-content_root="../../">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>SiFive HiFive Unleashed (sifive_u) — QEMU Debian 1:8.2.2+ds-0ubuntu1.11 documentation</title>
|
||
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=fa44fd50" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/css/theme.css?v=86f27845" />
|
||
<link rel="stylesheet" type="text/css" href="../../_static/theme_overrides.css?v=08e6c168" />
|
||
|
||
|
||
<link rel="shortcut icon" href="../../_static/qemu_32x32.png"/>
|
||
|
||
<script src="../../_static/jquery.js?v=8dae8fb0"></script>
|
||
<script src="../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
|
||
<script src="../../_static/documentation_options.js?v=802af9f6"></script>
|
||
<script src="../../_static/doctools.js?v=888ff710"></script>
|
||
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
|
||
<script src="../../_static/custom.js?v=2ab9f71d"></script>
|
||
<script src="../../_static/js/theme.js"></script>
|
||
<link rel="index" title="Index" href="../../genindex.html" />
|
||
<link rel="search" title="Search" href="../../search.html" />
|
||
<link rel="next" title="‘virt’ Generic Virtual Platform (virt)" href="virt.html" />
|
||
<link rel="prev" title="Shakti C Reference Platform (shakti_c)" href="shakti-c.html" />
|
||
</head>
|
||
|
||
<body class="wy-body-for-nav">
|
||
<div class="wy-grid-for-nav">
|
||
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
|
||
<div class="wy-side-scroll">
|
||
<div class="wy-side-nav-search" style="background: #802400" >
|
||
|
||
|
||
|
||
<a href="../../index.html" class="icon icon-home">
|
||
QEMU
|
||
<img src="../../_static/qemu_128x128.png" class="logo" alt="Logo"/>
|
||
</a>
|
||
<div class="version">
|
||
8.2.2
|
||
</div>
|
||
<div role="search">
|
||
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
|
||
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
|
||
<p class="caption" role="heading"><span class="caption-text">Contents:</span></p>
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../../about/index.html">About QEMU</a></li>
|
||
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">System Emulation</a><ul class="current">
|
||
<li class="toctree-l2"><a class="reference internal" href="../introduction.html">Introduction</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../invocation.html">Invocation</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../device-emulation.html">Device Emulation</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../keys.html">Keys in the graphical frontends</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../mux-chardev.html">Keys in the character backend multiplexer</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../monitor.html">QEMU Monitor</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../images.html">Disk Images</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../virtio-net-failover.html">QEMU virtio-net standby (net_failover)</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../linuxboot.html">Direct Linux Boot</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../generic-loader.html">Generic Loader</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../guest-loader.html">Guest Loader</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../barrier.html">QEMU Barrier Client</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../vnc-security.html">VNC security</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../tls.html">TLS setup for network services</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../secrets.html">Providing secret data to QEMU</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../authz.html">Client authorization</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../gdb.html">GDB usage</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../replay.html">Record/replay</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../managed-startup.html">Managed start up options</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../bootindex.html">Managing device boot order with bootindex properties</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../cpu-hotplug.html">Virtual CPU hotplug</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../pr-manager.html">Persistent reservation managers</a></li>
|
||
<li class="toctree-l2 current"><a class="reference internal" href="../targets.html">QEMU System Emulator Targets</a><ul class="current">
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-arm.html">Arm System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-avr.html">AVR System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-m68k.html">ColdFire System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-mips.html">MIPS System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-ppc.html">PowerPC System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-openrisc.html">OpenRISC System emulator</a></li>
|
||
<li class="toctree-l3 current"><a class="reference internal" href="../target-riscv.html">RISC-V System emulator</a><ul class="current">
|
||
<li class="toctree-l4"><a class="reference internal" href="../target-riscv.html#choosing-a-board-model">Choosing a board model</a></li>
|
||
<li class="toctree-l4 current"><a class="reference internal" href="../target-riscv.html#board-specific-documentation">Board-specific documentation</a></li>
|
||
<li class="toctree-l4"><a class="reference internal" href="../target-riscv.html#risc-v-cpu-firmware">RISC-V CPU firmware</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-rx.html">RX System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-s390x.html">s390x System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-sparc.html">Sparc32 System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-sparc64.html">Sparc64 System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-i386.html">x86 System emulator</a></li>
|
||
<li class="toctree-l3"><a class="reference internal" href="../target-xtensa.html">Xtensa System emulator</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../security.html">Security</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../multi-process.html">Multi-process QEMU</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../confidential-guest-support.html">Confidential Guest Support</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../vm-templating.html">QEMU VM templating</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../user/index.html">User Mode Emulation</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../tools/index.html">Tools</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../interop/index.html">System Emulation Management and Interoperability</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../specs/index.html">System Emulation Guest Hardware Specifications</a></li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../../devel/index.html">Developer Information</a></li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #802400" >
|
||
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
|
||
<a href="../../index.html">QEMU</a>
|
||
</nav>
|
||
|
||
<div class="wy-nav-content">
|
||
<div class="rst-content">
|
||
<div role="navigation" aria-label="Page navigation">
|
||
<ul class="wy-breadcrumbs">
|
||
<li><a href="../../index.html" class="icon icon-home" aria-label="Home"></a></li>
|
||
<li class="breadcrumb-item"><a href="../index.html">System Emulation</a></li>
|
||
<li class="breadcrumb-item"><a href="../targets.html">QEMU System Emulator Targets</a></li>
|
||
<li class="breadcrumb-item"><a href="../target-riscv.html">RISC-V System emulator</a></li>
|
||
<li class="breadcrumb-item active">SiFive HiFive Unleashed (<code class="docutils literal notranslate"><span class="pre">sifive_u</span></code>)</li>
|
||
<li class="wy-breadcrumbs-aside">
|
||
<a href="https://gitlab.com/qemu-project/qemu/blob/master/docs/system/riscv/sifive_u.rst" class="fa fa-gitlab"> Edit on GitLab</a>
|
||
</li>
|
||
</ul>
|
||
<hr/>
|
||
</div>
|
||
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
|
||
<div itemprop="articleBody">
|
||
|
||
<section id="sifive-hifive-unleashed-sifive-u">
|
||
<h1>SiFive HiFive Unleashed (<code class="docutils literal notranslate"><span class="pre">sifive_u</span></code>)<a class="headerlink" href="#sifive-hifive-unleashed-sifive-u" title="Link to this heading"></a></h1>
|
||
<p>SiFive HiFive Unleashed Development Board is the ultimate RISC-V development
|
||
board featuring the Freedom U540 multi-core RISC-V processor.</p>
|
||
<section id="supported-devices">
|
||
<h2>Supported devices<a class="headerlink" href="#supported-devices" title="Link to this heading"></a></h2>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine supports the following devices:</p>
|
||
<ul class="simple">
|
||
<li><p>1 E51 / E31 core</p></li>
|
||
<li><p>Up to 4 U54 / U34 cores</p></li>
|
||
<li><p>Core Local Interruptor (CLINT)</p></li>
|
||
<li><p>Platform-Level Interrupt Controller (PLIC)</p></li>
|
||
<li><p>Power, Reset, Clock, Interrupt (PRCI)</p></li>
|
||
<li><p>L2 Loosely Integrated Memory (L2-LIM)</p></li>
|
||
<li><p>DDR memory controller</p></li>
|
||
<li><p>2 UARTs</p></li>
|
||
<li><p>1 GEM Ethernet controller</p></li>
|
||
<li><p>1 GPIO controller</p></li>
|
||
<li><p>1 One-Time Programmable (OTP) memory with stored serial number</p></li>
|
||
<li><p>1 DMA controller</p></li>
|
||
<li><p>2 QSPI controllers</p></li>
|
||
<li><p>1 ISSI 25WP256 flash</p></li>
|
||
<li><p>1 SD card in SPI mode</p></li>
|
||
<li><p>PWM0 and PWM1</p></li>
|
||
</ul>
|
||
<p>Please note the real world HiFive Unleashed board has a fixed configuration of
|
||
1 E51 core and 4 U54 core combination and the RISC-V core boots in 64-bit mode.
|
||
With QEMU, one can create a machine with 1 E51 core and up to 4 U54 cores. It
|
||
is also possible to create a 32-bit variant with the same peripherals except
|
||
that the RISC-V cores are replaced by the 32-bit ones (E31 and U34), to help
|
||
testing of 32-bit guest software.</p>
|
||
</section>
|
||
<section id="hardware-configuration-information">
|
||
<h2>Hardware configuration information<a class="headerlink" href="#hardware-configuration-information" title="Link to this heading"></a></h2>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine automatically generates a device tree blob (“dtb”)
|
||
which it passes to the guest, if there is no <code class="docutils literal notranslate"><span class="pre">-dtb</span></code> option. This provides
|
||
information about the addresses, interrupt lines and other configuration of
|
||
the various devices in the system. Guest software should discover the devices
|
||
that are present in the generated DTB instead of using a DTB for the real
|
||
hardware, as some of the devices are not modeled by QEMU and trying to access
|
||
these devices may cause unexpected behavior.</p>
|
||
<p>If users want to provide their own DTB, they can use the <code class="docutils literal notranslate"><span class="pre">-dtb</span></code> option.
|
||
These DTBs should have the following requirements:</p>
|
||
<ul class="simple">
|
||
<li><p>The /cpus node should contain at least one subnode for E51 and the number
|
||
of subnodes should match QEMU’s <code class="docutils literal notranslate"><span class="pre">-smp</span></code> option</p></li>
|
||
<li><p>The /memory reg size should match QEMU’s selected ram_size via <code class="docutils literal notranslate"><span class="pre">-m</span></code></p></li>
|
||
<li><p>Should contain a node for the CLINT device with a compatible string
|
||
“riscv,clint0” if using with OpenSBI BIOS images</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="boot-options">
|
||
<h2>Boot options<a class="headerlink" href="#boot-options" title="Link to this heading"></a></h2>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine can start using the standard -kernel functionality
|
||
for loading a Linux kernel, a VxWorks kernel, a modified U-Boot bootloader
|
||
(S-mode) or ELF executable with the default OpenSBI firmware image as the
|
||
-bios. It also supports booting the unmodified U-Boot bootloader using the
|
||
standard -bios functionality.</p>
|
||
</section>
|
||
<section id="machine-specific-options">
|
||
<h2>Machine-specific options<a class="headerlink" href="#machine-specific-options" title="Link to this heading"></a></h2>
|
||
<p>The following machine-specific options are supported:</p>
|
||
<ul>
|
||
<li><p>serial=nnn</p>
|
||
<p>The board serial number. When not given, the default serial number 1 is used.</p>
|
||
<p>SiFive reserves the first 1 KiB of the 16 KiB OTP memory for internal use.
|
||
The current usage is only used to store the serial number of the board at
|
||
offset 0xfc. U-Boot reads the serial number from the OTP memory, and uses
|
||
it to generate a unique MAC address to be programmed to the on-chip GEM
|
||
Ethernet controller. When multiple QEMU <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machines are created
|
||
and connected to the same subnet, they all have the same MAC address hence
|
||
it creates an unusable network. In such scenario, user should give different
|
||
values to serial= when creating different <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machines.</p>
|
||
</li>
|
||
<li><p>start-in-flash</p>
|
||
<p>When given, QEMU’s ROM codes jump to QSPI memory-mapped flash directly.
|
||
Otherwise QEMU will jump to DRAM or L2LIM depending on the msel= value.
|
||
When not given, it defaults to direct DRAM booting.</p>
|
||
</li>
|
||
<li><p>msel=[6|11]</p>
|
||
<p>Mode Select (MSEL[3:0]) pins value, used to control where to boot from.</p>
|
||
<p>The FU540 SoC supports booting from several sources, which are controlled
|
||
using the Mode Select pins on the chip. Typically, the boot process runs
|
||
through several stages before it begins execution of user-provided programs.
|
||
These stages typically include the following:</p>
|
||
<ol class="arabic simple">
|
||
<li><p>Zeroth Stage Boot Loader (ZSBL), which is contained in an on-chip mask
|
||
ROM and provided by QEMU. Note QEMU implemented ROM codes are not the
|
||
same as what is programmed in the hardware. The QEMU one is a simplified
|
||
version, but it provides the same functionality as the hardware.</p></li>
|
||
<li><p>First Stage Boot Loader (FSBL), which brings up PLLs and DDR memory.
|
||
This is U-Boot SPL.</p></li>
|
||
<li><p>Second Stage Boot Loader (SSBL), which further initializes additional
|
||
peripherals as needed. This is U-Boot proper combined with an OpenSBI
|
||
fw_dynamic firmware image.</p></li>
|
||
</ol>
|
||
<p>msel=6 means FSBL and SSBL are both on the QSPI flash. msel=11 means FSBL
|
||
and SSBL are both on the SD card.</p>
|
||
</li>
|
||
</ul>
|
||
</section>
|
||
<section id="running-linux-kernel">
|
||
<h2>Running Linux kernel<a class="headerlink" href="#running-linux-kernel" title="Link to this heading"></a></h2>
|
||
<p>Linux mainline v5.10 release is tested at the time of writing. To build a
|
||
Linux mainline kernel that can be booted by the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine in
|
||
64-bit mode, simply configure the kernel using the defconfig configuration:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">ARCH</span><span class="o">=</span>riscv
|
||
$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">CROSS_COMPILE</span><span class="o">=</span>riscv64-linux-
|
||
$<span class="w"> </span>make<span class="w"> </span>defconfig
|
||
$<span class="w"> </span>make
|
||
</pre></div>
|
||
</div>
|
||
<p>To boot the newly built Linux kernel in QEMU with the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u<span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>2G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-kernel<span class="w"> </span>arch/riscv/boot/Image<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-initrd<span class="w"> </span>/path/to/rootfs.ext4<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-append<span class="w"> </span><span class="s2">"root=/dev/ram"</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Alternatively, we can use a custom DTB to boot the machine by inserting a CLINT
|
||
node in fu540-c000.dtsi in the Linux kernel,</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>clint: clint@2000000 {
|
||
compatible = "riscv,clint0";
|
||
interrupts-extended = <&cpu0_intc 3 &cpu0_intc 7
|
||
&cpu1_intc 3 &cpu1_intc 7
|
||
&cpu2_intc 3 &cpu2_intc 7
|
||
&cpu3_intc 3 &cpu3_intc 7
|
||
&cpu4_intc 3 &cpu4_intc 7>;
|
||
reg = <0x00 0x2000000 0x00 0x10000>;
|
||
};
|
||
</pre></div>
|
||
</div>
|
||
<p>with the following command line options:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u<span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>8G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-kernel<span class="w"> </span>arch/riscv/boot/Image<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-dtb<span class="w"> </span>arch/riscv/boot/dts/sifive/hifive-unleashed-a00.dtb<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-initrd<span class="w"> </span>/path/to/rootfs.ext4<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-append<span class="w"> </span><span class="s2">"root=/dev/ram"</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>To build a Linux mainline kernel that can be booted by the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine
|
||
in 32-bit mode, use the rv32_defconfig configuration. A patch is required to
|
||
fix the 32-bit boot issue for Linux kernel v5.10.</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">ARCH</span><span class="o">=</span>riscv
|
||
$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">CROSS_COMPILE</span><span class="o">=</span>riscv64-linux-
|
||
$<span class="w"> </span>curl<span class="w"> </span>https://patchwork.kernel.org/project/linux-riscv/patch/20201219001356.2887782-1-atish.patra@wdc.com/mbox/<span class="w"> </span>><span class="w"> </span>riscv.patch
|
||
$<span class="w"> </span>git<span class="w"> </span>am<span class="w"> </span>riscv.patch
|
||
$<span class="w"> </span>make<span class="w"> </span>rv32_defconfig
|
||
$<span class="w"> </span>make
|
||
</pre></div>
|
||
</div>
|
||
<p>Replace <code class="docutils literal notranslate"><span class="pre">qemu-system-riscv64</span></code> with <code class="docutils literal notranslate"><span class="pre">qemu-system-riscv32</span></code> in the command
|
||
line above to boot the 32-bit Linux kernel. A rootfs image containing 32-bit
|
||
applications shall be used in order for kernel to boot to user space.</p>
|
||
</section>
|
||
<section id="running-vxworks-kernel">
|
||
<h2>Running VxWorks kernel<a class="headerlink" href="#running-vxworks-kernel" title="Link to this heading"></a></h2>
|
||
<p>VxWorks 7 SR0650 release is tested at the time of writing. To build a 64-bit
|
||
VxWorks mainline kernel that can be booted by the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine, simply
|
||
create a VxWorks source build project based on the sifive_generic BSP, and a
|
||
VxWorks image project to generate the bootable VxWorks image, by following the
|
||
BSP documentation instructions.</p>
|
||
<p>A pre-built 64-bit VxWorks 7 image for HiFive Unleashed board is available as
|
||
part of the VxWorks SDK for testing as well. Instructions to download the SDK:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>wget<span class="w"> </span>https://labs.windriver.com/downloads/wrsdk-vxworks7-sifive-hifive-1.01.tar.bz2
|
||
$<span class="w"> </span>tar<span class="w"> </span>xvf<span class="w"> </span>wrsdk-vxworks7-sifive-hifive-1.01.tar.bz2
|
||
$<span class="w"> </span>ls<span class="w"> </span>bsps/sifive_generic_1_0_0_0/uboot/uVxWorks
|
||
</pre></div>
|
||
</div>
|
||
<p>To boot the VxWorks kernel in QEMU with the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine, use:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u<span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>2G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-nic<span class="w"> </span>tap,ifname<span class="o">=</span>tap0,script<span class="o">=</span>no,downscript<span class="o">=</span>no<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-kernel<span class="w"> </span>/path/to/vxWorks<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-append<span class="w"> </span><span class="s2">"gem(0,0)host:vxWorks h=192.168.200.1 e=192.168.200.2:ffffff00 u=target pw=vxTarget f=0x01"</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>It is also possible to test 32-bit VxWorks on the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine. Create
|
||
a 32-bit project to build the 32-bit VxWorks image, and use exact the same
|
||
command line options with <code class="docutils literal notranslate"><span class="pre">qemu-system-riscv32</span></code>.</p>
|
||
</section>
|
||
<section id="running-u-boot">
|
||
<h2>Running U-Boot<a class="headerlink" href="#running-u-boot" title="Link to this heading"></a></h2>
|
||
<p>U-Boot mainline v2021.07 release is tested at the time of writing. To build a
|
||
U-Boot mainline bootloader that can be booted by the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine, use
|
||
the sifive_unleashed_defconfig with similar commands as described above for
|
||
Linux:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">CROSS_COMPILE</span><span class="o">=</span>riscv64-linux-
|
||
$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">OPENSBI</span><span class="o">=</span>/path/to/opensbi-riscv64-generic-fw_dynamic.bin
|
||
$<span class="w"> </span>make<span class="w"> </span>sifive_unleashed_defconfig
|
||
</pre></div>
|
||
</div>
|
||
<p>You will get spl/u-boot-spl.bin and u-boot.itb file in the build tree.</p>
|
||
<p>To start U-Boot using the <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine, prepare an SPI flash image, or
|
||
SD card image that is properly partitioned and populated with correct contents.
|
||
<a class="reference external" href="https://github.com/pengutronix/genimage">genimage</a> can be used to generate these images.</p>
|
||
<p>A sample configuration file for a 128 MiB SD card image is:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>cat<span class="w"> </span>genimage_sdcard.cfg
|
||
image<span class="w"> </span>sdcard.img<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>128M
|
||
|
||
<span class="w"> </span>hdimage<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">gpt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
|
||
<span class="w"> </span><span class="o">}</span>
|
||
|
||
<span class="w"> </span>partition<span class="w"> </span>u-boot-spl<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"u-boot-spl.bin"</span>
|
||
<span class="w"> </span><span class="nv">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>17K
|
||
<span class="w"> </span>partition-type-uuid<span class="w"> </span><span class="o">=</span><span class="w"> </span>5B193300-FC78-40CD-8002-E86C45580B47
|
||
<span class="w"> </span><span class="o">}</span>
|
||
|
||
<span class="w"> </span>partition<span class="w"> </span>u-boot<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"u-boot.itb"</span>
|
||
<span class="w"> </span><span class="nv">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>1041K
|
||
<span class="w"> </span>partition-type-uuid<span class="w"> </span><span class="o">=</span><span class="w"> </span>2E54B353-1271-4842-806F-E436D6AF6985
|
||
<span class="w"> </span><span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>SPI flash image has slightly different partition offsets, and the size has to
|
||
be 32 MiB to match the ISSI 25WP256 flash on the real board:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>cat<span class="w"> </span>genimage_spi-nor.cfg
|
||
image<span class="w"> </span>spi-nor.img<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>32M
|
||
|
||
<span class="w"> </span>hdimage<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">gpt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span>
|
||
<span class="w"> </span><span class="o">}</span>
|
||
|
||
<span class="w"> </span>partition<span class="w"> </span>u-boot-spl<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"u-boot-spl.bin"</span>
|
||
<span class="w"> </span><span class="nv">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>20K
|
||
<span class="w"> </span>partition-type-uuid<span class="w"> </span><span class="o">=</span><span class="w"> </span>5B193300-FC78-40CD-8002-E86C45580B47
|
||
<span class="w"> </span><span class="o">}</span>
|
||
|
||
<span class="w"> </span>partition<span class="w"> </span>u-boot<span class="w"> </span><span class="o">{</span>
|
||
<span class="w"> </span><span class="nv">image</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"u-boot.itb"</span>
|
||
<span class="w"> </span><span class="nv">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span>1044K
|
||
<span class="w"> </span>partition-type-uuid<span class="w"> </span><span class="o">=</span><span class="w"> </span>2E54B353-1271-4842-806F-E436D6AF6985
|
||
<span class="w"> </span><span class="o">}</span>
|
||
<span class="o">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Assume U-Boot binaries are put in the same directory as the config file,
|
||
we can generate the image by:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>genimage<span class="w"> </span>--config<span class="w"> </span>genimage_<boot_src>.cfg<span class="w"> </span>--inputpath<span class="w"> </span>.
|
||
</pre></div>
|
||
</div>
|
||
<p>Boot U-Boot from SD card, by specifying msel=11 and pass the SD card image
|
||
to QEMU <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u,msel<span class="o">=</span><span class="m">11</span><span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>8G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-bios<span class="w"> </span>/path/to/u-boot-spl.bin<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-drive<span class="w"> </span><span class="nv">file</span><span class="o">=</span>/path/to/sdcard.img,if<span class="o">=</span>sd
|
||
</pre></div>
|
||
</div>
|
||
<p>Changing msel= value to 6, allows booting U-Boot from the SPI flash:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u,msel<span class="o">=</span><span class="m">6</span><span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>8G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-bios<span class="w"> </span>/path/to/u-boot-spl.bin<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-drive<span class="w"> </span><span class="nv">file</span><span class="o">=</span>/path/to/spi-nor.img,if<span class="o">=</span>mtd
|
||
</pre></div>
|
||
</div>
|
||
<p>Note when testing U-Boot, QEMU automatically generated device tree blob is
|
||
not used because U-Boot itself embeds device tree blobs for U-Boot SPL and
|
||
U-Boot proper. Hence the number of cores and size of memory have to match
|
||
the real hardware, ie: 5 cores (-smp 5) and 8 GiB memory (-m 8G).</p>
|
||
<p>Above use case is to run upstream U-Boot for the SiFive HiFive Unleashed
|
||
board on QEMU <code class="docutils literal notranslate"><span class="pre">sifive_u</span></code> machine out of the box. This allows users to
|
||
develop and test the recommended RISC-V boot flow with a real world use
|
||
case: ZSBL (in QEMU) loads U-Boot SPL from SD card or SPI flash to L2LIM,
|
||
then U-Boot SPL loads the combined payload image of OpenSBI fw_dynamic
|
||
firmware and U-Boot proper.</p>
|
||
<p>However sometimes we want to have a quick test of booting U-Boot on QEMU
|
||
without the needs of preparing the SPI flash or SD card images, an alternate
|
||
way can be used, which is to create a U-Boot S-mode image by modifying the
|
||
configuration of U-Boot:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">CROSS_COMPILE</span><span class="o">=</span>riscv64-linux-
|
||
$<span class="w"> </span>make<span class="w"> </span>sifive_unleashed_defconfig
|
||
$<span class="w"> </span>make<span class="w"> </span>menuconfig
|
||
</pre></div>
|
||
</div>
|
||
<p>then manually select the following configuration:</p>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><p>Device Tree Control —> Provider of DTB for DT Control —> Prior Stage bootloader DTB</p></li>
|
||
</ul>
|
||
</div></blockquote>
|
||
<p>and unselect the following configuration:</p>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><p>Library routines —> Allow access to binman information in the device tree</p></li>
|
||
</ul>
|
||
</div></blockquote>
|
||
<p>This changes U-Boot to use the QEMU generated device tree blob, and bypass
|
||
running the U-Boot SPL stage.</p>
|
||
<p>Boot the 64-bit U-Boot S-mode image directly:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv64<span class="w"> </span>-M<span class="w"> </span>sifive_u<span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>2G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-kernel<span class="w"> </span>/path/to/u-boot.bin
|
||
</pre></div>
|
||
</div>
|
||
<p>It’s possible to create a 32-bit U-Boot S-mode image as well.</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span><span class="nb">export</span><span class="w"> </span><span class="nv">CROSS_COMPILE</span><span class="o">=</span>riscv64-linux-
|
||
$<span class="w"> </span>make<span class="w"> </span>sifive_unleashed_defconfig
|
||
$<span class="w"> </span>make<span class="w"> </span>menuconfig
|
||
</pre></div>
|
||
</div>
|
||
<p>then manually update the following configuration in U-Boot:</p>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><p>Device Tree Control —> Provider of DTB for DT Control —> Prior Stage bootloader DTB</p></li>
|
||
<li><p>RISC-V architecture —> Base ISA —> RV32I</p></li>
|
||
<li><p>Boot options —> Boot images —> Text Base —> 0x80400000</p></li>
|
||
</ul>
|
||
</div></blockquote>
|
||
<p>and unselect the following configuration:</p>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><p>Library routines —> Allow access to binman information in the device tree</p></li>
|
||
</ul>
|
||
</div></blockquote>
|
||
<p>Use the same command line options to boot the 32-bit U-Boot S-mode image:</p>
|
||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$<span class="w"> </span>qemu-system-riscv32<span class="w"> </span>-M<span class="w"> </span>sifive_u<span class="w"> </span>-smp<span class="w"> </span><span class="m">5</span><span class="w"> </span>-m<span class="w"> </span>2G<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-display<span class="w"> </span>none<span class="w"> </span>-serial<span class="w"> </span>stdio<span class="w"> </span><span class="se">\</span>
|
||
<span class="w"> </span>-kernel<span class="w"> </span>/path/to/u-boot.bin
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
|
||
<a href="shakti-c.html" class="btn btn-neutral float-left" title="Shakti C Reference Platform (shakti_c)" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
|
||
<a href="virt.html" class="btn btn-neutral float-right" title="‘virt’ Generic Virtual Platform (virt)" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
|
||
</div>
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<p>© Copyright 2025, The QEMU Project Developers.</p>
|
||
</div>
|
||
|
||
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
|
||
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
|
||
provided by <a href="https://readthedocs.org">Read the Docs</a>.
|
||
|
||
|
||
<!-- Empty para to force a blank line after "Built with Sphinx ..." -->
|
||
<p></p>
|
||
|
||
<p>This documentation is for QEMU version 8.2.2.</p>
|
||
|
||
|
||
<p><a href="../../about/license.html">QEMU and this manual are released under the
|
||
GNU General Public License, version 2.</a></p>
|
||
|
||
|
||
|
||
|
||
</footer>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
<script>
|
||
jQuery(function () {
|
||
SphinxRtdTheme.Navigation.enable(true);
|
||
});
|
||
</script>
|
||
|
||
</body>
|
||
</html> |