What works, with images from [1]:
virt-install \
--import --name riscv64 \
--arch riscv64 --machine virt \
--memory 2048 \
--rng /dev/urandom \
--disk /var/lib/libvirt/images/stage4-disk.img,bus=virtio \
--boot kernel=/var/lib/libvirt/images/bbl,kernel_args="console=ttyS0 ro
root=/dev/vda"
[1]
https://fedorapeople.org/groups/risc-v/disk-images/
Signed-off-by: Lubomir Rintel <lkundrak(a)v3.sk>
---
docs/schemas/basictypes.rng | 2 ++
src/qemu/qemu_command.c | 15 ++++++++-------
src/qemu/qemu_domain.c | 18 +++++++++++++++---
src/qemu/qemu_domain_address.c | 21 +++++++++++----------
src/util/virarch.c | 3 +++
src/util/virarch.h | 6 ++++++
6 files changed, 45 insertions(+), 20 deletions(-)
diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng
index 1a18cd31b1..14a3670e5c 100644
--- a/docs/schemas/basictypes.rng
+++ b/docs/schemas/basictypes.rng
@@ -398,6 +398,8 @@
<value>ppc64</value>
<value>ppc64le</value>
<value>ppcemb</value>
+ <value>riscv32</value>
+ <value>riscv64</value>
<value>s390</value>
<value>s390x</value>
<value>sh4</value>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index f91d3ae5ac..12f90521d4 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8940,14 +8940,15 @@ static bool
qemuChrIsPlatformDevice(const virDomainDef *def,
virDomainChrDefPtr chr)
{
- if (def->os.arch == VIR_ARCH_ARMV7L || def->os.arch == VIR_ARCH_AARCH64) {
-
- /* pl011 (used on mach-virt) is a platform device */
- if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
- chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM &&
- chr->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011) {
+ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
+ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM) {
+ if ((def->os.arch == VIR_ARCH_ARMV7L || def->os.arch == VIR_ARCH_AARCH64)
&&
+ chr->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011)
+ return true;
+ if (ARCH_IS_RISCV(def->os.arch) &&
+ qemuDomainIsVirt(def) &&
+ chr->targetModel == VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NS16550A)
return true;
- }
}
/* If we got all the way here and we're still stuck with the default
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index db73f45204..20d05da9c4 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2914,6 +2914,14 @@ qemuDomainDefAddDefaultDevices(virDomainDefPtr def,
case VIR_ARCH_PARISC:
case VIR_ARCH_PARISC64:
case VIR_ARCH_PPCLE:
+ break;
+
+ case VIR_ARCH_RISCV32:
+ case VIR_ARCH_RISCV64:
+ addDefaultUSB = false;
+ addDefaultMemballoon = false;
+ break;
+
case VIR_ARCH_UNICORE32:
case VIR_ARCH_XTENSA:
case VIR_ARCH_XTENSAEB:
@@ -5138,7 +5146,7 @@ static const char *
qemuDomainDefaultNetModel(const virDomainDef *def,
virQEMUCapsPtr qemuCaps)
{
- if (ARCH_IS_S390(def->os.arch))
+ if (ARCH_IS_S390(def->os.arch) || ARCH_IS_RISCV(def->os.arch))
return "virtio";
if (def->os.arch == VIR_ARCH_ARMV7L ||
@@ -5470,7 +5478,10 @@ qemuDomainChrDefPostParse(virDomainChrDefPtr chr,
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SPAPR_VTY;
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
- chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011;
+ if (ARCH_IS_RISCV(def->os.arch))
+ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_NS16550A;
+ else
+ chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011;
break;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP:
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_SCLPCONSOLE;
@@ -8449,7 +8460,8 @@ qemuDomainMachineIsVirt(const char *machine,
const virArch arch)
{
if (arch != VIR_ARCH_ARMV7L &&
- arch != VIR_ARCH_AARCH64)
+ arch != VIR_ARCH_AARCH64 &&
+ !ARCH_IS_RISCV(arch))
return false;
if (STRNEQ(machine, "virt") &&
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 87e1dc3bd2..5d9a073d25 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -480,13 +480,13 @@ static void
qemuDomainAssignVirtioMMIOAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps)
{
- if (def->os.arch != VIR_ARCH_ARMV7L &&
- def->os.arch != VIR_ARCH_AARCH64)
- return;
-
- if (!(STRPREFIX(def->os.machine, "vexpress-") ||
- qemuDomainIsVirt(def)))
+ if (def->os.arch == VIR_ARCH_ARMV7L || def->os.arch == VIR_ARCH_AARCH64) {
+ if (!(STRPREFIX(def->os.machine, "vexpress-") ||
+ qemuDomainIsVirt(def)))
+ return;
+ } else if (!ARCH_IS_RISCV(def->os.arch)) {
return;
+ }
/* We use virtio-mmio by default on mach-virt guests only if they already
* have at least one virtio-mmio device: in all other cases, we prefer
@@ -2163,11 +2163,12 @@ static bool
qemuDomainSupportsPCI(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps)
{
- if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch !=
VIR_ARCH_AARCH64))
- return true;
-
- if (STREQ(def->os.machine, "versatilepb"))
+ if (def->os.arch == VIR_ARCH_ARMV7L) {
+ if (STREQ(def->os.machine, "versatilepb"))
+ return true;
+ } else if (!(def->os.arch != VIR_ARCH_AARCH64 || ARCH_IS_RISCV(def->os.arch)))
{
return true;
+ }
if (qemuDomainIsVirt(def) &&
virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_GPEX))
diff --git a/src/util/virarch.c b/src/util/virarch.c
index be48bcfb89..77b893b0ac 100644
--- a/src/util/virarch.c
+++ b/src/util/virarch.c
@@ -65,6 +65,9 @@ static const struct virArchData {
{ "ppc64le", 64, VIR_ARCH_LITTLE_ENDIAN },
{ "ppcemb", 32, VIR_ARCH_BIG_ENDIAN },
+ { "riscv32", 32, VIR_ARCH_LITTLE_ENDIAN },
+ { "riscv64", 64, VIR_ARCH_LITTLE_ENDIAN },
+
{ "s390", 32, VIR_ARCH_BIG_ENDIAN },
{ "s390x", 64, VIR_ARCH_BIG_ENDIAN },
{ "sh4", 32, VIR_ARCH_LITTLE_ENDIAN },
diff --git a/src/util/virarch.h b/src/util/virarch.h
index af5ff83528..806a23fade 100644
--- a/src/util/virarch.h
+++ b/src/util/virarch.h
@@ -55,6 +55,9 @@ typedef enum {
VIR_ARCH_PPC64LE, /* PowerPC 64 LE
http://en.wikipedia.org/wiki/PowerPC */
VIR_ARCH_PPCEMB, /* PowerPC 32 BE
http://en.wikipedia.org/wiki/PowerPC */
+ VIR_ARCH_RISCV32, /* RISC-V 64 LE
http://en.wikipedia.org/wiki/RISC-V */
+ VIR_ARCH_RISCV64, /* RISC-V 32 BE
http://en.wikipedia.org/wiki/RISC-V */
+
VIR_ARCH_S390, /* S390 32 BE
http://en.wikipedia.org/wiki/S390 */
VIR_ARCH_S390X, /* S390 64 BE
http://en.wikipedia.org/wiki/S390x */
VIR_ARCH_SH4, /* SuperH4 32 LE
http://en.wikipedia.org/wiki/SuperH */
@@ -87,6 +90,9 @@ typedef enum {
(arch) == VIR_ARCH_ARMV7B ||\
(arch) == VIR_ARCH_AARCH64)
+# define ARCH_IS_RISCV(arch) ((arch) == VIR_ARCH_RISCV32 ||\
+ (arch) == VIR_ARCH_RISCV64)
+
# define ARCH_IS_S390(arch) ((arch) == VIR_ARCH_S390 ||\
(arch) == VIR_ARCH_S390X)
--
2.17.0