if (!def)
return;
- VIR_FREE(def->arch);
virCPUDefFreeModel(def);
for (i = 0 ; i < def->ncells ; i++) {
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;
}
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)) &&
virBufferAddLit(buf, ">\n");
if (def->arch)
- virBufferAsprintf(buf, " <arch>%s</arch>\n", def->arch);
+ virBufferAsprintf(buf, " <arch>%s</arch>\n",
+ virArchToString(def->arch));
virBufferAdjustIndent(buf, 2);
if (virCPUDefFormatBuf(buf, def, flags) < 0)
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;
}
# include "buf.h"
# include "xml.h"
# include "bitmap.h"
+# include "virarch.h"
# define VIR_CPU_VENDOR_ID_LENGTH 12
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 */
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;
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];
}
}
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;
}
if (driver->decode == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot decode CPU data for %s architecture"),
- cpu->arch);
+ virArchToString(cpu->arch));
return -1;
}
int
-cpuEncode(const char *arch,
+cpuEncode(virArch arch,
const virCPUDefPtr cpu,
union cpuData **forced,
union cpuData **required,
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)
if (driver->encode == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot encode CPU data for %s architecture"),
- arch);
+ virArchToString(arch));
return -1;
}
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;
if (driver->free == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot free CPU data for %s architecture"),
- arch);
+ virArchToString(arch));
return;
}
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;
if (driver->nodeData == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot get node CPU data for %s architecture"),
- arch);
+ virArchToString(arch));
return NULL;
}
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;
}
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;
}
if (driver->update == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot update guest CPU data for %s architecture"),
- host->arch);
+ virArchToString(host->arch));
return -1;
}
}
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;
if (driver->hasFeature == NULL) {
virReportError(VIR_ERR_NO_SUPPORT,
_("cannot check guest CPU data for %s architecture"),
- arch);
+ virArchToString(arch));
return -1;
}
# 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"
struct cpuArchDriver {
const char *name;
- const char **arch;
+ const virArch *arch;
unsigned int narch;
cpuArchCompare compare;
cpuArchDecode decode;
const char *preferred);
extern int
-cpuEncode (const char *arch,
+cpuEncode (virArch arch,
const virCPUDefPtr cpu,
union cpuData **forced,
union cpuData **required,
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,
const virCPUDefPtr host);
extern int
-cpuHasFeature(const char *arch,
+cpuHasFeature(virArch arch,
const union cpuData *data,
const char *feature);
#define VIR_FROM_THIS VIR_FROM_CPU
-static const char *archs[] = { "armv7l" };
+static const virArch archs[] = { VIR_ARCH_ARMV7L };
static union cpuData *
ArmNodeData(void)
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;
}
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;
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;
}
#define VIR_FROM_THIS VIR_FROM_CPU
-static const char *archs[] = { "ppc64" };
+static const virArch archs[] = { VIR_ARCH_PPC64 };
struct cpuPowerPC {
const char *name;
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;
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;
if (!outputModel)
VIR_FREE(cpu->model);
- VIR_FREE(cpu->arch);
-
cleanup:
ppcModelFree(base_model);
ppcMapFree(map);
#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)
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;
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;
}
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;
if (!outputVendor)
VIR_FREE(cpu->vendor);
- VIR_FREE(cpu->arch);
-
cleanup:
x86ModelFree(base_model);
x86MapFree(map);
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;
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;
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
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");
}
virCapsGuestPtr guest = NULL;
virCPUDefPtr cpu = NULL;
union cpuData *data = NULL;
- const char *hostarch = NULL;
if ((caps = virCapabilitiesNew(virArchFromHost(),
0, 0)) == NULL)
goto error;
}
- hostarch = virArchToString(caps->host.arch);
- if (!(cpu->arch = strdup(hostarch))) {
+ if (!(cpu->arch = caps->host.arch)) {
virReportOOMError();
goto error;
}
* - 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",
cleanup:
virCPUDefFree(cpu);
- cpuDataFree(hostarch, data);
+ cpuDataFree(caps->host.arch, data);
return caps;