On Thu, 2015-08-06 at 16:42 +0200, Jiri Denemark wrote:
> @@ -364,6 +358,24 @@ ppc64ModelLoad(xmlXPathContextPtr ctxt,
> model->data->pvr[i].value = pvr;
>
> VIR_FREE(prop);
> +
> + if (!(prop = virXMLPropString(nodes[i], "mask"))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Missing PVR mask in CPU model %s"),
> + model->name);
> + goto ignore;
> + }
> +
> + if (virStrToLong_ul(prop, NULL, 16, &pvr) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Invalid PVR mask in CPU model %s"),
> + model->name);
> + goto ignore;
> + }
> +
> + model->data->pvr[i].mask = pvr;
Wouldn't virXPathULongHex be good enough?
See the replay to the same remark in patch 13/18.
> +
> + VIR_FREE(prop);
> }
>
> if (!map->models) {
> @@ -607,33 +619,33 @@ ppc64DriverFree(virCPUDataPtr data)
> static virCPUDataPtr
> ppc64DriverNodeData(virArch arch)
> {
> - virCPUDataPtr cpuData;
> -
> - if (VIR_ALLOC(cpuData) < 0)
> - goto error;
> -
> - if (VIR_ALLOC(cpuData->data.ppc64) < 0)
> - goto error;
> -
> - if (VIR_ALLOC_N(cpuData->data.ppc64->pvr, 1) < 0)
> - goto error;
> -
> - cpuData->data.ppc64->len = 1;
> -
> - cpuData->arch = arch;
> + virCPUDataPtr nodeData = NULL;
> + struct ppc64_map *map = NULL;
> + struct ppc64_model *model = NULL;
> + uint32_t pvr = 0;
>
> #if defined(__powerpc__) || defined(__powerpc64__)
> asm("mfpvr %0"
> - : "=r" (cpuData->data.ppc64->pvr[0].value));
> + : "=r" (pvr));
> #endif
>
> - return cpuData;
> + if (!(map = ppc64LoadMap()))
> + goto cleanup;
>
> - error:
> - if (cpuData)
> - ppc64DataFree(cpuData->data.ppc64);
> - VIR_FREE(cpuData);
> - return NULL;
> + if (!(model = ppc64ModelFindPVR(map, pvr))) {
> + virReportError(VIR_ERR_OPERATION_FAILED,
> + _("Cannot find CPU model with PVR 0x%08x"),
> + pvr);
> + goto cleanup;
> + }
> +
> + if (!(nodeData = ppc64MakeCPUData(arch, model->data)))
> + goto cleanup;
> +
> + cleanup:
> + ppc64MapFree(map);
> +
> + return nodeData;
> }
The ppc64DriverNodeData API is supposed to return raw data from the
host, which is then passed to ppc64DriverDecode to be translated into
a
CPU model name. In other words, you copied most of the internals of
ppc64DriverDecode here while you in fact only need to add a single
line
cpuData->data.ppc64->pvr[0].mask = 0xffffffff;
Done.
Cheers.
--
Andrea Bolognani
Software Engineer - Virtualization Team