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@xxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list