43fe83
From 8d2d51fab95e51c9e4625ef4f5424db2f6a548eb Mon Sep 17 00:00:00 2001
43fe83
Message-Id: <8d2d51fab95e51c9e4625ef4f5424db2f6a548eb.1383922566.git.jdenemar@redhat.com>
43fe83
From: Jiri Denemark <jdenemar@redhat.com>
43fe83
Date: Fri, 8 Nov 2013 12:33:31 +0100
43fe83
Subject: [PATCH] qemu: Add monitor APIs to fetch CPUID data from QEMU
43fe83
43fe83
https://bugzilla.redhat.com/show_bug.cgi?id=1008989
43fe83
43fe83
The qemu monitor supports retrieval of actual CPUID bits presented to
43fe83
the guest using QMP monitor. Add APIs to extract these information and
43fe83
tests for them.
43fe83
43fe83
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
43fe83
(cherry picked from commit 3afde0756ff1b87912f36268fd80617c34f1164a)
43fe83
43fe83
    Conflicts:
43fe83
    tests/qemumonitorjsontest.c: recent changes to the testsuite changed
43fe83
    arguments for virTestRun and instantiation of the monitor test
43fe83
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
43fe83
---
43fe83
 src/qemu/qemu_monitor.c                            |  31 +++++
43fe83
 src/qemu/qemu_monitor.h                            |   4 +
43fe83
 src/qemu/qemu_monitor_json.c                       | 133 +++++++++++++++++++++
43fe83
 src/qemu/qemu_monitor_json.h                       |   2 +
43fe83
 tests/Makefile.am                                  |   1 +
43fe83
 .../qemumonitorjson-getcpu-full.data               |   5 +
43fe83
 .../qemumonitorjson-getcpu-full.json               |  46 +++++++
43fe83
 .../qemumonitorjson-getcpu-host.data               |   6 +
43fe83
 .../qemumonitorjson-getcpu-host.json               |  45 +++++++
43fe83
 tests/qemumonitorjsontest.c                        |  75 ++++++++++++
43fe83
 10 files changed, 348 insertions(+)
43fe83
 create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.data
43fe83
 create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.json
43fe83
 create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.data
43fe83
 create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.json
43fe83
43fe83
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
43fe83
index cf4f954..4384ab4 100644
43fe83
--- a/src/qemu/qemu_monitor.c
43fe83
+++ b/src/qemu/qemu_monitor.c
43fe83
@@ -3922,3 +3922,34 @@ qemuMonitorSetDomainLog(qemuMonitorPtr mon, int logfd)
43fe83
 
43fe83
     return 0;
43fe83
 }
43fe83
+
43fe83
+
43fe83
+/**
43fe83
+ * qemuMonitorJSONGetGuestCPU:
43fe83
+ * @mon: Pointer to the monitor
43fe83
+ * @arch: arch of the guest
43fe83
+ *
43fe83
+ * Retrieve the definition of the guest CPU from a running qemu instance.
43fe83
+ *
43fe83
+ * Returns the cpu definition object. On error returns NULL.
43fe83
+ */
43fe83
+virCPUDataPtr
43fe83
+qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
43fe83
+                       virArch arch)
43fe83
+{
43fe83
+    VIR_DEBUG("mon=%p, arch='%s'", mon, virArchToString(arch));
43fe83
+
43fe83
+    if (!mon) {
43fe83
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
43fe83
+                       _("monitor must not be NULL"));
43fe83
+        return NULL;
43fe83
+    }
43fe83
+
43fe83
+    if (!mon->json) {
43fe83
+        virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
43fe83
+                       _("JSON monitor is required"));
43fe83
+        return NULL;
43fe83
+    }
43fe83
+
43fe83
+    return qemuMonitorJSONGetGuestCPU(mon, arch);
43fe83
+}
43fe83
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
43fe83
index 85ae533..3e113f3 100644
43fe83
--- a/src/qemu/qemu_monitor.h
43fe83
+++ b/src/qemu/qemu_monitor.h
43fe83
@@ -32,6 +32,7 @@
43fe83
 # include "virhash.h"
43fe83
 # include "virjson.h"
43fe83
 # include "device_conf.h"
43fe83
+# include "cpu/cpu.h"
43fe83
 
43fe83
 typedef struct _qemuMonitor qemuMonitor;
43fe83
 typedef qemuMonitor *qemuMonitorPtr;
43fe83
@@ -719,6 +720,9 @@ int qemuMonitorGetDeviceAliases(qemuMonitorPtr mon,
43fe83
 
43fe83
 int qemuMonitorSetDomainLog(qemuMonitorPtr mon, int logfd);
43fe83
 
43fe83
+virCPUDataPtr qemuMonitorGetGuestCPU(qemuMonitorPtr mon,
43fe83
+                                     virArch arch);
43fe83
+
43fe83
 /**
43fe83
  * When running two dd process and using <> redirection, we need a
43fe83
  * shell that will not truncate files.  These two strings serve that
43fe83
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
43fe83
index 12f7e69..ef5c08a 100644
43fe83
--- a/src/qemu/qemu_monitor_json.c
43fe83
+++ b/src/qemu/qemu_monitor_json.c
43fe83
@@ -42,6 +42,7 @@
43fe83
 #include "virerror.h"
43fe83
 #include "virjson.h"
43fe83
 #include "virstring.h"
43fe83
+#include "cpu/cpu_x86.h"
43fe83
 
43fe83
 #ifdef WITH_DTRACE_PROBES
43fe83
 # include "libvirt_qemu_probes.h"
43fe83
@@ -49,6 +50,7 @@
43fe83
 
43fe83
 #define VIR_FROM_THIS VIR_FROM_QEMU
43fe83
 
43fe83
+#define QOM_CPU_PATH  "/machine/unattached/device[0]"
43fe83
 
43fe83
 #define LINE_ENDING "\r\n"
43fe83
 
43fe83
@@ -5453,3 +5455,134 @@ cleanup:
43fe83
     VIR_FREE(paths);
43fe83
     return ret;
43fe83
 }
43fe83
+
43fe83
+
43fe83
+static int
43fe83
+qemuMonitorJSONParseCPUx86FeatureWord(virJSONValuePtr data,
43fe83
+                                      virCPUx86CPUID *cpuid)
43fe83
+{
43fe83
+    const char *reg;
43fe83
+    unsigned long long fun;
43fe83
+    unsigned long long features;
43fe83
+
43fe83
+    memset(cpuid, 0, sizeof(*cpuid));
43fe83
+
43fe83
+    if (!(reg = virJSONValueObjectGetString(data, "cpuid-register"))) {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
43fe83
+                       _("missing cpuid-register in CPU data"));
43fe83
+        return -1;
43fe83
+    }
43fe83
+    if (virJSONValueObjectGetNumberUlong(data, "cpuid-input-eax", &fun) < 0) {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
43fe83
+                       _("missing or invalid cpuid-input-eax in CPU data"));
43fe83
+        return -1;
43fe83
+    }
43fe83
+    if (virJSONValueObjectGetNumberUlong(data, "features", &features) < 0) {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
43fe83
+                       _("missing or invalid features in CPU data"));
43fe83
+        return -1;
43fe83
+    }
43fe83
+
43fe83
+    cpuid->function = fun;
43fe83
+    if (STREQ(reg, "EAX")) {
43fe83
+        cpuid->eax = features;
43fe83
+    } else if (STREQ(reg, "EBX")) {
43fe83
+        cpuid->ebx = features;
43fe83
+    } else if (STREQ(reg, "ECX")) {
43fe83
+        cpuid->ecx = features;
43fe83
+    } else if (STREQ(reg, "EDX")) {
43fe83
+        cpuid->edx = features;
43fe83
+    } else {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR,
43fe83
+                       _("unknown CPU register '%s'"), reg);
43fe83
+        return -1;
43fe83
+    }
43fe83
+
43fe83
+    return 0;
43fe83
+}
43fe83
+
43fe83
+
43fe83
+static virCPUDataPtr
43fe83
+qemuMonitorJSONGetCPUx86Data(qemuMonitorPtr mon,
43fe83
+                             const char *property)
43fe83
+{
43fe83
+    virJSONValuePtr cmd;
43fe83
+    virJSONValuePtr reply = NULL;
43fe83
+    virJSONValuePtr data;
43fe83
+    virCPUx86Data *x86Data = NULL;
43fe83
+    virCPUx86CPUID cpuid;
43fe83
+    size_t i;
43fe83
+    virCPUDataPtr ret = NULL;
43fe83
+    int n;
43fe83
+
43fe83
+    if (!(cmd = qemuMonitorJSONMakeCommand("qom-get",
43fe83
+                                           "s:path", QOM_CPU_PATH,
43fe83
+                                           "s:property", property,
43fe83
+                                           NULL)))
43fe83
+        return NULL;
43fe83
+
43fe83
+    if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (qemuMonitorJSONCheckError(cmd, reply))
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (!(data = virJSONValueObjectGet(reply, "return"))) {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
43fe83
+                       _("qom-get reply was missing return data"));
43fe83
+        goto cleanup;
43fe83
+    }
43fe83
+
43fe83
+    if ((n = virJSONValueArraySize(data)) < 0) {
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR,
43fe83
+                       _("%s CPU property did not return an array"),
43fe83
+                       property);
43fe83
+        goto cleanup;
43fe83
+    }
43fe83
+
43fe83
+    if (VIR_ALLOC(x86Data) < 0)
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    for (i = 0; i < n; i++) {
43fe83
+        if (qemuMonitorJSONParseCPUx86FeatureWord(virJSONValueArrayGet(data, i),
43fe83
+                                                  &cpuid) < 0 ||
43fe83
+            virCPUx86DataAddCPUID(x86Data, &cpuid) < 0)
43fe83
+            goto cleanup;
43fe83
+    }
43fe83
+
43fe83
+    if (!(ret = virCPUx86MakeData(VIR_ARCH_X86_64, &x86Data)))
43fe83
+        goto cleanup;
43fe83
+
43fe83
+cleanup:
43fe83
+    virJSONValueFree(cmd);
43fe83
+    virJSONValueFree(reply);
43fe83
+    virCPUx86DataFree(x86Data);
43fe83
+    return ret;
43fe83
+}
43fe83
+
43fe83
+
43fe83
+/**
43fe83
+ * qemuMonitorJSONGetGuestCPU:
43fe83
+ * @mon: Pointer to the monitor
43fe83
+ * @arch: arch of the guest
43fe83
+ *
43fe83
+ * Retrieve the definition of the guest CPU from a running qemu instance.
43fe83
+ *
43fe83
+ * Returns the cpu definition object. On error returns NULL.
43fe83
+ */
43fe83
+virCPUDataPtr
43fe83
+qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon,
43fe83
+                           virArch arch)
43fe83
+{
43fe83
+    switch (arch) {
43fe83
+    case VIR_ARCH_X86_64:
43fe83
+    case VIR_ARCH_I686:
43fe83
+        return qemuMonitorJSONGetCPUx86Data(mon, "feature-words");
43fe83
+
43fe83
+    default:
43fe83
+        virReportError(VIR_ERR_INTERNAL_ERROR,
43fe83
+                       _("CPU definition retrieval isn't supported for '%s'"),
43fe83
+                       virArchToString(arch));
43fe83
+        return NULL;
43fe83
+    }
43fe83
+}
43fe83
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
43fe83
index 51cf19c..2fdc28f 100644
43fe83
--- a/src/qemu/qemu_monitor_json.h
43fe83
+++ b/src/qemu/qemu_monitor_json.h
43fe83
@@ -29,6 +29,7 @@
43fe83
 
43fe83
 # include "qemu_monitor.h"
43fe83
 # include "virbitmap.h"
43fe83
+# include "cpu/cpu.h"
43fe83
 
43fe83
 int qemuMonitorJSONIOProcess(qemuMonitorPtr mon,
43fe83
                              const char *data,
43fe83
@@ -426,4 +427,5 @@ int qemuMonitorJSONDetachCharDev(qemuMonitorPtr mon,
43fe83
 int qemuMonitorJSONGetDeviceAliases(qemuMonitorPtr mon,
43fe83
                                     char ***aliases);
43fe83
 
43fe83
+virCPUDataPtr qemuMonitorJSONGetGuestCPU(qemuMonitorPtr mon, virArch arch);
43fe83
 #endif /* QEMU_MONITOR_JSON_H */
43fe83
diff --git a/tests/Makefile.am b/tests/Makefile.am
43fe83
index b794005..d095595 100644
43fe83
--- a/tests/Makefile.am
43fe83
+++ b/tests/Makefile.am
43fe83
@@ -82,6 +82,7 @@ EXTRA_DIST =		\
43fe83
 	oomtrace.pl \
43fe83
 	qemuhelpdata \
43fe83
 	qemuhotplugtestdata \
43fe83
+	qemumonitorjsondata \
43fe83
 	qemuxml2argvdata \
43fe83
 	qemuxml2xmloutdata \
43fe83
 	qemuxmlnsdata \
43fe83
diff --git a/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.data b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.data
43fe83
new file mode 100644
43fe83
index 0000000..bba8d31
43fe83
--- /dev/null
43fe83
+++ b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.data
43fe83
@@ -0,0 +1,5 @@
43fe83
+<cpudata arch='x86'>
43fe83
+  <cpuid function='0x00000001' eax='0x00000000' ebx='0x00000000' ecx='0x97ba2223' edx='0x078bfbfd'/>
43fe83
+  <cpuid function='0x40000001' eax='0x0100003b' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
43fe83
+  <cpuid function='0x80000001' eax='0x00000000' ebx='0x00000000' ecx='0x00000001' edx='0x28100800'/>
43fe83
+</cpudata>
43fe83
diff --git a/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.json b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.json
43fe83
new file mode 100644
43fe83
index 0000000..29c00b4
43fe83
--- /dev/null
43fe83
+++ b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-full.json
43fe83
@@ -0,0 +1,46 @@
43fe83
+{
43fe83
+    "return": [
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 2147483658,
43fe83
+            "features": 0
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EAX",
43fe83
+            "cpuid-input-eax": 1073741825,
43fe83
+            "features": 16777275
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 3221225473,
43fe83
+            "features": 0
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "ECX",
43fe83
+            "cpuid-input-eax": 2147483649,
43fe83
+            "features": 1
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 2147483649,
43fe83
+            "features": 672139264
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EBX",
43fe83
+            "cpuid-input-ecx": 0,
43fe83
+            "cpuid-input-eax": 7,
43fe83
+            "features": 0
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "ECX",
43fe83
+            "cpuid-input-eax": 1,
43fe83
+            "features": 2545558051
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 1,
43fe83
+            "features": 126614525
43fe83
+        }
43fe83
+    ],
43fe83
+    "id": "libvirt-6"
43fe83
+}
43fe83
diff --git a/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.data b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.data
43fe83
new file mode 100644
43fe83
index 0000000..98b9e7c
43fe83
--- /dev/null
43fe83
+++ b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.data
43fe83
@@ -0,0 +1,6 @@
43fe83
+<cpudata arch='x86'>
43fe83
+  <cpuid function='0x00000001' eax='0x00000000' ebx='0x00000000' ecx='0x97ba2223' edx='0x0f8bfbff'/>
43fe83
+  <cpuid function='0x00000007' eax='0x00000000' ebx='0x00000002' ecx='0x00000000' edx='0x00000000'/>
43fe83
+  <cpuid function='0x40000001' eax='0x0100007b' ebx='0x00000000' ecx='0x00000000' edx='0x00000000'/>
43fe83
+  <cpuid function='0x80000001' eax='0x00000000' ebx='0x00000000' ecx='0x00000001' edx='0x2993fbff'/>
43fe83
+</cpudata>
43fe83
diff --git a/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.json b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.json
43fe83
new file mode 100644
43fe83
index 0000000..b5fb9f3
43fe83
--- /dev/null
43fe83
+++ b/tests/qemumonitorjsondata/qemumonitorjson-getcpu-host.json
43fe83
@@ -0,0 +1,45 @@
43fe83
+{
43fe83
+    "return": [
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 2147483658,
43fe83
+            "features": 0
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EAX",
43fe83
+            "cpuid-input-eax": 1073741825,
43fe83
+            "features": 16777339
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 3221225473,
43fe83
+            "features": 0
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "ECX",
43fe83
+            "cpuid-input-eax": 2147483649,
43fe83
+            "features": 1
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 2147483649,
43fe83
+            "features": 697564159
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EBX",
43fe83
+            "cpuid-input-ecx": 0,
43fe83
+            "cpuid-input-eax": 7,
43fe83
+            "features": 2
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "ECX",
43fe83
+            "cpuid-input-eax": 1,
43fe83
+            "features": 2545558051
43fe83
+        },
43fe83
+        {
43fe83
+            "cpuid-register": "EDX",
43fe83
+            "cpuid-input-eax": 1,
43fe83
+            "features": 260832255
43fe83
+        }
43fe83
+    ]
43fe83
+}
43fe83
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
43fe83
index 9e66059..f709de7 100644
43fe83
--- a/tests/qemumonitorjsontest.c
43fe83
+++ b/tests/qemumonitorjsontest.c
43fe83
@@ -27,6 +27,7 @@
43fe83
 #include "virthread.h"
43fe83
 #include "virerror.h"
43fe83
 #include "virstring.h"
43fe83
+#include "cpu/cpu.h"
43fe83
 
43fe83
 
43fe83
 #define VIR_FROM_THIS VIR_FROM_NONE
43fe83
@@ -943,6 +944,69 @@ cleanup:
43fe83
 }
43fe83
 
43fe83
 
43fe83
+
43fe83
+struct testCPUData {
43fe83
+    const char *name;
43fe83
+    virDomainXMLOptionPtr xmlopt;
43fe83
+};
43fe83
+
43fe83
+
43fe83
+static int
43fe83
+testQemuMonitorJSONGetCPUData(const void *opaque)
43fe83
+{
43fe83
+    const struct testCPUData *data = opaque;
43fe83
+    qemuMonitorTestPtr test = qemuMonitorTestNew(true, data->xmlopt);
43fe83
+    virCPUDataPtr cpuData = NULL;
43fe83
+    char *jsonFile = NULL;
43fe83
+    char *dataFile = NULL;
43fe83
+    char *jsonStr = NULL;
43fe83
+    char *expected = NULL;
43fe83
+    char *actual = NULL;
43fe83
+    int ret = -1;
43fe83
+
43fe83
+    if (!test)
43fe83
+        return -1;
43fe83
+
43fe83
+    if (virAsprintf(&jsonFile,
43fe83
+                    "%s/qemumonitorjsondata/qemumonitorjson-getcpu-%s.json",
43fe83
+                    abs_srcdir, data->name) < 0 ||
43fe83
+        virAsprintf(&dataFile,
43fe83
+                    "%s/qemumonitorjsondata/qemumonitorjson-getcpu-%s.data",
43fe83
+                    abs_srcdir, data->name) < 0)
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (virtTestLoadFile(jsonFile, &jsonStr) < 0 ||
43fe83
+        virtTestLoadFile(dataFile, &expected) < 0)
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (qemuMonitorTestAddItem(test, "qom-get", jsonStr) < 0)
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (!(cpuData = qemuMonitorJSONGetGuestCPU(qemuMonitorTestGetMonitor(test),
43fe83
+                                               VIR_ARCH_X86_64)))
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (!(actual = cpuDataFormat(cpuData)))
43fe83
+        goto cleanup;
43fe83
+
43fe83
+    if (STRNEQ(expected, actual)) {
43fe83
+        virtTestDifference(stderr, expected, actual);
43fe83
+        goto cleanup;
43fe83
+    }
43fe83
+
43fe83
+    ret = 0;
43fe83
+cleanup:
43fe83
+    VIR_FREE(jsonFile);
43fe83
+    VIR_FREE(dataFile);
43fe83
+    VIR_FREE(jsonStr);
43fe83
+    VIR_FREE(expected);
43fe83
+    VIR_FREE(actual);
43fe83
+    cpuDataFree(cpuData);
43fe83
+    qemuMonitorTestFree(test);
43fe83
+    return ret;
43fe83
+}
43fe83
+
43fe83
+
43fe83
 static int
43fe83
 mymain(void)
43fe83
 {
43fe83
@@ -964,6 +1028,14 @@ mymain(void)
43fe83
     if (virtTestRun(# name, 1, testQemuMonitorJSON ## name, xmlopt) < 0) \
43fe83
         ret = -1
43fe83
 
43fe83
+#define DO_TEST_CPU_DATA(name) \
43fe83
+    do {                                                                  \
43fe83
+        struct testCPUData data = { name, xmlopt };                       \
43fe83
+        const char *label = "GetCPUData(" name ")";                       \
43fe83
+        if (virtTestRun(label, 1, testQemuMonitorJSONGetCPUData, &data) < 0) \
43fe83
+            ret = -1;                                                     \
43fe83
+    } while (0)
43fe83
+
43fe83
     DO_TEST(GetStatus);
43fe83
     DO_TEST(GetVersion);
43fe83
     DO_TEST(GetMachines);
43fe83
@@ -978,6 +1050,9 @@ mymain(void)
43fe83
     DO_TEST(SetObjectProperty);
43fe83
     DO_TEST(GetDeviceAliases);
43fe83
 
43fe83
+    DO_TEST_CPU_DATA("host");
43fe83
+    DO_TEST_CPU_DATA("full");
43fe83
+
43fe83
     virObjectUnref(xmlopt);
43fe83
 
43fe83
     return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
43fe83
-- 
43fe83
1.8.4.2
43fe83