mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
Convert CPU APIs to use virArch
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
c25c18f71b
commit
1846b80be8
@ -79,7 +79,6 @@ virCPUDefFree(virCPUDefPtr def)
|
|||||||
if (!def)
|
if (!def)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
VIR_FREE(def->arch);
|
|
||||||
virCPUDefFreeModel(def);
|
virCPUDefFreeModel(def);
|
||||||
|
|
||||||
for (i = 0 ; i < def->ncells ; i++) {
|
for (i = 0 ; i < def->ncells ; i++) {
|
||||||
@ -149,9 +148,7 @@ virCPUDefCopy(const virCPUDefPtr cpu)
|
|||||||
copy->sockets = cpu->sockets;
|
copy->sockets = cpu->sockets;
|
||||||
copy->cores = cpu->cores;
|
copy->cores = cpu->cores;
|
||||||
copy->threads = cpu->threads;
|
copy->threads = cpu->threads;
|
||||||
|
copy->arch = cpu->arch;
|
||||||
if (cpu->arch && !(copy->arch = strdup(cpu->arch)))
|
|
||||||
goto no_memory;
|
|
||||||
|
|
||||||
if (virCPUDefCopyModel(copy, cpu, false) < 0)
|
if (virCPUDefCopyModel(copy, cpu, false) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
@ -273,12 +270,19 @@ virCPUDefParseXML(const xmlNodePtr node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (def->type == VIR_CPU_TYPE_HOST) {
|
if (def->type == VIR_CPU_TYPE_HOST) {
|
||||||
def->arch = virXPathString("string(./arch[1])", ctxt);
|
char *arch = virXPathString("string(./arch[1])", ctxt);
|
||||||
if (!def->arch) {
|
if (!arch) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("Missing CPU architecture"));
|
"%s", _("Missing CPU architecture"));
|
||||||
goto error;
|
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)) &&
|
if (!(def->model = virXPathString("string(./model[1])", ctxt)) &&
|
||||||
@ -554,7 +558,8 @@ virCPUDefFormatBufFull(virBufferPtr buf,
|
|||||||
virBufferAddLit(buf, ">\n");
|
virBufferAddLit(buf, ">\n");
|
||||||
|
|
||||||
if (def->arch)
|
if (def->arch)
|
||||||
virBufferAsprintf(buf, " <arch>%s</arch>\n", def->arch);
|
virBufferAsprintf(buf, " <arch>%s</arch>\n",
|
||||||
|
virArchToString(def->arch));
|
||||||
|
|
||||||
virBufferAdjustIndent(buf, 2);
|
virBufferAdjustIndent(buf, 2);
|
||||||
if (virCPUDefFormatBuf(buf, def, flags) < 0)
|
if (virCPUDefFormatBuf(buf, def, flags) < 0)
|
||||||
@ -734,10 +739,11 @@ virCPUDefIsEqual(virCPUDefPtr src,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (STRNEQ_NULLABLE(src->arch, dst->arch)) {
|
if (src->arch != dst->arch) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("Target CPU arch %s does not match source %s"),
|
_("Target CPU arch %s does not match source %s"),
|
||||||
NULLSTR(dst->arch), NULLSTR(src->arch));
|
virArchToString(dst->arch),
|
||||||
|
virArchToString(src->arch));
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
# include "buf.h"
|
# include "buf.h"
|
||||||
# include "xml.h"
|
# include "xml.h"
|
||||||
# include "bitmap.h"
|
# include "bitmap.h"
|
||||||
|
# include "virarch.h"
|
||||||
|
|
||||||
# define VIR_CPU_VENDOR_ID_LENGTH 12
|
# define VIR_CPU_VENDOR_ID_LENGTH 12
|
||||||
|
|
||||||
@ -104,7 +105,7 @@ struct _virCPUDef {
|
|||||||
int type; /* enum virCPUType */
|
int type; /* enum virCPUType */
|
||||||
int mode; /* enum virCPUMode */
|
int mode; /* enum virCPUMode */
|
||||||
int match; /* enum virCPUMatch */
|
int match; /* enum virCPUMatch */
|
||||||
char *arch;
|
virArch arch;
|
||||||
char *model;
|
char *model;
|
||||||
char *vendor_id; /* vendor id returned by CPUID in the guest */
|
char *vendor_id; /* vendor id returned by CPUID in the guest */
|
||||||
int fallback; /* enum virCPUFallback */
|
int fallback; /* enum virCPUFallback */
|
||||||
|
@ -48,12 +48,12 @@ static struct cpuArchDriver *drivers[] = {
|
|||||||
|
|
||||||
|
|
||||||
static struct cpuArchDriver *
|
static struct cpuArchDriver *
|
||||||
cpuGetSubDriver(const char *arch)
|
cpuGetSubDriver(virArch arch)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
if (arch == NULL) {
|
if (arch == VIR_ARCH_NONE) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
"%s", _("undefined hardware architecture"));
|
"%s", _("undefined hardware architecture"));
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -61,7 +61,7 @@ cpuGetSubDriver(const char *arch)
|
|||||||
|
|
||||||
for (i = 0; i < NR_DRIVERS - 1; i++) {
|
for (i = 0; i < NR_DRIVERS - 1; i++) {
|
||||||
for (j = 0; j < drivers[i]->narch; j++) {
|
for (j = 0; j < drivers[i]->narch; j++) {
|
||||||
if (STREQ(arch, drivers[i]->arch[j]))
|
if (arch == drivers[i]->arch[j])
|
||||||
return drivers[i];
|
return drivers[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,7 +120,7 @@ cpuCompare(virCPUDefPtr host,
|
|||||||
if (driver->compare == NULL) {
|
if (driver->compare == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot compare CPUs of %s architecture"),
|
_("cannot compare CPUs of %s architecture"),
|
||||||
host->arch);
|
virArchToString(host->arch));
|
||||||
return VIR_CPU_COMPARE_ERROR;
|
return VIR_CPU_COMPARE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +163,7 @@ cpuDecode(virCPUDefPtr cpu,
|
|||||||
if (driver->decode == NULL) {
|
if (driver->decode == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot decode CPU data for %s architecture"),
|
_("cannot decode CPU data for %s architecture"),
|
||||||
cpu->arch);
|
virArchToString(cpu->arch));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ cpuDecode(virCPUDefPtr cpu,
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
cpuEncode(const char *arch,
|
cpuEncode(virArch arch,
|
||||||
const virCPUDefPtr cpu,
|
const virCPUDefPtr cpu,
|
||||||
union cpuData **forced,
|
union cpuData **forced,
|
||||||
union cpuData **required,
|
union cpuData **required,
|
||||||
@ -185,7 +185,7 @@ cpuEncode(const char *arch,
|
|||||||
|
|
||||||
VIR_DEBUG("arch=%s, cpu=%p, forced=%p, required=%p, "
|
VIR_DEBUG("arch=%s, cpu=%p, forced=%p, required=%p, "
|
||||||
"optional=%p, disabled=%p, forbidden=%p, vendor=%p",
|
"optional=%p, disabled=%p, forbidden=%p, vendor=%p",
|
||||||
NULLSTR(arch), cpu, forced, required,
|
virArchToString(arch), cpu, forced, required,
|
||||||
optional, disabled, forbidden, vendor);
|
optional, disabled, forbidden, vendor);
|
||||||
|
|
||||||
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
||||||
@ -194,7 +194,7 @@ cpuEncode(const char *arch,
|
|||||||
if (driver->encode == NULL) {
|
if (driver->encode == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot encode CPU data for %s architecture"),
|
_("cannot encode CPU data for %s architecture"),
|
||||||
arch);
|
virArchToString(arch));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -204,12 +204,12 @@ cpuEncode(const char *arch,
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
cpuDataFree(const char *arch,
|
cpuDataFree(virArch arch,
|
||||||
union cpuData *data)
|
union cpuData *data)
|
||||||
{
|
{
|
||||||
struct cpuArchDriver *driver;
|
struct cpuArchDriver *driver;
|
||||||
|
|
||||||
VIR_DEBUG("arch=%s, data=%p", NULLSTR(arch), data);
|
VIR_DEBUG("arch=%s, data=%p", virArchToString(arch), data);
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return;
|
return;
|
||||||
@ -220,7 +220,7 @@ cpuDataFree(const char *arch,
|
|||||||
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"),
|
||||||
arch);
|
virArchToString(arch));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,11 +229,11 @@ cpuDataFree(const char *arch,
|
|||||||
|
|
||||||
|
|
||||||
union cpuData *
|
union cpuData *
|
||||||
cpuNodeData(const char *arch)
|
cpuNodeData(virArch arch)
|
||||||
{
|
{
|
||||||
struct cpuArchDriver *driver;
|
struct cpuArchDriver *driver;
|
||||||
|
|
||||||
VIR_DEBUG("arch=%s", NULLSTR(arch));
|
VIR_DEBUG("arch=%s", virArchToString(arch));
|
||||||
|
|
||||||
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -241,7 +241,7 @@ cpuNodeData(const char *arch)
|
|||||||
if (driver->nodeData == NULL) {
|
if (driver->nodeData == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot get node CPU data for %s architecture"),
|
_("cannot get node CPU data for %s architecture"),
|
||||||
arch);
|
virArchToString(arch));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ cpuGuestData(virCPUDefPtr host,
|
|||||||
if (driver->guestData == NULL) {
|
if (driver->guestData == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot compute guest CPU data for %s architecture"),
|
_("cannot compute guest CPU data for %s architecture"),
|
||||||
host->arch);
|
virArchToString(host->arch));
|
||||||
return VIR_CPU_COMPARE_ERROR;
|
return VIR_CPU_COMPARE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +391,7 @@ cpuBaseline(virCPUDefPtr *cpus,
|
|||||||
if (driver->baseline == NULL) {
|
if (driver->baseline == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot compute baseline CPU of %s architecture"),
|
_("cannot compute baseline CPU of %s architecture"),
|
||||||
cpus[0]->arch);
|
virArchToString(cpus[0]->arch));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -413,7 +413,7 @@ cpuUpdate(virCPUDefPtr guest,
|
|||||||
if (driver->update == NULL) {
|
if (driver->update == NULL) {
|
||||||
virReportError(VIR_ERR_NO_SUPPORT,
|
virReportError(VIR_ERR_NO_SUPPORT,
|
||||||
_("cannot update guest CPU data for %s architecture"),
|
_("cannot update guest CPU data for %s architecture"),
|
||||||
host->arch);
|
virArchToString(host->arch));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -421,14 +421,14 @@ cpuUpdate(virCPUDefPtr guest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
cpuHasFeature(const char *arch,
|
cpuHasFeature(virArch arch,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char *feature)
|
const char *feature)
|
||||||
{
|
{
|
||||||
struct cpuArchDriver *driver;
|
struct cpuArchDriver *driver;
|
||||||
|
|
||||||
VIR_DEBUG("arch=%s, data=%p, feature=%s",
|
VIR_DEBUG("arch=%s, data=%p, feature=%s",
|
||||||
arch, data, feature);
|
virArchToString(arch), data, feature);
|
||||||
|
|
||||||
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
if ((driver = cpuGetSubDriver(arch)) == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
@ -436,7 +436,7 @@ cpuHasFeature(const char *arch,
|
|||||||
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"),
|
||||||
arch);
|
virArchToString(arch));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
# include "virterror_internal.h"
|
# include "virterror_internal.h"
|
||||||
# include "datatypes.h"
|
# include "datatypes.h"
|
||||||
|
# include "virarch.h"
|
||||||
# include "conf/cpu_conf.h"
|
# include "conf/cpu_conf.h"
|
||||||
# include "cpu_x86_data.h"
|
# include "cpu_x86_data.h"
|
||||||
# include "cpu_ppc_data.h"
|
# include "cpu_ppc_data.h"
|
||||||
@ -88,7 +89,7 @@ typedef int
|
|||||||
|
|
||||||
struct cpuArchDriver {
|
struct cpuArchDriver {
|
||||||
const char *name;
|
const char *name;
|
||||||
const char **arch;
|
const virArch *arch;
|
||||||
unsigned int narch;
|
unsigned int narch;
|
||||||
cpuArchCompare compare;
|
cpuArchCompare compare;
|
||||||
cpuArchDecode decode;
|
cpuArchDecode decode;
|
||||||
@ -118,7 +119,7 @@ cpuDecode (virCPUDefPtr cpu,
|
|||||||
const char *preferred);
|
const char *preferred);
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
cpuEncode (const char *arch,
|
cpuEncode (virArch arch,
|
||||||
const virCPUDefPtr cpu,
|
const virCPUDefPtr cpu,
|
||||||
union cpuData **forced,
|
union cpuData **forced,
|
||||||
union cpuData **required,
|
union cpuData **required,
|
||||||
@ -128,11 +129,11 @@ cpuEncode (const char *arch,
|
|||||||
union cpuData **vendor);
|
union cpuData **vendor);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
cpuDataFree (const char *arch,
|
cpuDataFree (virArch arch,
|
||||||
union cpuData *data);
|
union cpuData *data);
|
||||||
|
|
||||||
extern union cpuData *
|
extern union cpuData *
|
||||||
cpuNodeData (const char *arch);
|
cpuNodeData (virArch arch);
|
||||||
|
|
||||||
extern virCPUCompareResult
|
extern virCPUCompareResult
|
||||||
cpuGuestData(virCPUDefPtr host,
|
cpuGuestData(virCPUDefPtr host,
|
||||||
@ -157,7 +158,7 @@ cpuUpdate (virCPUDefPtr guest,
|
|||||||
const virCPUDefPtr host);
|
const virCPUDefPtr host);
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
cpuHasFeature(const char *arch,
|
cpuHasFeature(virArch arch,
|
||||||
const union cpuData *data,
|
const union cpuData *data,
|
||||||
const char *feature);
|
const char *feature);
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_CPU
|
#define VIR_FROM_THIS VIR_FROM_CPU
|
||||||
|
|
||||||
static const char *archs[] = { "armv7l" };
|
static const virArch archs[] = { VIR_ARCH_ARMV7L };
|
||||||
|
|
||||||
static union cpuData *
|
static union cpuData *
|
||||||
ArmNodeData(void)
|
ArmNodeData(void)
|
||||||
|
@ -64,7 +64,8 @@ genericCompare(virCPUDefPtr host,
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int reqfeatures;
|
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))
|
STRNEQ(host->model, cpu->model))
|
||||||
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
||||||
|
|
||||||
@ -139,11 +140,11 @@ genericBaseline(virCPUDefPtr *cpus,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (VIR_ALLOC(cpu) < 0 ||
|
if (VIR_ALLOC(cpu) < 0 ||
|
||||||
!(cpu->arch = strdup(cpus[0]->arch)) ||
|
|
||||||
!(cpu->model = strdup(cpus[0]->model)) ||
|
!(cpu->model = strdup(cpus[0]->model)) ||
|
||||||
VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0)
|
VIR_ALLOC_N(features, cpus[0]->nfeatures) < 0)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
|
cpu->arch = cpus[0]->arch;
|
||||||
cpu->type = VIR_CPU_TYPE_HOST;
|
cpu->type = VIR_CPU_TYPE_HOST;
|
||||||
|
|
||||||
count = nfeatures = cpus[0]->nfeatures;
|
count = nfeatures = cpus[0]->nfeatures;
|
||||||
@ -153,10 +154,11 @@ genericBaseline(virCPUDefPtr *cpus,
|
|||||||
for (i = 1; i < ncpus; i++) {
|
for (i = 1; i < ncpus; i++) {
|
||||||
virHashTablePtr hash;
|
virHashTablePtr hash;
|
||||||
|
|
||||||
if (STRNEQ(cpu->arch, cpus[i]->arch)) {
|
if (cpu->arch != cpus[i]->arch) {
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||||
_("CPUs have incompatible architectures: '%s' != '%s'"),
|
_("CPUs have incompatible architectures: '%s' != '%s'"),
|
||||||
cpu->arch, cpus[i]->arch);
|
virArchToString(cpu->arch),
|
||||||
|
virArchToString(cpus[i]->arch));
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_CPU
|
#define VIR_FROM_THIS VIR_FROM_CPU
|
||||||
|
|
||||||
static const char *archs[] = { "ppc64" };
|
static const virArch archs[] = { VIR_ARCH_PPC64 };
|
||||||
|
|
||||||
struct cpuPowerPC {
|
struct cpuPowerPC {
|
||||||
const char *name;
|
const char *name;
|
||||||
@ -417,7 +417,8 @@ static virCPUCompareResult
|
|||||||
PowerPCCompare(virCPUDefPtr host,
|
PowerPCCompare(virCPUDefPtr host,
|
||||||
virCPUDefPtr cpu)
|
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))
|
STRNEQ(host->model, cpu->model))
|
||||||
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
||||||
|
|
||||||
@ -589,9 +590,10 @@ PowerPCBaseline(virCPUDefPtr *cpus,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VIR_ALLOC(cpu) < 0 ||
|
if (VIR_ALLOC(cpu) < 0)
|
||||||
!(cpu->arch = strdup(cpus[0]->arch)))
|
goto no_memory;
|
||||||
goto no_memory;
|
|
||||||
|
cpu->arch = cpus[0]->arch;
|
||||||
cpu->type = VIR_CPU_TYPE_GUEST;
|
cpu->type = VIR_CPU_TYPE_GUEST;
|
||||||
cpu->match = VIR_CPU_MATCH_EXACT;
|
cpu->match = VIR_CPU_MATCH_EXACT;
|
||||||
|
|
||||||
@ -610,8 +612,6 @@ PowerPCBaseline(virCPUDefPtr *cpus,
|
|||||||
if (!outputModel)
|
if (!outputModel)
|
||||||
VIR_FREE(cpu->model);
|
VIR_FREE(cpu->model);
|
||||||
|
|
||||||
VIR_FREE(cpu->arch);
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
ppcModelFree(base_model);
|
ppcModelFree(base_model);
|
||||||
ppcMapFree(map);
|
ppcMapFree(map);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_CPU
|
#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 *
|
static union cpuData *
|
||||||
s390NodeData(void)
|
s390NodeData(void)
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
static const struct cpuX86cpuid cpuidNull = { 0, 0, 0, 0, 0 };
|
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 {
|
struct x86_vendor {
|
||||||
char *name;
|
char *name;
|
||||||
@ -1165,22 +1165,23 @@ x86Compute(virCPUDefPtr host,
|
|||||||
enum compare_result result;
|
enum compare_result result;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (cpu->arch != NULL) {
|
if (cpu->arch != VIR_ARCH_NONE) {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_CARDINALITY(archs); i++) {
|
for (i = 0; i < ARRAY_CARDINALITY(archs); i++) {
|
||||||
if (STREQ(archs[i], cpu->arch)) {
|
if (archs[i] == cpu->arch) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) {
|
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 &&
|
if (message &&
|
||||||
virAsprintf(message,
|
virAsprintf(message,
|
||||||
_("CPU arch %s does not match host arch"),
|
_("CPU arch %s does not match host arch"),
|
||||||
cpu->arch) < 0)
|
virArchToString(cpu->arch)) < 0)
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
return VIR_CPU_COMPARE_INCOMPATIBLE;
|
||||||
}
|
}
|
||||||
@ -1643,9 +1644,10 @@ x86Baseline(virCPUDefPtr *cpus,
|
|||||||
if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE)))
|
if (!(base_model = x86ModelFromCPU(cpus[0], map, VIR_CPU_FEATURE_REQUIRE)))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
if (VIR_ALLOC(cpu) < 0 ||
|
if (VIR_ALLOC(cpu) < 0)
|
||||||
!(cpu->arch = strdup(cpus[0]->arch)))
|
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
|
cpu->arch = cpus[0]->arch;
|
||||||
cpu->type = VIR_CPU_TYPE_GUEST;
|
cpu->type = VIR_CPU_TYPE_GUEST;
|
||||||
cpu->match = VIR_CPU_MATCH_EXACT;
|
cpu->match = VIR_CPU_MATCH_EXACT;
|
||||||
|
|
||||||
@ -1713,8 +1715,6 @@ x86Baseline(virCPUDefPtr *cpus,
|
|||||||
if (!outputVendor)
|
if (!outputVendor)
|
||||||
VIR_FREE(cpu->vendor);
|
VIR_FREE(cpu->vendor);
|
||||||
|
|
||||||
VIR_FREE(cpu->arch);
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
x86ModelFree(base_model);
|
x86ModelFree(base_model);
|
||||||
x86MapFree(map);
|
x86MapFree(map);
|
||||||
|
@ -811,14 +811,14 @@ qemuCapsInitCPU(virCapsPtr caps,
|
|||||||
union cpuData *data = NULL;
|
union cpuData *data = NULL;
|
||||||
virNodeInfo nodeinfo;
|
virNodeInfo nodeinfo;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
const char *archstr = virArchToString(arch);
|
|
||||||
|
|
||||||
if (VIR_ALLOC(cpu) < 0
|
if (VIR_ALLOC(cpu) < 0) {
|
||||||
|| !(cpu->arch = strdup(archstr))) {
|
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cpu->arch = arch;
|
||||||
|
|
||||||
if (nodeGetInfo(NULL, &nodeinfo))
|
if (nodeGetInfo(NULL, &nodeinfo))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
@ -828,14 +828,14 @@ qemuCapsInitCPU(virCapsPtr caps,
|
|||||||
cpu->threads = nodeinfo.threads;
|
cpu->threads = nodeinfo.threads;
|
||||||
caps->host.cpu = cpu;
|
caps->host.cpu = cpu;
|
||||||
|
|
||||||
if (!(data = cpuNodeData(archstr))
|
if (!(data = cpuNodeData(arch))
|
||||||
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0)
|
|| cpuDecode(cpu, data, NULL, 0, NULL) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
cpuDataFree(archstr, data);
|
cpuDataFree(arch, data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -4409,10 +4409,10 @@ qemuBuildCpuArgStr(const virQEMUDriverPtr driver,
|
|||||||
virBufferAddLit(&buf, "host");
|
virBufferAddLit(&buf, "host");
|
||||||
} else {
|
} else {
|
||||||
if (VIR_ALLOC(guest) < 0 ||
|
if (VIR_ALLOC(guest) < 0 ||
|
||||||
!(guest->arch = strdup(host->arch)) ||
|
|
||||||
(cpu->vendor_id && !(guest->vendor_id = strdup(cpu->vendor_id))))
|
(cpu->vendor_id && !(guest->vendor_id = strdup(cpu->vendor_id))))
|
||||||
goto no_memory;
|
goto no_memory;
|
||||||
|
|
||||||
|
guest->arch = host->arch;
|
||||||
if (cpu->match == VIR_CPU_MATCH_MINIMUM)
|
if (cpu->match == VIR_CPU_MATCH_MINIMUM)
|
||||||
preferred = host->model;
|
preferred = host->model;
|
||||||
else
|
else
|
||||||
@ -8204,13 +8204,13 @@ qemuParseCommandLineCPU(virDomainDefPtr dom,
|
|||||||
union cpuData *cpuData = NULL;
|
union cpuData *cpuData = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = cpuEncode("x86_64", cpu, NULL, &cpuData,
|
ret = cpuEncode(VIR_ARCH_X86_64, cpu, NULL, &cpuData,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
is_32bit = (cpuHasFeature("x86_64", cpuData, "lm") != 1);
|
is_32bit = (cpuHasFeature(VIR_ARCH_X86_64, cpuData, "lm") != 1);
|
||||||
cpuDataFree("x86_64", cpuData);
|
cpuDataFree(VIR_ARCH_X86_64, cpuData);
|
||||||
} else if (model) {
|
} else if (model) {
|
||||||
is_32bit = STREQ(model, "qemu32");
|
is_32bit = STREQ(model, "qemu32");
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,6 @@ vmwareCapsInit(void)
|
|||||||
virCapsGuestPtr guest = NULL;
|
virCapsGuestPtr guest = NULL;
|
||||||
virCPUDefPtr cpu = NULL;
|
virCPUDefPtr cpu = NULL;
|
||||||
union cpuData *data = NULL;
|
union cpuData *data = NULL;
|
||||||
const char *hostarch = NULL;
|
|
||||||
|
|
||||||
if ((caps = virCapabilitiesNew(virArchFromHost(),
|
if ((caps = virCapabilitiesNew(virArchFromHost(),
|
||||||
0, 0)) == NULL)
|
0, 0)) == NULL)
|
||||||
@ -91,8 +90,7 @@ vmwareCapsInit(void)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
hostarch = virArchToString(caps->host.arch);
|
if (!(cpu->arch = caps->host.arch)) {
|
||||||
if (!(cpu->arch = strdup(hostarch))) {
|
|
||||||
virReportOOMError();
|
virReportOOMError();
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
@ -109,9 +107,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(hostarch, data, "lm") &&
|
(cpuHasFeature(caps->host.arch, data, "lm") &&
|
||||||
(cpuHasFeature(hostarch, data, "vmx") ||
|
(cpuHasFeature(caps->host.arch, data, "vmx") ||
|
||||||
cpuHasFeature(hostarch, data, "svm")))) {
|
cpuHasFeature(caps->host.arch, data, "svm")))) {
|
||||||
|
|
||||||
if ((guest = virCapabilitiesAddGuest(caps,
|
if ((guest = virCapabilitiesAddGuest(caps,
|
||||||
"hvm",
|
"hvm",
|
||||||
@ -129,7 +127,7 @@ vmwareCapsInit(void)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
virCPUDefFree(cpu);
|
virCPUDefFree(cpu);
|
||||||
cpuDataFree(hostarch, data);
|
cpuDataFree(caps->host.arch, data);
|
||||||
|
|
||||||
return caps;
|
return caps;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user