1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

cpu: Store arch in virCPUData

This commit is contained in:
Jiri Denemark 2013-07-16 14:39:40 +02:00
parent 57d52b244b
commit 1dfa174ad2
8 changed files with 55 additions and 54 deletions

View File

@ -198,29 +198,28 @@ cpuEncode(virArch arch,
return -1; return -1;
} }
return driver->encode(cpu, forced, required, return driver->encode(arch, cpu, forced, required,
optional, disabled, forbidden, vendor); optional, disabled, forbidden, vendor);
} }
void void
cpuDataFree(virArch arch, cpuDataFree(virCPUDataPtr data)
virCPUDataPtr data)
{ {
struct cpuArchDriver *driver; struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s, data=%p", virArchToString(arch), data); VIR_DEBUG("data=%p", data);
if (data == NULL) if (data == NULL)
return; return;
if ((driver = cpuGetSubDriver(arch)) == NULL) if ((driver = cpuGetSubDriver(data->arch)) == NULL)
return; return;
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"),
virArchToString(arch)); virArchToString(data->arch));
return; return;
} }
@ -419,22 +418,20 @@ cpuUpdate(virCPUDefPtr guest,
} }
int int
cpuHasFeature(virArch arch, cpuHasFeature(const virCPUDataPtr data,
const virCPUDataPtr data,
const char *feature) const char *feature)
{ {
struct cpuArchDriver *driver; struct cpuArchDriver *driver;
VIR_DEBUG("arch=%s, data=%p, feature=%s", VIR_DEBUG("data=%p, feature=%s", data, feature);
virArchToString(arch), data, feature);
if ((driver = cpuGetSubDriver(arch)) == NULL) if ((driver = cpuGetSubDriver(data->arch)) == NULL)
return -1; return -1;
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"),
virArchToString(arch)); virArchToString(data->arch));
return -1; return -1;
} }

View File

@ -32,12 +32,15 @@
# include "cpu_ppc_data.h" # include "cpu_ppc_data.h"
typedef union _virCPUData virCPUData; typedef struct _virCPUData virCPUData;
typedef virCPUData *virCPUDataPtr; typedef virCPUData *virCPUDataPtr;
union _virCPUData { struct _virCPUData {
virArch arch;
union {
struct cpuX86Data *x86; struct cpuX86Data *x86;
struct cpuPPCData ppc; struct cpuPPCData ppc;
/* generic driver needs no data */ /* generic driver needs no data */
} data;
}; };
@ -53,7 +56,8 @@ typedef int
const char *preferred); const char *preferred);
typedef int typedef int
(*cpuArchEncode) (const virCPUDefPtr cpu, (*cpuArchEncode) (virArch arch,
const virCPUDefPtr cpu,
virCPUDataPtr *forced, virCPUDataPtr *forced,
virCPUDataPtr *required, virCPUDataPtr *required,
virCPUDataPtr *optional, virCPUDataPtr *optional,
@ -130,8 +134,7 @@ cpuEncode (virArch arch,
virCPUDataPtr *vendor); virCPUDataPtr *vendor);
extern void extern void
cpuDataFree (virArch arch, cpuDataFree (virCPUDataPtr data);
virCPUDataPtr data);
extern virCPUDataPtr extern virCPUDataPtr
cpuNodeData (virArch arch); cpuNodeData (virArch arch);
@ -159,8 +162,7 @@ cpuUpdate (virCPUDefPtr guest,
const virCPUDefPtr host); const virCPUDefPtr host);
extern int extern int
cpuHasFeature(virArch arch, cpuHasFeature(const virCPUDataPtr data,
const virCPUDataPtr data,
const char *feature); const char *feature);

View File

@ -313,10 +313,10 @@ ppcDecode(virCPUDefPtr cpu,
if (data == NULL || (map = ppcLoadMap()) == NULL) if (data == NULL || (map = ppcLoadMap()) == NULL)
return -1; return -1;
if (!(model = ppcModelFindPVR(map, data->ppc.pvr))) { if (!(model = ppcModelFindPVR(map, data->data.ppc.pvr))) {
virReportError(VIR_ERR_OPERATION_FAILED, virReportError(VIR_ERR_OPERATION_FAILED,
_("Cannot find CPU model with PVR 0x%08x"), _("Cannot find CPU model with PVR 0x%08x"),
data->ppc.pvr); data->data.ppc.pvr);
goto cleanup; goto cleanup;
} }

View File

@ -216,14 +216,15 @@ x86DataFree(struct cpuX86Data *data)
static virCPUDataPtr static virCPUDataPtr
x86MakeCPUData(struct cpuX86Data **data) x86MakeCPUData(virArch arch, struct cpuX86Data **data)
{ {
virCPUDataPtr cpuData; virCPUDataPtr cpuData;
if (VIR_ALLOC(cpuData) < 0) if (VIR_ALLOC(cpuData) < 0)
return NULL; return NULL;
cpuData->x86 = *data; cpuData->arch = arch;
cpuData->data.x86 = *data;
*data = NULL; *data = NULL;
return cpuData; return cpuData;
@ -235,7 +236,7 @@ x86FreeCPUData(virCPUDataPtr data)
if (!data) if (!data)
return; return;
x86DataFree(data->x86); x86DataFree(data->data.x86);
VIR_FREE(data); VIR_FREE(data);
} }
@ -1165,6 +1166,7 @@ x86Compute(virCPUDefPtr host,
struct x86_model *guest_model = NULL; struct x86_model *guest_model = NULL;
virCPUCompareResult ret; virCPUCompareResult ret;
enum compare_result result; enum compare_result result;
virArch arch;
size_t i; size_t i;
if (cpu->arch != VIR_ARCH_NONE) { if (cpu->arch != VIR_ARCH_NONE) {
@ -1187,6 +1189,9 @@ x86Compute(virCPUDefPtr host,
goto error; goto error;
return VIR_CPU_COMPARE_INCOMPATIBLE; return VIR_CPU_COMPARE_INCOMPATIBLE;
} }
arch = cpu->arch;
} else {
arch = host->arch;
} }
if (cpu->vendor && if (cpu->vendor &&
@ -1266,7 +1271,7 @@ x86Compute(virCPUDefPtr host,
x86DataSubtract(guest_model->data, cpu_disable->data); x86DataSubtract(guest_model->data, cpu_disable->data);
if (!(guestData = x86DataCopy(guest_model->data)) || if (!(guestData = x86DataCopy(guest_model->data)) ||
!(*guest = x86MakeCPUData(&guestData))) { !(*guest = x86MakeCPUData(arch, &guestData))) {
x86DataFree(guestData); x86DataFree(guestData);
goto error; goto error;
} }
@ -1418,7 +1423,7 @@ x86DecodeCPUData(virCPUDefPtr cpu,
unsigned int nmodels, unsigned int nmodels,
const char *preferred) const char *preferred)
{ {
return x86Decode(cpu, data->x86, models, nmodels, preferred); return x86Decode(cpu, data->data.x86, models, nmodels, preferred);
} }
@ -1442,7 +1447,8 @@ x86EncodePolicy(const virCPUDefPtr cpu,
static int static int
x86Encode(const virCPUDefPtr cpu, x86Encode(virArch arch,
const virCPUDefPtr cpu,
virCPUDataPtr *forced, virCPUDataPtr *forced,
virCPUDataPtr *required, virCPUDataPtr *required,
virCPUDataPtr *optional, virCPUDataPtr *optional,
@ -1522,22 +1528,22 @@ x86Encode(const virCPUDefPtr cpu,
} }
if (forced && if (forced &&
!(*forced = x86MakeCPUData(&data_forced))) !(*forced = x86MakeCPUData(arch, &data_forced)))
goto error; goto error;
if (required && if (required &&
!(*required = x86MakeCPUData(&data_required))) !(*required = x86MakeCPUData(arch, &data_required)))
goto error; goto error;
if (optional && if (optional &&
!(*optional = x86MakeCPUData(&data_optional))) !(*optional = x86MakeCPUData(arch, &data_optional)))
goto error; goto error;
if (disabled && if (disabled &&
!(*disabled = x86MakeCPUData(&data_disabled))) !(*disabled = x86MakeCPUData(arch, &data_disabled)))
goto error; goto error;
if (forbidden && if (forbidden &&
!(*forbidden = x86MakeCPUData(&data_forbidden))) !(*forbidden = x86MakeCPUData(arch, &data_forbidden)))
goto error; goto error;
if (vendor && if (vendor &&
!(*vendor = x86MakeCPUData(&data_vendor))) !(*vendor = x86MakeCPUData(arch, &data_vendor)))
goto error; goto error;
ret = 0; ret = 0;
@ -1646,7 +1652,7 @@ x86NodeData(void)
goto error; goto error;
data->extended_len = ret; data->extended_len = ret;
if (!(cpuData = x86MakeCPUData(&data))) if (!(cpuData = x86MakeCPUData(virArchFromHost(), &data)))
goto error; goto error;
return cpuData; return cpuData;
@ -1885,7 +1891,7 @@ static int x86HasFeature(const virCPUDataPtr data,
if (!(feature = x86FeatureFind(map, name))) if (!(feature = x86FeatureFind(map, name)))
goto cleanup; goto cleanup;
ret = x86DataIsSubset(data->x86, feature->data) ? 1 : 0; ret = x86DataIsSubset(data->data.x86, feature->data) ? 1 : 0;
cleanup: cleanup:
x86MapFree(map); x86MapFree(map);

View File

@ -857,7 +857,7 @@ virQEMUCapsInitCPU(virCapsPtr caps,
ret = 0; ret = 0;
cleanup: cleanup:
cpuDataFree(arch, data); cpuDataFree(data);
return ret; return ret;

View File

@ -5704,7 +5704,7 @@ qemuBuildCpuArgStr(const virQEMUDriverPtr driver,
/* Only 'svm' requires --enable-nesting. The nested /* Only 'svm' requires --enable-nesting. The nested
* 'vmx' patches now simply hook off the CPU features * 'vmx' patches now simply hook off the CPU features
*/ */
hasSVM = cpuHasFeature(host->arch, data, "svm"); hasSVM = cpuHasFeature(data, "svm");
if (hasSVM < 0) if (hasSVM < 0)
goto cleanup; goto cleanup;
*hasHwVirt = hasSVM > 0 ? true : false; *hasHwVirt = hasSVM > 0 ? true : false;
@ -5845,8 +5845,7 @@ qemuBuildCpuArgStr(const virQEMUDriverPtr driver,
cleanup: cleanup:
VIR_FREE(compare_msg); VIR_FREE(compare_msg);
if (host) cpuDataFree(data);
cpuDataFree(host->arch, data);
virCPUDefFree(guest); virCPUDefFree(guest);
virCPUDefFree(cpu); virCPUDefFree(cpu);
virObjectUnref(caps); virObjectUnref(caps);
@ -9900,8 +9899,8 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
NULL, NULL, NULL, NULL) < 0) NULL, NULL, NULL, NULL) < 0)
goto cleanup; goto cleanup;
is_32bit = (cpuHasFeature(VIR_ARCH_X86_64, cpuData, "lm") != 1); is_32bit = (cpuHasFeature(cpuData, "lm") != 1);
cpuDataFree(VIR_ARCH_X86_64, cpuData); cpuDataFree(cpuData);
} else if (model) { } else if (model) {
is_32bit = STREQ(model, "qemu32"); is_32bit = STREQ(model, "qemu32");
} }

View File

@ -97,9 +97,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(caps->host.arch, data, "lm") && (cpuHasFeature(data, "lm") &&
(cpuHasFeature(caps->host.arch, data, "vmx") || (cpuHasFeature(data, "vmx") ||
cpuHasFeature(caps->host.arch, data, "svm")))) { cpuHasFeature(data, "svm")))) {
if ((guest = virCapabilitiesAddGuest(caps, if ((guest = virCapabilitiesAddGuest(caps,
"hvm", "hvm",
@ -115,8 +115,7 @@ vmwareCapsInit(void)
cleanup: cleanup:
virCPUDefFree(cpu); virCPUDefFree(cpu);
if (caps) cpuDataFree(data);
cpuDataFree(caps->host.arch, data);
return caps; return caps;

View File

@ -308,8 +308,7 @@ cpuTestGuestData(const void *arg)
cleanup: cleanup:
VIR_FREE(result); VIR_FREE(result);
if (host) cpuDataFree(guestData);
cpuDataFree(host->arch, guestData);
virCPUDefFree(host); virCPUDefFree(host);
virCPUDefFree(cpu); virCPUDefFree(cpu);
virCPUDefFree(guest); virCPUDefFree(guest);
@ -427,7 +426,7 @@ cpuTestHasFeature(const void *arg)
NULL, NULL, NULL, NULL) < 0) NULL, NULL, NULL, NULL) < 0)
goto cleanup; goto cleanup;
result = cpuHasFeature(host->arch, hostData, data->name); result = cpuHasFeature(hostData, data->name);
if (data->result == -1) if (data->result == -1)
virResetLastError(); virResetLastError();
@ -445,8 +444,7 @@ cpuTestHasFeature(const void *arg)
ret = 0; ret = 0;
cleanup: cleanup:
if (host) cpuDataFree(hostData);
cpuDataFree(host->arch, hostData);
virCPUDefFree(host); virCPUDefFree(host);
return ret; return ret;
} }