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)
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, " <arch>%s</arch>\n", def->arch);
virBufferAsprintf(buf, " <arch>%s</arch>\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;
}

View File

@ -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 */

View File

@ -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;
}

View File

@ -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);

View File

@ -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)

View File

@ -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;
}

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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");
}

View File

@ -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;