diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index 41c553572c8f5bfee95bd5c02c9fd4ad354d1c40..3973c8319e8e95ae43bc44a7350013ec28c78438 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -79,7 +79,6 @@ virCPUDefFree(virCPUDefPtr def) if (!def) return; - VIR_FREE(def->arch); virCPUDefFreeModel(def); for (i = 0 ; i < def->ncells ; i++) { @@ -149,9 +148,7 @@ virCPUDefCopy(const virCPUDefPtr cpu) copy->sockets = cpu->sockets; copy->cores = cpu->cores; copy->threads = cpu->threads; - - if (cpu->arch && !(copy->arch = strdup(cpu->arch))) - goto no_memory; + copy->arch = cpu->arch; if (virCPUDefCopyModel(copy, cpu, false) < 0) goto error; @@ -273,12 +270,19 @@ virCPUDefParseXML(const xmlNodePtr node, } if (def->type == VIR_CPU_TYPE_HOST) { - def->arch = virXPathString("string(./arch[1])", ctxt); - if (!def->arch) { + char *arch = virXPathString("string(./arch[1])", ctxt); + if (!arch) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Missing CPU architecture")); goto error; } + if ((def->arch = virArchFromString(arch)) == VIR_ARCH_NONE) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Unknown architecture %s"), arch); + VIR_FREE(arch); + goto error; + } + VIR_FREE(arch); } if (!(def->model = virXPathString("string(./model[1])", ctxt)) && @@ -554,7 +558,8 @@ virCPUDefFormatBufFull(virBufferPtr buf, virBufferAddLit(buf, ">\n"); if (def->arch) - virBufferAsprintf(buf, " %s\n", def->arch); + virBufferAsprintf(buf, " %s\n", + virArchToString(def->arch)); virBufferAdjustIndent(buf, 2); if (virCPUDefFormatBuf(buf, def, flags) < 0) @@ -734,10 +739,11 @@ virCPUDefIsEqual(virCPUDefPtr src, goto cleanup; } - if (STRNEQ_NULLABLE(src->arch, dst->arch)) { + if (src->arch != dst->arch) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Target CPU arch %s does not match source %s"), - NULLSTR(dst->arch), NULLSTR(src->arch)); + virArchToString(dst->arch), + virArchToString(src->arch)); goto cleanup; } diff --git a/src/conf/cpu_conf.h b/src/conf/cpu_conf.h index 879f8eb693891b9313d3cfbc4f6e1fb30af133f5..5bff70e6f36ec71449607291a51047a67c620342 100644 --- a/src/conf/cpu_conf.h +++ b/src/conf/cpu_conf.h @@ -28,6 +28,7 @@ # include "buf.h" # include "xml.h" # include "bitmap.h" +# include "virarch.h" # define VIR_CPU_VENDOR_ID_LENGTH 12 @@ -104,7 +105,7 @@ struct _virCPUDef { int type; /* enum virCPUType */ int mode; /* enum virCPUMode */ int match; /* enum virCPUMatch */ - char *arch; + virArch arch; char *model; char *vendor_id; /* vendor id returned by CPUID in the guest */ int fallback; /* enum virCPUFallback */ diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 4263b88549b12a2647301d7e22b20c2e9a318b8e..53c4cc3eb8b0570c49776142a2e19479355fca39 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -48,12 +48,12 @@ static struct cpuArchDriver *drivers[] = { static struct cpuArchDriver * -cpuGetSubDriver(const char *arch) +cpuGetSubDriver(virArch arch) { unsigned int i; unsigned int j; - if (arch == NULL) { + if (arch == VIR_ARCH_NONE) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("undefined hardware architecture")); return NULL; @@ -61,7 +61,7 @@ cpuGetSubDriver(const char *arch) for (i = 0; i < NR_DRIVERS - 1; i++) { for (j = 0; j < drivers[i]->narch; j++) { - if (STREQ(arch, drivers[i]->arch[j])) + if (arch == drivers[i]->arch[j]) return drivers[i]; } } @@ -120,7 +120,7 @@ cpuCompare(virCPUDefPtr host, if (driver->compare == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot compare CPUs of %s architecture"), - host->arch); + virArchToString(host->arch)); return VIR_CPU_COMPARE_ERROR; } @@ -163,7 +163,7 @@ cpuDecode(virCPUDefPtr cpu, if (driver->decode == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot decode CPU data for %s architecture"), - cpu->arch); + virArchToString(cpu->arch)); return -1; } @@ -172,7 +172,7 @@ cpuDecode(virCPUDefPtr cpu, int -cpuEncode(const char *arch, +cpuEncode(virArch arch, const virCPUDefPtr cpu, union cpuData **forced, union cpuData **required, @@ -185,7 +185,7 @@ cpuEncode(const char *arch, VIR_DEBUG("arch=%s, cpu=%p, forced=%p, required=%p, " "optional=%p, disabled=%p, forbidden=%p, vendor=%p", - NULLSTR(arch), cpu, forced, required, + virArchToString(arch), cpu, forced, required, optional, disabled, forbidden, vendor); if ((driver = cpuGetSubDriver(arch)) == NULL) @@ -194,7 +194,7 @@ cpuEncode(const char *arch, if (driver->encode == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot encode CPU data for %s architecture"), - arch); + virArchToString(arch)); return -1; } @@ -204,12 +204,12 @@ cpuEncode(const char *arch, void -cpuDataFree(const char *arch, +cpuDataFree(virArch arch, union cpuData *data) { struct cpuArchDriver *driver; - VIR_DEBUG("arch=%s, data=%p", NULLSTR(arch), data); + VIR_DEBUG("arch=%s, data=%p", virArchToString(arch), data); if (data == NULL) return; @@ -220,7 +220,7 @@ cpuDataFree(const char *arch, if (driver->free == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot free CPU data for %s architecture"), - arch); + virArchToString(arch)); return; } @@ -229,11 +229,11 @@ cpuDataFree(const char *arch, union cpuData * -cpuNodeData(const char *arch) +cpuNodeData(virArch arch) { struct cpuArchDriver *driver; - VIR_DEBUG("arch=%s", NULLSTR(arch)); + VIR_DEBUG("arch=%s", virArchToString(arch)); if ((driver = cpuGetSubDriver(arch)) == NULL) return NULL; @@ -241,7 +241,7 @@ cpuNodeData(const char *arch) if (driver->nodeData == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot get node CPU data for %s architecture"), - arch); + virArchToString(arch)); return NULL; } @@ -265,7 +265,7 @@ cpuGuestData(virCPUDefPtr host, if (driver->guestData == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot compute guest CPU data for %s architecture"), - host->arch); + virArchToString(host->arch)); return VIR_CPU_COMPARE_ERROR; } @@ -391,7 +391,7 @@ cpuBaseline(virCPUDefPtr *cpus, if (driver->baseline == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot compute baseline CPU of %s architecture"), - cpus[0]->arch); + virArchToString(cpus[0]->arch)); return NULL; } @@ -413,7 +413,7 @@ cpuUpdate(virCPUDefPtr guest, if (driver->update == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot update guest CPU data for %s architecture"), - host->arch); + virArchToString(host->arch)); return -1; } @@ -421,14 +421,14 @@ cpuUpdate(virCPUDefPtr guest, } int -cpuHasFeature(const char *arch, +cpuHasFeature(virArch arch, const union cpuData *data, const char *feature) { struct cpuArchDriver *driver; VIR_DEBUG("arch=%s, data=%p, feature=%s", - arch, data, feature); + virArchToString(arch), data, feature); if ((driver = cpuGetSubDriver(arch)) == NULL) return -1; @@ -436,7 +436,7 @@ cpuHasFeature(const char *arch, if (driver->hasFeature == NULL) { virReportError(VIR_ERR_NO_SUPPORT, _("cannot check guest CPU data for %s architecture"), - arch); + virArchToString(arch)); return -1; } diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 01c732c2332218af9d1b558b53a0e458bfe27b88..5153b626739feab65c70e611bfe09a64809169f0 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -26,6 +26,7 @@ # include "virterror_internal.h" # include "datatypes.h" +# include "virarch.h" # include "conf/cpu_conf.h" # include "cpu_x86_data.h" # include "cpu_ppc_data.h" @@ -88,7 +89,7 @@ typedef int struct cpuArchDriver { const char *name; - const char **arch; + const virArch *arch; unsigned int narch; cpuArchCompare compare; cpuArchDecode decode; @@ -118,7 +119,7 @@ cpuDecode (virCPUDefPtr cpu, const char *preferred); extern int -cpuEncode (const char *arch, +cpuEncode (virArch arch, const virCPUDefPtr cpu, union cpuData **forced, union cpuData **required, @@ -128,11 +129,11 @@ cpuEncode (const char *arch, union cpuData **vendor); extern void -cpuDataFree (const char *arch, +cpuDataFree (virArch arch, union cpuData *data); extern union cpuData * -cpuNodeData (const char *arch); +cpuNodeData (virArch arch); extern virCPUCompareResult cpuGuestData(virCPUDefPtr host, @@ -157,7 +158,7 @@ cpuUpdate (virCPUDefPtr guest, const virCPUDefPtr host); extern int -cpuHasFeature(const char *arch, +cpuHasFeature(virArch arch, const union cpuData *data, const char *feature); diff --git a/src/cpu/cpu_arm.c b/src/cpu/cpu_arm.c index 2d005df8ba28f5debd9cb7d1460603d9abe758ed..36c9db03078c2e4b4372d90c18cd840326aa3f63 100644 --- a/src/cpu/cpu_arm.c +++ b/src/cpu/cpu_arm.c @@ -28,7 +28,7 @@ #define VIR_FROM_THIS VIR_FROM_CPU -static const char *archs[] = { "armv7l" }; +static const virArch archs[] = { VIR_ARCH_ARMV7L }; static union cpuData * ArmNodeData(void) diff --git a/src/cpu/cpu_generic.c b/src/cpu/cpu_generic.c index 3a6ed6c2e95fcf32f76753826b8b1e5ff0cd5810..b10ff47a2520baef32c8fb61bd17c1aec1760b65 100644 --- a/src/cpu/cpu_generic.c +++ b/src/cpu/cpu_generic.c @@ -64,7 +64,8 @@ genericCompare(virCPUDefPtr host, unsigned int i; unsigned int reqfeatures; - if ((cpu->arch && STRNEQ(host->arch, cpu->arch)) || + if (((cpu->arch != VIR_ARCH_NONE) && + (host->arch != cpu->arch)) || STRNEQ(host->model, cpu->model)) return VIR_CPU_COMPARE_INCOMPATIBLE; @@ -139,11 +140,11 @@ genericBaseline(virCPUDefPtr *cpus, } if (VIR_ALLOC(cpu) < 0 || - !(cpu->arch = strdup(cpus[0]->arch)) || !(cpu->model = strdup(cpus[0]->model)) || VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0) goto no_memory; + cpu->arch = cpus[0]->arch; cpu->type = VIR_CPU_TYPE_HOST; count = nfeatures = cpus[0]->nfeatures; @@ -153,10 +154,11 @@ genericBaseline(virCPUDefPtr *cpus, for (i = 1; i < ncpus; i++) { virHashTablePtr hash; - if (STRNEQ(cpu->arch, cpus[i]->arch)) { + if (cpu->arch != cpus[i]->arch) { virReportError(VIR_ERR_INTERNAL_ERROR, _("CPUs have incompatible architectures: '%s' != '%s'"), - cpu->arch, cpus[i]->arch); + virArchToString(cpu->arch), + virArchToString(cpus[i]->arch)); goto error; } diff --git a/src/cpu/cpu_powerpc.c b/src/cpu/cpu_powerpc.c index e420ffb0ce63c52d029222a8dd1ae35a20c68ba1..ac107892b51d61702b9c37f0ea176b082b82094e 100644 --- a/src/cpu/cpu_powerpc.c +++ b/src/cpu/cpu_powerpc.c @@ -36,7 +36,7 @@ #define VIR_FROM_THIS VIR_FROM_CPU -static const char *archs[] = { "ppc64" }; +static const virArch archs[] = { VIR_ARCH_PPC64 }; struct cpuPowerPC { const char *name; @@ -417,7 +417,8 @@ static virCPUCompareResult PowerPCCompare(virCPUDefPtr host, virCPUDefPtr cpu) { - if ((cpu->arch && STRNEQ(host->arch, cpu->arch)) || + if ((cpu->arch != VIR_ARCH_NONE && + (host->arch != cpu->arch)) || STRNEQ(host->model, cpu->model)) return VIR_CPU_COMPARE_INCOMPATIBLE; @@ -589,9 +590,10 @@ PowerPCBaseline(virCPUDefPtr *cpus, goto error; } - if (VIR_ALLOC(cpu) < 0 || - !(cpu->arch = strdup(cpus[0]->arch))) - goto no_memory; + if (VIR_ALLOC(cpu) < 0) + goto no_memory; + + cpu->arch = cpus[0]->arch; cpu->type = VIR_CPU_TYPE_GUEST; cpu->match = VIR_CPU_MATCH_EXACT; @@ -610,8 +612,6 @@ PowerPCBaseline(virCPUDefPtr *cpus, if (!outputModel) VIR_FREE(cpu->model); - VIR_FREE(cpu->arch); - cleanup: ppcModelFree(base_model); ppcMapFree(map); diff --git a/src/cpu/cpu_s390.c b/src/cpu/cpu_s390.c index 137c15f9029f976bc02ee6ffb3705e3771bfcf6c..ffbad036c5995c39e99ae5e7463e75be8847a8e8 100644 --- a/src/cpu/cpu_s390.c +++ b/src/cpu/cpu_s390.c @@ -29,7 +29,7 @@ #define VIR_FROM_THIS VIR_FROM_CPU -static const char *archs[] = { "s390", "s390x" }; +static const virArch archs[] = { VIR_ARCH_S390, VIR_ARCH_S390X }; static union cpuData * s390NodeData(void) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index ca8cd92188bd224811326f830ac94126ba2cd4ba..2001b996585fa341dbfbb2dfb97ac4f98184a239 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -40,7 +40,7 @@ static const struct cpuX86cpuid cpuidNull = { 0, 0, 0, 0, 0 }; -static const char *archs[] = { "i686", "x86_64" }; +static const virArch archs[] = { VIR_ARCH_I686, VIR_ARCH_X86_64 }; struct x86_vendor { char *name; @@ -1165,22 +1165,23 @@ x86Compute(virCPUDefPtr host, enum compare_result result; unsigned int i; - if (cpu->arch != NULL) { + if (cpu->arch != VIR_ARCH_NONE) { bool found = false; for (i = 0; i < ARRAY_CARDINALITY(archs); i++) { - if (STREQ(archs[i], cpu->arch)) { + if (archs[i] == cpu->arch) { found = true; break; } } if (!found) { - VIR_DEBUG("CPU arch %s does not match host arch", cpu->arch); + VIR_DEBUG("CPU arch %s does not match host arch", + virArchToString(cpu->arch)); if (message && virAsprintf(message, _("CPU arch %s does not match host arch"), - cpu->arch) < 0) + virArchToString(cpu->arch)) < 0) goto no_memory; return VIR_CPU_COMPARE_INCOMPATIBLE; } @@ -1643,9 +1644,10 @@ x86Baseline(virCPUDefPtr *cpus, if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE))) goto error; - if (VIR_ALLOC(cpu) < 0 || - !(cpu->arch = strdup(cpus[0]->arch))) + if (VIR_ALLOC(cpu) < 0) goto no_memory; + + cpu->arch = cpus[0]->arch; cpu->type = VIR_CPU_TYPE_GUEST; cpu->match = VIR_CPU_MATCH_EXACT; @@ -1713,8 +1715,6 @@ x86Baseline(virCPUDefPtr *cpus, if (!outputVendor) VIR_FREE(cpu->vendor); - VIR_FREE(cpu->arch); - cleanup: x86ModelFree(base_model); x86MapFree(map); diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index b1a478bcfe4a925b149a20cde745d09a205f7903..6a02161afb980cb598662b94b2ba53a70b340695 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -811,14 +811,14 @@ qemuCapsInitCPU(virCapsPtr caps, union cpuData *data = NULL; virNodeInfo nodeinfo; int ret = -1; - const char *archstr = virArchToString(arch); - if (VIR_ALLOC(cpu) < 0 - || !(cpu->arch = strdup(archstr))) { + if (VIR_ALLOC(cpu) < 0) { virReportOOMError(); goto error; } + cpu->arch = arch; + if (nodeGetInfo(NULL, &nodeinfo)) goto error; @@ -828,14 +828,14 @@ qemuCapsInitCPU(virCapsPtr caps, cpu->threads = nodeinfo.threads; caps->host.cpu = cpu; - if (!(data = cpuNodeData(archstr)) + if (!(data = cpuNodeData(arch)) || cpuDecode(cpu, data, NULL, 0, NULL) < 0) goto cleanup; ret = 0; cleanup: - cpuDataFree(archstr, data); + cpuDataFree(arch, data); return ret; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index f0b2e6070a3df111691cbacdde6d68089f96813c..ef16d274a5c238e85012a53b8c4a1204357c48db 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4409,10 +4409,10 @@ qemuBuildCpuArgStr(const virQEMUDriverPtr driver, virBufferAddLit(&buf, "host"); } else { if (VIR_ALLOC(guest) < 0 || - !(guest->arch = strdup(host->arch)) || (cpu->vendor_id && !(guest->vendor_id = strdup(cpu->vendor_id)))) goto no_memory; + guest->arch = host->arch; if (cpu->match == VIR_CPU_MATCH_MINIMUM) preferred = host->model; else @@ -8204,13 +8204,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom, union cpuData *cpuData = NULL; int ret; - ret = cpuEncode("x86_64", cpu, NULL, &cpuData, + ret = cpuEncode(VIR_ARCH_X86_64, cpu, NULL, &cpuData, NULL, NULL, NULL, NULL); if (ret < 0) goto error; - is_32bit = (cpuHasFeature("x86_64", cpuData, "lm") != 1); - cpuDataFree("x86_64", cpuData); + is_32bit = (cpuHasFeature(VIR_ARCH_X86_64, cpuData, "lm") != 1); + cpuDataFree(VIR_ARCH_X86_64, cpuData); } else if (model) { is_32bit = STREQ(model, "qemu32"); } diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index 33100fb2fc95af654b18d8778020d92be5f310fc..bada4a513b07274f9ab99d704585da1a89990a2b 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -63,7 +63,6 @@ vmwareCapsInit(void) virCapsGuestPtr guest = NULL; virCPUDefPtr cpu = NULL; union cpuData *data = NULL; - const char *hostarch = NULL; if ((caps = virCapabilitiesNew(virArchFromHost(), 0, 0)) == NULL) @@ -91,8 +90,7 @@ vmwareCapsInit(void) goto error; } - hostarch = virArchToString(caps->host.arch); - if (!(cpu->arch = strdup(hostarch))) { + if (!(cpu->arch = caps->host.arch)) { virReportOOMError(); goto error; } @@ -109,9 +107,9 @@ vmwareCapsInit(void) * - Host CPU is x86_64 with virtualization extensions */ if (caps->host.arch == VIR_ARCH_X86_64 || - (cpuHasFeature(hostarch, data, "lm") && - (cpuHasFeature(hostarch, data, "vmx") || - cpuHasFeature(hostarch, data, "svm")))) { + (cpuHasFeature(caps->host.arch, data, "lm") && + (cpuHasFeature(caps->host.arch, data, "vmx") || + cpuHasFeature(caps->host.arch, data, "svm")))) { if ((guest = virCapabilitiesAddGuest(caps, "hvm", @@ -129,7 +127,7 @@ vmwareCapsInit(void) cleanup: virCPUDefFree(cpu); - cpuDataFree(hostarch, data); + cpuDataFree(caps->host.arch, data); return caps;