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:
parent
57d52b244b
commit
1dfa174ad2
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -857,7 +857,7 @@ virQEMUCapsInitCPU(virCapsPtr caps,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
cpuDataFree(arch, data);
|
cpuDataFree(data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user