/**
* qemuMonitorJSONGetGuestCPUx86:
* @mon: Pointer to the monitor
+ * @cpuQOMPath: QOM path of a CPU to probe
* @data: returns the cpu data
* @disabled: returns the CPU data for features which were disabled by QEMU
*
*/
int
qemuMonitorGetGuestCPUx86(qemuMonitor *mon,
+ const char *cpuQOMPath,
virCPUData **data,
virCPUData **disabled)
{
- VIR_DEBUG("data=%p disabled=%p", data, disabled);
+ VIR_DEBUG("cpuQOMPath=%s data=%p disabled=%p", cpuQOMPath, data, disabled);
QEMU_CHECK_MONITOR(mon);
if (disabled)
*disabled = NULL;
- return qemuMonitorJSONGetGuestCPUx86(mon, data, disabled);
+ return qemuMonitorJSONGetGuestCPUx86(mon, cpuQOMPath, data, disabled);
}
* qemuMonitorGetGuestCPU:
* @mon: Pointer to the monitor
* @arch: CPU architecture
+ * @cpuQOMPath: QOM path of a CPU to probe
* @translate: callback for translating CPU feature names from QEMU to libvirt
* @opaque: data for @translate callback
* @enabled: returns the CPU data for all enabled features
int
qemuMonitorGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
void *opaque,
virCPUData **enabled,
virCPUData **disabled)
{
- VIR_DEBUG("arch=%s translate=%p opaque=%p enabled=%p disabled=%p",
- virArchToString(arch), translate, opaque, enabled, disabled);
+ VIR_DEBUG("arch=%s cpuQOMPath=%s translate=%p opaque=%p enabled=%p disabled=%p",
+ virArchToString(arch), cpuQOMPath, translate, opaque, enabled, disabled);
QEMU_CHECK_MONITOR(mon);
if (disabled)
*disabled = NULL;
- return qemuMonitorJSONGetGuestCPU(mon, arch, translate, opaque,
+ return qemuMonitorJSONGetGuestCPU(mon, arch, cpuQOMPath, translate, opaque,
enabled, disabled);
}
*/
int
qemuMonitorGetCPUMigratable(qemuMonitor *mon,
+ const char *cpuQOMPath,
bool *migratable)
{
QEMU_CHECK_MONITOR(mon);
- return qemuMonitorJSONGetCPUMigratable(mon, migratable);
+ return qemuMonitorJSONGetCPUMigratable(mon, cpuQOMPath, migratable);
}
VIR_LOG_INIT("qemu.qemu_monitor_json");
-#define QOM_CPU_PATH "/machine/unattached/device[0]"
-
#define LINE_ENDING "\r\n"
VIR_ENUM_IMPL(qemuMonitorJob,
static int
qemuMonitorJSONGetCPUx86Data(qemuMonitor *mon,
+ const char *cpuQOMPath,
const char *property,
virCPUData **cpudata)
{
virJSONValue *data;
if (!(cmd = qemuMonitorJSONMakeCommand("qom-get",
- "s:path", QOM_CPU_PATH,
+ "s:path", cpuQOMPath,
"s:property", property,
NULL)))
return -1;
* of a guest CPU, and 1 if the feature is supported.
*/
static int
-qemuMonitorJSONCheckCPUx86(qemuMonitor *mon)
+qemuMonitorJSONCheckCPUx86(qemuMonitor *mon,
+ const char *cpuQOMPath)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
size_t n;
if (!(cmd = qemuMonitorJSONMakeCommand("qom-list",
- "s:path", QOM_CPU_PATH,
+ "s:path", cpuQOMPath,
NULL)))
return -1;
/**
* qemuMonitorJSONGetGuestCPUx86:
* @mon: Pointer to the monitor
+ * @cpuQOMPath: QOM path of a CPU to probe
* @data: returns the cpu data of the guest
* @disabled: returns the CPU data for features which were disabled by QEMU
*
*/
int
qemuMonitorJSONGetGuestCPUx86(qemuMonitor *mon,
+ const char *cpuQOMPath,
virCPUData **data,
virCPUData **disabled)
{
g_autoptr(virCPUData) cpuDisabled = NULL;
int rc;
- if ((rc = qemuMonitorJSONCheckCPUx86(mon)) < 0)
+ if ((rc = qemuMonitorJSONCheckCPUx86(mon, cpuQOMPath)) < 0)
return -1;
else if (!rc)
return -2;
- if (qemuMonitorJSONGetCPUx86Data(mon, "feature-words",
+ if (qemuMonitorJSONGetCPUx86Data(mon, cpuQOMPath, "feature-words",
&cpuEnabled) < 0)
return -1;
if (disabled &&
- qemuMonitorJSONGetCPUx86Data(mon, "filtered-features",
+ qemuMonitorJSONGetCPUx86Data(mon, cpuQOMPath, "filtered-features",
&cpuDisabled) < 0)
return -1;
static int
qemuMonitorJSONGetCPUProperties(qemuMonitor *mon,
+ const char *cpuQOMPath,
char ***props)
{
g_autoptr(virJSONValue) cmd = NULL;
*props = NULL;
if (!(cmd = qemuMonitorJSONMakeCommand("qom-list",
- "s:path", QOM_CPU_PATH,
+ "s:path", cpuQOMPath,
NULL)))
return -1;
static int
qemuMonitorJSONGetCPUData(qemuMonitor *mon,
+ const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
void *opaque,
virCPUData *data)
g_auto(GStrv) props = NULL;
char **p;
- if (qemuMonitorJSONGetCPUProperties(mon, &props) < 0)
+ if (qemuMonitorJSONGetCPUProperties(mon, cpuQOMPath, &props) < 0)
return -1;
for (p = props; p && *p; p++) {
const char *name = *p;
- if (qemuMonitorJSONGetObjectProperty(mon, QOM_CPU_PATH, name, &prop) < 0)
+ if (qemuMonitorJSONGetObjectProperty(mon, cpuQOMPath, name, &prop) < 0)
return -1;
if (!prop.val.b)
static int
qemuMonitorJSONGetCPUDataDisabled(qemuMonitor *mon,
+ const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
void *opaque,
virCPUData *data)
g_auto(GStrv) props = NULL;
char **p;
- if (qemuMonitorJSONGetStringListProperty(mon, QOM_CPU_PATH,
+ if (qemuMonitorJSONGetStringListProperty(mon, cpuQOMPath,
"unavailable-features", &props) < 0)
return -1;
* qemuMonitorJSONGetGuestCPU:
* @mon: Pointer to the monitor
* @arch: CPU architecture
+ * @cpuQOMPath: QOM path of a CPU to probe
* @translate: callback for translating CPU feature names from QEMU to libvirt
* @opaque: data for @translate callback
* @enabled: returns the CPU data for all enabled features
int
qemuMonitorJSONGetGuestCPU(qemuMonitor *mon,
virArch arch,
+ const char *cpuQOMPath,
qemuMonitorCPUFeatureTranslationCallback translate,
void *opaque,
virCPUData **enabled,
!(cpuDisabled = virCPUDataNew(arch)))
return -1;
- if (qemuMonitorJSONGetCPUData(mon, translate, opaque, cpuEnabled) < 0)
+ if (qemuMonitorJSONGetCPUData(mon, cpuQOMPath, translate, opaque, cpuEnabled) < 0)
return -1;
if (disabled &&
- qemuMonitorJSONGetCPUDataDisabled(mon, translate, opaque, cpuDisabled) < 0)
+ qemuMonitorJSONGetCPUDataDisabled(mon, cpuQOMPath, translate, opaque, cpuDisabled) < 0)
return -1;
*enabled = g_steal_pointer(&cpuEnabled);
int
qemuMonitorJSONGetCPUMigratable(qemuMonitor *mon,
+ const char *cpuQOMPath,
bool *migratable)
{
g_autoptr(virJSONValue) cmd = NULL;
g_autoptr(virJSONValue) reply = NULL;
if (!(cmd = qemuMonitorJSONMakeCommand("qom-get",
- "s:path", QOM_CPU_PATH,
+ "s:path", cpuQOMPath,
"s:property", "migratable",
NULL)))
return -1;
}
+/* returns the QOM path to the first vcpu */
+static const char *
+qemuProcessGetVCPUQOMPath(void)
+{
+ return "/machine/unattached/device[0]";
+}
+
+
static int
qemuProcessFetchGuestCPU(virQEMUDriver *driver,
virDomainObj *vm,
qemuDomainObjPrivate *priv = vm->privateData;
g_autoptr(virCPUData) dataEnabled = NULL;
g_autoptr(virCPUData) dataDisabled = NULL;
+ const char *cpuQOMPath = qemuProcessGetVCPUQOMPath();
bool generic;
int rc;
if (generic) {
rc = qemuMonitorGetGuestCPU(priv->mon,
vm->def->os.arch,
+ cpuQOMPath,
qemuProcessTranslateCPUFeatures, priv->qemuCaps,
&dataEnabled, &dataDisabled);
} else {
- rc = qemuMonitorGetGuestCPUx86(priv->mon, &dataEnabled, &dataDisabled);
+ rc = qemuMonitorGetGuestCPUx86(priv->mon, cpuQOMPath, &dataEnabled, &dataDisabled);
}
qemuDomainObjExitMonitor(driver, vm);
{
qemuDomainObjPrivate *priv = vm->privateData;
virDomainDef *def = vm->def;
+ const char *cpuQOMPath = qemuProcessGetVCPUQOMPath();
bool migratable;
int rc;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
- rc = qemuMonitorGetCPUMigratable(priv->mon, &migratable);
+ rc = qemuMonitorGetCPUMigratable(priv->mon, cpuQOMPath, &migratable);
qemuDomainObjExitMonitor(driver, vm);
if (rc < 0)