NULL, NULL, 0, NULL);
}
- if ((ARCH_IS_X86(guestarch) || guestarch == VIR_ARCH_AARCH64))
+ if (ARCH_IS_X86(guestarch) || guestarch == VIR_ARCH_AARCH64 ||
+ ARCH_IS_LOONGARCH(guestarch))
virCapabilitiesAddGuestFeatureWithToggle(guest, VIR_CAPS_GUEST_FEATURE_TYPE_ACPI,
true, true);
NULL, /* VIR_ARCH_ITANIUM (doesn't exist in QEMU any more) */
"lm32-evr", /* VIR_ARCH_LM32 */
- NULL, /* VIR_ARCH_LOONGARCH64 */
+ "virt", /* VIR_ARCH_LOONGARCH64 */
"mcf5208evb", /* VIR_ARCH_M68K */
"petalogix-s3adsp1800", /* VIR_ARCH_MICROBLAZE */
"petalogix-s3adsp1800", /* VIR_ARCH_MICROBLAZEEL */
} else if (ARCH_IS_X86(qemuCaps->arch)) {
ret = virQEMUCapsInitCPUModelX86(qemuCaps, type, modelInfo,
cpu, migratable);
- } else if (ARCH_IS_ARM(qemuCaps->arch)) {
+ } else if (ARCH_IS_ARM(qemuCaps->arch) || ARCH_IS_LOONGARCH(qemuCaps->arch)) {
ret = 2;
}
if (qemuDomainIsPSeries(def))
return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_IBMVSCSI;
- if (ARCH_IS_S390(def->os.arch))
+ if (ARCH_IS_S390(def->os.arch) || qemuDomainIsLoongArchVirt(def))
return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_LSI))
return VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC;
addPCIRoot = true;
break;
+ case VIR_ARCH_LOONGARCH64:
+ addPCIeRoot = true;
+ break;
+
case VIR_ARCH_CRIS:
case VIR_ARCH_ITANIUM:
case VIR_ARCH_LM32:
- case VIR_ARCH_LOONGARCH64:
case VIR_ARCH_M68K:
case VIR_ARCH_MICROBLAZE:
case VIR_ARCH_MICROBLAZEEL:
/* When there are no backwards compatibility concerns getting in
* the way, virtio is a good default */
if (ARCH_IS_S390(def->os.arch) ||
+ qemuDomainIsLoongArchVirt(def) ||
qemuDomainIsRISCVVirt(def)) {
return VIR_DOMAIN_NET_MODEL_VIRTIO;
}
cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_NEC_USB_XHCI))
cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_NEC_XHCI;
+ } else if (ARCH_IS_LOONGARCH(def->os.arch)) {
+ if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_QEMU_XHCI))
+ cont->model = VIR_DOMAIN_CONTROLLER_MODEL_USB_QEMU_XHCI;
}
}
/* forbid usb model 'qusb1' and 'qusb2' in this kind of hyperviosr */
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_ISA;
} else if (qemuDomainIsPSeries(def)) {
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SPAPR_VIO;
- } else if (qemuDomainIsARMVirt(def) || qemuDomainIsRISCVVirt(def)) {
+ } else if (qemuDomainIsARMVirt(def) ||
+ qemuDomainIsLoongArchVirt(def) ||
+ qemuDomainIsRISCVVirt(def)) {
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM;
} else if (ARCH_IS_S390(def->os.arch)) {
chr->targetType = VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SCLP;
case VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_SYSTEM:
if (qemuDomainIsARMVirt(def)) {
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_PL011;
- } else if (qemuDomainIsRISCVVirt(def)) {
+ } else if (qemuDomainIsLoongArchVirt(def) ||
+ qemuDomainIsRISCVVirt(def)) {
chr->targetModel = VIR_DOMAIN_CHR_SERIAL_TARGET_MODEL_16550A;
}
break;
if (ARCH_IS_PPC64(def->os.arch))
return VIR_DOMAIN_VIDEO_TYPE_VGA;
if (qemuDomainIsARMVirt(def) ||
+ qemuDomainIsLoongArchVirt(def) ||
qemuDomainIsRISCVVirt(def) ||
ARCH_IS_S390(def->os.arch)) {
return VIR_DOMAIN_VIDEO_TYPE_VIRTIO;
}
+static bool
+qemuDomainMachineIsLoongArchVirt(const char *machine,
+ const virArch arch)
+{
+ if (!ARCH_IS_LOONGARCH(arch))
+ return false;
+
+ if (STREQ(machine, "virt") ||
+ STRPREFIX(machine, "virt-")) {
+ return true;
+ }
+
+ return false;
+}
+
+
static bool
qemuDomainMachineIsMipsMalta(const char *machine,
const virArch arch)
}
+bool
+qemuDomainIsLoongArchVirt(const virDomainDef *def)
+{
+ return qemuDomainMachineIsLoongArchVirt(def->os.machine, def->os.arch);
+}
+
+
bool
qemuDomainHasPCIRoot(const virDomainDef *def)
{
/* In some cases, support for multibus is limited to some machine
* types */
if (qemuDomainIsARMVirt(def) ||
+ qemuDomainIsLoongArchVirt(def) ||
qemuDomainIsRISCVVirt(def)) {
return true;
}