mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-04 02:56:21 +00:00
RISC-V Patches for 4.2-rc2
This contains a pair of patches that add OpenSBI support to QEMU on RISC-V targets. The patches have been floating around for a bit, but everything seems solid now. These pass my standard test of booting OpenEmbedded, and also works when I swap around the various command-line arguments to use the new boot method. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEAM520YNJYN/OiG3470yhUCzLq0EFAl0xBrMTHHBhbG1lckBk YWJiZWx0LmNvbQAKCRDvTKFQLMurQY+wD/9ewP2nQqPaaLCkJJKKb4iYLkm7yqxu IY1xnCZvbRi5dB/5WJvZCKILB/6eaJfpH1GIx12jUS97lSgxleopSyAE9zSvcKXY guhbrblnsfA/Ogov7ivAWxqaLJD9QPFq7MaTMpserV+RAFaX7RHH7DIZX3Hizera IVkUxqNsrvWFPnEV0JiRvyYiQA7kz2Bd/Qro5S/UtalP/SQGQAxi4T+j78MI4df2 L00VIs352wJ75wu+Rv3TFRjMWevVkqzCiM67ZemXDKLh25poyZr0ccWdWFq1aXRq w90ti0WHdd92EbWLH+0tajIaAQMn+jyXcD1VIQJbEsOeSKbd4zRInTlhXlR0gloq bUOH6F3tHucZ/l/O4D/Q1mgxeLPVc+Whlq/kVvpTVq3AyaOAGSccwvz/H5Pl/LDI U+YxMndeUn6wh56z/VFxNNc3OMo0HJIn7sLckBiqWUrvx2N+jr/nLUz3XZ3zaBme G0Xdepai2Dj+BDn7CP1Bzro37pVtkT7qtDIMi5n1r3K2W+kXtuET5f0nvP4wZi44 ksFtPEuLZON0Jcu+PHCo/4haTV2guWc162iEC80vhfp4WjozKo42bt/m8wYyzI4u ZjZGJ9VqrHu7Zre8pydJXaik/xyWpdHoG4Xr859oYQJCD49Q0xBSz0eeBa9nmYyo rn4f5TTD99hEbA== =+N8r -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/palmer/tags/riscv-for-master-4.1-rc2' into staging RISC-V Patches for 4.2-rc2 This contains a pair of patches that add OpenSBI support to QEMU on RISC-V targets. The patches have been floating around for a bit, but everything seems solid now. These pass my standard test of booting OpenEmbedded, and also works when I swap around the various command-line arguments to use the new boot method. # gpg: Signature made Fri 19 Jul 2019 00:54:27 BST # gpg: using RSA key 00CE76D1834960DFCE886DF8EF4CA1502CCBAB41 # gpg: issuer "palmer@dabbelt.com" # gpg: Good signature from "Palmer Dabbelt <palmer@dabbelt.com>" [unknown] # gpg: aka "Palmer Dabbelt <palmer@sifive.com>" [unknown] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 00CE 76D1 8349 60DF CE88 6DF8 EF4C A150 2CCB AB41 * remotes/palmer/tags/riscv-for-master-4.1-rc2: hw/riscv: Load OpenSBI as the default firmware roms: Add OpenSBI version 0.4 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
1f7678fa6f
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -55,3 +55,6 @@
|
||||
[submodule "slirp"]
|
||||
path = slirp
|
||||
url = https://git.qemu.org/git/libslirp.git
|
||||
[submodule "roms/opensbi"]
|
||||
path = roms/opensbi
|
||||
url = https://git.qemu.org/git/opensbi.git
|
||||
|
21
LICENSE
21
LICENSE
@ -1,13 +1,18 @@
|
||||
The following points clarify the QEMU license:
|
||||
The QEMU distribution includes both the QEMU emulator and
|
||||
various firmware files. These are separate programs that are
|
||||
distributed together for our users' convenience, and they have
|
||||
separate licenses.
|
||||
|
||||
1) QEMU as a whole is released under the GNU General Public License,
|
||||
version 2.
|
||||
The following points clarify the license of the QEMU emulator:
|
||||
|
||||
2) Parts of QEMU have specific licenses which are compatible with the
|
||||
GNU General Public License, version 2. Hence each source file contains
|
||||
its own licensing information. Source files with no licensing information
|
||||
are released under the GNU General Public License, version 2 or (at your
|
||||
option) any later version.
|
||||
1) The QEMU emulator as a whole is released under the GNU General
|
||||
Public License, version 2.
|
||||
|
||||
2) Parts of the QEMU emulator have specific licenses which are compatible
|
||||
with the GNU General Public License, version 2. Hence each source file
|
||||
contains its own licensing information. Source files with no licensing
|
||||
information are released under the GNU General Public License, version
|
||||
2 or (at your option) any later version.
|
||||
|
||||
As of July 2013, contributions under version 2 of the GNU General Public
|
||||
License (and no later version) are only accepted for the following files
|
||||
|
5
Makefile
5
Makefile
@ -770,7 +770,10 @@ palcode-clipper \
|
||||
u-boot.e500 u-boot-sam460-20100605.bin \
|
||||
qemu_vga.ndrv \
|
||||
edk2-licenses.txt \
|
||||
hppa-firmware.img
|
||||
hppa-firmware.img \
|
||||
opensbi-riscv32-virt-fw_jump.bin \
|
||||
opensbi-riscv64-sifive_u-fw_jump.bin opensbi-riscv64-virt-fw_jump.bin
|
||||
|
||||
|
||||
DESCS=50-edk2-i386-secure.json 50-edk2-x86_64-secure.json \
|
||||
60-edk2-aarch64.json 60-edk2-arm.json 60-edk2-i386.json 60-edk2-x86_64.json
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
#include "qemu/units.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "exec/cpu-defs.h"
|
||||
@ -32,6 +33,59 @@
|
||||
# define KERNEL_BOOT_ADDRESS 0x80200000
|
||||
#endif
|
||||
|
||||
void riscv_find_and_load_firmware(MachineState *machine,
|
||||
const char *default_machine_firmware,
|
||||
hwaddr firmware_load_addr)
|
||||
{
|
||||
char *firmware_filename;
|
||||
|
||||
if (!machine->firmware) {
|
||||
/*
|
||||
* The user didn't specify -bios.
|
||||
* At the moment we default to loading nothing when this hapens.
|
||||
* In the future this defaul will change to loading the prebuilt
|
||||
* OpenSBI firmware. Let's warn the user and then continue.
|
||||
*/
|
||||
warn_report("No -bios option specified. Not loading a firmware.");
|
||||
warn_report("This default will change in QEMU 4.3. Please use the " \
|
||||
"-bios option to aviod breakages when this happens.");
|
||||
warn_report("See QEMU's deprecation documentation for details");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!strcmp(machine->firmware, "default")) {
|
||||
/*
|
||||
* The user has specified "-bios default". That means we are going to
|
||||
* load the OpenSBI binary included in the QEMU source.
|
||||
*
|
||||
* We can't load the binary by default as it will break existing users
|
||||
* as users are already loading their own firmware.
|
||||
*
|
||||
* Let's try to get everyone to specify the -bios option at all times,
|
||||
* so then in the future we can make "-bios default" the default option
|
||||
* if no -bios option is set without breaking anything.
|
||||
*/
|
||||
firmware_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
|
||||
default_machine_firmware);
|
||||
if (firmware_filename == NULL) {
|
||||
error_report("Unable to load the default RISC-V firmware \"%s\"",
|
||||
default_machine_firmware);
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
firmware_filename = machine->firmware;
|
||||
}
|
||||
|
||||
if (strcmp(firmware_filename, "none")) {
|
||||
/* If not "none" load the firmware */
|
||||
riscv_load_firmware(firmware_filename, firmware_load_addr);
|
||||
}
|
||||
|
||||
if (!strcmp(machine->firmware, "default")) {
|
||||
g_free(firmware_filename);
|
||||
}
|
||||
}
|
||||
|
||||
target_ulong riscv_load_firmware(const char *firmware_filename,
|
||||
hwaddr firmware_load_addr)
|
||||
{
|
||||
|
@ -49,6 +49,8 @@
|
||||
|
||||
#include <libfdt.h>
|
||||
|
||||
#define BIOS_FILENAME "opensbi-riscv64-sifive_u-fw_jump.bin"
|
||||
|
||||
static const struct MemmapEntry {
|
||||
hwaddr base;
|
||||
hwaddr size;
|
||||
@ -269,9 +271,8 @@ static void riscv_sifive_u_init(MachineState *machine)
|
||||
/* create device tree */
|
||||
create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline);
|
||||
|
||||
if (machine->firmware) {
|
||||
riscv_load_firmware(machine->firmware, memmap[SIFIVE_U_DRAM].base);
|
||||
}
|
||||
riscv_find_and_load_firmware(machine, BIOS_FILENAME,
|
||||
memmap[SIFIVE_U_DRAM].base);
|
||||
|
||||
if (machine->kernel_filename) {
|
||||
riscv_load_kernel(machine->kernel_filename);
|
||||
|
@ -44,6 +44,12 @@
|
||||
|
||||
#include <libfdt.h>
|
||||
|
||||
#if defined(TARGET_RISCV32)
|
||||
# define BIOS_FILENAME "opensbi-riscv32-virt-fw_jump.bin"
|
||||
#else
|
||||
# define BIOS_FILENAME "opensbi-riscv64-virt-fw_jump.bin"
|
||||
#endif
|
||||
|
||||
static const struct MemmapEntry {
|
||||
hwaddr base;
|
||||
hwaddr size;
|
||||
@ -399,9 +405,8 @@ static void riscv_virt_board_init(MachineState *machine)
|
||||
memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base,
|
||||
mask_rom);
|
||||
|
||||
if (machine->firmware) {
|
||||
riscv_load_firmware(machine->firmware, memmap[VIRT_DRAM].base);
|
||||
}
|
||||
riscv_find_and_load_firmware(machine, BIOS_FILENAME,
|
||||
memmap[VIRT_DRAM].base);
|
||||
|
||||
if (machine->kernel_filename) {
|
||||
uint64_t kernel_entry = riscv_load_kernel(machine->kernel_filename);
|
||||
|
@ -20,6 +20,9 @@
|
||||
#ifndef RISCV_BOOT_H
|
||||
#define RISCV_BOOT_H
|
||||
|
||||
void riscv_find_and_load_firmware(MachineState *machine,
|
||||
const char *default_machine_firmware,
|
||||
hwaddr firmware_load_addr);
|
||||
target_ulong riscv_load_firmware(const char *firmware_filename,
|
||||
hwaddr firmware_load_addr);
|
||||
target_ulong riscv_load_kernel(const char *kernel_filename);
|
||||
|
@ -63,3 +63,14 @@
|
||||
ARM. Licensing information is given in "edk2-licenses.txt". The image files
|
||||
are described by the JSON documents in the "pc-bios/descriptors" directory,
|
||||
which conform to the "docs/interop/firmware.json" schema.
|
||||
|
||||
- OpenSBI (https://github.com/riscv/opensbi) aims to provide an open-source
|
||||
reference implementation of the RISC-V Supervisor Binary Interface (SBI)
|
||||
specifications for platform-specific firmwares executing in M-mode. For all
|
||||
supported platforms, OpenSBI provides several runtime firmware examples.
|
||||
These example firmwares can be used to replace the legacy riscv-pk bootloader
|
||||
and enable the use of well-known bootloaders such as U-Boot.
|
||||
OpenSBI is distributed under the terms of the BSD 2-clause license
|
||||
("Simplified BSD License" or "FreeBSD License", SPDX: BSD-2-Clause). OpenSBI
|
||||
source code also contains code reused from other projects desribed here:
|
||||
https://github.com/riscv/opensbi/blob/master/ThirdPartyNotices.md.
|
||||
|
BIN
pc-bios/opensbi-riscv32-virt-fw_jump.bin
Executable file
BIN
pc-bios/opensbi-riscv32-virt-fw_jump.bin
Executable file
Binary file not shown.
BIN
pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
Executable file
BIN
pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
Executable file
Binary file not shown.
BIN
pc-bios/opensbi-riscv64-virt-fw_jump.bin
Executable file
BIN
pc-bios/opensbi-riscv64-virt-fw_jump.bin
Executable file
Binary file not shown.
@ -121,6 +121,26 @@ the backing storage specified with @option{-mem-path} can actually provide
|
||||
the guest RAM configured with @option{-m} and QEMU will fail to start up if
|
||||
RAM allocation is unsuccessful.
|
||||
|
||||
@subsection RISC-V -bios (since 4.1)
|
||||
|
||||
QEMU 4.1 introduced support for the -bios option in QEMU for RISC-V for the
|
||||
RISC-V virt machine and sifive_u machine.
|
||||
|
||||
QEMU 4.1 has no changes to the default behaviour to avoid breakages. This
|
||||
default will change in a future QEMU release, so please prepare now. All users
|
||||
of the virt or sifive_u machine must change their command line usage.
|
||||
|
||||
QEMU 4.1 has three options, please migrate to one of these three:
|
||||
1. ``-bios none`` - This is the current default behavior if no -bios option
|
||||
is included. QEMU will not automatically load any firmware. It is up
|
||||
to the user to load all the images they need.
|
||||
2. ``-bios default`` - In a future QEMU release this will become the default
|
||||
behaviour if no -bios option is specified. This option will load the
|
||||
default OpenSBI firmware automatically. The firmware is included with
|
||||
the QEMU release and no user interaction is required. All a user needs
|
||||
to do is specify the kernel they want to boot with the -kernel option
|
||||
3. ``-bios <file>`` - Tells QEMU to load the specified file as the firmwrae.
|
||||
|
||||
@section QEMU Machine Protocol (QMP) commands
|
||||
|
||||
@subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0)
|
||||
|
@ -37,6 +37,8 @@ find-cross-prefix = $(subst gcc,,$(notdir $(call find-cross-gcc,$(1))))
|
||||
powerpc64_cross_prefix := $(call find-cross-prefix,powerpc64)
|
||||
powerpc_cross_prefix := $(call find-cross-prefix,powerpc)
|
||||
x86_64_cross_prefix := $(call find-cross-prefix,x86_64)
|
||||
riscv32_cross_prefix := $(call find-cross-prefix,riscv32)
|
||||
riscv64_cross_prefix := $(call find-cross-prefix,riscv64)
|
||||
|
||||
# tag our seabios builds
|
||||
SEABIOS_EXTRAVERSION="-prebuilt.qemu.org"
|
||||
@ -52,18 +54,21 @@ EDK2_EFIROM = edk2/BaseTools/Source/C/bin/EfiRom
|
||||
default:
|
||||
@echo "nothing is build by default"
|
||||
@echo "available build targets:"
|
||||
@echo " bios -- update bios.bin (seabios)"
|
||||
@echo " vgabios -- update vgabios binaries (seabios)"
|
||||
@echo " sgabios -- update sgabios binaries"
|
||||
@echo " pxerom -- update nic roms (bios only)"
|
||||
@echo " efirom -- update nic roms (bios+efi)"
|
||||
@echo " slof -- update slof.bin"
|
||||
@echo " skiboot -- update skiboot.lid"
|
||||
@echo " u-boot.e500 -- update u-boot.e500"
|
||||
@echo " u-boot.sam460 -- update u-boot.sam460"
|
||||
@echo " efi -- update UEFI (edk2) platform firmware"
|
||||
@echo " clean -- delete the files generated by the previous" \
|
||||
"build targets"
|
||||
@echo " bios -- update bios.bin (seabios)"
|
||||
@echo " vgabios -- update vgabios binaries (seabios)"
|
||||
@echo " sgabios -- update sgabios binaries"
|
||||
@echo " pxerom -- update nic roms (bios only)"
|
||||
@echo " efirom -- update nic roms (bios+efi)"
|
||||
@echo " slof -- update slof.bin"
|
||||
@echo " skiboot -- update skiboot.lid"
|
||||
@echo " u-boot.e500 -- update u-boot.e500"
|
||||
@echo " u-boot.sam460 -- update u-boot.sam460"
|
||||
@echo " efi -- update UEFI (edk2) platform firmware"
|
||||
@echo " opensbi32-virt -- update OpenSBI for 32-bit virt machine"
|
||||
@echo " opensbi64-virt -- update OpenSBI for 64-bit virt machine"
|
||||
@echo " opensbi64-sifive_u -- update OpenSBI for 64-bit sifive_u machine"
|
||||
@echo " clean -- delete the files generated by the previous" \
|
||||
"build targets"
|
||||
|
||||
bios: build-seabios-config-seabios-128k build-seabios-config-seabios-256k
|
||||
cp seabios/builds/seabios-128k/bios.bin ../pc-bios/bios.bin
|
||||
@ -162,6 +167,24 @@ skiboot:
|
||||
efi: edk2-basetools
|
||||
$(MAKE) -f Makefile.edk2
|
||||
|
||||
opensbi32-virt:
|
||||
$(MAKE) -C opensbi \
|
||||
CROSS_COMPILE=$(riscv32_cross_prefix) \
|
||||
PLATFORM="qemu/virt"
|
||||
cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv32-virt-fw_jump.bin
|
||||
|
||||
opensbi64-virt:
|
||||
$(MAKE) -C opensbi \
|
||||
CROSS_COMPILE=$(riscv64_cross_prefix) \
|
||||
PLATFORM="qemu/virt"
|
||||
cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-virt-fw_jump.bin
|
||||
|
||||
opensbi64-sifive_u:
|
||||
$(MAKE) -C opensbi \
|
||||
CROSS_COMPILE=$(riscv64_cross_prefix) \
|
||||
PLATFORM="qemu/sifive_u"
|
||||
cp opensbi/build/platform/qemu/virt/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
|
||||
|
||||
clean:
|
||||
rm -rf seabios/.config seabios/out seabios/builds
|
||||
$(MAKE) -C sgabios clean
|
||||
@ -173,3 +196,4 @@ clean:
|
||||
$(MAKE) -C u-boot-sam460ex distclean
|
||||
$(MAKE) -C skiboot clean
|
||||
$(MAKE) -f Makefile.edk2 clean
|
||||
$(MAKE) -C opensbi clean
|
||||
|
1
roms/opensbi
Submodule
1
roms/opensbi
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit ce228ee0919deb9957192d723eecc8aaae2697c6
|
Loading…
x
Reference in New Issue
Block a user