Convert CPU APIs to use virArch

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-12-11 12:58:54 +00:00
parent c25c18f71b
commit 1846b80be8
12 changed files with 81 additions and 73 deletions

View File

@ -79,7 +79,6 @@ virCPUDefFree(virCPUDefPtr def)
if (!def) if (!def)
return; return;
VIR_FREE(def->arch);
virCPUDefFreeModel(def); virCPUDefFreeModel(def);
for (i = 0 ; i < def->ncells ; i++) { for (i = 0 ; i < def->ncells ; i++) {
@ -149,9 +148,7 @@ virCPUDefCopy(const virCPUDefPtr cpu)
copy->sockets = cpu->sockets; copy->sockets = cpu->sockets;
copy->cores = cpu->cores; copy->cores = cpu->cores;
copy->threads = cpu->threads; copy->threads = cpu->threads;
copy->arch = cpu->arch;
if (cpu->arch && !(copy->arch = strdup(cpu->arch)))
goto no_memory;
if (virCPUDefCopyModel(copy, cpu, false) < 0) if (virCPUDefCopyModel(copy, cpu, false) < 0)
goto error; goto error;
@ -273,12 +270,19 @@ virCPUDefParseXML(const xmlNodePtr node,
} }
if (def->type == VIR_CPU_TYPE_HOST) { if (def->type == VIR_CPU_TYPE_HOST) {
def->arch = virXPathString("string(./arch[1])", ctxt); char *arch = virXPathString("string(./arch[1])", ctxt);
if (!def->arch) { if (!arch) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Missing CPU architecture")); "%s", _("Missing CPU architecture"));
goto error; 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)) && if (!(def->model = virXPathString("string(./model[1])", ctxt)) &&
@ -554,7 +558,8 @@ virCPUDefFormatBufFull(virBufferPtr buf,
virBufferAddLit(buf, ">\n"); virBufferAddLit(buf, ">\n");
if (def->arch) if (def->arch)
virBufferAsprintf(buf, " <arch>%s</arch>\n", def->arch); virBufferAsprintf(buf, " <arch>%s</arch>\n",
virArchToString(def->arch));
virBufferAdjustIndent(buf, 2); virBufferAdjustIndent(buf, 2);
if (virCPUDefFormatBuf(buf, def, flags) < 0) if (virCPUDefFormatBuf(buf, def, flags) < 0)
@ -734,10 +739,11 @@ virCPUDefIsEqual(virCPUDefPtr src,
goto cleanup; goto cleanup;
} }
if (STRNEQ_NULLABLE(src->arch, dst->arch)) { if (src->arch != dst->arch) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target CPU arch %s does not match source %s"), _("Target CPU arch %s does not match source %s"),
NULLSTR(dst->arch), NULLSTR(src->arch)); virArchToString(dst->arch),
virArchToString(src->arch));
goto cleanup; goto cleanup;
} }

View File

@ -28,6 +28,7 @@
# include "buf.h" # include "buf.h"
# include "xml.h" # include "xml.h"
# include "bitmap.h" # include "bitmap.h"
# include "virarch.h"
# define VIR_CPU_VENDOR_ID_LENGTH 12 # define VIR_CPU_VENDOR_ID_LENGTH 12
@ -104,7 +105,7 @@ struct _virCPUDef {
int type; /* enum virCPUType */ int type; /* enum virCPUType */
int mode; /* enum virCPUMode */ int mode; /* enum virCPUMode */
int match; /* enum virCPUMatch */ int match; /* enum virCPUMatch */
char *arch; virArch arch;
char *model; char *model;
char *vendor_id; /* vendor id returned by CPUID in the guest */ char *vendor_id; /* vendor id returned by CPUID in the guest */
int fallback; /* enum virCPUFallback */ int fallback; /* enum virCPUFallback */

View File

@ -48,12 +48,12 @@ static struct cpuArchDriver *drivers[] = {
static struct cpuArchDriver * static struct cpuArchDriver *
cpuGetSubDriver(const char *arch) cpuGetSubDriver(virArch arch)
{ {
unsigned int i; unsigned int i;
unsigned int j; unsigned int j;
if (arch == NULL) { if (arch == VIR_ARCH_NONE) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("undefined hardware architecture")); "%s", _("undefined hardware architecture"));
return NULL; return NULL;
@ -61,7 +61,7 @@ cpuGetSubDriver(const char *arch)
for (i = 0; i < NR_DRIVERS - 1; i++) { for (i = 0; i < NR_DRIVERS - 1; i++) {
for (j = 0; j < drivers[i]->narch; j++) { for (j = 0; j < drivers[i]->narch; j++) {
if (STREQ(arch, drivers[i]->arch[j])) if (arch == drivers[i]->arch[j])
return drivers[i]; return drivers[i];
} }
} }
@ -120,7 +120,7 @@ cpuCompare(virCPUDefPtr host,
if (driver->compare == NULL) { if (driver->compare == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot compare CPUs of %s architecture"), _("cannot compare CPUs of %s architecture"),
host->arch); virArchToString(host->arch));
return VIR_CPU_COMPARE_ERROR; return VIR_CPU_COMPARE_ERROR;
} }
@ -163,7 +163,7 @@ cpuDecode(virCPUDefPtr cpu,
if (driver->decode == NULL) { if (driver->decode == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot decode CPU data for %s architecture"), _("cannot decode CPU data for %s architecture"),
cpu->arch); virArchToString(cpu->arch));
return -1; return -1;
} }
@ -172,7 +172,7 @@ cpuDecode(virCPUDefPtr cpu,
int int
cpuEncode(const char *arch, cpuEncode(virArch arch,
const virCPUDefPtr cpu, const virCPUDefPtr cpu,
union cpuData **forced, union cpuData **forced,
union cpuData **required, union cpuData **required,
@ -185,7 +185,7 @@ cpuEncode(const char *arch,
VIR_DEBUG("arch=%s, cpu=%p, forced=%p, required=%p, " VIR_DEBUG("arch=%s, cpu=%p, forced=%p, required=%p, "
"optional=%p, disabled=%p, forbidden=%p, vendor=%p", "optional=%p, disabled=%p, forbidden=%p, vendor=%p",
NULLSTR(arch), cpu, forced, required, virArchToString(arch), cpu, forced, required,
optional, disabled, forbidden, vendor); optional, disabled, forbidden, vendor);
if ((driver = cpuGetSubDriver(arch)) == NULL) if ((driver = cpuGetSubDriver(arch)) == NULL)
@ -194,7 +194,7 @@ cpuEncode(const char *arch,
if (driver->encode == NULL) { if (driver->encode == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot encode CPU data for %s architecture"), _("cannot encode CPU data for %s architecture"),
arch); virArchToString(arch));
return -1; return -1;
} }
@ -204,12 +204,12 @@ cpuEncode(const char *arch,
void void
cpuDataFree(const char *arch, cpuDataFree(virArch arch,
union cpuData *data) union cpuData *data)
{ {
struct cpuArchDriver *driver; struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s, data=%p", NULLSTR(arch), data); VIR_DEBUG("arch=%s, data=%p", virArchToString(arch), data);
if (data == NULL) if (data == NULL)
return; return;
@ -220,7 +220,7 @@ cpuDataFree(const char *arch,
if (driver->free == NULL) { if (driver->free == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot free CPU data for %s architecture"), _("cannot free CPU data for %s architecture"),
arch); virArchToString(arch));
return; return;
} }
@ -229,11 +229,11 @@ cpuDataFree(const char *arch,
union cpuData * union cpuData *
cpuNodeData(const char *arch) cpuNodeData(virArch arch)
{ {
struct cpuArchDriver *driver; struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s", NULLSTR(arch)); VIR_DEBUG("arch=%s", virArchToString(arch));
if ((driver = cpuGetSubDriver(arch)) == NULL) if ((driver = cpuGetSubDriver(arch)) == NULL)
return NULL; return NULL;
@ -241,7 +241,7 @@ cpuNodeData(const char *arch)
if (driver->nodeData == NULL) { if (driver->nodeData == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot get node CPU data for %s architecture"), _("cannot get node CPU data for %s architecture"),
arch); virArchToString(arch));
return NULL; return NULL;
} }
@ -265,7 +265,7 @@ cpuGuestData(virCPUDefPtr host,
if (driver->guestData == NULL) { if (driver->guestData == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot compute guest CPU data for %s architecture"), _("cannot compute guest CPU data for %s architecture"),
host->arch); virArchToString(host->arch));
return VIR_CPU_COMPARE_ERROR; return VIR_CPU_COMPARE_ERROR;
} }
@ -391,7 +391,7 @@ cpuBaseline(virCPUDefPtr *cpus,
if (driver->baseline == NULL) { if (driver->baseline == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot compute baseline CPU of %s architecture"), _("cannot compute baseline CPU of %s architecture"),
cpus[0]->arch); virArchToString(cpus[0]->arch));
return NULL; return NULL;
} }
@ -413,7 +413,7 @@ cpuUpdate(virCPUDefPtr guest,
if (driver->update == NULL) { if (driver->update == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot update guest CPU data for %s architecture"), _("cannot update guest CPU data for %s architecture"),
host->arch); virArchToString(host->arch));
return -1; return -1;
} }
@ -421,14 +421,14 @@ cpuUpdate(virCPUDefPtr guest,
} }
int int
cpuHasFeature(const char *arch, cpuHasFeature(virArch arch,
const union cpuData *data, const union cpuData *data,
const char *feature) const char *feature)
{ {
struct cpuArchDriver *driver; struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s, data=%p, feature=%s", VIR_DEBUG("arch=%s, data=%p, feature=%s",
arch, data, feature); virArchToString(arch), data, feature);
if ((driver = cpuGetSubDriver(arch)) == NULL) if ((driver = cpuGetSubDriver(arch)) == NULL)
return -1; return -1;
@ -436,7 +436,7 @@ cpuHasFeature(const char *arch,
if (driver->hasFeature == NULL) { if (driver->hasFeature == NULL) {
virReportError(VIR_ERR_NO_SUPPORT, virReportError(VIR_ERR_NO_SUPPORT,
_("cannot check guest CPU data for %s architecture"), _("cannot check guest CPU data for %s architecture"),
arch); virArchToString(arch));
return -1; return -1;
} }

View File

@ -26,6 +26,7 @@
# include "virterror_internal.h" # include "virterror_internal.h"
# include "datatypes.h" # include "datatypes.h"
# include "virarch.h"
# include "conf/cpu_conf.h" # include "conf/cpu_conf.h"
# include "cpu_x86_data.h" # include "cpu_x86_data.h"
# include "cpu_ppc_data.h" # include "cpu_ppc_data.h"
@ -88,7 +89,7 @@ typedef int
struct cpuArchDriver { struct cpuArchDriver {
const char *name; const char *name;
const char **arch; const virArch *arch;
unsigned int narch; unsigned int narch;
cpuArchCompare compare; cpuArchCompare compare;
cpuArchDecode decode; cpuArchDecode decode;
@ -118,7 +119,7 @@ cpuDecode (virCPUDefPtr cpu,
const char *preferred); const char *preferred);
extern int extern int
cpuEncode (const char *arch, cpuEncode (virArch arch,
const virCPUDefPtr cpu, const virCPUDefPtr cpu,
union cpuData **forced, union cpuData **forced,
union cpuData **required, union cpuData **required,
@ -128,11 +129,11 @@ cpuEncode (const char *arch,
union cpuData **vendor); union cpuData **vendor);
extern void extern void
cpuDataFree (const char *arch, cpuDataFree (virArch arch,
union cpuData *data); union cpuData *data);
extern union cpuData * extern union cpuData *
cpuNodeData (const char *arch); cpuNodeData (virArch arch);
extern virCPUCompareResult extern virCPUCompareResult
cpuGuestData(virCPUDefPtr host, cpuGuestData(virCPUDefPtr host,
@ -157,7 +158,7 @@ cpuUpdate (virCPUDefPtr guest,
const virCPUDefPtr host); const virCPUDefPtr host);
extern int extern int
cpuHasFeature(const char *arch, cpuHasFeature(virArch arch,
const union cpuData *data, const union cpuData *data,
const char *feature); const char *feature);

View File

@ -28,7 +28,7 @@
#define VIR_FROM_THIS VIR_FROM_CPU #define VIR_FROM_THIS VIR_FROM_CPU
static const char *archs[] = { "armv7l" }; static const virArch archs[] = { VIR_ARCH_ARMV7L };
static union cpuData * static union cpuData *
ArmNodeData(void) ArmNodeData(void)

View File

@ -64,7 +64,8 @@ genericCompare(virCPUDefPtr host,
unsigned int i; unsigned int i;
unsigned int reqfeatures; 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)) STRNEQ(host->model, cpu->model))
return VIR_CPU_COMPARE_INCOMPATIBLE; return VIR_CPU_COMPARE_INCOMPATIBLE;
@ -139,11 +140,11 @@ genericBaseline(virCPUDefPtr *cpus,
} }
if (VIR_ALLOC(cpu) < 0 || if (VIR_ALLOC(cpu) < 0 ||
!(cpu->arch = strdup(cpus[0]->arch)) ||
!(cpu->model = strdup(cpus[0]->model)) || !(cpu->model = strdup(cpus[0]->model)) ||
VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0) VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0)
goto no_memory; goto no_memory;
cpu->arch = cpus[0]->arch;
cpu->type = VIR_CPU_TYPE_HOST; cpu->type = VIR_CPU_TYPE_HOST;
count = nfeatures = cpus[0]->nfeatures; count = nfeatures = cpus[0]->nfeatures;
@ -153,10 +154,11 @@ genericBaseline(virCPUDefPtr *cpus,
for (i = 1; i < ncpus; i++) { for (i = 1; i < ncpus; i++) {
virHashTablePtr hash; virHashTablePtr hash;
if (STRNEQ(cpu->arch, cpus[i]->arch)) { if (cpu->arch != cpus[i]->arch) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("CPUs have incompatible architectures: '%s' != '%s'"), _("CPUs have incompatible architectures: '%s' != '%s'"),
cpu->arch, cpus[i]->arch); virArchToString(cpu->arch),
virArchToString(cpus[i]->arch));
goto error; goto error;
} }

View File

@ -36,7 +36,7 @@
#define VIR_FROM_THIS VIR_FROM_CPU #define VIR_FROM_THIS VIR_FROM_CPU
static const char *archs[] = { "ppc64" }; static const virArch archs[] = { VIR_ARCH_PPC64 };
struct cpuPowerPC { struct cpuPowerPC {
const char *name; const char *name;
@ -417,7 +417,8 @@ static virCPUCompareResult
PowerPCCompare(virCPUDefPtr host, PowerPCCompare(virCPUDefPtr host,
virCPUDefPtr cpu) 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)) STRNEQ(host->model, cpu->model))
return VIR_CPU_COMPARE_INCOMPATIBLE; return VIR_CPU_COMPARE_INCOMPATIBLE;
@ -589,9 +590,10 @@ PowerPCBaseline(virCPUDefPtr *cpus,
goto error; goto error;
} }
if (VIR_ALLOC(cpu) < 0 || if (VIR_ALLOC(cpu) < 0)
!(cpu->arch = strdup(cpus[0]->arch))) goto no_memory;
goto no_memory;
cpu->arch = cpus[0]->arch;
cpu->type = VIR_CPU_TYPE_GUEST; cpu->type = VIR_CPU_TYPE_GUEST;
cpu->match = VIR_CPU_MATCH_EXACT; cpu->match = VIR_CPU_MATCH_EXACT;
@ -610,8 +612,6 @@ PowerPCBaseline(virCPUDefPtr *cpus,
if (!outputModel) if (!outputModel)
VIR_FREE(cpu->model); VIR_FREE(cpu->model);
VIR_FREE(cpu->arch);
cleanup: cleanup:
ppcModelFree(base_model); ppcModelFree(base_model);
ppcMapFree(map); ppcMapFree(map);

View File

@ -29,7 +29,7 @@
#define VIR_FROM_THIS VIR_FROM_CPU #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 * static union cpuData *
s390NodeData(void) s390NodeData(void)

View File

@ -40,7 +40,7 @@
static const struct cpuX86cpuid cpuidNull = { 0, 0, 0, 0, 0 }; 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 { struct x86_vendor {
char *name; char *name;
@ -1165,22 +1165,23 @@ x86Compute(virCPUDefPtr host,
enum compare_result result; enum compare_result result;
unsigned int i; unsigned int i;
if (cpu->arch != NULL) { if (cpu->arch != VIR_ARCH_NONE) {
bool found = false; bool found = false;
for (i = 0; i < ARRAY_CARDINALITY(archs); i++) { for (i = 0; i < ARRAY_CARDINALITY(archs); i++) {
if (STREQ(archs[i], cpu->arch)) { if (archs[i] == cpu->arch) {
found = true; found = true;
break; break;
} }
} }
if (!found) { 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 && if (message &&
virAsprintf(message, virAsprintf(message,
_("CPU arch %s does not match host arch"), _("CPU arch %s does not match host arch"),
cpu->arch) < 0) virArchToString(cpu->arch)) < 0)
goto no_memory; goto no_memory;
return VIR_CPU_COMPARE_INCOMPATIBLE; return VIR_CPU_COMPARE_INCOMPATIBLE;
} }
@ -1643,9 +1644,10 @@ x86Baseline(virCPUDefPtr *cpus,
if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE))) if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE)))
goto error; goto error;
if (VIR_ALLOC(cpu) < 0 || if (VIR_ALLOC(cpu) < 0)
!(cpu->arch = strdup(cpus[0]->arch)))
goto no_memory; goto no_memory;
cpu->arch = cpus[0]->arch;
cpu->type = VIR_CPU_TYPE_GUEST; cpu->type = VIR_CPU_TYPE_GUEST;
cpu->match = VIR_CPU_MATCH_EXACT; cpu->match = VIR_CPU_MATCH_EXACT;
@ -1713,8 +1715,6 @@ x86Baseline(virCPUDefPtr *cpus,
if (!outputVendor) if (!outputVendor)
VIR_FREE(cpu->vendor); VIR_FREE(cpu->vendor);
VIR_FREE(cpu->arch);
cleanup: cleanup:
x86ModelFree(base_model); x86ModelFree(base_model);
x86MapFree(map); x86MapFree(map);

View File

@ -811,14 +811,14 @@ qemuCapsInitCPU(virCapsPtr caps,
union cpuData *data = NULL; union cpuData *data = NULL;
virNodeInfo nodeinfo; virNodeInfo nodeinfo;
int ret = -1; int ret = -1;
const char *archstr = virArchToString(arch);
if (VIR_ALLOC(cpu) < 0 if (VIR_ALLOC(cpu) < 0) {
|| !(cpu->arch = strdup(archstr))) {
virReportOOMError(); virReportOOMError();
goto error; goto error;
} }
cpu->arch = arch;
if (nodeGetInfo(NULL, &nodeinfo)) if (nodeGetInfo(NULL, &nodeinfo))
goto error; goto error;
@ -828,14 +828,14 @@ qemuCapsInitCPU(virCapsPtr caps,
cpu->threads = nodeinfo.threads; cpu->threads = nodeinfo.threads;
caps->host.cpu = cpu; caps->host.cpu = cpu;
if (!(data = cpuNodeData(archstr)) if (!(data = cpuNodeData(arch))
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0) || cpuDecode(cpu, data, NULL, 0, NULL) < 0)
goto cleanup; goto cleanup;
ret = 0; ret = 0;
cleanup: cleanup:
cpuDataFree(archstr, data); cpuDataFree(arch, data);
return ret; return ret;

View File

@ -4409,10 +4409,10 @@ qemuBuildCpuArgStr(const virQEMUDriverPtr driver,
virBufferAddLit(&buf, "host"); virBufferAddLit(&buf, "host");
} else { } else {
if (VIR_ALLOC(guest) < 0 || if (VIR_ALLOC(guest) < 0 ||
!(guest->arch = strdup(host->arch)) ||
(cpu->vendor_id && !(guest->vendor_id = strdup(cpu->vendor_id)))) (cpu->vendor_id && !(guest->vendor_id = strdup(cpu->vendor_id))))
goto no_memory; goto no_memory;
guest->arch = host->arch;
if (cpu->match == VIR_CPU_MATCH_MINIMUM) if (cpu->match == VIR_CPU_MATCH_MINIMUM)
preferred = host->model; preferred = host->model;
else else
@ -8204,13 +8204,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
union cpuData *cpuData = NULL; union cpuData *cpuData = NULL;
int ret; int ret;
ret = cpuEncode("x86_64", cpu, NULL, &cpuData, ret = cpuEncode(VIR_ARCH_X86_64, cpu, NULL, &cpuData,
NULL, NULL, NULL, NULL); NULL, NULL, NULL, NULL);
if (ret < 0) if (ret < 0)
goto error; goto error;
is_32bit = (cpuHasFeature("x86_64", cpuData, "lm") != 1); is_32bit = (cpuHasFeature(VIR_ARCH_X86_64, cpuData, "lm") != 1);
cpuDataFree("x86_64", cpuData); cpuDataFree(VIR_ARCH_X86_64, cpuData);
} else if (model) { } else if (model) {
is_32bit = STREQ(model, "qemu32"); is_32bit = STREQ(model, "qemu32");
} }

View File

@ -63,7 +63,6 @@ vmwareCapsInit(void)
virCapsGuestPtr guest = NULL; virCapsGuestPtr guest = NULL;
virCPUDefPtr cpu = NULL; virCPUDefPtr cpu = NULL;
union cpuData *data = NULL; union cpuData *data = NULL;
const char *hostarch = NULL;
if ((caps = virCapabilitiesNew(virArchFromHost(), if ((caps = virCapabilitiesNew(virArchFromHost(),
0, 0)) == NULL) 0, 0)) == NULL)
@ -91,8 +90,7 @@ vmwareCapsInit(void)
goto error; goto error;
} }
hostarch = virArchToString(caps->host.arch); if (!(cpu->arch = caps->host.arch)) {
if (!(cpu->arch = strdup(hostarch))) {
virReportOOMError(); virReportOOMError();
goto error; goto error;
} }
@ -109,9 +107,9 @@ vmwareCapsInit(void)
* - Host CPU is x86_64 with virtualization extensions * - Host CPU is x86_64 with virtualization extensions
*/ */
if (caps->host.arch == VIR_ARCH_X86_64 || if (caps->host.arch == VIR_ARCH_X86_64 ||
(cpuHasFeature(hostarch, data, "lm") && (cpuHasFeature(caps->host.arch, data, "lm") &&
(cpuHasFeature(hostarch, data, "vmx") || (cpuHasFeature(caps->host.arch, data, "vmx") ||
cpuHasFeature(hostarch, data, "svm")))) { cpuHasFeature(caps->host.arch, data, "svm")))) {
if ((guest = virCapabilitiesAddGuest(caps, if ((guest = virCapabilitiesAddGuest(caps,
"hvm", "hvm",
@ -129,7 +127,7 @@ vmwareCapsInit(void)
cleanup: cleanup:
virCPUDefFree(cpu); virCPUDefFree(cpu);
cpuDataFree(hostarch, data); cpuDataFree(caps->host.arch, data);
return caps; return caps;