bool
virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
- virCapsPtr caps,
+ virArch hostarch,
virDomainVirtType type,
virCPUMode mode)
{
switch (mode) {
case VIR_CPU_MODE_HOST_PASSTHROUGH:
return type == VIR_DOMAIN_VIRT_KVM &&
- virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
+ virQEMUCapsGuestIsNative(hostarch, qemuCaps->arch);
case VIR_CPU_MODE_HOST_MODEL:
return !!virQEMUCapsGetHostModel(qemuCaps, type,
static void
-virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
- virQEMUCapsPtr qemuCaps,
+virQEMUCapsFillDomainCPUCaps(virQEMUCapsPtr qemuCaps,
+ virArch hostarch,
virDomainCapsPtr domCaps)
{
- if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+ if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
VIR_CPU_MODE_HOST_PASSTHROUGH))
domCaps->cpu.hostPassthrough = true;
- if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+ if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
VIR_CPU_MODE_HOST_MODEL)) {
virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
VIR_QEMU_CAPS_HOST_CPU_REPORTED);
domCaps->cpu.hostModel = virCPUDefCopy(cpu);
}
- if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+ if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
VIR_CPU_MODE_CUSTOM)) {
const char *blacklist[] = { "host", NULL };
VIR_AUTOSTRINGLIST models = NULL;
int
-virQEMUCapsFillDomainCaps(virCapsPtr caps,
+virQEMUCapsFillDomainCaps(virQEMUCapsPtr qemuCaps,
+ virArch hostarch,
virDomainCapsPtr domCaps,
- virQEMUCapsPtr qemuCaps,
bool privileged,
virFirmwarePtr *firmwares,
size_t nfirmwares)
firmwares, nfirmwares) < 0)
return -1;
- virQEMUCapsFillDomainCPUCaps(caps, qemuCaps, domCaps);
+ virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps);
virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk);
virQEMUCapsFillDomainDeviceGraphicsCaps(qemuCaps, graphics);
virQEMUCapsFillDomainDeviceVideoCaps(qemuCaps, video);
char ***features);
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
- virCapsPtr caps,
+ virArch hostarch,
virDomainVirtType type,
virCPUMode mode);
const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
virQEMUCapsPtr qemuCaps,
virArch guestarch);
-int virQEMUCapsFillDomainCaps(virCapsPtr caps,
+int virQEMUCapsFillDomainCaps(virQEMUCapsPtr qemuCaps,
+ virArch hostarch,
virDomainCapsPtr domCaps,
- virQEMUCapsPtr qemuCaps,
bool privileged,
virFirmwarePtr *firmwares,
size_t nfirmwares);
virQEMUCapsPtr qemuCaps)
{
size_t i;
- g_autoptr(virCaps) caps = NULL;
virCPUDefPtr cpu = def->cpu;
- if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
- return -1;
-
switch ((virCPUMode) cpu->mode) {
case VIR_CPU_MODE_HOST_PASSTHROUGH:
virBufferAddLit(buf, "host");
if (def->os.arch == VIR_ARCH_ARMV7L &&
- caps->host.arch == VIR_ARCH_AARCH64) {
+ driver->hostarch == VIR_ARCH_AARCH64) {
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_AARCH64_OFF)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("QEMU binary does not support CPU "
virDomainVirtType virttype)
{
g_autoptr(virDomainCaps) domCaps = NULL;
- g_autoptr(virCaps) caps = NULL;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
virHashTablePtr domCapsCache = virQEMUCapsGetDomainCapsCache(qemuCaps);
struct virQEMUDriverSearchDomcapsData data = {
.virttype = virttype,
};
- if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
- return NULL;
-
domCaps = virHashSearch(domCapsCache,
virQEMUDriverSearchDomcaps, &data, NULL);
if (!domCaps) {
data.arch, data.virttype)))
return NULL;
- if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+ if (virQEMUCapsFillDomainCaps(qemuCaps, driver->hostarch, domCaps,
driver->privileged,
cfg->firmwares, cfg->nfirmwares) < 0)
return NULL;
*/
virCapsPtr caps;
+ /* Immutable value */
+ virArch hostarch;
+
/* Immutable pointer, Immutable object */
virDomainXMLOptionPtr xmlopt;
static int
qemuDomainDefSetDefaultCPU(virDomainDefPtr def,
- virCapsPtr caps,
+ virArch hostarch,
virQEMUCapsPtr qemuCaps)
{
const char *model;
if (STREQ(model, "host")) {
if (ARCH_IS_S390(def->os.arch) &&
- virQEMUCapsIsCPUModeSupported(qemuCaps, caps, def->virtType,
+ virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, def->virtType,
VIR_CPU_MODE_HOST_MODEL)) {
def->cpu->mode = VIR_CPU_MODE_HOST_MODEL;
} else {
static int
qemuDomainDefPostParse(virDomainDefPtr def,
- virCapsPtr caps,
+ virCapsPtr caps G_GNUC_UNUSED,
unsigned int parseFlags,
void *opaque,
void *parseOpaque)
if (qemuCanonicalizeMachine(def, qemuCaps) < 0)
return -1;
- if (qemuDomainDefSetDefaultCPU(def, caps, qemuCaps) < 0)
+ if (qemuDomainDefSetDefaultCPU(def, driver->hostarch, qemuCaps) < 0)
return -1;
qemuDomainDefEnableDefaultFeatures(def, qemuCaps);
qemu_driver->inhibitOpaque = opaque;
qemu_driver->privileged = privileged;
+ qemu_driver->hostarch = virArchFromHost();
if (!(qemu_driver->domains = virDomainObjListNew()))
goto error;
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
return VIR_CPU_COMPARE_ERROR;
- return virCPUCompareXML(caps->host.arch, caps->host.cpu,
+ return virCPUCompareXML(driver->hostarch, caps->host.cpu,
xmlDesc, failIncompatible);
}
static int
qemuProcessUpdateGuestCPU(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
- virCapsPtr caps,
+ virArch hostarch,
unsigned int flags)
{
if (!def->cpu)
def->cpu->mode = VIR_CPU_MODE_CUSTOM;
}
- if (!virQEMUCapsIsCPUModeSupported(qemuCaps, caps, def->virtType,
+ if (!virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, def->virtType,
def->cpu->mode)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("CPU mode '%s' for %s %s domain on %s host is not "
virCPUModeTypeToString(def->cpu->mode),
virArchToString(def->os.arch),
virDomainVirtTypeToString(def->virtType),
- virArchToString(caps->host.arch));
+ virArchToString(hostarch));
return -1;
}
- if (virCPUConvertLegacy(caps->host.arch, def->cpu) < 0)
+ if (virCPUConvertLegacy(hostarch, def->cpu) < 0)
return -1;
/* nothing to update for host-passthrough */
g_autoptr(virDomainCapsCPUModels) cpuModels = NULL;
if (def->cpu->check == VIR_CPU_CHECK_PARTIAL &&
- virCPUCompare(caps->host.arch,
+ virCPUCompare(hostarch,
virQEMUCapsGetHostModel(qemuCaps, def->virtType,
VIR_QEMU_CAPS_HOST_CPU_FULL),
def->cpu, true) < 0)
priv->pausedReason = VIR_DOMAIN_PAUSED_UNKNOWN;
VIR_DEBUG("Updating guest CPU definition");
- if (qemuProcessUpdateGuestCPU(vm->def, priv->qemuCaps, caps, flags) < 0)
+ if (qemuProcessUpdateGuestCPU(vm->def, priv->qemuCaps, driver->hostarch, flags) < 0)
goto cleanup;
for (i = 0; i < vm->def->nshmems; i++)
if (!caps)
return -1;
- if (!virQEMUCapsGuestIsNative(caps->host.arch, vm->def->os.arch) ||
+ if (!virQEMUCapsGuestIsNative(driver->hostarch, vm->def->os.arch) ||
!caps->host.cpu ||
!vm->def->cpu) {
ret = 0;
if (!domCaps->machine)
domCaps->machine = g_strdup(virQEMUCapsGetPreferredMachine(qemuCaps, virtType));
- if (virQEMUCapsFillDomainCaps(caps, domCaps, qemuCaps,
+ if (virQEMUCapsFillDomainCaps(qemuCaps, caps->host.arch, domCaps,
false,
cfg->firmwares,
cfg->nfirmwares) < 0)
* ensure settings are prioritized as expected.
*/
- qemuTestSetHostArch(driver.caps, VIR_ARCH_X86_64);
+ qemuTestSetHostArch(&driver, VIR_ARCH_X86_64);
DO_TEST("pc-kvm", 0);
DO_TEST("pc-tcg", 0);
DO_TEST("pc-hardlimit+locked+hostdev", 2147483648);
DO_TEST("pc-locked+hostdev", VIR_DOMAIN_MEMORY_PARAM_UNLIMITED);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
+ qemuTestSetHostArch(&driver, VIR_ARCH_PPC64);
if (!(qemuCaps = virQEMUCapsNew())) {
ret = -1;
goto cleanup;
qemuDomainObjPrivatePtr priv = NULL;
if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
- qemuTestSetHostArch(driver.caps, info->arch);
+ qemuTestSetHostArch(&driver, info->arch);
memset(&monitor_chr, 0, sizeof(monitor_chr));
virObjectUnref(conn);
VIR_FREE(migrateURI);
if (info->arch != VIR_ARCH_NONE && info->arch != VIR_ARCH_X86_64)
- qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+ qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
return ret;
}
DO_TEST("cpu-host-passthrough", QEMU_CAPS_KVM);
DO_TEST_FAILURE("cpu-qemu-host-passthrough", QEMU_CAPS_KVM);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_S390X);
+ qemuTestSetHostArch(&driver, VIR_ARCH_S390X);
DO_TEST("cpu-s390-zEC12", QEMU_CAPS_KVM, QEMU_CAPS_CCW, QEMU_CAPS_VIRTIO_S390);
DO_TEST("cpu-s390-features", QEMU_CAPS_KVM, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION);
DO_TEST_FAILURE("cpu-s390-features", QEMU_CAPS_KVM);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+ qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
qemuTestSetHostCPU(driver.caps, cpuHaswell);
DO_TEST("cpu-Haswell", QEMU_CAPS_KVM);
QEMU_CAPS_DEVICE_SPAPR_VTY);
DO_TEST_PARSE_ERROR("pseries-no-parallel", NONE);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_PPC64);
+ qemuTestSetHostArch(&driver, VIR_ARCH_PPC64);
DO_TEST("pseries-cpu-compat", QEMU_CAPS_KVM,
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
QEMU_CAPS_DEVICE_SPAPR_VTY);
QEMU_CAPS_DEVICE_SPAPR_VTY);
qemuTestSetHostCPU(driver.caps, NULL);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+ qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
DO_TEST("pseries-panic-missing",
QEMU_CAPS_DEVICE_SPAPR_PCI_HOST_BRIDGE,
QEMU_CAPS_DEVICE_VIRTIO_RNG, QEMU_CAPS_OBJECT_RNG_RANDOM);
DO_TEST("aarch64-virt-default-nic",
QEMU_CAPS_DEVICE_VIRTIO_MMIO);
- qemuTestSetHostArch(driver.caps, VIR_ARCH_AARCH64);
+ qemuTestSetHostArch(&driver, VIR_ARCH_AARCH64);
DO_TEST("aarch64-cpu-passthrough",
QEMU_CAPS_DEVICE_VIRTIO_MMIO,
QEMU_CAPS_KVM);
/* SVE aarch64 CPU features work on modern QEMU */
DO_TEST_CAPS_ARCH_LATEST("aarch64-features-sve", "aarch64");
- qemuTestSetHostArch(driver.caps, VIR_ARCH_NONE);
+ qemuTestSetHostArch(&driver, VIR_ARCH_NONE);
DO_TEST("kvm-pit-delay", QEMU_CAPS_KVM_PIT_TICK_POLICY);
DO_TEST("kvm-pit-discard", QEMU_CAPS_KVM_PIT_TICK_POLICY);
char *progname;
static char *python;
+virArch virTestHostArch = VIR_ARCH_X86_64;
+
+virArch
+virArchFromHost(void)
+{
+ return virTestHostArch;
+}
+
+
static int virTestUseTerminalColors(void)
{
return isatty(STDOUT_FILENO);
# error Fix Makefile.am
#endif
+extern virArch virTestHostArch;
+
int virTestRun(const char *title,
int (*body)(const void *data),
const void *data);
void
-qemuTestSetHostArch(virCapsPtr caps,
+qemuTestSetHostArch(virQEMUDriverPtr driver,
virArch arch)
{
if (arch == VIR_ARCH_NONE)
arch = VIR_ARCH_X86_64;
- caps->host.arch = arch;
- qemuTestSetHostCPU(caps, NULL);
+
+ virTestHostArch = arch;
+ driver->hostarch = virArchFromHost();
+ driver->caps->host.arch = virArchFromHost();
+ qemuTestSetHostCPU(driver->caps, NULL);
}
if (virMutexInit(&driver->lock) < 0)
return -1;
+ driver->hostarch = virArchFromHost();
+
driver->config = virQEMUDriverConfigNew(false);
if (!driver->config)
goto error;
extern virCPUDefPtr cpuPower8;
extern virCPUDefPtr cpuPower9;
-void qemuTestSetHostArch(virCapsPtr caps,
- virArch arch);
+void qemuTestSetHostArch(virQEMUDriverPtr driver,
+ virArch arch);
void qemuTestSetHostCPU(virCapsPtr caps,
virCPUDefPtr cpu);