struct ppc64_model {
char *name;
const struct ppc64_vendor *vendor;
- struct cpuPPC64Data data;
+ virCPUppc64Data *data;
struct ppc64_model *next;
};
struct ppc64_model *models;
};
+static void
+ppc64DataFree(virCPUppc64Data *data)
+{
+ VIR_FREE(data);
+}
+
+static virCPUppc64Data *
+ppc64DataCopy(const virCPUppc64Data *data)
+{
+ virCPUppc64Data *copy;
+
+ if (VIR_ALLOC(copy) < 0)
+ return NULL;
+
+ copy->pvr = data->pvr;
+
+ return copy;
+}
+
static void
ppc64VendorFree(struct ppc64_vendor *vendor)
{
if (!model)
return;
+ ppc64DataFree(model->data);
VIR_FREE(model->name);
VIR_FREE(model);
}
{
struct ppc64_model *copy;
- if (VIR_ALLOC(copy) < 0 ||
- VIR_STRDUP(copy->name, model->name) < 0) {
- ppc64ModelFree(copy);
- return NULL;
- }
+ if (VIR_ALLOC(copy) < 0)
+ goto error;
+
+ if (VIR_STRDUP(copy->name, model->name) < 0)
+ goto error;
+
+ if (!(copy->data = ppc64DataCopy(model->data)))
+ goto error;
- copy->data.pvr = model->data.pvr;
copy->vendor = model->vendor;
return copy;
+
+ error:
+ ppc64ModelFree(copy);
+ return NULL;
}
static struct ppc64_model *
model = map->models;
while (model) {
- if (model->data.pvr == pvr)
+ if (model->data->pvr == pvr)
return model;
model = model->next;
if (VIR_ALLOC(model) < 0)
return -1;
+ if (VIR_ALLOC(model->data) < 0) {
+ ppc64ModelFree(model);
+ return -1;
+ }
+
model->name = virXPathString("string(@name)", ctxt);
if (!model->name) {
virReportError(VIR_ERR_INTERNAL_ERROR,
model->name);
goto ignore;
}
- model->data.pvr = pvr;
+ model->data->pvr = pvr;
if (!map->models) {
map->models = model;
struct ppc64_map *map;
if (VIR_ALLOC(map) < 0)
- return NULL;
+ goto error;
if (cpuMapLoad("ppc64", ppc64MapLoadCallback, map) < 0)
goto error;
static virCPUDataPtr
ppc64MakeCPUData(virArch arch,
- struct cpuPPC64Data *data)
+ virCPUppc64Data *data)
{
virCPUDataPtr cpuData;
return NULL;
cpuData->arch = arch;
- cpuData->data.ppc64 = *data;
+
+ if (!(cpuData->data.ppc64 = ppc64DataCopy(data)))
+ VIR_FREE(cpuData);
return cpuData;
}
}
if (guestData)
- if (!(*guestData = ppc64MakeCPUData(arch, &guest_model->data)))
+ if (!(*guestData = ppc64MakeCPUData(arch, guest_model->data)))
goto cleanup;
ret = VIR_CPU_COMPARE_IDENTICAL;
if (!data || !(map = ppc64LoadMap()))
return -1;
- if (!(model = ppc64ModelFindPVR(map, data->data.ppc64.pvr))) {
+ if (!(model = ppc64ModelFindPVR(map, data->data.ppc64->pvr))) {
virReportError(VIR_ERR_OPERATION_FAILED,
_("Cannot find CPU model with PVR 0x%08x"),
- data->data.ppc64.pvr);
+ data->data.ppc64->pvr);
goto cleanup;
}
if (!data)
return;
+ ppc64DataFree(data->data.ppc64);
VIR_FREE(data);
}
static virCPUDataPtr
ppc64DriverNodeData(virArch arch)
{
- virCPUDataPtr cpuData;
+ virCPUDataPtr nodeData;
+ virCPUppc64Data *data;
- if (VIR_ALLOC(cpuData) < 0)
- return NULL;
+ if (VIR_ALLOC(nodeData) < 0)
+ goto error;
- cpuData->arch = arch;
+ if (VIR_ALLOC(data) < 0)
+ goto error;
+
+ data = nodeData->data.ppc64;
#if defined(__powerpc__) || defined(__powerpc64__)
asm("mfpvr %0"
- : "=r" (cpuData->data.ppc64.pvr));
+ : "=r" (data->pvr));
#endif
- return cpuData;
+ nodeData->arch = arch;
+
+ return nodeData;
+
+ error:
+ ppc64DriverFree(nodeData);
+ return NULL;
}
static virCPUCompareResult