All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
@ 2017-08-04  1:25 Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 01/22] qobject: Accept "%"PRId64 in qobject_from_jsonf() Eric Blake
                   ` (23 more replies)
  0 siblings, 24 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

Definitely 2.11 material now.  v4 is a rather big overhaul
of what has been previously posted, rebasing things to make
it easier to pass the command name separately from the args
when calling qmp() derivatives in the testsuite, and adding
support for %% handling to make -Wformat checking more robust.

Also available as a tag at:
git fetch git://repo.or.cz/qemu/ericb.git qapi-qmp-cleanup-v4

Diffstat since v3:

001/22:[0011] [FC] 'qobject: Accept "%"PRId64 in qobject_from_jsonf()'
002/22:[----] [--] 'tests: Clean up wait for event'
003/22:[----] [--] 'tests/libqtest: Clean up how we read the QMP greeting'
004/22:[down] 'tests: Add assertion for no qmp("")'
005/22:[down] 'qobject: Simplify qobject_from_jsonv()'
006/22:[down] 'qobject: Perform %% interpolation in qobject_from_jsonf()'
007/22:[down] 'numa-test: Use hmp()'
008/22:[----] [--] 'qtest: Avoid passing raw strings through hmp()'
009/22:[0022] [FC] 'qtest: Document calling conventions'
010/22:[down] 'libqtest: Skip round-trip through QObject'
011/22:[down] 'test-qga: Simplify command construction'
012/22:[down] 'libqtest: Change qmp_fd_send() to drop varargs'
013/22:[down] 'libqtest: Add qmp_raw()'
014/22:[down] 'libqtest: Separate qmp_discard_response() from command'
015/22:[down] 'libqtest: Delete qtest_qmp() wrappers'
016/22:[down] 'libqtest: Add qmp_cmd() helper'
017/22:[down] 'libqtest: Add qmp_args() helper'
018/22:[0014] [FC] 'tests/libqos/usb: Clean up string interpolation into QMP input'
019/22:[down] 'libqtest: Add qmp_args_dict() helper'
020/22:[0004] [FC] 'tests/libqos/pci: Clean up string interpolation into QMP input'
021/22:[down] 'libqtest: Drop now-unused qmp()'
022/22:[down] 'libqtest: Rename qmp_cmd() to qmp()'

Eric Blake (18):
  qobject: Accept "%"PRId64 in qobject_from_jsonf()
  tests: Add assertion for no qmp("")
  qobject: Simplify qobject_from_jsonv()
  qobject: Perform %% interpolation in qobject_from_jsonf()
  numa-test: Use hmp()
  qtest: Avoid passing raw strings through hmp()
  qtest: Document calling conventions
  libqtest: Skip round-trip through QObject
  test-qga: Simplify command construction
  libqtest: Change qmp_fd_send() to drop varargs
  libqtest: Add qmp_raw()
  libqtest: Separate qmp_discard_response() from command
  libqtest: Delete qtest_qmp() wrappers
  libqtest: Add qmp_cmd() helper
  libqtest: Add qmp_args() helper
  libqtest: Add qmp_args_dict() helper
  libqtest: Drop now-unused qmp()
  libqtest: Rename qmp_cmd() to qmp()

Markus Armbruster (4):
  tests: Clean up wait for event
  tests/libqtest: Clean up how we read the QMP greeting
  tests/libqos/usb: Clean up string interpolation into QMP input
  tests/libqos/pci: Clean up string interpolation into QMP input

 configure                          |  24 ++++
 include/qapi/qmp/qjson.h           |   2 +-
 tests/libqos/pci.h                 |   2 +-
 tests/libqtest.h                   | 163 +++++++++++---------------
 tests/libqtest.c                   | 234 ++++++++++++++-----------------------
 qobject/json-lexer.c               |  24 ++--
 qobject/json-parser.c              |  59 +++++-----
 qobject/qjson.c                    |  49 +++++++-
 tests/ahci-test.c                  |  29 ++---
 tests/boot-order-test.c            |   4 +-
 tests/check-qjson.c                |  57 +++++++++
 tests/device-introspect-test.c     |   7 +-
 tests/drive_del-test.c             |  11 +-
 tests/fdc-test.c                   |  11 +-
 tests/ide-test.c                   |   5 +-
 tests/ivshmem-test.c               |  10 +-
 tests/libqos/ahci.c                |   4 +-
 tests/libqos/libqos.c              |  23 +---
 tests/libqos/pci-pc.c              |  14 +--
 tests/libqos/pci.c                 |  32 ++---
 tests/libqos/usb.c                 |  26 ++---
 tests/numa-test.c                  |  23 +---
 tests/pc-cpu-test.c                |   8 +-
 tests/postcopy-test.c              |  41 +++----
 tests/q35-test.c                   |   2 +-
 tests/qmp-test.c                   |  27 +++--
 tests/qom-test.c                   |  11 +-
 tests/tco-test.c                   |   3 +-
 tests/test-filter-mirror.c         |   3 +-
 tests/test-filter-redirector.c     |   6 +-
 tests/test-hmp.c                   |   4 +-
 tests/test-netfilter.c             | 139 +++++++++-------------
 tests/test-qga.c                   | 220 +++++++++++++++++-----------------
 tests/test-qobject-input-visitor.c |  18 +--
 tests/test-x86-cpuid-compat.c      |   8 +-
 tests/tmp105-test.c                |   9 +-
 tests/usb-hcd-uhci-test.c          |  20 +---
 tests/usb-hcd-xhci-test.c          |  37 ++----
 tests/vhost-user-test.c            |  12 +-
 tests/virtio-blk-test.c            |  20 ++--
 tests/virtio-net-test.c            |  13 +--
 tests/virtio-scsi-test.c           |  13 +--
 tests/virtio-serial-test.c         |  12 +-
 tests/vmgenid-test.c               |   2 +-
 tests/wdt_ib700-test.c             |  37 ++----
 45 files changed, 678 insertions(+), 800 deletions(-)

-- 
2.13.3

^ permalink raw reply	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 01/22] qobject: Accept "%"PRId64 in qobject_from_jsonf()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 02/22] tests: Clean up wait for event Eric Blake
                   ` (22 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

Commit 1792d7d0 was written because PRId64 expands to non-portable
crap for some libc, and we had testsuite failures on Mac OS as a
result.  This in turn makes it difficult to rely on the obvious
conversions of 64-bit values into JSON, requiring things such as
casting int64_t to long long so we can use a reliable %lld and
still keep -Wformat happy.  So now it's time to fix that.

We are already lexing %I64d (hello mingw); now expand the lexer
to parse %qd (hello Mac OS). In the process, we can drop one
state: IN_ESCAPE_I64 is redundant with IN_ESCAPE_LL, and reused
again by %qd, so rename it to IN_ESCAPE_64.  And fix a comment
that mistakenly omitted %u as a supported escape.

Next, tweak the parser to accept the exact spelling of PRId64
regardless of what it expands to (note that there are are now dead
branches in the 'if' chain for some platforms, like glibc; but
there are other platforms where all branches are necessary).  We
are at least safe in that we are parsing the correct size 32-bit or
a 64-bit quantity on whatever branch we end up in.  This also means
that we no longer parse everything that the lexer will consume (no
more %I64d on glibc), but that is intentional.  And of course,
update the testsuite for coverage of the feature.

Finally, update configure to barf on any libc that uses yet
another form of PRId64 that we have not yet coded for, so that we
can once again update json-lexer.c to cater to those quirks (my
guess? we might see %jd next) (on the bright side, json-parser.c
should no longer need updates).  Yes, the only way I could find
to quickly learn what spelling is preferred when cross-compiling
is to grep a compiled binary; C does not make it easy to turn a
string constant into an integer constant, let alone make
preprocessor decisions; and even parsing '$CC -E' output is
fragile, since 64-bit glibc pre-processes as "l" "d" rather than
"ld", and newer gcc splits macro expansions across multiple lines.

I'm assuming that 'strings' is portable enough during configure;
if that assumption fails in some constrained docker environment,
we can make a followup patch to configure along these lines:
  strings () { tr -d '\0' < "$1"; }
Either way, it's better to avoid worrying about whether grep will
portably handle a file still containing NUL bytes.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>

---
v4: compile_object instead of compile_prog; another comment tweak
v3: incorporate review comments from Markus
---
 configure             | 24 ++++++++++++++++++++++++
 qobject/json-lexer.c  | 22 ++++++++++------------
 qobject/json-parser.c | 10 ++++++----
 tests/check-qjson.c   |  7 +++++++
 4 files changed, 47 insertions(+), 16 deletions(-)

diff --git a/configure b/configure
index 987f59ba88..6e0e433cc4 100755
--- a/configure
+++ b/configure
@@ -3222,6 +3222,30 @@ for i in $glib_modules; do
     fi
 done

+# Sanity check that we can parse PRId64 and friends in json-lexer.c
+# (Sadly, the "easiest" way to do this is to grep the compiled binary,
+# since we can't control whether the preprocessor would output "ld" vs.
+# "l" "d", nor even portably ensure it fits output on the same line as
+# a witness marker.)
+cat > $TMPC <<EOF
+#include <inttypes.h>
+int main(void) {
+    static const char findme[] = "\nUnLiKeLyToClAsH_" PRId64 "\n";
+    return !findme[0];
+}
+EOF
+if ! compile_object "$CFLAGS" "$LIBS" ; then
+    error_exit "can't determine value of PRId64"
+fi
+nl='
+'
+case $(strings $TMPO | grep ^UnLiKeLyToClAsH) in
+    '' | *"$nl"* ) error_exit "can't determine value of PRId64" ;;
+    *_ld | *_lld | *_I64d | *_qd) ;;
+    *) error_exit "unexepected value of PRId64, please add %$(strings $TMPO |
+       sed -n s/^UnLiKeLyToClAsH_//p) support to json-lexer.c" ;;
+esac
+
 # Sanity check that the current size_t matches the
 # size that glib thinks it should be. This catches
 # problems on multi-arch where people try to build
diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
index 980ba159d6..b846d2852d 100644
--- a/qobject/json-lexer.c
+++ b/qobject/json-lexer.c
@@ -29,9 +29,12 @@
  *
  * '([^\\']|\\[\"'\\/bfnrt]|\\u[0-9a-fA-F]{4})*'
  *
- * Extension for vararg handling in JSON construction:
+ * Extension for vararg handling in JSON construction, when using
+ * qobject_from_jsonf() instead of qobject_from_json() (this lexer
+ * actually accepts multiple forms of PRId64, but parse_escape() later
+ * filters to only parse the current platform's spelling):
  *
- * %((l|ll|I64)?d|[ipsf])
+ * %(PRI[du]64|(l|ll)?[ud]|[ipsf])
  *
  */

@@ -60,10 +63,9 @@ enum json_lexer_state {
     IN_KEYWORD,
     IN_ESCAPE,
     IN_ESCAPE_L,
-    IN_ESCAPE_LL,
+    IN_ESCAPE_64,
     IN_ESCAPE_I,
     IN_ESCAPE_I6,
-    IN_ESCAPE_I64,
     IN_WHITESPACE,
     IN_START,
 };
@@ -225,24 +227,19 @@ static const uint8_t json_lexer[][256] =  {
     },

     /* escape */
-    [IN_ESCAPE_LL] = {
+    [IN_ESCAPE_64] = {
         ['d'] = JSON_ESCAPE,
         ['u'] = JSON_ESCAPE,
     },

     [IN_ESCAPE_L] = {
         ['d'] = JSON_ESCAPE,
-        ['l'] = IN_ESCAPE_LL,
-        ['u'] = JSON_ESCAPE,
-    },
-
-    [IN_ESCAPE_I64] = {
-        ['d'] = JSON_ESCAPE,
+        ['l'] = IN_ESCAPE_64,
         ['u'] = JSON_ESCAPE,
     },

     [IN_ESCAPE_I6] = {
-        ['4'] = IN_ESCAPE_I64,
+        ['4'] = IN_ESCAPE_64,
     },

     [IN_ESCAPE_I] = {
@@ -257,6 +254,7 @@ static const uint8_t json_lexer[][256] =  {
         ['u'] = JSON_ESCAPE,
         ['f'] = JSON_ESCAPE,
         ['l'] = IN_ESCAPE_L,
+        ['q'] = IN_ESCAPE_64,
         ['I'] = IN_ESCAPE_I,
     },

diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 724ca240e4..388aa7a386 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -470,16 +470,18 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
         return QOBJECT(qnum_from_int(va_arg(*ap, int)));
     } else if (!strcmp(token->str, "%ld")) {
         return QOBJECT(qnum_from_int(va_arg(*ap, long)));
-    } else if (!strcmp(token->str, "%lld") ||
-               !strcmp(token->str, "%I64d")) {
+    } else if (!strcmp(token->str, "%lld")) {
         return QOBJECT(qnum_from_int(va_arg(*ap, long long)));
+    } else if (!strcmp(token->str, "%" PRId64)) {
+        return QOBJECT(qnum_from_int(va_arg(*ap, int64_t)));
     } else if (!strcmp(token->str, "%u")) {
         return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned int)));
     } else if (!strcmp(token->str, "%lu")) {
         return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long)));
-    } else if (!strcmp(token->str, "%llu") ||
-               !strcmp(token->str, "%I64u")) {
+    } else if (!strcmp(token->str, "%llu")) {
         return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long long)));
+    } else if (!strcmp(token->str, "%" PRIu64)) {
+        return QOBJECT(qnum_from_uint(va_arg(*ap, uint64_t)));
     } else if (!strcmp(token->str, "%s")) {
         return QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
     } else if (!strcmp(token->str, "%f")) {
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index a3a97b0d99..1ad1f41a52 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -990,8 +990,10 @@ static void vararg_number(void)
     QNum *qnum;
     int value = 0x2342;
     long long value_ll = 0x2342342343LL;
+    uint64_t value_u64 = 0x2342342343ULL;
     double valuef = 2.323423423;
     int64_t val;
+    uint64_t uval;

     qnum = qobject_to_qnum(qobject_from_jsonf("%d", value));
     g_assert(qnum_get_try_int(qnum, &val));
@@ -1003,6 +1005,11 @@ static void vararg_number(void)
     g_assert_cmpint(val, ==, value_ll);
     QDECREF(qnum);

+    qnum = qobject_to_qnum(qobject_from_jsonf("%" PRIu64, value_u64));
+    g_assert(qnum_get_try_uint(qnum, &uval));
+    g_assert_cmpint(uval, ==, value_u64);
+    QDECREF(qnum);
+
     qnum = qobject_to_qnum(qobject_from_jsonf("%f", valuef));
     g_assert(qnum_get_double(qnum) == valuef);
     QDECREF(qnum);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 02/22] tests: Clean up wait for event
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 01/22] qobject: Accept "%"PRId64 in qobject_from_jsonf() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 03/22] tests/libqtest: Clean up how we read the QMP greeting Eric Blake
                   ` (21 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, Gerd Hoffmann

From: Markus Armbruster <armbru@redhat.com>

We still use hacks like qmp("") to wait for an event, even though we
have qmp_eventwait() since commit 8fe941f, and qmp_eventwait_ref()
since commit 7ffe312.  Both commits neglected to convert all the
existing hacks.  Make up what they missed.

Bonus: gets rid of empty format strings.  A step towards compile-time
format string checking without triggering -Wformat-zero-length.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1500645206-13559-8-git-send-email-armbru@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>

---
v4: hoist earlier in series
---
 tests/boot-order-test.c   |  2 +-
 tests/libqos/pci-pc.c     |  6 +-----
 tests/tco-test.c          |  3 +--
 tests/usb-hcd-uhci-test.c |  6 +-----
 tests/usb-hcd-xhci-test.c | 12 ++----------
 tests/wdt_ib700-test.c    | 35 ++++++++++-------------------------
 6 files changed, 16 insertions(+), 48 deletions(-)

diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c
index fc1e7941f7..9d516830dd 100644
--- a/tests/boot-order-test.c
+++ b/tests/boot-order-test.c
@@ -43,7 +43,7 @@ static void test_a_boot_order(const char *machine,
      * system_reset only requests reset.  We get a RESET event after
      * the actual reset completes.  Need to wait for that.
      */
-    qmp_discard_response("");   /* HACK: wait for event */
+    qmp_eventwait("RESET");
     actual = read_boot_order();
     g_assert_cmphex(actual, ==, expected_reboot);
     qtest_quit(global_qtest);
diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c
index ded1c54c06..02ce49927a 100644
--- a/tests/libqos/pci-pc.c
+++ b/tests/libqos/pci-pc.c
@@ -173,9 +173,5 @@ void qpci_unplug_acpi_device_test(const char *id, uint8_t slot)

     outb(ACPI_PCIHP_ADDR + PCI_EJ_BASE, 1 << slot);

-    response = qmp("");
-    g_assert(response);
-    g_assert(qdict_haskey(response, "event"));
-    g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
-    QDECREF(response);
+    qmp_eventwait("DEVICE_DELETED");
 }
diff --git a/tests/tco-test.c b/tests/tco-test.c
index c4c264eb3d..f2ed6ed91c 100644
--- a/tests/tco-test.c
+++ b/tests/tco-test.c
@@ -237,9 +237,8 @@ static void test_tco_max_timeout(void)

 static QDict *get_watchdog_action(void)
 {
-    QDict *ev = qmp("");
+    QDict *ev = qmp_eventwait_ref("WATCHDOG");
     QDict *data;
-    g_assert(!strcmp(qdict_get_str(ev, "event"), "WATCHDOG"));

     data = qdict_get_qdict(ev, "data");
     QINCREF(data);
diff --git a/tests/usb-hcd-uhci-test.c b/tests/usb-hcd-uhci-test.c
index 5b500fedb0..0fb7f8d223 100644
--- a/tests/usb-hcd-uhci-test.c
+++ b/tests/usb-hcd-uhci-test.c
@@ -68,11 +68,7 @@ static void test_usb_storage_hotplug(void)
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("");
-    g_assert(response);
-    g_assert(qdict_haskey(response, "event"));
-    g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
-    QDECREF(response);
+    qmp_eventwait("DEVICE_DELETED");
 }

 int main(int argc, char **argv)
diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c
index 031764da6d..c05a339894 100644
--- a/tests/usb-hcd-xhci-test.c
+++ b/tests/usb-hcd-xhci-test.c
@@ -57,11 +57,7 @@ static void test_usb_uas_hotplug(void)
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("");
-    g_assert(qdict_haskey(response, "event"));
-    g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
-    QDECREF(response);
-
+    qmp_eventwait("DEVICE_DELETED");

     response = qmp("{'execute': 'device_del',"
                            " 'arguments': {"
@@ -71,11 +67,7 @@ static void test_usb_uas_hotplug(void)
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("");
-    g_assert(response);
-    g_assert(qdict_haskey(response, "event"));
-    g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
-    QDECREF(response);
+    qmp_eventwait("DEVICE_DELETED");
 }

 int main(int argc, char **argv)
diff --git a/tests/wdt_ib700-test.c b/tests/wdt_ib700-test.c
index 49f4f0c221..4fc8eeae86 100644
--- a/tests/wdt_ib700-test.c
+++ b/tests/wdt_ib700-test.c
@@ -18,26 +18,10 @@ static void qmp_check_no_event(void)
     QDECREF(resp);
 }

-static QDict *qmp_get_event(const char *name)
-{
-    QDict *event = qmp("");
-    QDict *data;
-    g_assert(qdict_haskey(event, "event"));
-    g_assert(!strcmp(qdict_get_str(event, "event"), name));
-
-    if (qdict_haskey(event, "data")) {
-        data = qdict_get_qdict(event, "data");
-        QINCREF(data);
-    } else {
-        data = NULL;
-    }
-
-    QDECREF(event);
-    return data;
-}
-
 static QDict *ib700_program_and_wait(QTestState *s)
 {
+    QDict *event, *data;
+
     clock_step(NANOSECONDS_PER_SECOND * 40);
     qmp_check_no_event();

@@ -61,7 +45,11 @@ static QDict *ib700_program_and_wait(QTestState *s)
     clock_step(3 * NANOSECONDS_PER_SECOND);
     qmp_check_no_event();
     clock_step(2 * NANOSECONDS_PER_SECOND);
-    return qmp_get_event("WATCHDOG");
+    event = qmp_eventwait_ref("WATCHDOG");
+    data = qdict_get_qdict(event, "data");
+    QINCREF(data);
+    QDECREF(event);
+    return data;
 }


@@ -73,8 +61,7 @@ static void ib700_pause(void)
     d = ib700_program_and_wait(s);
     g_assert(!strcmp(qdict_get_str(d, "action"), "pause"));
     QDECREF(d);
-    d = qmp_get_event("STOP");
-    QDECREF(d);
+    qmp_eventwait("STOP");
     qtest_end();
 }

@@ -86,8 +73,7 @@ static void ib700_reset(void)
     d = ib700_program_and_wait(s);
     g_assert(!strcmp(qdict_get_str(d, "action"), "reset"));
     QDECREF(d);
-    d = qmp_get_event("RESET");
-    QDECREF(d);
+    qmp_eventwait("RESET");
     qtest_end();
 }

@@ -99,8 +85,7 @@ static void ib700_shutdown(void)
     d = ib700_program_and_wait(s);
     g_assert(!strcmp(qdict_get_str(d, "action"), "reset"));
     QDECREF(d);
-    d = qmp_get_event("SHUTDOWN");
-    QDECREF(d);
+    qmp_eventwait("SHUTDOWN");
     qtest_end();
 }

-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 03/22] tests/libqtest: Clean up how we read the QMP greeting
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 01/22] qobject: Accept "%"PRId64 in qobject_from_jsonf() Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 02/22] tests: Clean up wait for event Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("") Eric Blake
                   ` (20 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

From: Markus Armbruster <armbru@redhat.com>

qtest_init() still uses the qtest_qmp_discard_response(s, "") hack to
receive the greeting, even though we have qtest_qmp_receive() since
commit 66e0c7b.  Put it to use.

Bonus: gets rid of an empty format string.  A step towards
compile-time format string checking without triggering
-Wformat-zero-length.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1500645206-13559-9-git-send-email-armbru@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>

---
v4: hoist earlier in series
---
 tests/libqtest.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 4a5492a603..7e5425d704 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -230,9 +230,11 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args)
 QTestState *qtest_init(const char *extra_args)
 {
     QTestState *s = qtest_init_without_qmp_handshake(extra_args);
+    QDict *greeting;

     /* Read the QMP greeting and then do the handshake */
-    qtest_qmp_discard_response(s, "");
+    greeting = qtest_qmp_receive(s);
+    QDECREF(greeting);
     qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");

     return s;
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("")
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (2 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 03/22] tests/libqtest: Clean up how we read the QMP greeting Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09  7:13   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv() Eric Blake
                   ` (19 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

Now that the previous patches have fixed all callers to avoid an
empty message, we can tweak qmp_fd_sendv() to assert that we
don't introduce new callers, and reindent accordingly.  The
additional assertions will also help verify that later refactoring
is not breaking anything.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.c | 38 ++++++++++++++++++--------------------
 1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 7e5425d704..99a07c246f 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -450,6 +450,9 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
 {
     va_list ap_copy;
     QObject *qobj;
+    int log = getenv("QTEST_LOG") != NULL;
+    QString *qstr;
+    const char *str;

     /* qobject_from_jsonv() silently eats leading 0xff as invalid
      * JSON, but we want to test sending them over the wire to force
@@ -458,6 +461,7 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
         socket_send(fd, fmt, 1);
         fmt++;
     }
+    assert(*fmt);

     /* Going through qobject ensures we escape strings properly.
      * This seemingly unnecessary copy is required in case va_list
@@ -466,29 +470,23 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
     va_copy(ap_copy, ap);
     qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
     va_end(ap_copy);
+    qstr = qobject_to_json(qobj);

-    /* No need to send anything for an empty QObject.  */
-    if (qobj) {
-        int log = getenv("QTEST_LOG") != NULL;
-        QString *qstr = qobject_to_json(qobj);
-        const char *str;
+    /*
+     * BUG: QMP doesn't react to input until it sees a newline, an
+     * object, or an array.  Work-around: give it a newline.
+     */
+    qstring_append_chr(qstr, '\n');
+    str = qstring_get_str(qstr);

-        /*
-         * BUG: QMP doesn't react to input until it sees a newline, an
-         * object, or an array.  Work-around: give it a newline.
-         */
-        qstring_append_chr(qstr, '\n');
-        str = qstring_get_str(qstr);
-
-        if (log) {
-            fprintf(stderr, "%s", str);
-        }
-        /* Send QMP request */
-        socket_send(fd, str, qstring_get_length(qstr));
-
-        QDECREF(qstr);
-        qobject_decref(qobj);
+    if (log) {
+        fprintf(stderr, "%s", str);
     }
+    /* Send QMP request */
+    socket_send(fd, str, qstring_get_length(qstr));
+
+    QDECREF(qstr);
+    qobject_decref(qobj);
 }

 void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (3 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("") Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09  7:59   ` Markus Armbruster
  2017-09-11 21:52   ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf() Eric Blake
                   ` (18 subsequent siblings)
  23 siblings, 2 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, Michael Roth

qobject_from_jsonv() was unusual in that it took a va_list*, instead
of the more typical va_list; this was so that callers could pass
NULL to avoid % interpolation.  While this works under the hood, it
is awkward for callers, so move the magic into qjson.c rather than
in the public interface, and finally improve the documentation of
qobject_from_jsonf().

test-qobject-input-visitor.c's visitor_input_test_init_internal()
was the only caller passing NULL, fix it to instead use a QObject
created by the various callers, who now use the appropriate form
of qobject_from_json*() according to whether % interpolation is
desired.

Once that is done, all remaining callers to qobject_from_jsonv() are
passing &error_abort; drop this parameter to match the counterpart
qobject_from_jsonf() which assert()s success instead.  Besides, all
current callers that need interpolation live in the testsuite, where
enforcing well-defined input by asserts can help catch typos, and
where we should not be operating on dynamic untrusted arbitrary
input in the first place.

Asserting success has another nice benefit: if we pass more than one
%p, but could return failure, we would have to worry about whether
all arguments in the va_list had consistent refcount treatment (it
should be an all-or-none decision on whether each QObject in the
va_list had its reference count altered - but whichever way we
prefer, it's a lot of overhead to ensure we do it for everything
in the va_list even if we failed halfway through).  But now that we
promise success, we can now easily promise that all %p arguments will
now be cleaned up when freeing the returned object.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 include/qapi/qmp/qjson.h           |  2 +-
 tests/libqtest.c                   | 10 ++------
 qobject/qjson.c                    | 49 +++++++++++++++++++++++++++++++++++---
 tests/test-qobject-input-visitor.c | 18 ++++++++------
 4 files changed, 60 insertions(+), 19 deletions(-)

diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h
index 6e84082d5f..9aacb1ccf6 100644
--- a/include/qapi/qmp/qjson.h
+++ b/include/qapi/qmp/qjson.h
@@ -19,7 +19,7 @@

 QObject *qobject_from_json(const char *string, Error **errp);
 QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2);
-QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
+QObject *qobject_from_jsonv(const char *string, va_list ap)
     GCC_FMT_ATTR(1, 0);

 QString *qobject_to_json(const QObject *obj);
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 99a07c246f..cde737ec5a 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -448,7 +448,6 @@ QDict *qtest_qmp_receive(QTestState *s)
  */
 void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
 {
-    va_list ap_copy;
     QObject *qobj;
     int log = getenv("QTEST_LOG") != NULL;
     QString *qstr;
@@ -463,13 +462,8 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
     }
     assert(*fmt);

-    /* Going through qobject ensures we escape strings properly.
-     * This seemingly unnecessary copy is required in case va_list
-     * is an array type.
-     */
-    va_copy(ap_copy, ap);
-    qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
-    va_end(ap_copy);
+    /* Going through qobject ensures we escape strings properly. */
+    qobj = qobject_from_jsonv(fmt, ap);
     qstr = qobject_to_json(qobj);

     /*
diff --git a/qobject/qjson.c b/qobject/qjson.c
index 2e0930884e..210c290aa9 100644
--- a/qobject/qjson.c
+++ b/qobject/qjson.c
@@ -35,7 +35,8 @@ static void parse_json(JSONMessageParser *parser, GQueue *tokens)
     s->result = json_parser_parse_err(tokens, s->ap, &s->err);
 }

-QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
+static QObject *qobject_from_json_internal(const char *string, va_list *ap,
+                                           Error **errp)
 {
     JSONParsingState state = {};

@@ -50,12 +51,31 @@ QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
     return state.result;
 }

+/*
+ * Parses JSON input without interpolation.
+ *
+ * Returns a QObject matching the input on success, or NULL with
+ * an error set if the input is not valid JSON.
+ */
 QObject *qobject_from_json(const char *string, Error **errp)
 {
-    return qobject_from_jsonv(string, NULL, errp);
+    return qobject_from_json_internal(string, NULL, errp);
 }

 /*
+ * Parses JSON input with interpolation of % sequences.
+ *
+ * The set of sequences recognized is compatible with gcc's -Wformat
+ * warnings, although not all printf sequences are valid.  All use of
+ * % must occur outside JSON strings.
+ *
+ * %i - treat corresponding integer value as JSON bool
+ * %[l[l]]d, %PRId64 - treat sized integer value as signed JSON number
+ * %[l[l]]u, %PRIu64 - treat sized integer value as unsigned JSON number
+ * %f - treat double as JSON number (undefined for inf, NaN)
+ * %s - convert char * into JSON string (adds escapes, outer quotes)
+ * %p - embed QObject, transferring the reference to the returned object
+ *
  * IMPORTANT: This function aborts on error, thus it must not
  * be used with untrusted arguments.
  */
@@ -65,13 +85,36 @@ QObject *qobject_from_jsonf(const char *string, ...)
     va_list ap;

     va_start(ap, string);
-    obj = qobject_from_jsonv(string, &ap, &error_abort);
+    obj = qobject_from_json_internal(string, &ap, &error_abort);
     va_end(ap);

     assert(obj != NULL);
     return obj;
 }

+/*
+ * va_list form of qobject_from_jsonf().
+ *
+ * IMPORTANT: This function aborts on error, thus it must not
+ * be used with untrusted arguments.
+ */
+QObject *qobject_from_jsonv(const char *string, va_list ap)
+{
+    QObject *obj;
+    va_list ap_copy;
+
+    /*
+     * This seemingly unnecessary copy is required in case va_list
+     * is an array type.
+     */
+    va_copy(ap_copy, ap);
+    obj = qobject_from_json_internal(string, &ap_copy, &error_abort);
+    va_end(ap_copy);
+
+    assert(obj != NULL);
+    return obj;
+}
+
 typedef struct ToJsonIterState
 {
     int indent;
diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c
index bcf02617dc..a9addd9f98 100644
--- a/tests/test-qobject-input-visitor.c
+++ b/tests/test-qobject-input-visitor.c
@@ -45,13 +45,11 @@ static void visitor_input_teardown(TestInputVisitorData *data,
    function so that the JSON string used by the tests are kept in the test
    functions (and not in main()). */
 static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
-                                                 bool keyval,
-                                                 const char *json_string,
-                                                 va_list *ap)
+                                                 bool keyval, QObject *obj)
 {
     visitor_input_teardown(data, NULL);

-    data->obj = qobject_from_jsonv(json_string, ap, &error_abort);
+    data->obj = obj;
     g_assert(data->obj);

     if (keyval) {
@@ -69,10 +67,12 @@ Visitor *visitor_input_test_init_full(TestInputVisitorData *data,
                                       const char *json_string, ...)
 {
     Visitor *v;
+    QObject *obj;
     va_list ap;

     va_start(ap, json_string);
-    v = visitor_input_test_init_internal(data, keyval, json_string, &ap);
+    obj = qobject_from_jsonv(json_string, ap);
+    v = visitor_input_test_init_internal(data, keyval, obj);
     va_end(ap);
     return v;
 }
@@ -82,10 +82,12 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
                                  const char *json_string, ...)
 {
     Visitor *v;
+    QObject *obj;
     va_list ap;

     va_start(ap, json_string);
-    v = visitor_input_test_init_internal(data, false, json_string, &ap);
+    obj = qobject_from_jsonv(json_string, ap);
+    v = visitor_input_test_init_internal(data, false, obj);
     va_end(ap);
     return v;
 }
@@ -100,7 +102,9 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
 static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
                                             const char *json_string)
 {
-    return visitor_input_test_init_internal(data, false, json_string, NULL);
+    QObject *obj = qobject_from_json(json_string, &error_abort);
+
+    return visitor_input_test_init_internal(data, false, obj);
 }

 static void test_visitor_in_int(TestInputVisitorData *data,
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (4 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09  9:06   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp() Eric Blake
                   ` (17 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

We want -Wformat to catch blatant programming errors in format
strings that we pass to qobject_from_jsonf().  But if someone
were to pass a JSON string "'%s'" as the format string, gcc would
insist that it be paired with a char* argument, even though our
lexer does not recognize % sequences inside a JSON string.  You can
bypass -Wformat checking by passing the Unicode escape \u0025 for
%, but who wants to remember to type that?  So the solution is that
anywhere we are relying on -Wformat checking, the caller should
pass the usual printf %% escape sequence where a literal % is
wanted on output.

Note that since % can only appear in JSON inside a string, we don't
have to teach the lexer how to parse any new % sequences, but instead
only have to add code to the parser.  Likewise, the parser is still
where we reject any attempt at mid-string % interpolation other than
%% (this is only a runtime failure, rather than compile-time), but
since we already document that qobject_from_jsonf() asserts on invalid
usage, presumably anyone that is adding a new usage will have tested
that their usage doesn't always fail.

Simplify qstring_from_escaped_str() while touching it, by using
bool, a more compact conditional, and qstring_append_chr().
Likewise, improve the error message when parse_escape() is reached
without interpolation (for example, if a client sends garbage
rather than JSON over a QMP connection).

The testsuite additions pass under valgrind, proving that we are
indeed passing the reference of anything given through %p to the
returned containing object, even when more than one object is
interpolated.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 qobject/json-lexer.c  |  6 ++++--
 qobject/json-parser.c | 49 ++++++++++++++++++++++++-------------------------
 qobject/qjson.c       |  4 ++--
 tests/check-qjson.c   | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+), 29 deletions(-)

diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
index b846d2852d..599b7446b7 100644
--- a/qobject/json-lexer.c
+++ b/qobject/json-lexer.c
@@ -32,9 +32,11 @@
  * Extension for vararg handling in JSON construction, when using
  * qobject_from_jsonf() instead of qobject_from_json() (this lexer
  * actually accepts multiple forms of PRId64, but parse_escape() later
- * filters to only parse the current platform's spelling):
+ * filters to only parse the current platform's spelling; meanwhile,
+ * JSON only allows % inside strings, where the parser handles %%, so
+ * we do not need to lex it here):
  *
- * %(PRI[du]64|(l|ll)?[ud]|[ipsf])
+ * %(PRI[du]64|(l|ll)?[ud]|[ipsf%])
  *
  */

diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 388aa7a386..daafe77a0c 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -120,25 +120,21 @@ static int hex2decimal(char ch)
  *      \n
  *      \r
  *      \t
- *      \u four-hex-digits 
+ *      \u four-hex-digits
+ *
+ * Additionally, if @percent is true, all % in @token must be doubled,
+ * replaced by a single % will be in the result; this allows -Wformat
+ * processing of qobject_from_jsonf().
  */
 static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
-                                         JSONToken *token)
+                                         JSONToken *token, bool percent)
 {
     const char *ptr = token->str;
     QString *str;
-    int double_quote = 1;
-
-    if (*ptr == '"') {
-        double_quote = 1;
-    } else {
-        double_quote = 0;
-    }
-    ptr++;
+    bool double_quote = *ptr++ == '"';

     str = qstring_new();
-    while (*ptr && 
-           ((double_quote && *ptr != '"') || (!double_quote && *ptr != '\''))) {
+    while (*ptr && *ptr != "'\""[double_quote]) {
         if (*ptr == '\\') {
             ptr++;

@@ -205,12 +201,13 @@ static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
                 goto out;
             }
         } else {
-            char dummy[2];
-
-            dummy[0] = *ptr++;
-            dummy[1] = 0;
-
-            qstring_append(str, dummy);
+            if (*ptr == '%' && percent) {
+                if (*++ptr != '%') {
+                    parse_error(ctxt, token, "invalid %% sequence in string");
+                    goto out;
+                }
+            }
+            qstring_append_chr(str, *ptr++);
         }
     }

@@ -455,13 +452,15 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
 {
     JSONToken *token;

-    if (ap == NULL) {
-        return NULL;
-    }
-
     token = parser_context_pop_token(ctxt);
     assert(token && token->type == JSON_ESCAPE);

+    if (ap == NULL) {
+        parse_error(ctxt, token, "escape parsing for '%s' not requested",
+                    token->str);
+        return NULL;
+    }
+
     if (!strcmp(token->str, "%p")) {
         return va_arg(*ap, QObject *);
     } else if (!strcmp(token->str, "%i")) {
@@ -490,7 +489,7 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
     return NULL;
 }

-static QObject *parse_literal(JSONParserContext *ctxt)
+static QObject *parse_literal(JSONParserContext *ctxt, bool percent)
 {
     JSONToken *token;

@@ -499,7 +498,7 @@ static QObject *parse_literal(JSONParserContext *ctxt)

     switch (token->type) {
     case JSON_STRING:
-        return QOBJECT(qstring_from_escaped_str(ctxt, token));
+        return QOBJECT(qstring_from_escaped_str(ctxt, token, percent));
     case JSON_INTEGER: {
         /*
          * Represent JSON_INTEGER as QNUM_I64 if possible, else as
@@ -562,7 +561,7 @@ static QObject *parse_value(JSONParserContext *ctxt, va_list *ap)
     case JSON_INTEGER:
     case JSON_FLOAT:
     case JSON_STRING:
-        return parse_literal(ctxt);
+        return parse_literal(ctxt, ap);
     case JSON_KEYWORD:
         return parse_keyword(ctxt);
     default:
diff --git a/qobject/qjson.c b/qobject/qjson.c
index 210c290aa9..2244292d1a 100644
--- a/qobject/qjson.c
+++ b/qobject/qjson.c
@@ -66,8 +66,7 @@ QObject *qobject_from_json(const char *string, Error **errp)
  * Parses JSON input with interpolation of % sequences.
  *
  * The set of sequences recognized is compatible with gcc's -Wformat
- * warnings, although not all printf sequences are valid.  All use of
- * % must occur outside JSON strings.
+ * warnings, although not all printf sequences are valid.
  *
  * %i - treat corresponding integer value as JSON bool
  * %[l[l]]d, %PRId64 - treat sized integer value as signed JSON number
@@ -75,6 +74,7 @@ QObject *qobject_from_json(const char *string, Error **errp)
  * %f - treat double as JSON number (undefined for inf, NaN)
  * %s - convert char * into JSON string (adds escapes, outer quotes)
  * %p - embed QObject, transferring the reference to the returned object
+ * %% - literal %, usable only within JSON string
  *
  * IMPORTANT: This function aborts on error, thus it must not
  * be used with untrusted arguments.
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index 1ad1f41a52..31815b2d04 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -1408,6 +1408,55 @@ static void empty_input(void)
     g_assert(obj == NULL);
 }

+static void percent_and_vararg(void)
+{
+    QObject *obj;
+    QString *str;
+    QList *list;
+    Error *err = NULL;
+
+    /* Use of % escapes requires vararg form */
+    obj = qobject_from_json("%d", &err);
+    error_free_or_abort(&err);
+    g_assert(!obj);
+
+    /* In normal form, % in strings is literal */
+    obj = qobject_from_json("'%% %s \\u0025d'", &error_abort);
+    str = qobject_to_qstring(obj);
+    g_assert_cmpstr(qstring_get_str(str), ==, "%% %s %d");
+    qobject_decref(obj);
+
+    /*
+     * In vararg form, % in strings must be escaped (via the normal
+     * printf-escaping, or via a \u escape).  The returned value now
+     * owns references to any %p counterpart.
+     */
+    obj = qobject_from_jsonf("[ %p, '%% \\u0025s', %p ]",
+                             qstring_from_str("one"),
+                             qstring_from_str("three"));
+    list = qobject_to_qlist(obj);
+    str = qobject_to_qstring(qlist_pop(list));
+    g_assert_cmpstr(qstring_get_str(str), ==, "one");
+    QDECREF(str);
+    str = qobject_to_qstring(qlist_pop(list));
+    g_assert_cmpstr(qstring_get_str(str), ==, "% %s");
+    QDECREF(str);
+    str = qobject_to_qstring(qlist_pop(list));
+    g_assert_cmpstr(qstring_get_str(str), ==, "three");
+    QDECREF(str);
+    g_assert(qlist_empty(list));
+    qobject_decref(obj);
+
+    /* The following intentionally cause assertion failures */
+
+    /* In vararg form, %% must occur in strings */
+    /* qobject_from_jsonf("%%"); */
+    /* qobject_from_jsonf("{%%}"); */
+
+    /* In vararg form, strings must not use % except for %% */
+    /* qobject_from_jsonf("'%s'", "unpaired"); */
+}
+
 static void unterminated_string(void)
 {
     Error *err = NULL;
@@ -1540,6 +1589,7 @@ int main(int argc, char **argv)
     g_test_add_func("/varargs/simple_varargs", simple_varargs);

     g_test_add_func("/errors/empty_input", empty_input);
+    g_test_add_func("/errors/percent_and_vararg", percent_and_vararg);
     g_test_add_func("/errors/unterminated/string", unterminated_string);
     g_test_add_func("/errors/unterminated/escape", unterminated_escape);
     g_test_add_func("/errors/unterminated/sq_string", unterminated_sq_string);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (5 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09  9:07   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 08/22] qtest: Avoid passing raw strings through hmp() Eric Blake
                   ` (16 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

Don't open-code something that has a convenient helper available.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/numa-test.c | 21 +++------------------
 1 file changed, 3 insertions(+), 18 deletions(-)

diff --git a/tests/numa-test.c b/tests/numa-test.c
index 3f636840b1..e1b6152244 100644
--- a/tests/numa-test.c
+++ b/tests/numa-test.c
@@ -17,21 +17,6 @@ static char *make_cli(const char *generic_cli, const char *test_cli)
     return g_strdup_printf("%s %s", generic_cli ? generic_cli : "", test_cli);
 }

-static char *hmp_info_numa(void)
-{
-    QDict *resp;
-    char *s;
-
-    resp = qmp("{ 'execute': 'human-monitor-command', 'arguments': "
-                      "{ 'command-line': 'info numa '} }");
-    g_assert(resp);
-    g_assert(qdict_haskey(resp, "return"));
-    s = g_strdup(qdict_get_str(resp, "return"));
-    g_assert(s);
-    QDECREF(resp);
-    return s;
-}
-
 static void test_mon_explicit(const void *data)
 {
     char *s;
@@ -42,7 +27,7 @@ static void test_mon_explicit(const void *data)
                    "-numa node,nodeid=1,cpus=4-7 ");
     qtest_start(cli);

-    s = hmp_info_numa();
+    s = hmp("info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3"));
     g_assert(strstr(s, "node 1 cpus: 4 5 6 7"));
     g_free(s);
@@ -59,7 +44,7 @@ static void test_mon_default(const void *data)
     cli = make_cli(data, "-smp 8 -numa node -numa node");
     qtest_start(cli);

-    s = hmp_info_numa();
+    s = hmp("info numa");
     g_assert(strstr(s, "node 0 cpus: 0 2 4 6"));
     g_assert(strstr(s, "node 1 cpus: 1 3 5 7"));
     g_free(s);
@@ -78,7 +63,7 @@ static void test_mon_partial(const void *data)
                    "-numa node,nodeid=1,cpus=4-5 ");
     qtest_start(cli);

-    s = hmp_info_numa();
+    s = hmp("info numa");
     g_assert(strstr(s, "node 0 cpus: 0 1 2 3 6 7"));
     g_assert(strstr(s, "node 1 cpus: 4 5"));
     g_free(s);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 08/22] qtest: Avoid passing raw strings through hmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (6 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 09/22] qtest: Document calling conventions Eric Blake
                   ` (15 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, Dr. David Alan Gilbert

The next patch will add __attribute__((__format__)) to hmp(), which
in turn causes gcc to warn about non-literal format strings.  Rather
than risk an arbitrary string containing % being mis-handled, always
pass variable strings along with a %s format.  It also makes it
easier to prove correctness locally, rather than auditing all the
source strings.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20170720214008.28494-4-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 tests/test-hmp.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tests/test-hmp.c b/tests/test-hmp.c
index 729c0339f7..4aadd6a432 100644
--- a/tests/test-hmp.c
+++ b/tests/test-hmp.c
@@ -80,7 +80,7 @@ static void test_commands(void)
         if (verbose) {
             fprintf(stderr, "\t%s\n", hmp_cmds[i]);
         }
-        response = hmp(hmp_cmds[i]);
+        response = hmp("%s", hmp_cmds[i]);
         g_free(response);
     }

@@ -103,7 +103,7 @@ static void test_info_commands(void)
         if (verbose) {
             fprintf(stderr, "\t%s\n", info);
         }
-        resp = hmp(info);
+        resp = hmp("%s", info);
         g_free(resp);
         /* And move forward to the next line */
         info = strchr(endp + 1, '\n');
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 09/22] qtest: Document calling conventions
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (7 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 08/22] qtest: Avoid passing raw strings through hmp() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject Eric Blake
                   ` (14 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

We have two flavors of vararg usage in qtest: hmp() etc. work
like sprintf(), and qmp() etc. work like qobject_from_jsonf().
Spell that out in the comments.

Also add GCC_FMT_ATTR() to qtest_hmp() etc. so that the compiler
can flag incorrect use.

We have some cleanup work to do before we can do the same for
qtest_qmp() etc.  This will get us the same better-than-nothing
checking we already have for qobject_from_jsonf(): common
incorrect uses of supported conversion specifications will be
flagged (e.g. passing a double for %d), but use of unsupported
ones won't.

Signed-off-by: Eric Blake <eblake@redhat.com>

---
v4: rebase to %% handling, update commit message
v3: restore lost attributes, add comments on va_list forms, tweak
commit message to mention upcoming qmp cleanups
v2: several comment tweaks, explain why qmp() can't be marked
---
 tests/libqtest.h | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 3ae570927a..38148af66b 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -50,7 +50,8 @@ void qtest_quit(QTestState *s);
 /**
  * qtest_qmp_discard_response:
  * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and consumes the response.
  */
@@ -59,7 +60,8 @@ void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...);
 /**
  * qtest_qmp:
  * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and returns the response.
  */
@@ -68,7 +70,8 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...);
 /**
  * qtest_async_qmp:
  * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and leaves the response in the stream.
  */
@@ -77,7 +80,8 @@ void qtest_async_qmp(QTestState *s, const char *fmt, ...);
 /**
  * qtest_qmpv_discard_response:
  * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU
+ * @fmt: QMP message to send to QEMU; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  * @ap: QMP message arguments
  *
  * Sends a QMP message to QEMU and consumes the response.
@@ -87,7 +91,8 @@ void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap);
 /**
  * qtest_qmpv:
  * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU
+ * @fmt: QMP message to send to QEMU; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  * @ap: QMP message arguments
  *
  * Sends a QMP message to QEMU and returns the response.
@@ -97,7 +102,8 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap);
 /**
  * qtest_async_qmpv:
  * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU
+ * @fmt: QMP message to send to QEMU; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  * @ap: QMP message arguments
  *
  * Sends a QMP message to QEMU and leaves the response in the stream.
@@ -134,19 +140,19 @@ QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);
 /**
  * qtest_hmp:
  * @s: #QTestState instance to operate on.
- * @fmt...: HMP command to send to QEMU
+ * @fmt...: HMP command to send to QEMU, formats arguments like sprintf().
  *
  * Send HMP command to QEMU via QMP's human-monitor-command.
  * QMP events are discarded.
  *
  * Returns: the command's output.  The caller should g_free() it.
  */
-char *qtest_hmp(QTestState *s, const char *fmt, ...);
+char *qtest_hmp(QTestState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3);

 /**
  * qtest_hmpv:
  * @s: #QTestState instance to operate on.
- * @fmt: HMP command to send to QEMU
+ * @fmt: HMP command to send to QEMU, formats arguments like vsprintf().
  * @ap: HMP command arguments
  *
  * Send HMP command to QEMU via QMP's human-monitor-command.
@@ -154,7 +160,8 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...);
  *
  * Returns: the command's output.  The caller should g_free() it.
  */
-char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap);
+char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
+    GCC_FMT_ATTR(2, 0);

 /**
  * qtest_get_irq:
@@ -535,7 +542,8 @@ static inline void qtest_end(void)

 /**
  * qmp:
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and returns the response.
  */
@@ -543,7 +551,8 @@ QDict *qmp(const char *fmt, ...);

 /**
  * qmp_async:
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and leaves the response in the stream.
  */
@@ -551,7 +560,8 @@ void qmp_async(const char *fmt, ...);

 /**
  * qmp_discard_response:
- * @fmt...: QMP message to send to qemu
+ * @fmt...: QMP message to send to qemu; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
  * Sends a QMP message to QEMU and consumes the response.
  */
@@ -592,13 +602,13 @@ static inline QDict *qmp_eventwait_ref(const char *event)

 /**
  * hmp:
- * @fmt...: HMP command to send to QEMU
+ * @fmt...: HMP command to send to QEMU, formats arguments like sprintf().
  *
  * Send HMP command to QEMU via QMP's human-monitor-command.
  *
  * Returns: the command's output.  The caller should g_free() it.
  */
-char *hmp(const char *fmt, ...);
+char *hmp(const char *fmt, ...) GCC_FMT_ATTR(1, 2);

 /**
  * get_irq:
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (8 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 09/22] qtest: Document calling conventions Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 10:10   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction Eric Blake
                   ` (13 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

When we don't have to do any % interpolation in qmp() and friends,
there is no point wasting time allocating a QObject from the format
string only to then format it back into the string we send over
the wire.

This is a temporary measure: it becomes important in the next
patch, where test-qga will be refactored to do interpolation in
place, and where we must not re-interpolate the string; but will
go away when further refactoring makes it easier to directly
output a string without going through qmp_fd_sendv().

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index cde737ec5a..0cb439eefa 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -448,7 +448,7 @@ QDict *qtest_qmp_receive(QTestState *s)
  */
 void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
 {
-    QObject *qobj;
+    QObject *qobj = NULL;
     int log = getenv("QTEST_LOG") != NULL;
     QString *qstr;
     const char *str;
@@ -462,9 +462,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
     }
     assert(*fmt);

-    /* Going through qobject ensures we escape strings properly. */
-    qobj = qobject_from_jsonv(fmt, ap);
-    qstr = qobject_to_json(qobj);
+    /*
+     * A round trip through QObject is only needed if % interpolation
+     * is used.  We interpolate through QObject rather than sprintf in
+     * order to escape strings properly.
+     */
+    if (strchr(fmt, '%')) {
+        qobj = qobject_from_jsonv(fmt, ap);
+        qstr = qobject_to_json(qobj);
+    } else {
+        qstr = qstring_from_str(fmt);
+    }

     /*
      * BUG: QMP doesn't react to input until it sees a newline, an
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (9 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 11:40   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs Eric Blake
                   ` (12 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

When you build qga input manually like this:

    cmd = g_strdup_printf("{'execute': 'guest-file-write',"
                          " 'arguments': {'handle': %" PRId64 ","
                          " 'buf-b64': '%s' } }", id, enc);
    ret = qmp_fd(fixture->fd, cmd);
    g_free(cmd);

you're responsible for escaping the interpolated values for JSON.
Not done here, and therefore works only because the base64 encoding
does not include % or '.

Leaving interpolation into JSON via qobject_from_jsonf() is more
robust; we can also reduce the boilerplate by factoring out the
common 'execute':%s and 'arguments':%p code into new qga() and
qga_args() helpers:

    ret = qga_args(fixture, "guest-file-write",
                   "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);

Note that this reverts part of commit 1792d7d0; but that is because
we just recently guaranteed support of PRId64 in qobject_from_jsonf().

Also note that the simple form qga() sends "arguments":{} over the
wire rather than the previous approach of omitting it entirely;
test_qga_ping() is updated to use a long-hand form to ensure that
"arguments" is truly optional.

As a bonus, this eliminates the last external caller using varargs
for qmp_fd_send(); the next patch will simplify that interface to
take just the string being sent over the wire rather than performing
a string->QObject->string round trip (there's already a hint
of that in the simplification of passing '\xff' separately from
the command, where this patch had to tweak things to avoid an
assertion).  Also, this is a step towards getting rid of non-literal
format strings; our new helpers can already use GCC_ATTR_FMT() just
like qobject_from_jsonf().

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.c |   3 +-
 tests/test-qga.c | 222 +++++++++++++++++++++++++++----------------------------
 2 files changed, 111 insertions(+), 114 deletions(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 0cb439eefa..ba09c949dc 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -458,7 +458,8 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
      * resyncs */
     if (*fmt == '\377') {
         socket_send(fd, fmt, 1);
-        fmt++;
+        assert(!fmt[1]);
+        return;
     }
     assert(*fmt);

diff --git a/tests/test-qga.c b/tests/test-qga.c
index fd6bc7690f..839481e49b 100644
--- a/tests/test-qga.c
+++ b/tests/test-qga.c
@@ -5,6 +5,7 @@
 #include <sys/un.h>

 #include "libqtest.h"
+#include "qapi/qmp/qjson.h"

 typedef struct {
     char *test_dir;
@@ -111,6 +112,55 @@ fixture_tear_down(TestFixture *fixture, gconstpointer data)
     g_free(fixture->test_dir);
 }

+static void GCC_FMT_ATTR(3, 0) qga_sendv(const TestFixture *fixture,
+                                         const char *cmd,
+                                         const char *fmt, va_list ap)
+{
+    QObject *args = qobject_from_jsonv(fmt, ap);
+    QObject *obj = qobject_from_jsonf("{'execute':%s, 'arguments':%p}",
+                                      cmd, args);
+    QString *qstr = qobject_to_json(obj);
+    const char *str;
+
+    qstring_append_chr(qstr, '\n');
+    str = qstring_get_str(qstr);
+    assert(!strchr(str, '%'));
+    qmp_fd_send(fixture->fd, str);
+    QDECREF(qstr);
+    qobject_decref(obj);
+}
+
+static void GCC_FMT_ATTR(3, 4) qga_send_args(const TestFixture *fixture,
+                                             const char *cmd,
+                                             const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    qga_sendv(fixture, cmd, fmt, ap);
+    va_end(ap);
+}
+
+
+static QDict * GCC_FMT_ATTR(3, 4) qga_args(const TestFixture *fixture,
+                                           const char *cmd,
+                                           const char *fmt, ...)
+{
+    va_list ap;
+
+    va_start(ap, fmt);
+    qga_sendv(fixture, cmd, fmt, ap);
+    va_end(ap);
+    return qmp_fd_receive(fixture->fd);
+}
+
+static QDict *qga(const TestFixture *fixture, const char *cmd)
+{
+    qga_send_args(fixture, cmd, "{}");
+    return qmp_fd_receive(fixture->fd);
+}
+
+
 static void qmp_assertion_message_error(const char     *domain,
                                         const char     *file,
                                         int             line,
@@ -144,12 +194,9 @@ static void test_qga_sync_delimited(gconstpointer fix)
     guint32 v, r = g_random_int();
     unsigned char c;
     QDict *ret;
-    gchar *cmd;

-    cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
-                          " 'arguments': {'id': %u } }", r);
-    qmp_fd_send(fixture->fd, cmd);
-    g_free(cmd);
+    qmp_fd_send(fixture->fd, "\xff");
+    qga_send_args(fixture, "guest-sync-delimited", "{'id': %u}", r);

     /*
      * Read and ignore garbage until resynchronized.
@@ -186,7 +233,6 @@ static void test_qga_sync(gconstpointer fix)
     const TestFixture *fixture = fix;
     guint32 v, r = g_random_int();
     QDict *ret;
-    gchar *cmd;

     /*
      * TODO guest-sync is inherently limited: we cannot distinguish
@@ -199,10 +245,7 @@ static void test_qga_sync(gconstpointer fix)
      * invalid JSON. Testing of '\xff' handling is done in
      * guest-sync-delimited instead.
      */
-    cmd = g_strdup_printf("{'execute': 'guest-sync',"
-                          " 'arguments': {'id': %u } }", r);
-    ret = qmp_fd(fixture->fd, cmd);
-    g_free(cmd);
+    ret = qga_args(fixture, "guest-sync", "{'id': %u}", r);

     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
@@ -218,10 +261,17 @@ static void test_qga_ping(gconstpointer fix)
     const TestFixture *fixture = fix;
     QDict *ret;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping'}");
+    /* qga() adds an "arguments":{} over the wire... */
+    ret = qga(fixture, "guest-ping");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
+    QDECREF(ret);

+    /* ...so also test in long-hand that "arguments" can be omitted. */
+    qmp_fd_send(fixture->fd, "{'execute':'guest-ping'}");
+    ret = qmp_fd_receive(fixture->fd);
+    g_assert_nonnull(ret);
+    qmp_assert_no_error(ret);
     QDECREF(ret);
 }

@@ -231,8 +281,7 @@ static void test_qga_invalid_args(gconstpointer fix)
     QDict *ret, *error;
     const gchar *class, *desc;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping', "
-                 "'arguments': {'foo': 42 }}");
+    ret = qga_args(fixture, "guest-ping", "{'foo': 42 }");
     g_assert_nonnull(ret);

     error = qdict_get_qdict(ret, "error");
@@ -251,7 +300,7 @@ static void test_qga_invalid_cmd(gconstpointer fix)
     QDict *ret, *error;
     const gchar *class, *desc;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-invalid-cmd'}");
+    ret = qga(fixture, "guest-invalid-cmd");
     g_assert_nonnull(ret);

     error = qdict_get_qdict(ret, "error");
@@ -270,7 +319,7 @@ static void test_qga_info(gconstpointer fix)
     QDict *ret, *val;
     const gchar *version;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-info'}");
+    ret = qga(fixture, "guest-info");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -288,7 +337,7 @@ static void test_qga_get_vcpus(gconstpointer fix)
     QList *list;
     const QListEntry *entry;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-vcpus'}");
+    ret = qga(fixture, "guest-get-vcpus");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -308,7 +357,7 @@ static void test_qga_get_fsinfo(gconstpointer fix)
     QList *list;
     const QListEntry *entry;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-fsinfo'}");
+    ret = qga(fixture, "guest-get-fsinfo");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -331,7 +380,7 @@ static void test_qga_get_memory_block_info(gconstpointer fix)
     QDict *ret, *val;
     int64_t size;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-block-info'}");
+    ret = qga(fixture, "guest-get-memory-block-info");
     g_assert_nonnull(ret);

     /* some systems might not expose memory block info in sysfs */
@@ -352,7 +401,7 @@ static void test_qga_get_memory_blocks(gconstpointer fix)
     QList *list;
     const QListEntry *entry;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-blocks'}");
+    ret = qga(fixture, "guest-get-memory-blocks");
     g_assert_nonnull(ret);

     /* some systems might not expose memory block info in sysfs */
@@ -376,7 +425,7 @@ static void test_qga_network_get_interfaces(gconstpointer fix)
     QList *list;
     const QListEntry *entry;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-network-get-interfaces'}");
+    ret = qga(fixture, "guest-network-get-interfaces");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -393,7 +442,7 @@ static void test_qga_file_ops(gconstpointer fix)
     const TestFixture *fixture = fix;
     const unsigned char helloworld[] = "Hello World!\n";
     const char *b64;
-    gchar *cmd, *path, *enc;
+    gchar *path, *enc;
     unsigned char *dec;
     QDict *ret, *val;
     int64_t id, eof;
@@ -402,8 +451,8 @@ static void test_qga_file_ops(gconstpointer fix)
     char tmp[100];

     /* open */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
-                 " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
+    ret = qga_args(fixture, "guest-file-open",
+                   "{ 'path': 'foo', 'mode': 'w+' }");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
     id = qdict_get_int(ret, "return");
@@ -411,10 +460,8 @@ static void test_qga_file_ops(gconstpointer fix)

     enc = g_base64_encode(helloworld, sizeof(helloworld));
     /* write */
-    cmd = g_strdup_printf("{'execute': 'guest-file-write',"
-                          " 'arguments': { 'handle': %" PRId64 ","
-                          " 'buf-b64': '%s' } }", id, enc);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-write",
+                   "{ 'handle': %" PRId64 ", 'buf-b64': %s }", id, enc);
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -424,23 +471,14 @@ static void test_qga_file_ops(gconstpointer fix)
     g_assert_cmpint(count, ==, sizeof(helloworld));
     g_assert_cmpint(eof, ==, 0);
     QDECREF(ret);
-    g_free(cmd);

     /* flush */
-    cmd = g_strdup_printf("{'execute': 'guest-file-flush',"
-                          " 'arguments': {'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-flush", "{'handle': %" PRId64 "}", id);
     QDECREF(ret);
-    g_free(cmd);

     /* close */
-    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
-                          " 'arguments': {'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);
     QDECREF(ret);
-    g_free(cmd);

     /* check content */
     path = g_build_filename(fixture->test_dir, "foo", NULL);
@@ -454,18 +492,15 @@ static void test_qga_file_ops(gconstpointer fix)
     fclose(f);

     /* open */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
-                 " 'arguments': { 'path': 'foo', 'mode': 'r' } }");
+    ret = qga_args(fixture, "guest-file-open",
+                   "{ 'path': 'foo', 'mode': 'r' }");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
     id = qdict_get_int(ret, "return");
     QDECREF(ret);

     /* read */
-    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
-                          " 'arguments': { 'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "count");
     eof = qdict_get_bool(val, "eof");
@@ -475,14 +510,10 @@ static void test_qga_file_ops(gconstpointer fix)
     g_assert_cmpstr(b64, ==, enc);

     QDECREF(ret);
-    g_free(cmd);
     g_free(enc);

     /* read eof */
-    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
-                          " 'arguments': { 'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "count");
     eof = qdict_get_bool(val, "eof");
@@ -491,14 +522,11 @@ static void test_qga_file_ops(gconstpointer fix)
     g_assert(eof);
     g_assert_cmpstr(b64, ==, "");
     QDECREF(ret);
-    g_free(cmd);

     /* seek */
-    cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
-                          " 'arguments': { 'handle': %" PRId64 ", "
-                          " 'offset': %d, 'whence': '%s' } }",
-                          id, 6, "set");
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-seek",
+                   "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
+                   id, 6, "set");
     qmp_assert_no_error(ret);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "position");
@@ -506,13 +534,9 @@ static void test_qga_file_ops(gconstpointer fix)
     g_assert_cmpint(count, ==, 6);
     g_assert(!eof);
     QDECREF(ret);
-    g_free(cmd);

     /* partial read */
-    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
-                          " 'arguments': { 'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "count");
     eof = qdict_get_bool(val, "eof");
@@ -525,15 +549,10 @@ static void test_qga_file_ops(gconstpointer fix)
     g_free(dec);

     QDECREF(ret);
-    g_free(cmd);

     /* close */
-    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
-                          " 'arguments': {'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);
     QDECREF(ret);
-    g_free(cmd);
 }

 static void test_qga_file_write_read(gconstpointer fix)
@@ -541,14 +560,14 @@ static void test_qga_file_write_read(gconstpointer fix)
     const TestFixture *fixture = fix;
     const unsigned char helloworld[] = "Hello World!\n";
     const char *b64;
-    gchar *cmd, *enc;
+    gchar *enc;
     QDict *ret, *val;
     int64_t id, eof;
     gsize count;

     /* open */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
-                 " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
+    ret = qga_args(fixture, "guest-file-open",
+                   "{ 'path': 'foo', 'mode': 'w+' }");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
     id = qdict_get_int(ret, "return");
@@ -556,10 +575,8 @@ static void test_qga_file_write_read(gconstpointer fix)

     enc = g_base64_encode(helloworld, sizeof(helloworld));
     /* write */
-    cmd = g_strdup_printf("{'execute': 'guest-file-write',"
-                          " 'arguments': { 'handle': %" PRId64 ","
-                          " 'buf-b64': '%s' } }", id, enc);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-write",
+                   "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -569,13 +586,9 @@ static void test_qga_file_write_read(gconstpointer fix)
     g_assert_cmpint(count, ==, sizeof(helloworld));
     g_assert_cmpint(eof, ==, 0);
     QDECREF(ret);
-    g_free(cmd);

     /* read (check implicit flush) */
-    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
-                          " 'arguments': { 'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "count");
     eof = qdict_get_bool(val, "eof");
@@ -584,14 +597,11 @@ static void test_qga_file_write_read(gconstpointer fix)
     g_assert(eof);
     g_assert_cmpstr(b64, ==, "");
     QDECREF(ret);
-    g_free(cmd);

     /* seek to 0 */
-    cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
-                          " 'arguments': { 'handle': %" PRId64 ", "
-                          " 'offset': %d, 'whence': '%s' } }",
-                          id, 0, "set");
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-seek",
+                   "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
+                   id, 0, "set");
     qmp_assert_no_error(ret);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "position");
@@ -599,13 +609,9 @@ static void test_qga_file_write_read(gconstpointer fix)
     g_assert_cmpint(count, ==, 0);
     g_assert(!eof);
     QDECREF(ret);
-    g_free(cmd);

     /* read */
-    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
-                          " 'arguments': { 'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);
     val = qdict_get_qdict(ret, "return");
     count = qdict_get_int(val, "count");
     eof = qdict_get_bool(val, "eof");
@@ -614,16 +620,11 @@ static void test_qga_file_write_read(gconstpointer fix)
     g_assert(eof);
     g_assert_cmpstr(b64, ==, enc);
     QDECREF(ret);
-    g_free(cmd);
     g_free(enc);

     /* close */
-    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
-                          " 'arguments': {'handle': %" PRId64 "} }",
-                          id);
-    ret = qmp_fd(fixture->fd, cmd);
+    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);
     QDECREF(ret);
-    g_free(cmd);
 }

 static void test_qga_get_time(gconstpointer fix)
@@ -632,7 +633,7 @@ static void test_qga_get_time(gconstpointer fix)
     QDict *ret;
     int64_t time;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-time'}");
+    ret = qga(fixture, "guest-get-time");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -651,7 +652,7 @@ static void test_qga_blacklist(gconstpointer data)
     fixture_setup(&fix, "-b guest-ping,guest-get-time", NULL);

     /* check blacklist */
-    ret = qmp_fd(fix.fd, "{'execute': 'guest-ping'}");
+    ret = qga(&fix, "guest-ping");
     g_assert_nonnull(ret);
     error = qdict_get_qdict(ret, "error");
     class = qdict_get_try_str(error, "class");
@@ -660,7 +661,7 @@ static void test_qga_blacklist(gconstpointer data)
     g_assert_nonnull(g_strstr_len(desc, -1, "has been disabled"));
     QDECREF(ret);

-    ret = qmp_fd(fix.fd, "{'execute': 'guest-get-time'}");
+    ret = qga(&fix, "guest-get-time");
     g_assert_nonnull(ret);
     error = qdict_get_qdict(ret, "error");
     class = qdict_get_try_str(error, "class");
@@ -670,7 +671,7 @@ static void test_qga_blacklist(gconstpointer data)
     QDECREF(ret);

     /* check something work */
-    ret = qmp_fd(fix.fd, "{'execute': 'guest-get-fsinfo'}");
+    ret = qga(&fix, "guest-get-fsinfo");
     qmp_assert_no_error(ret);
     QDECREF(ret);

@@ -762,7 +763,7 @@ static void test_qga_fsfreeze_status(gconstpointer fix)
     QDict *ret;
     const gchar *status;

-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-status'}");
+    ret = qga(fixture, "guest-fsfreeze-status");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

@@ -781,12 +782,11 @@ static void test_qga_guest_exec(gconstpointer fix)
     int64_t pid, now, exitcode;
     gsize len;
     bool exited;
-    char *cmd;

     /* exec 'echo foo bar' */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
-                 " 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
-                 " 'capture-output': true } }");
+    ret = qga_args(fixture, "guest-exec",
+                 "{ 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
+                 " 'capture-output': true }");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);
     val = qdict_get_qdict(ret, "return");
@@ -796,10 +796,9 @@ static void test_qga_guest_exec(gconstpointer fix)

     /* wait for completion */
     now = g_get_monotonic_time();
-    cmd = g_strdup_printf("{'execute': 'guest-exec-status',"
-                          " 'arguments': { 'pid': %" PRId64 " } }", pid);
     do {
-        ret = qmp_fd(fixture->fd, cmd);
+        ret = qga_args(fixture, "guest-exec-status", "{'pid': %" PRId64 "}",
+                       pid);
         g_assert_nonnull(ret);
         val = qdict_get_qdict(ret, "return");
         exited = qdict_get_bool(val, "exited");
@@ -809,7 +808,6 @@ static void test_qga_guest_exec(gconstpointer fix)
     } while (!exited &&
              g_get_monotonic_time() < now + 5 * G_TIME_SPAN_SECOND);
     g_assert(exited);
-    g_free(cmd);

     /* check stdout */
     exitcode = qdict_get_int(val, "exitcode");
@@ -829,8 +827,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
     const gchar *class, *desc;

     /* invalid command */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
-                 " 'path': '/bin/invalid-cmd42' } }");
+    ret = qga_args(fixture, "guest-exec", "{ 'path': '/bin/invalid-cmd42' }");
     g_assert_nonnull(ret);
     error = qdict_get_qdict(ret, "error");
     g_assert_nonnull(error);
@@ -841,8 +838,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
     QDECREF(ret);

     /* invalid pid */
-    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec-status',"
-                 " 'arguments': { 'pid': 0 } }");
+    ret = qga_args(fixture, "guest-exec-status", "{ 'pid': 0 }");
     g_assert_nonnull(ret);
     error = qdict_get_qdict(ret, "error");
     g_assert_nonnull(error);
@@ -868,7 +864,7 @@ static void test_qga_guest_get_osinfo(gconstpointer data)
     g_free(cwd);
     fixture_setup(&fixture, NULL, env);

-    ret = qmp_fd(fixture.fd, "{'execute': 'guest-get-osinfo'}");
+    ret = qga(&fixture, "guest-get-osinfo");
     g_assert_nonnull(ret);
     qmp_assert_no_error(ret);

-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (10 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 13:18   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw() Eric Blake
                   ` (11 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

With the previous commit, no external clients are using qmp_fd()
or qmp_fd_sendv().  Making qmp_fd_sendv() static lets us refactor
the public qmp_fd_send() to be the common point where we send a
fixed string over the wire as well as log that string, while
qmp_fd_sendv() worries about converting varargs into the final
string.  Note that the refactoring changes roles: previously,
qmp_fd_send() deferred to qmp_fd_sendv(); now the call chain is
in the opposite direction.  Likewise, now that we take a fixed
string, we no longer have to special case '\xff'.

Add documentation while in the area.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h | 20 ++++++++++++----
 tests/libqtest.c | 73 +++++++++++++++++---------------------------------------
 tests/test-qga.c |  2 --
 3 files changed, 38 insertions(+), 57 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 38148af66b..33af3ae8ff 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -923,11 +923,23 @@ static inline int64_t clock_set(int64_t val)
     return qtest_clock_set(global_qtest, val);
 }

+/**
+ * qmp_fd_receive:
+ * @fd: Socket to read from.
+ *
+ * Read from input until a complete JSON object has been parsed,
+ * returning NULL on errors.
+ */
 QDict *qmp_fd_receive(int fd);
-void qmp_fd_sendv(int fd, const char *fmt, va_list ap);
-void qmp_fd_send(int fd, const char *fmt, ...);
-QDict *qmp_fdv(int fd, const char *fmt, va_list ap);
-QDict *qmp_fd(int fd, const char *fmt, ...);
+
+/**
+ * qmp_fd_send:
+ * @fd: Socket to write to.
+ * @msg: Fixed string to send.
+ *
+ * Send a message to the destination, without waiting for a reply.
+ */
+void qmp_fd_send(int fd, const char *msg);

 /**
  * qtest_cb_for_every_machine:
diff --git a/tests/libqtest.c b/tests/libqtest.c
index ba09c949dc..0fa32928c8 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -441,26 +441,16 @@ QDict *qtest_qmp_receive(QTestState *s)
     return qmp_fd_receive(s->qmp_fd);
 }

-/**
- * Allow users to send a message without waiting for the reply,
- * in the case that they choose to discard all replies up until
- * a particular EVENT is received.
+/*
+ * Internal code that converts from interpolated JSON into a message
+ * to send over the wire, without waiting for a reply.
  */
-void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
+static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
 {
     QObject *qobj = NULL;
-    int log = getenv("QTEST_LOG") != NULL;
     QString *qstr;
     const char *str;

-    /* qobject_from_jsonv() silently eats leading 0xff as invalid
-     * JSON, but we want to test sending them over the wire to force
-     * resyncs */
-    if (*fmt == '\377') {
-        socket_send(fd, fmt, 1);
-        assert(!fmt[1]);
-        return;
-    }
     assert(*fmt);

     /*
@@ -468,25 +458,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
      * is used.  We interpolate through QObject rather than sprintf in
      * order to escape strings properly.
      */
-    if (strchr(fmt, '%')) {
-        qobj = qobject_from_jsonv(fmt, ap);
-        qstr = qobject_to_json(qobj);
-    } else {
-        qstr = qstring_from_str(fmt);
+    if (!strchr(fmt, '%')) {
+        qmp_fd_send(fd, fmt);
+        return;
     }

-    /*
-     * BUG: QMP doesn't react to input until it sees a newline, an
-     * object, or an array.  Work-around: give it a newline.
-     */
-    qstring_append_chr(qstr, '\n');
+    qobj = qobject_from_jsonv(fmt, ap);
+    qstr = qobject_to_json(qobj);
     str = qstring_get_str(qstr);

-    if (log) {
-        fprintf(stderr, "%s", str);
-    }
     /* Send QMP request */
-    socket_send(fd, str, qstring_get_length(qstr));
+    qmp_fd_send(fd, str);

     QDECREF(qstr);
     qobject_decref(qobj);
@@ -497,13 +479,6 @@ void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
     qmp_fd_sendv(s->qmp_fd, fmt, ap);
 }

-QDict *qmp_fdv(int fd, const char *fmt, va_list ap)
-{
-    qmp_fd_sendv(fd, fmt, ap);
-
-    return qmp_fd_receive(fd);
-}
-
 QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
 {
     qtest_async_qmpv(s, fmt, ap);
@@ -512,24 +487,20 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
     return qtest_qmp_receive(s);
 }

-QDict *qmp_fd(int fd, const char *fmt, ...)
+void qmp_fd_send(int fd, const char *msg)
 {
-    va_list ap;
-    QDict *response;
+    int log = getenv("QTEST_LOG") != NULL;

-    va_start(ap, fmt);
-    response = qmp_fdv(fd, fmt, ap);
-    va_end(ap);
-    return response;
-}
-
-void qmp_fd_send(int fd, const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    qmp_fd_sendv(fd, fmt, ap);
-    va_end(ap);
+    if (log) {
+        fprintf(stderr, "%s\n", msg);
+    }
+    /* Send QMP request */
+    socket_send(fd, msg, strlen(msg));
+    /*
+     * BUG: QMP doesn't react to input until it sees a newline, an
+     * object, or an array.  Work-around: give it a newline.
+     */
+    socket_send(fd, "\n", 1);
 }

 QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
diff --git a/tests/test-qga.c b/tests/test-qga.c
index 839481e49b..ae0da6c9ac 100644
--- a/tests/test-qga.c
+++ b/tests/test-qga.c
@@ -122,9 +122,7 @@ static void GCC_FMT_ATTR(3, 0) qga_sendv(const TestFixture *fixture,
     QString *qstr = qobject_to_json(obj);
     const char *str;

-    qstring_append_chr(qstr, '\n');
     str = qstring_get_str(qstr);
-    assert(!strchr(str, '%'));
     qmp_fd_send(fixture->fd, str);
     QDECREF(qstr);
     qobject_decref(obj);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (11 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 14:54   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command Eric Blake
                   ` (10 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

The majority of calls into libqtest's qmp() and friends are passing
a JSON object that includes a command name; we can prove this by
adding an assertion.  The only outlier is qmp-test, which is testing
appropriate error responses to protocol violations and id support,
by sending raw strings, where those raw strings don't need
interpolation anyways.

Adding a new entry-point makes a clean separation of which input
needs interpolation, so that upcoming patches can refactor qmp()
to be more like the recent additions to test-qga in taking the
command name separately from the arguments for an overall
reduction in testsuite boilerplate.

This change also lets us move the workaround for the QMP parser
limitation of not ending a parse until } or newline: all calls
through qmp() are passing an object ending in }, so only the
few callers of qmp_raw() have to worry about a trailing newline.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h |  8 ++++++++
 tests/libqtest.c | 13 +++++++------
 tests/qmp-test.c | 19 ++++++++++++-------
 3 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 33af3ae8ff..917ec5cf92 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -550,6 +550,14 @@ static inline void qtest_end(void)
 QDict *qmp(const char *fmt, ...);

 /**
+ * qmp_raw:
+ * @msg: Raw QMP message to send to qemu.
+ *
+ * Sends a QMP message to QEMU and returns the response.
+ */
+QDict *qmp_raw(const char *msg);
+
+/**
  * qmp_async:
  * @fmt...: QMP message to send to qemu; formats arguments through
  * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 0fa32928c8..3071be2efb 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -451,7 +451,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
     QString *qstr;
     const char *str;

-    assert(*fmt);
+    assert(strstr(fmt, "execute"));

     /*
      * A round trip through QObject is only needed if % interpolation
@@ -496,11 +496,6 @@ void qmp_fd_send(int fd, const char *msg)
     }
     /* Send QMP request */
     socket_send(fd, msg, strlen(msg));
-    /*
-     * BUG: QMP doesn't react to input until it sees a newline, an
-     * object, or an array.  Work-around: give it a newline.
-     */
-    socket_send(fd, "\n", 1);
 }

 QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
@@ -899,6 +894,12 @@ QDict *qmp(const char *fmt, ...)
     return response;
 }

+QDict *qmp_raw(const char *msg)
+{
+    qmp_fd_send(global_qtest->qmp_fd, msg);
+    return qtest_qmp_receive(global_qtest);
+}
+
 void qmp_async(const char *fmt, ...)
 {
     va_list ap;
diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 5d0260b2be..905fb4b3e5 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -44,28 +44,33 @@ static void test_malformed(void)
 {
     QDict *resp;

+    /*
+     * BUG: QMP doesn't react to input until it sees a newline, an
+     * object, or an array.  Work-around: give it a newline.
+     */
+
     /* Not even a dictionary */
-    resp = qmp("null");
+    resp = qmp_raw("null\n");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     QDECREF(resp);

     /* No "execute" key */
-    resp = qmp("{}");
+    resp = qmp_raw("{}");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     QDECREF(resp);

     /* "execute" isn't a string */
-    resp = qmp("{ 'execute': true }");
+    resp = qmp_raw("{ 'execute': true }");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     QDECREF(resp);

     /* "arguments" isn't a dictionary */
-    resp = qmp("{ 'execute': 'no-such-cmd', 'arguments': [] }");
+    resp = qmp_raw("{ 'execute': 'no-such-cmd', 'arguments': [] }");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     QDECREF(resp);

     /* extra key */
-    resp = qmp("{ 'execute': 'no-such-cmd', 'extra': true }");
+    resp = qmp_raw("{ 'execute': 'no-such-cmd', 'extra': true }");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     QDECREF(resp);
 }
@@ -114,14 +119,14 @@ static void test_qmp_protocol(void)
     test_malformed();

     /* Test 'id' */
-    resp = qmp("{ 'execute': 'query-name', 'id': 'cookie#1' }");
+    resp = qmp_raw("{ 'execute': 'query-name', 'id': 'cookie#1' }");
     ret = qdict_get_qdict(resp, "return");
     g_assert(ret);
     g_assert_cmpstr(qdict_get_try_str(resp, "id"), ==, "cookie#1");
     QDECREF(resp);

     /* Test command failure with 'id' */
-    resp = qmp("{ 'execute': 'human-monitor-command', 'id': 2 }");
+    resp = qmp_raw("{ 'execute': 'human-monitor-command', 'id': 2 }");
     g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
     g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
     QDECREF(resp);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (12 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 15:15   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers Eric Blake
                   ` (9 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, John Snow, Stefan Hajnoczi, open list:IDE

Upcoming patches will be adding new convenience methods for
constructing QMP commands.  But making every variation of sending
support every variation of response handling becomes unwieldy;
it's easier to specify that discarding a JSON response is
unassociated with sending the command, where qmp_async() already
fits the bill for sending a command without tying up a reference
to the response.

Doing this renders qtest_qmp[v]_discard_response() unused.

Bonus: gets rid of a non-literal format string, which is a step
towards compile-time format string checking without triggering
-Wformat-nonliteral.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h               | 27 ++-------------------------
 tests/libqtest.c               | 30 ++++++------------------------
 tests/ahci-test.c              | 20 ++++++++++----------
 tests/boot-order-test.c        |  2 +-
 tests/drive_del-test.c         |  5 +++--
 tests/fdc-test.c               | 11 ++++++-----
 tests/ide-test.c               |  5 ++---
 tests/postcopy-test.c          |  3 ++-
 tests/test-filter-mirror.c     |  3 ++-
 tests/test-filter-redirector.c |  6 ++++--
 tests/virtio-blk-test.c        | 21 ++++++++++++---------
 11 files changed, 50 insertions(+), 83 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 917ec5cf92..6bae0223aa 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -48,16 +48,6 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
 void qtest_quit(QTestState *s);

 /**
- * qtest_qmp_discard_response:
- * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- *
- * Sends a QMP message to QEMU and consumes the response.
- */
-void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...);
-
-/**
  * qtest_qmp:
  * @s: #QTestState instance to operate on.
  * @fmt...: QMP message to send to qemu; formats arguments through
@@ -78,17 +68,6 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...);
 void qtest_async_qmp(QTestState *s, const char *fmt, ...);

 /**
- * qtest_qmpv_discard_response:
- * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- * @ap: QMP message arguments
- *
- * Sends a QMP message to QEMU and consumes the response.
- */
-void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap);
-
-/**
  * qtest_qmpv:
  * @s: #QTestState instance to operate on.
  * @fmt: QMP message to send to QEMU; formats arguments through
@@ -568,12 +547,10 @@ void qmp_async(const char *fmt, ...);

 /**
  * qmp_discard_response:
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
  *
- * Sends a QMP message to QEMU and consumes the response.
+ * Read and discard a QMP response, typically after qmp_async().
  */
-void qmp_discard_response(const char *fmt, ...);
+void qmp_discard_response(void);

 /**
  * qmp_receive:
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 3071be2efb..f9781d67f5 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -235,7 +235,8 @@ QTestState *qtest_init(const char *extra_args)
     /* Read the QMP greeting and then do the handshake */
     greeting = qtest_qmp_receive(s);
     QDECREF(greeting);
-    qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
+    greeting = qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
+    QDECREF(greeting);

     return s;
 }
@@ -518,23 +519,6 @@ void qtest_async_qmp(QTestState *s, const char *fmt, ...)
     va_end(ap);
 }

-void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap)
-{
-    QDict *response = qtest_qmpv(s, fmt, ap);
-    QDECREF(response);
-}
-
-void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...)
-{
-    va_list ap;
-    QDict *response;
-
-    va_start(ap, fmt);
-    response = qtest_qmpv(s, fmt, ap);
-    va_end(ap);
-    QDECREF(response);
-}
-
 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
 {
     QDict *response;
@@ -909,14 +893,12 @@ void qmp_async(const char *fmt, ...)
     va_end(ap);
 }

-void qmp_discard_response(const char *fmt, ...)
+void qmp_discard_response(void)
 {
-    va_list ap;
-
-    va_start(ap, fmt);
-    qtest_qmpv_discard_response(global_qtest, fmt, ap);
-    va_end(ap);
+    QDict *response = qtest_qmp_receive(global_qtest);
+    QDECREF(response);
 }
+
 char *hmp(const char *fmt, ...)
 {
     va_list ap;
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index 999121bb7c..9460843a9f 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -1596,8 +1596,9 @@ static void test_atapi_tray(void)
     rsp = qmp_receive();
     QDECREF(rsp);

-    qmp_discard_response("{'execute': 'x-blockdev-remove-medium', "
-                         "'arguments': {'device': 'drive0'}}");
+    qmp_async("{'execute': 'x-blockdev-remove-medium', "
+              "'arguments': {'device': 'drive0'}}");
+    qmp_discard_response();

     /* Test the tray without a medium */
     ahci_atapi_load(ahci, port);
@@ -1607,14 +1608,13 @@ static void test_atapi_tray(void)
     atapi_wait_tray(true);

     /* Re-insert media */
-    qmp_discard_response("{'execute': 'blockdev-add', "
-                          "'arguments': {'node-name': 'node0', "
-                                        "'driver': 'raw', "
-                                        "'file': { 'driver': 'file', "
-                                                  "'filename': %s }}}", iso);
-    qmp_discard_response("{'execute': 'x-blockdev-insert-medium',"
-                          "'arguments': { 'device': 'drive0', "
-                                         "'node-name': 'node0' }}");
+    qmp_async("{'execute': 'blockdev-add', 'arguments': {"
+              "  'node-name': 'node0', 'driver': 'raw', "
+              "  'file': { 'driver': 'file', 'filename': %s }}}", iso);
+    qmp_discard_response();
+    qmp_async("{'execute': 'x-blockdev-insert-medium',"
+              "'arguments': { 'device': 'drive0', 'node-name': 'node0' }}");
+    qmp_discard_response();

     /* Again, the event shows up first */
     qmp_async("{'execute': 'blockdev-close-tray', "
diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c
index 9d516830dd..4114720236 100644
--- a/tests/boot-order-test.c
+++ b/tests/boot-order-test.c
@@ -38,7 +38,7 @@ static void test_a_boot_order(const char *machine,
     qtest_start(args);
     actual = read_boot_order();
     g_assert_cmphex(actual, ==, expected_boot);
-    qmp_discard_response("{ 'execute': 'system_reset' }");
+    qmp_async("{ 'execute': 'system_reset' }");
     /*
      * system_reset only requests reset.  We get a RESET event after
      * the actual reset completes.  Need to wait for that.
diff --git a/tests/drive_del-test.c b/tests/drive_del-test.c
index 2175139abb..834a634da3 100644
--- a/tests/drive_del-test.c
+++ b/tests/drive_del-test.c
@@ -34,8 +34,9 @@ static void device_del(void)
     QDict *response;

     /* Complication: ignore DEVICE_DELETED event */
-    qmp_discard_response("{'execute': 'device_del',"
-                         " 'arguments': { 'id': 'dev0' } }");
+    qmp_async("{'execute': 'device_del',"
+              " 'arguments': { 'id': 'dev0' } }");
+    qmp_discard_response();
     response = qmp_receive();
     g_assert(response);
     g_assert(qdict_haskey(response, "return"));
diff --git a/tests/fdc-test.c b/tests/fdc-test.c
index 325712e0f2..ab61a82873 100644
--- a/tests/fdc-test.c
+++ b/tests/fdc-test.c
@@ -298,9 +298,10 @@ static void test_media_insert(void)

     /* Insert media in drive. DSKCHK should not be reset until a step pulse
      * is sent. */
-    qmp_discard_response("{'execute':'blockdev-change-medium', 'arguments':{"
-                         " 'id':'floppy0', 'filename': %s, 'format': 'raw' }}",
-                         test_image);
+    qmp_async("{'execute':'blockdev-change-medium', 'arguments':{"
+              " 'id':'floppy0', 'filename': %s, 'format': 'raw' }}",
+              test_image);
+    qmp_discard_response();

     dir = inb(FLOPPY_BASE + reg_dir);
     assert_bit_set(dir, DSKCHG);
@@ -329,8 +330,8 @@ static void test_media_change(void)

     /* Eject the floppy and check that DSKCHG is set. Reading it out doesn't
      * reset the bit. */
-    qmp_discard_response("{'execute':'eject', 'arguments':{"
-                         " 'id':'floppy0' }}");
+    qmp_async("{'execute':'eject', 'arguments':{ 'id':'floppy0' }}");
+    qmp_discard_response();

     dir = inb(FLOPPY_BASE + reg_dir);
     assert_bit_set(dir, DSKCHG);
diff --git a/tests/ide-test.c b/tests/ide-test.c
index bfd79ddbdc..757af7cd1d 100644
--- a/tests/ide-test.c
+++ b/tests/ide-test.c
@@ -624,7 +624,6 @@ static void test_retry_flush(const char *machine)
     QPCIDevice *dev;
     QPCIBar bmdma_bar, ide_bar;
     uint8_t data;
-    const char *s;

     prepare_blkdebug_script(debug_path, "flush_to_disk");

@@ -652,8 +651,8 @@ static void test_retry_flush(const char *machine)
     qmp_eventwait("STOP");

     /* Complete the command */
-    s = "{'execute':'cont' }";
-    qmp_discard_response(s);
+    qmp_async("{'execute':'cont' }");
+    qmp_discard_response();

     /* Check registers */
     data = qpci_io_readb(dev, ide_bar, reg_device);
diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index 8142f2ab90..ceaed823eb 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -482,7 +482,8 @@ static void test_migrate(void)
         usleep(10 * 1000);
     } while (dest_byte_a == dest_byte_b);

-    qmp_discard_response("{ 'execute' : 'stop'}");
+    qmp_async("{ 'execute' : 'stop'}");
+    qmp_discard_response();
     /* With it stopped, check nothing changes */
     qtest_memread(to, start_address, &dest_byte_c, 1);
     sleep(1);
diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
index 9f84402493..79c5306fe7 100644
--- a/tests/test-filter-mirror.c
+++ b/tests/test-filter-mirror.c
@@ -57,7 +57,8 @@ static void test_mirror(void)
     };

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_discard_response("{ 'execute' : 'query-status'}");
+    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_discard_response();
     ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
     g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
     close(send_sock[0]);
diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c
index 0c4b8d52ef..a6a714abea 100644
--- a/tests/test-filter-redirector.c
+++ b/tests/test-filter-redirector.c
@@ -99,7 +99,8 @@ static void test_redirector_tx(void)
     g_assert_cmpint(recv_sock, !=, -1);

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_discard_response("{ 'execute' : 'query-status'}");
+    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_discard_response();

     struct iovec iov[] = {
         {
@@ -184,7 +185,8 @@ static void test_redirector_rx(void)
     send_sock = unix_connect(sock_path1, NULL);
     g_assert_cmpint(send_sock, !=, -1);
     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_discard_response("{ 'execute' : 'query-status'}");
+    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_discard_response();

     ret = iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf));
     g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
index 0576cb16ba..fe966c0606 100644
--- a/tests/virtio-blk-test.c
+++ b/tests/virtio-blk-test.c
@@ -409,9 +409,10 @@ static void pci_config(void)

     qvirtio_set_driver_ok(&dev->vdev);

-    qmp_discard_response("{ 'execute': 'block_resize', "
-                         " 'arguments': { 'device': 'drive0', "
-                         " 'size': %d } }", n_size);
+    qmp_async("{ 'execute': 'block_resize', "
+              " 'arguments': { 'device': 'drive0', "
+              " 'size': %d } }", n_size);
+    qmp_discard_response();
     qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);

     capacity = qvirtio_config_readq(&dev->vdev, 0);
@@ -459,9 +460,10 @@ static void pci_msix(void)

     qvirtio_set_driver_ok(&dev->vdev);

-    qmp_discard_response("{ 'execute': 'block_resize', "
-                         " 'arguments': { 'device': 'drive0', "
-                         " 'size': %d } }", n_size);
+    qmp_async("{ 'execute': 'block_resize', "
+              " 'arguments': { 'device': 'drive0', "
+              " 'size': %d } }", n_size);
+    qmp_discard_response();

     qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);

@@ -700,9 +702,10 @@ static void mmio_basic(void)

     test_basic(&dev->vdev, alloc, vq);

-    qmp_discard_response("{ 'execute': 'block_resize', "
-                         " 'arguments': { 'device': 'drive0', "
-                         " 'size': %d } }", n_size);
+    qmp_async("{ 'execute': 'block_resize', "
+              " 'arguments': { 'device': 'drive0', "
+              " 'size': %d } }", n_size);
+    qmp_discard_response();

     qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US);

-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (13 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 15:34   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper Eric Blake
                   ` (8 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

None of our tests were directly using qtest_qmp() and friends;
even tests like postcopy-test.c that manage multiple connections
get along just fine changing global_qtest as needed (other than
one callsite where it forgot to use the inlined form).  It's
also annoying that we have qmp_async() but qtest_async_qmp(),
with inconsistent naming for tracing through the wrappers.

As future patches are about to add some convenience functions
for easier generation of QMP commands, it's easier if we don't
have to percolate the changes through as many layers of the stack,
by getting rid of the layer that no one uses, and just documenting
that callers have to massage the global variable as needed. (Yes,
this is backwards from good design that says all state should be
passed as parameters rather than via a global variable - but such
is life in maintaining a testsuite, where it is easier to write
concise tests than it is to retrofit all existing tests to pass
the extra parameter everywhere.)

Internally, we rename qmp_fd_sendv() to qtest_qmp_sendv(), as
well as give it a ... counterpart qmp_fd_send(), but the overall
reduction in code makes this file a bit less repetitive.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h      | 75 +++++----------------------------------------------
 tests/libqtest.c      | 71 +++++++++++++-----------------------------------
 tests/postcopy-test.c |  2 +-
 3 files changed, 25 insertions(+), 123 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 6bae0223aa..684cfb3507 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -21,6 +21,11 @@

 typedef struct QTestState QTestState;

+/*
+ * The various qmp_*() commands operate on global_qtest.  Tests can
+ * alternate between two parallel connections by switching which state
+ * is current before issuing commands.
+ */
 extern QTestState *global_qtest;

 /**
@@ -48,49 +53,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
 void qtest_quit(QTestState *s);

 /**
- * qtest_qmp:
- * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- *
- * Sends a QMP message to QEMU and returns the response.
- */
-QDict *qtest_qmp(QTestState *s, const char *fmt, ...);
-
-/**
- * qtest_async_qmp:
- * @s: #QTestState instance to operate on.
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- *
- * Sends a QMP message to QEMU and leaves the response in the stream.
- */
-void qtest_async_qmp(QTestState *s, const char *fmt, ...);
-
-/**
- * qtest_qmpv:
- * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- * @ap: QMP message arguments
- *
- * Sends a QMP message to QEMU and returns the response.
- */
-QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap);
-
-/**
- * qtest_async_qmpv:
- * @s: #QTestState instance to operate on.
- * @fmt: QMP message to send to QEMU; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- * @ap: QMP message arguments
- *
- * Sends a QMP message to QEMU and leaves the response in the stream.
- */
-void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap);
-
-/**
- * qtest_receive:
+ * qtest_qmp_receive:
  * @s: #QTestState instance to operate on.
  *
  * Reads a QMP message from QEMU and returns the response.
@@ -117,32 +80,6 @@ void qtest_qmp_eventwait(QTestState *s, const char *event);
 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);

 /**
- * qtest_hmp:
- * @s: #QTestState instance to operate on.
- * @fmt...: HMP command to send to QEMU, formats arguments like sprintf().
- *
- * Send HMP command to QEMU via QMP's human-monitor-command.
- * QMP events are discarded.
- *
- * Returns: the command's output.  The caller should g_free() it.
- */
-char *qtest_hmp(QTestState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
-
-/**
- * qtest_hmpv:
- * @s: #QTestState instance to operate on.
- * @fmt: HMP command to send to QEMU, formats arguments like vsprintf().
- * @ap: HMP command arguments
- *
- * Send HMP command to QEMU via QMP's human-monitor-command.
- * QMP events are discarded.
- *
- * Returns: the command's output.  The caller should g_free() it.
- */
-char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
-    GCC_FMT_ATTR(2, 0);
-
-/**
  * qtest_get_irq:
  * @s: #QTestState instance to operate on.
  * @num: Interrupt to observe.
diff --git a/tests/libqtest.c b/tests/libqtest.c
index f9781d67f5..2df01682c0 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -233,9 +233,10 @@ QTestState *qtest_init(const char *extra_args)
     QDict *greeting;

     /* Read the QMP greeting and then do the handshake */
-    greeting = qtest_qmp_receive(s);
+    greeting = qmp_fd_receive(s->qmp_fd);
     QDECREF(greeting);
-    greeting = qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
+    qmp_fd_send(s->qmp_fd, "{ 'execute': 'qmp_capabilities' }");
+    greeting = qmp_fd_receive(s->qmp_fd);
     QDECREF(greeting);

     return s;
@@ -446,7 +447,7 @@ QDict *qtest_qmp_receive(QTestState *s)
  * Internal code that converts from interpolated JSON into a message
  * to send over the wire, without waiting for a reply.
  */
-static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
+static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)
 {
     QObject *qobj = NULL;
     QString *qstr;
@@ -460,7 +461,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
      * order to escape strings properly.
      */
     if (!strchr(fmt, '%')) {
-        qmp_fd_send(fd, fmt);
+        qmp_fd_send(s->qmp_fd, fmt);
         return;
     }

@@ -469,23 +470,19 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
     str = qstring_get_str(qstr);

     /* Send QMP request */
-    qmp_fd_send(fd, str);
+    qmp_fd_send(s->qmp_fd, str);

     QDECREF(qstr);
     qobject_decref(qobj);
 }

-void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
+static void qtest_qmp_send(QTestState *s, const char *fmt, ...)
 {
-    qmp_fd_sendv(s->qmp_fd, fmt, ap);
-}
+    va_list ap;

-QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
-{
-    qtest_async_qmpv(s, fmt, ap);
-
-    /* Receive reply */
-    return qtest_qmp_receive(s);
+    va_start(ap, fmt);
+    qtest_qmp_sendv(s, fmt, ap);
+    va_end(ap);
 }

 void qmp_fd_send(int fd, const char *msg)
@@ -499,26 +496,6 @@ void qmp_fd_send(int fd, const char *msg)
     socket_send(fd, msg, strlen(msg));
 }

-QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
-{
-    va_list ap;
-    QDict *response;
-
-    va_start(ap, fmt);
-    response = qtest_qmpv(s, fmt, ap);
-    va_end(ap);
-    return response;
-}
-
-void qtest_async_qmp(QTestState *s, const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    qtest_async_qmpv(s, fmt, ap);
-    va_end(ap);
-}
-
 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
 {
     QDict *response;
@@ -541,16 +518,16 @@ void qtest_qmp_eventwait(QTestState *s, const char *event)
     QDECREF(response);
 }

-char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
+static char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
 {
     char *cmd;
     QDict *resp;
     char *ret;

     cmd = g_strdup_vprintf(fmt, ap);
-    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
-                     " 'arguments': {'command-line': %s}}",
-                     cmd);
+    qtest_qmp_send(s, "{'execute': 'human-monitor-command',"
+                   " 'arguments': {'command-line': %s}}", cmd);
+    resp = qtest_qmp_receive(s);
     ret = g_strdup(qdict_get_try_str(resp, "return"));
     while (ret == NULL && qdict_get_try_str(resp, "event")) {
         /* Ignore asynchronous QMP events */
@@ -564,17 +541,6 @@ char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
     return ret;
 }

-char *qtest_hmp(QTestState *s, const char *fmt, ...)
-{
-    va_list ap;
-    char *ret;
-
-    va_start(ap, fmt);
-    ret = qtest_hmpv(s, fmt, ap);
-    va_end(ap);
-    return ret;
-}
-
 const char *qtest_get_arch(void)
 {
     const char *qemu = getenv("QTEST_QEMU_BINARY");
@@ -870,12 +836,11 @@ void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
 QDict *qmp(const char *fmt, ...)
 {
     va_list ap;
-    QDict *response;

     va_start(ap, fmt);
-    response = qtest_qmpv(global_qtest, fmt, ap);
+    qtest_qmp_sendv(global_qtest, fmt, ap);
     va_end(ap);
-    return response;
+    return qtest_qmp_receive(global_qtest);
 }

 QDict *qmp_raw(const char *msg)
@@ -889,7 +854,7 @@ void qmp_async(const char *fmt, ...)
     va_list ap;

     va_start(ap, fmt);
-    qtest_async_qmpv(global_qtest, fmt, ap);
+    qtest_qmp_sendv(global_qtest, fmt, ap);
     va_end(ap);
 }

diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index ceaed823eb..61f4b4180a 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -236,7 +236,7 @@ static QDict *return_or_event(QDict *response)
         got_stop = true;
     }
     QDECREF(response);
-    return return_or_event(qtest_qmp_receive(global_qtest));
+    return return_or_event(qmp_receive());
 }


-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (14 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 15:40   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper Eric Blake
                   ` (7 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel
  Cc: armbru, John Snow, Andreas Färber, Jason Wang, Ben Warren,
	open list:IDE

Now that we've asserted that all of our interpolated QMP commands
include 'execute', we can reduce some of the caller boilerplate
by providing a helpr function to wrap commands with no arguments
(later patches will cover commands with arguments).

Adjust all callers that can use the new helpers; in the process,
fixing a couple of places where we would have failed
-Wformat-nonliteral.  Likewise, libqos.c no longer needs
qmp_execute(), which in turn fixes the fact that it is better
to interpolate JSON strings through qobject_from_json() than
through sprintf().

The current name is long, but temporary: later patches will
remove all other uses of qmp(), and then make the mass rename
of qmp_cmd() down to qmp().

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h               | 16 ++++++++++++++++
 tests/libqtest.c               | 13 ++++++++++++-
 tests/ahci-test.c              |  4 +---
 tests/boot-order-test.c        |  2 +-
 tests/ide-test.c               |  2 +-
 tests/libqos/ahci.c            |  4 ++--
 tests/libqos/libqos.c          | 16 ++--------------
 tests/numa-test.c              |  2 +-
 tests/postcopy-test.c          |  8 ++++----
 tests/q35-test.c               |  2 +-
 tests/qmp-test.c               |  8 ++++----
 tests/qom-test.c               |  2 +-
 tests/test-filter-mirror.c     |  2 +-
 tests/test-filter-redirector.c |  4 ++--
 tests/test-x86-cpuid-compat.c  |  2 +-
 tests/virtio-net-test.c        | 13 ++++++-------
 tests/vmgenid-test.c           |  2 +-
 tests/wdt_ib700-test.c         |  2 +-
 18 files changed, 58 insertions(+), 46 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 684cfb3507..e0d87d035a 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -483,6 +483,22 @@ QDict *qmp_raw(const char *msg);
 void qmp_async(const char *fmt, ...);

 /**
+ * qmp_cmd:
+ * @cmd: QMP command, with no arguments.
+ *
+ * Sends a QMP message to QEMU and returns the response.
+ */
+QDict *qmp_cmd(const char *cmd);
+
+/**
+ * qmp_cmd_async:
+ * @cmd: QMP command, with no arguments.
+ *
+ * Sends a QMP message to QEMU and leaves the response in the stream.
+ */
+void qmp_cmd_async(const char *cmd);
+
+/**
  * qmp_discard_response:
  *
  * Read and discard a QMP response, typically after qmp_async().
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 2df01682c0..3926a4d481 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -858,6 +858,17 @@ void qmp_async(const char *fmt, ...)
     va_end(ap);
 }

+QDict *qmp_cmd(const char *cmd)
+{
+    qmp_cmd_async(cmd);
+    return qtest_qmp_receive(global_qtest);
+}
+
+void qmp_cmd_async(const char *cmd)
+{
+    qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
+}
+
 void qmp_discard_response(void)
 {
     QDict *response = qtest_qmp_receive(global_qtest);
@@ -890,7 +901,7 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine))
     const char *mname;

     qtest_start("-machine none");
-    response = qmp("{ 'execute': 'query-machines' }");
+    response = qmp_cmd("query-machines");
     g_assert(response);
     list = qdict_get_qlist(response, "return");
     g_assert(list);
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index 9460843a9f..63d52edfca 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -1350,7 +1350,6 @@ static void test_flush_migrate(void)
     AHCIQState *src, *dst;
     AHCICommand *cmd;
     uint8_t px;
-    const char *s;
     char *uri = g_strdup_printf("unix:%s", mig_socket);

     prepare_blkdebug_script(debug_path, "flush_to_disk");
@@ -1386,8 +1385,7 @@ static void test_flush_migrate(void)
     ahci_migrate(src, dst, uri);

     /* Complete the command */
-    s = "{'execute':'cont' }";
-    qmp_async(s);
+    qmp_cmd_async("cont");
     qmp_eventwait("RESUME");
     ahci_command_wait(dst, cmd);
     ahci_command_verify(dst, cmd);
diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c
index 4114720236..0be3333e6b 100644
--- a/tests/boot-order-test.c
+++ b/tests/boot-order-test.c
@@ -38,7 +38,7 @@ static void test_a_boot_order(const char *machine,
     qtest_start(args);
     actual = read_boot_order();
     g_assert_cmphex(actual, ==, expected_boot);
-    qmp_async("{ 'execute': 'system_reset' }");
+    qmp_cmd_async("system_reset");
     /*
      * system_reset only requests reset.  We get a RESET event after
      * the actual reset completes.  Need to wait for that.
diff --git a/tests/ide-test.c b/tests/ide-test.c
index 757af7cd1d..56a02b1c7f 100644
--- a/tests/ide-test.c
+++ b/tests/ide-test.c
@@ -651,7 +651,7 @@ static void test_retry_flush(const char *machine)
     qmp_eventwait("STOP");

     /* Complete the command */
-    qmp_async("{'execute':'cont' }");
+    qmp_cmd_async("cont");
     qmp_discard_response();

     /* Check registers */
diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c
index 1ca7f456b5..06b9ce3a13 100644
--- a/tests/libqos/ahci.c
+++ b/tests/libqos/ahci.c
@@ -668,7 +668,7 @@ void ahci_exec(AHCIQState *ahci, uint8_t port,
         g_assert_cmpint(rc, ==, 0);
     }
     if (opts->error) {
-        qmp_async("{'execute':'cont' }");
+        qmp_cmd_async("cont");
         qmp_eventwait("RESUME");
     }

@@ -706,7 +706,7 @@ AHCICommand *ahci_guest_io_halt(AHCIQState *ahci, uint8_t port,
 void ahci_guest_io_resume(AHCIQState *ahci, AHCICommand *cmd)
 {
     /* Complete the command */
-    qmp_async("{'execute':'cont' }");
+    qmp_cmd_async("cont");
     qmp_eventwait("RESUME");
     ahci_command_wait(ahci, cmd);
     ahci_command_verify(ahci, cmd);
diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c
index 6226546c28..246a04d6e6 100644
--- a/tests/libqos/libqos.c
+++ b/tests/libqos/libqos.c
@@ -84,18 +84,6 @@ void set_context(QOSState *s)
     global_qtest = s->qts;
 }

-static QDict *qmp_execute(const char *command)
-{
-    char *fmt;
-    QDict *rsp;
-
-    fmt = g_strdup_printf("{ 'execute': '%s' }", command);
-    rsp = qmp(fmt);
-    g_free(fmt);
-
-    return rsp;
-}
-
 void migrate(QOSState *from, QOSState *to, const char *uri)
 {
     const char *st;
@@ -106,7 +94,7 @@ void migrate(QOSState *from, QOSState *to, const char *uri)
     set_context(from);

     /* Is the machine currently running? */
-    rsp = qmp_execute("query-status");
+    rsp = qmp_cmd("query-status");
     g_assert(qdict_haskey(rsp, "return"));
     sub = qdict_get_qdict(rsp, "return");
     g_assert(qdict_haskey(sub, "running"));
@@ -137,7 +125,7 @@ void migrate(QOSState *from, QOSState *to, const char *uri)

     /* Otherwise, we need to wait: poll until migration is completed. */
     while (1) {
-        rsp = qmp_execute("query-migrate");
+        rsp = qmp_cmd("query-migrate");
         g_assert(qdict_haskey(rsp, "return"));
         sub = qdict_get_qdict(rsp, "return");
         g_assert(qdict_haskey(sub, "status"));
diff --git a/tests/numa-test.c b/tests/numa-test.c
index e1b6152244..d98500012f 100644
--- a/tests/numa-test.c
+++ b/tests/numa-test.c
@@ -74,7 +74,7 @@ static void test_mon_partial(const void *data)

 static QList *get_cpus(QDict **resp)
 {
-    *resp = qmp("{ 'execute': 'query-cpus' }");
+    *resp = qmp_cmd("query-cpus");
     g_assert(*resp);
     g_assert(qdict_haskey(*resp, "return"));
     return qdict_get_qlist(*resp, "return");
diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index 61f4b4180a..6f7f81eccd 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -252,7 +252,7 @@ static uint64_t get_migration_pass(void)
     QDict *rsp, *rsp_return, *rsp_ram;
     uint64_t result;

-    rsp = return_or_event(qmp("{ 'execute': 'query-migrate' }"));
+    rsp = return_or_event(qmp_cmd("query-migrate"));
     rsp_return = qdict_get_qdict(rsp, "return");
     if (!qdict_haskey(rsp_return, "ram")) {
         /* Still in setup */
@@ -273,7 +273,7 @@ static void wait_for_migration_complete(void)
     do {
         const char *status;

-        rsp = return_or_event(qmp("{ 'execute': 'query-migrate' }"));
+        rsp = return_or_event(qmp_cmd("query-migrate"));
         rsp_return = qdict_get_qdict(rsp, "return");
         status = qdict_get_str(rsp_return, "status");
         completed = strcmp(status, "completed") == 0;
@@ -455,7 +455,7 @@ static void test_migrate(void)

     wait_for_migration_pass();

-    rsp = return_or_event(qmp("{ 'execute': 'migrate-start-postcopy' }"));
+    rsp = return_or_event(qmp_cmd("migrate-start-postcopy"));
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

@@ -482,7 +482,7 @@ static void test_migrate(void)
         usleep(10 * 1000);
     } while (dest_byte_a == dest_byte_b);

-    qmp_async("{ 'execute' : 'stop'}");
+    qmp_cmd_async("stop");
     qmp_discard_response();
     /* With it stopped, check nothing changes */
     qtest_memread(to, start_address, &dest_byte_c, 1);
diff --git a/tests/q35-test.c b/tests/q35-test.c
index f98bed7a2d..122872b90d 100644
--- a/tests/q35-test.c
+++ b/tests/q35-test.c
@@ -105,7 +105,7 @@ static void test_smram_lock(void)
     g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == false);

     /* reset */
-    response = qmp("{'execute': 'system_reset', 'arguments': {} }");
+    response = qmp_cmd("system_reset");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 905fb4b3e5..082c5f7e8d 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -92,7 +92,7 @@ static void test_qmp_protocol(void)
     QDECREF(resp);

     /* Test valid command before handshake */
-    resp = qmp("{ 'execute': 'query-version' }");
+    resp = qmp_cmd("query-version");
     g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
     QDECREF(resp);

@@ -100,18 +100,18 @@ static void test_qmp_protocol(void)
     test_malformed();

     /* Test handshake */
-    resp = qmp("{ 'execute': 'qmp_capabilities' }");
+    resp = qmp_cmd("qmp_capabilities");
     ret = qdict_get_qdict(resp, "return");
     g_assert(ret && !qdict_size(ret));
     QDECREF(resp);

     /* Test repeated handshake */
-    resp = qmp("{ 'execute': 'qmp_capabilities' }");
+    resp = qmp_cmd("qmp_capabilities");
     g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
     QDECREF(resp);

     /* Test valid command */
-    resp = qmp("{ 'execute': 'query-version' }");
+    resp = qmp_cmd("query-version");
     test_version(qdict_get(resp, "return"));
     QDECREF(resp);

diff --git a/tests/qom-test.c b/tests/qom-test.c
index ab0595dc75..369972629a 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -98,7 +98,7 @@ static void test_machine(gconstpointer data)

     test_properties("/machine", true);

-    response = qmp("{ 'execute': 'quit' }");
+    response = qmp_cmd("quit");
     g_assert(qdict_haskey(response, "return"));
     QDECREF(response);

diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
index 79c5306fe7..0fb87c124d 100644
--- a/tests/test-filter-mirror.c
+++ b/tests/test-filter-mirror.c
@@ -57,7 +57,7 @@ static void test_mirror(void)
     };

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_cmd_async("query-status");
     qmp_discard_response();
     ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
     g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c
index a6a714abea..00f58f63b5 100644
--- a/tests/test-filter-redirector.c
+++ b/tests/test-filter-redirector.c
@@ -99,7 +99,7 @@ static void test_redirector_tx(void)
     g_assert_cmpint(recv_sock, !=, -1);

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_cmd_async("query-status");
     qmp_discard_response();

     struct iovec iov[] = {
@@ -185,7 +185,7 @@ static void test_redirector_rx(void)
     send_sock = unix_connect(sock_path1, NULL);
     g_assert_cmpint(send_sock, !=, -1);
     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_async("{ 'execute' : 'query-status'}");
+    qmp_cmd_async("query-status");
     qmp_discard_response();

     ret = iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf));
diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
index 58a2dd9fe8..f29df9b9df 100644
--- a/tests/test-x86-cpuid-compat.c
+++ b/tests/test-x86-cpuid-compat.c
@@ -13,7 +13,7 @@ static char *get_cpu0_qom_path(void)
     QDict *cpu0;
     char *path;

-    resp = qmp("{'execute': 'query-cpus', 'arguments': {}}");
+    resp = qmp_cmd("query-cpus");
     g_assert(qdict_haskey(resp, "return"));
     ret = qdict_get_qlist(resp, "return");

diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c
index 635b942c36..5d934d19c2 100644
--- a/tests/virtio-net-test.c
+++ b/tests/virtio-net-test.c
@@ -151,7 +151,6 @@ static void rx_stop_cont_test(QVirtioDevice *dev,
     char test[] = "TEST";
     char buffer[64];
     int len = htonl(sizeof(test));
-    QDict *rsp;
     struct iovec iov[] = {
         {
             .iov_base = &len,
@@ -168,8 +167,8 @@ static void rx_stop_cont_test(QVirtioDevice *dev,
     free_head = qvirtqueue_add(vq, req_addr, 64, true, false);
     qvirtqueue_kick(dev, vq, free_head);

-    rsp = qmp("{ 'execute' : 'stop'}");
-    QDECREF(rsp);
+    qmp_cmd_async("stop");
+    qmp_discard_response();

     ret = iov_send(socket, iov, 2, 0, sizeof(len) + sizeof(test));
     g_assert_cmpint(ret, ==, sizeof(test) + sizeof(len));
@@ -177,10 +176,10 @@ static void rx_stop_cont_test(QVirtioDevice *dev,
     /* We could check the status, but this command is more importantly to
      * ensure the packet data gets queued in QEMU, before we do 'cont'.
      */
-    rsp = qmp("{ 'execute' : 'query-status'}");
-    QDECREF(rsp);
-    rsp = qmp("{ 'execute' : 'cont'}");
-    QDECREF(rsp);
+    qmp_cmd_async("query-status");
+    qmp_discard_response();
+    qmp_cmd_async("cont");
+    qmp_discard_response();

     qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US);
     memread(req_addr + VNET_HDR_SIZE, buffer, sizeof(test));
diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c
index 3d5c1c3615..0842833eba 100644
--- a/tests/vmgenid-test.c
+++ b/tests/vmgenid-test.c
@@ -118,7 +118,7 @@ static void read_guid_from_monitor(QemuUUID *guid)
     QDict *rsp, *rsp_ret;
     const char *guid_str;

-    rsp = qmp("{ 'execute': 'query-vm-generation-id' }");
+    rsp = qmp_cmd("query-vm-generation-id");
     if (qdict_haskey(rsp, "return")) {
         rsp_ret = qdict_get_qdict(rsp, "return");
         g_assert(qdict_haskey(rsp_ret, "guid"));
diff --git a/tests/wdt_ib700-test.c b/tests/wdt_ib700-test.c
index 4fc8eeae86..a5fd795cc9 100644
--- a/tests/wdt_ib700-test.c
+++ b/tests/wdt_ib700-test.c
@@ -13,7 +13,7 @@

 static void qmp_check_no_event(void)
 {
-    QDict *resp = qmp("{'execute':'query-status'}");
+    QDict *resp = qmp_cmd("query-status");
     g_assert(qdict_haskey(resp, "return"));
     QDECREF(resp);
 }
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (15 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 15:57   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 18/22] tests/libqos/usb: Clean up string interpolation into QMP input Eric Blake
                   ` (6 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel
  Cc: armbru, John Snow, Andreas Färber, Gerd Hoffmann,
	Stefan Hajnoczi, Paolo Bonzini, Amit Shah, open list:IDE

Similar to the previous helper, we can reduce the boilerplate
of most callers by passing the command name separately from
the interpolated arguments.  Adjust the majority of the callers
that can use the new helpers; in the process, fixing a few
places where we would have failed -Wformat-nonliteral.  The
new helper function already uses GCC_FMT_ATTR to match the
underlying use of qobject_from_jsonv().

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h               |  20 ++++++
 tests/libqtest.c               |  29 +++++++++
 tests/ahci-test.c              |  19 +++---
 tests/device-introspect-test.c |   4 +-
 tests/drive_del-test.c         |  10 +--
 tests/fdc-test.c               |   8 +--
 tests/libqos/libqos.c          |   7 +--
 tests/libqos/pci-pc.c          |   8 +--
 tests/pc-cpu-test.c            |   8 +--
 tests/postcopy-test.c          |  30 +++------
 tests/qom-test.c               |   9 +--
 tests/test-netfilter.c         | 139 ++++++++++++++++-------------------------
 tests/test-x86-cpuid-compat.c  |   6 +-
 tests/tmp105-test.c            |   9 +--
 tests/usb-hcd-uhci-test.c      |  14 ++---
 tests/usb-hcd-xhci-test.c      |  25 ++------
 tests/vhost-user-test.c        |  12 +---
 tests/virtio-blk-test.c        |  12 +---
 tests/virtio-scsi-test.c       |  13 +---
 tests/virtio-serial-test.c     |  12 +---
 20 files changed, 167 insertions(+), 227 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index e0d87d035a..86ca7fa581 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -499,6 +499,26 @@ QDict *qmp_cmd(const char *cmd);
 void qmp_cmd_async(const char *cmd);

 /**
+ * qmp_args:
+ * @cmd: QMP command to send to QEMU.
+ * @fmt...: Arguments for the command; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
+ *
+ * Sends a QMP message to QEMU and returns the response.
+ */
+QDict *qmp_args(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
+
+/**
+ * qmp_args_async:
+ * @cmd: QMP command to send to QEMU.
+ * @fmt...: Arguments for the command; formats arguments through
+ * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
+ *
+ * Sends a QMP message to QEMU and leaves the response in the stream.
+ */
+void qmp_args_async(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
+
+/**
  * qmp_discard_response:
  *
  * Read and discard a QMP response, typically after qmp_async().
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 3926a4d481..49786cf2d7 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -869,6 +869,35 @@ void qmp_cmd_async(const char *cmd)
     qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
 }

+static void qmp_args_dict_async(const char *cmd, QDict *args)
+{
+    assert(args);
+    qtest_qmp_send(global_qtest, "{'execute':%s, 'arguments':%p}", cmd, args);
+}
+
+QDict *qmp_args(const char *cmd, const char *fmt, ...)
+{
+    va_list ap;
+    QObject *obj;
+
+    va_start(ap, fmt);
+    obj = qobject_from_jsonv(fmt, ap);
+    va_end(ap);
+    qmp_args_dict_async(cmd, qobject_to_qdict(obj));
+    return qtest_qmp_receive(global_qtest);
+}
+
+void qmp_args_async(const char *cmd, const char *fmt, ...)
+{
+    va_list ap;
+    QObject *obj;
+
+    va_start(ap, fmt);
+    obj = qobject_from_jsonv(fmt, ap);
+    va_end(ap);
+    qmp_args_dict_async(cmd, qobject_to_qdict(obj));
+}
+
 void qmp_discard_response(void)
 {
     QDict *response = qtest_qmp_receive(global_qtest);
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index 63d52edfca..ee8a539cf6 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -1588,14 +1588,12 @@ static void test_atapi_tray(void)
     atapi_wait_tray(false);

     /* Remove media */
-    qmp_async("{'execute': 'blockdev-open-tray', "
-               "'arguments': {'device': 'drive0'}}");
+    qmp_args_async("blockdev-open-tray", "{'device': 'drive0'}");
     atapi_wait_tray(true);
     rsp = qmp_receive();
     QDECREF(rsp);

-    qmp_async("{'execute': 'x-blockdev-remove-medium', "
-              "'arguments': {'device': 'drive0'}}");
+    qmp_args_async("x-blockdev-remove-medium", "{'device': 'drive0'}");
     qmp_discard_response();

     /* Test the tray without a medium */
@@ -1606,17 +1604,16 @@ static void test_atapi_tray(void)
     atapi_wait_tray(true);

     /* Re-insert media */
-    qmp_async("{'execute': 'blockdev-add', 'arguments': {"
-              "  'node-name': 'node0', 'driver': 'raw', "
-              "  'file': { 'driver': 'file', 'filename': %s }}}", iso);
+    qmp_args_async("blockdev-add", "{'node-name': 'node0', "
+                   "'driver': 'raw', "
+                   "'file': { 'driver': 'file', 'filename': %s }}", iso);
     qmp_discard_response();
-    qmp_async("{'execute': 'x-blockdev-insert-medium',"
-              "'arguments': { 'device': 'drive0', 'node-name': 'node0' }}");
+    qmp_args_async("x-blockdev-insert-medium",
+                   "{ 'device': 'drive0', 'node-name': 'node0' }");
     qmp_discard_response();

     /* Again, the event shows up first */
-    qmp_async("{'execute': 'blockdev-close-tray', "
-               "'arguments': {'device': 'drive0'}}");
+    qmp_args_async("blockdev-close-tray", "{'device': 'drive0'}");
     atapi_wait_tray(false);
     rsp = qmp_receive();
     QDECREF(rsp);
diff --git a/tests/device-introspect-test.c b/tests/device-introspect-test.c
index f7162c023f..e1fcd3b6c6 100644
--- a/tests/device-introspect-test.c
+++ b/tests/device-introspect-test.c
@@ -105,9 +105,7 @@ static void test_one_device(const char *type)
     QDict *resp;
     char *help, *qom_tree;

-    resp = qmp("{'execute': 'device-list-properties',"
-               " 'arguments': {'typename': %s}}",
-               type);
+    resp = qmp_args("device-list-properties", "{'typename': %s}", type);
     QDECREF(resp);

     help = hmp("device_add \"%s,help\"", type);
diff --git a/tests/drive_del-test.c b/tests/drive_del-test.c
index 834a634da3..442eb35c2b 100644
--- a/tests/drive_del-test.c
+++ b/tests/drive_del-test.c
@@ -34,8 +34,7 @@ static void device_del(void)
     QDict *response;

     /* Complication: ignore DEVICE_DELETED event */
-    qmp_async("{'execute': 'device_del',"
-              " 'arguments': { 'id': 'dev0' } }");
+    qmp_args_async("device_del", "{ 'id': 'dev0' }");
     qmp_discard_response();
     response = qmp_receive();
     g_assert(response);
@@ -69,11 +68,8 @@ static void test_after_failed_device_add(void)
     /* Make device_add fail.  If this leaks the virtio-blk-pci device then a
      * reference to drive0 will also be held (via qdev properties).
      */
-    response = qmp("{'execute': 'device_add',"
-                   " 'arguments': {"
-                   "   'driver': 'virtio-blk-pci',"
-                   "   'drive': 'drive0'"
-                   "}}");
+    response = qmp_args("device_add",
+                        "{'driver': 'virtio-blk-pci', 'drive': 'drive0'}");
     g_assert(response);
     error = qdict_get_qdict(response, "error");
     g_assert_cmpstr(qdict_get_try_str(error, "class"), ==, "GenericError");
diff --git a/tests/fdc-test.c b/tests/fdc-test.c
index ab61a82873..9999e5f5c4 100644
--- a/tests/fdc-test.c
+++ b/tests/fdc-test.c
@@ -298,9 +298,9 @@ static void test_media_insert(void)

     /* Insert media in drive. DSKCHK should not be reset until a step pulse
      * is sent. */
-    qmp_async("{'execute':'blockdev-change-medium', 'arguments':{"
-              " 'id':'floppy0', 'filename': %s, 'format': 'raw' }}",
-              test_image);
+    qmp_args_async("blockdev-change-medium",
+                   "{'id':'floppy0', 'filename': %s, 'format': 'raw' }",
+                   test_image);
     qmp_discard_response();

     dir = inb(FLOPPY_BASE + reg_dir);
@@ -330,7 +330,7 @@ static void test_media_change(void)

     /* Eject the floppy and check that DSKCHG is set. Reading it out doesn't
      * reset the bit. */
-    qmp_async("{'execute':'eject', 'arguments':{ 'id':'floppy0' }}");
+    qmp_args_async("eject", "{ 'id':'floppy0' }");
     qmp_discard_response();

     dir = inb(FLOPPY_BASE + reg_dir);
diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c
index 246a04d6e6..ba2707f89e 100644
--- a/tests/libqos/libqos.c
+++ b/tests/libqos/libqos.c
@@ -87,7 +87,6 @@ void set_context(QOSState *s)
 void migrate(QOSState *from, QOSState *to, const char *uri)
 {
     const char *st;
-    char *s;
     QDict *rsp, *sub;
     bool running;

@@ -102,11 +101,7 @@ void migrate(QOSState *from, QOSState *to, const char *uri)
     QDECREF(rsp);

     /* Issue the migrate command. */
-    s = g_strdup_printf("{ 'execute': 'migrate',"
-                        "'arguments': { 'uri': '%s' } }",
-                        uri);
-    rsp = qmp(s);
-    g_free(s);
+    rsp = qmp_args("migrate", "{'uri': %s}", uri);
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

diff --git a/tests/libqos/pci-pc.c b/tests/libqos/pci-pc.c
index 02ce49927a..b4790650ab 100644
--- a/tests/libqos/pci-pc.c
+++ b/tests/libqos/pci-pc.c
@@ -159,14 +159,8 @@ void qpci_free_pc(QPCIBus *bus)
 void qpci_unplug_acpi_device_test(const char *id, uint8_t slot)
 {
     QDict *response;
-    char *cmd;

-    cmd = g_strdup_printf("{'execute': 'device_del',"
-                          " 'arguments': {"
-                          "   'id': '%s'"
-                          "}}", id);
-    response = qmp(cmd);
-    g_free(cmd);
+    response = qmp_args("device_del", "{'id': %s}", id);
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c
index c4211a4e85..d4ea7ec612 100644
--- a/tests/pc-cpu-test.c
+++ b/tests/pc-cpu-test.c
@@ -37,8 +37,7 @@ static void test_pc_with_cpu_add(gconstpointer data)
     qtest_start(args);

     for (i = s->sockets * s->cores * s->threads; i < s->maxcpus; i++) {
-        response = qmp("{ 'execute': 'cpu-add',"
-                       "  'arguments': { 'id': %d } }", i);
+        response = qmp_args("cpu-add", "{ 'id': %d }", i);
         g_assert(response);
         g_assert(!qdict_haskey(response, "error"));
         QDECREF(response);
@@ -60,9 +59,8 @@ static void test_pc_without_cpu_add(gconstpointer data)
                            s->sockets, s->cores, s->threads, s->maxcpus);
     qtest_start(args);

-    response = qmp("{ 'execute': 'cpu-add',"
-                   "  'arguments': { 'id': %d } }",
-                   s->sockets * s->cores * s->threads);
+    response = qmp_args("cpu-add", "{ 'id': %d }",
+                        s->sockets * s->cores * s->threads);
     g_assert(response);
     g_assert(qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index 6f7f81eccd..4e585006a8 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -358,7 +358,7 @@ static void test_migrate(void)
     char *uri = g_strdup_printf("unix:%s/migsocket", tmpfs);
     QTestState *global = global_qtest, *from, *to;
     unsigned char dest_byte_a, dest_byte_b, dest_byte_c, dest_byte_d;
-    gchar *cmd, *cmd_src, *cmd_dst;
+    gchar *cmd_src, *cmd_dst;
     QDict *rsp;

     char *bootpath = g_strdup_printf("%s/bootsect", tmpfs);
@@ -408,20 +408,16 @@ static void test_migrate(void)
     g_free(cmd_dst);

     global_qtest = from;
-    rsp = qmp("{ 'execute': 'migrate-set-capabilities',"
-                  "'arguments': { "
-                      "'capabilities': [ {"
-                          "'capability': 'postcopy-ram',"
-                          "'state': true } ] } }");
+    rsp = qmp_args("migrate-set-capabilities",
+                   "{'capabilities': ["
+                   "  {'capability': 'postcopy-ram', 'state': true } ] }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

     global_qtest = to;
-    rsp = qmp("{ 'execute': 'migrate-set-capabilities',"
-                  "'arguments': { "
-                      "'capabilities': [ {"
-                          "'capability': 'postcopy-ram',"
-                          "'state': true } ] } }");
+    rsp = qmp_args("migrate-set-capabilities",
+                   "{'capabilities': ["
+                   "  {'capability': 'postcopy-ram', 'state': true } ] }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

@@ -430,14 +426,12 @@ static void test_migrate(void)
      * machine, so also set the downtime.
      */
     global_qtest = from;
-    rsp = qmp("{ 'execute': 'migrate_set_speed',"
-              "'arguments': { 'value': 100000000 } }");
+    rsp = qmp_args("migrate_set_speed", "{ 'value': 100000000 }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

     /* 1ms downtime - it should never finish precopy */
-    rsp = qmp("{ 'execute': 'migrate_set_downtime',"
-              "'arguments': { 'value': 0.001 } }");
+    rsp = qmp_args("migrate_set_downtime", "{ 'value': 0.001 }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

@@ -445,11 +439,7 @@ static void test_migrate(void)
     /* Wait for the first serial output from the source */
     wait_for_serial("src_serial");

-    cmd = g_strdup_printf("{ 'execute': 'migrate',"
-                          "'arguments': { 'uri': '%s' } }",
-                          uri);
-    rsp = qmp(cmd);
-    g_free(cmd);
+    rsp = qmp_args("migrate", "{'uri':%s}", uri);
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

diff --git a/tests/qom-test.c b/tests/qom-test.c
index 369972629a..3c315cf864 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -51,8 +51,7 @@ static void test_properties(const char *path, bool recurse)
     QListEntry *entry;

     g_test_message("Obtaining properties of %s", path);
-    response = qmp("{ 'execute': 'qom-list',"
-                   "  'arguments': { 'path': %s } }", path);
+    response = qmp_args("qom-list", "{ 'path': %s }", path);
     g_assert(response);

     if (!recurse) {
@@ -75,10 +74,8 @@ static void test_properties(const char *path, bool recurse)
         } else {
             const char *prop = qdict_get_str(tuple, "name");
             g_test_message("Testing property %s.%s", path, prop);
-            tmp = qmp("{ 'execute': 'qom-get',"
-                      "  'arguments': { 'path': %s,"
-                      "                 'property': %s } }",
-                      path, prop);
+            tmp = qmp_args("qom-get", "{ 'path': %s, 'property': %s }",
+                           path, prop);
             /* qom-get may fail but should not, e.g., segfault. */
             g_assert(tmp);
             QDECREF(tmp);
diff --git a/tests/test-netfilter.c b/tests/test-netfilter.c
index 8b5a9b21b5..736abc26ec 100644
--- a/tests/test-netfilter.c
+++ b/tests/test-netfilter.c
@@ -16,24 +16,20 @@ static void add_one_netfilter(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f0',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f0',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'object-del',"
-                   " 'arguments': {"
-                   "   'id': 'qtest-f0'"
-                   "}}");
+    response = qmp_args("object-del", "{'id': 'qtest-f0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
@@ -44,34 +40,26 @@ static void remove_netdev_with_one_netfilter(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f0',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f0',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'netdev_del',"
-                   " 'arguments': {"
-                   "   'id': 'qtest-bn0'"
-                   "}}");
+    response = qmp_args("netdev_del", "{'id': 'qtest-bn0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

     /* add back the netdev */
-    response = qmp("{'execute': 'netdev_add',"
-                   " 'arguments': {"
-                   "   'type': 'user',"
-                   "   'id': 'qtest-bn0'"
-                   "}}");
+    response = qmp_args("netdev_add", "{'type': 'user', 'id': 'qtest-bn0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
@@ -82,46 +70,38 @@ static void add_multi_netfilter(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f0',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f0',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f1',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f1',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'object-del',"
-                   " 'arguments': {"
-                   "   'id': 'qtest-f0'"
-                   "}}");
+    response = qmp_args("object-del", "{'id': 'qtest-f0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'object-del',"
-                   " 'arguments': {"
-                   "   'id': 'qtest-f1'"
-                   "}}");
+    response = qmp_args("object-del", "{'id': 'qtest-f1'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
@@ -132,48 +112,39 @@ static void remove_netdev_with_multi_netfilter(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f0',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f0',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'object-add',"
-                   " 'arguments': {"
-                   "   'qom-type': 'filter-buffer',"
-                   "   'id': 'qtest-f1',"
-                   "   'props': {"
-                   "     'netdev': 'qtest-bn0',"
-                   "     'queue': 'rx',"
-                   "     'interval': 1000"
-                   "}}}");
+    response = qmp_args("object-add",
+                        "{ 'qom-type': 'filter-buffer',"
+                        "  'id': 'qtest-f1',"
+                        "  'props': {"
+                        "     'netdev': 'qtest-bn0',"
+                        "     'queue': 'rx',"
+                        "     'interval': 1000"
+                        "}}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'netdev_del',"
-                   " 'arguments': {"
-                   "   'id': 'qtest-bn0'"
-                   "}}");
+    response = qmp_args("netdev_del", "{'id': 'qtest-bn0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

     /* add back the netdev */
-    response = qmp("{'execute': 'netdev_add',"
-                   " 'arguments': {"
-                   "   'type': 'user',"
-                   "   'id': 'qtest-bn0'"
-                   "}}");
+    response = qmp_args("netdev_add", "{'type': 'user', 'id': 'qtest-bn0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
index f29df9b9df..536e1cae2c 100644
--- a/tests/test-x86-cpuid-compat.c
+++ b/tests/test-x86-cpuid-compat.c
@@ -25,10 +25,8 @@ static char *get_cpu0_qom_path(void)

 static QObject *qom_get(const char *path, const char *prop)
 {
-    QDict *resp = qmp("{ 'execute': 'qom-get',"
-                      "  'arguments': { 'path': %s,"
-                      "                 'property': %s } }",
-                      path, prop);
+    QDict *resp = qmp_args("qom-get", "{ 'path': %s, 'property': %s }",
+                           path, prop);
     QObject *ret = qdict_get(resp, "return");
     qobject_incref(ret);
     QDECREF(resp);
diff --git a/tests/tmp105-test.c b/tests/tmp105-test.c
index a7940a4639..28e6f300bc 100644
--- a/tests/tmp105-test.c
+++ b/tests/tmp105-test.c
@@ -69,8 +69,8 @@ static int qmp_tmp105_get_temperature(const char *id)
     QDict *response;
     int ret;

-    response = qmp("{ 'execute': 'qom-get', 'arguments': { 'path': %s, "
-                   "'property': 'temperature' } }", id);
+    response = qmp_args("qom-get", "{ 'path': %s, 'property': 'temperature' }",
+                        id);
     g_assert(qdict_haskey(response, "return"));
     ret = qdict_get_int(response, "return");
     QDECREF(response);
@@ -81,8 +81,9 @@ static void qmp_tmp105_set_temperature(const char *id, int value)
 {
     QDict *response;

-    response = qmp("{ 'execute': 'qom-set', 'arguments': { 'path': %s, "
-                   "'property': 'temperature', 'value': %d } }", id, value);
+    response = qmp_args("qom-set",
+                        "{'path':%s, 'property':'temperature', 'value':%d}",
+                        id, value);
     g_assert(qdict_haskey(response, "return"));
     QDECREF(response);
 }
diff --git a/tests/usb-hcd-uhci-test.c b/tests/usb-hcd-uhci-test.c
index 0fb7f8d223..b45c0d7ac0 100644
--- a/tests/usb-hcd-uhci-test.c
+++ b/tests/usb-hcd-uhci-test.c
@@ -50,20 +50,14 @@ static void test_usb_storage_hotplug(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'device_add',"
-                   " 'arguments': {"
-                   "   'driver': 'usb-storage',"
-                   "   'drive': 'drive0',"
-                   "   'id': 'usbdev0'"
-                   "}}");
+    response = qmp_args("device_add",
+                        "{ 'driver': 'usb-storage', 'drive': 'drive0',"
+                        "   'id': 'usbdev0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'device_del',"
-                           " 'arguments': {"
-                           "   'id': 'usbdev0'"
-                           "}}");
+    response = qmp_args("device_del", "{'id': 'usbdev0'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c
index c05a339894..408e819a61 100644
--- a/tests/usb-hcd-xhci-test.c
+++ b/tests/usb-hcd-xhci-test.c
@@ -25,21 +25,14 @@ static void test_usb_uas_hotplug(void)
 {
     QDict *response;

-    response = qmp("{'execute': 'device_add',"
-                   " 'arguments': {"
-                   "   'driver': 'usb-uas',"
-                   "   'id': 'uas'"
-                   "}}");
+    response = qmp_args("device_add", "{'driver': 'usb-uas', 'id': 'uas'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{'execute': 'device_add',"
-                   " 'arguments': {"
-                   "   'driver': 'scsi-hd',"
-                   "   'drive': 'drive0',"
-                   "   'id': 'scsi-hd'"
-                   "}}");
+    response = qmp_args("device_add",
+                        "{'driver': 'scsi-hd', 'drive': 'drive0',"
+                        "  'id': 'scsi-hd'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
@@ -49,20 +42,14 @@ static void test_usb_uas_hotplug(void)
         added disk is visible after BUS rescan
     */

-    response = qmp("{'execute': 'device_del',"
-                           " 'arguments': {"
-                           "   'id': 'scsi-hd'"
-                           "}}");
+    response = qmp_args("device_del", "{'id': 'scsi-hd'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

     qmp_eventwait("DEVICE_DELETED");

-    response = qmp("{'execute': 'device_del',"
-                           " 'arguments': {"
-                           "   'id': 'uas'"
-                           "}}");
+    response = qmp_args("device_del", "{'id': 'uas'}");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/vhost-user-test.c b/tests/vhost-user-test.c
index d4da09f147..7c00f4b527 100644
--- a/tests/vhost-user-test.c
+++ b/tests/vhost-user-test.c
@@ -657,16 +657,11 @@ static void test_migrate(void)

     /* slow down migration to have time to fiddle with log */
     /* TODO: qtest could learn to break on some places */
-    rsp = qmp("{ 'execute': 'migrate_set_speed',"
-              "'arguments': { 'value': 10 } }");
+    rsp = qmp_args("migrate_set_speed", "{ 'value': 10 }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

-    cmd = g_strdup_printf("{ 'execute': 'migrate',"
-                          "'arguments': { 'uri': '%s' } }",
-                          uri);
-    rsp = qmp(cmd);
-    g_free(cmd);
+    rsp = qmp_args("migrate", "{'uri':%s}", uri);
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

@@ -681,8 +676,7 @@ static void test_migrate(void)
     munmap(log, size);

     /* speed things up */
-    rsp = qmp("{ 'execute': 'migrate_set_speed',"
-              "'arguments': { 'value': 0 } }");
+    rsp = qmp_args("migrate_set_speed", "{ 'value': 0 }");
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
index fe966c0606..649ba03c92 100644
--- a/tests/virtio-blk-test.c
+++ b/tests/virtio-blk-test.c
@@ -409,9 +409,7 @@ static void pci_config(void)

     qvirtio_set_driver_ok(&dev->vdev);

-    qmp_async("{ 'execute': 'block_resize', "
-              " 'arguments': { 'device': 'drive0', "
-              " 'size': %d } }", n_size);
+    qmp_args_async("block_resize", "{'device': 'drive0', 'size': %d}", n_size);
     qmp_discard_response();
     qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);

@@ -460,9 +458,7 @@ static void pci_msix(void)

     qvirtio_set_driver_ok(&dev->vdev);

-    qmp_async("{ 'execute': 'block_resize', "
-              " 'arguments': { 'device': 'drive0', "
-              " 'size': %d } }", n_size);
+    qmp_args_async("block_resize", "{'device': 'drive0', 'size': %d}", n_size);
     qmp_discard_response();

     qvirtio_wait_config_isr(&dev->vdev, QVIRTIO_BLK_TIMEOUT_US);
@@ -702,9 +698,7 @@ static void mmio_basic(void)

     test_basic(&dev->vdev, alloc, vq);

-    qmp_async("{ 'execute': 'block_resize', "
-              " 'arguments': { 'device': 'drive0', "
-              " 'size': %d } }", n_size);
+    qmp_args_async("block_resize", "{'device': 'drive0', 'size': %d}", n_size);
     qmp_discard_response();

     qvirtio_wait_queue_isr(&dev->vdev, vq, QVIRTIO_BLK_TIMEOUT_US);
diff --git a/tests/virtio-scsi-test.c b/tests/virtio-scsi-test.c
index 87a3b6e81a..126a6225f0 100644
--- a/tests/virtio-scsi-test.c
+++ b/tests/virtio-scsi-test.c
@@ -197,21 +197,14 @@ static void hotplug(void)

     qs = qvirtio_scsi_start(
             "-drive id=drv1,if=none,file=null-co://,format=raw");
-    response = qmp("{\"execute\": \"device_add\","
-                   " \"arguments\": {"
-                   "   \"driver\": \"scsi-hd\","
-                   "   \"id\": \"scsi-hd\","
-                   "   \"drive\": \"drv1\""
-                   "}}");
+    response = qmp_args("device_add",
+                        "{'driver':'scsi-hd', 'id':'scsi-hd', 'drive':'drv1'}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{\"execute\": \"device_del\","
-                   " \"arguments\": {"
-                   "   \"id\": \"scsi-hd\""
-                   "}}");
+    response = qmp_args("device_del", "{'id':'scsi-hd'}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
diff --git a/tests/virtio-serial-test.c b/tests/virtio-serial-test.c
index b14d943ada..f47c343a2f 100644
--- a/tests/virtio-serial-test.c
+++ b/tests/virtio-serial-test.c
@@ -19,20 +19,14 @@ static void hotplug(void)
 {
     QDict *response;

-    response = qmp("{\"execute\": \"device_add\","
-                   " \"arguments\": {"
-                   "   \"driver\": \"virtserialport\","
-                   "   \"id\": \"hp-port\""
-                   "}}");
+    response = qmp_args("device_add",
+                        "{'driver':'virtserialport', 'id':'hp-port'}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);

-    response = qmp("{\"execute\": \"device_del\","
-                   " \"arguments\": {"
-                   "   \"id\": \"hp-port\""
-                   "}}");
+    response = qmp_args("device_del", "{'id':'hp-port'}");

     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 18/22] tests/libqos/usb: Clean up string interpolation into QMP input
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (16 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper Eric Blake
                   ` (5 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

From: Markus Armbruster <armbru@redhat.com>

Leaving interpolation into JSON to qmp() is more robust than building
QMP input manually, as explained in a previous commit.

The case in usb_test_hotplug() is slightly more complicated: it
interpolates *into* JSON values.  Clean it up by building the values
separately, so we can again leave interpolation to qmp().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1500645206-13559-6-git-send-email-armbru@redhat.com>
[use qmp_args(), fix commit message typo]
Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqos/usb.c | 26 ++++++++++----------------
 1 file changed, 10 insertions(+), 16 deletions(-)

diff --git a/tests/libqos/usb.c b/tests/libqos/usb.c
index 0cdfaecda7..498e6e60e7 100644
--- a/tests/libqos/usb.c
+++ b/tests/libqos/usb.c
@@ -40,18 +40,17 @@ void uhci_port_test(struct qhc *hc, int port, uint16_t expect)
 void usb_test_hotplug(const char *hcd_id, const int port,
                       void (*port_check)(void))
 {
+    char id[32];
+    char *bus;
     QDict *response;
-    char  *cmd;

-    cmd = g_strdup_printf("{'execute': 'device_add',"
-                          " 'arguments': {"
-                          "   'driver': 'usb-tablet',"
-                          "   'port': '%d',"
-                          "   'bus': '%s.0',"
-                          "   'id': 'usbdev%d'"
-                          "}}", port, hcd_id, port);
-    response = qmp(cmd);
-    g_free(cmd);
+    sprintf(id, "usbdev%d", port);
+    bus = g_strdup_printf("%s.0", hcd_id);
+    response = qmp_args("device_add",
+                        "{'driver': 'usb-tablet',"
+                        " 'port': %s, 'bus': %s, 'id': %s}",
+                        id + 6, bus, id);
+    g_free(bus);
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
@@ -60,12 +59,7 @@ void usb_test_hotplug(const char *hcd_id, const int port,
         port_check();
     }

-    cmd = g_strdup_printf("{'execute': 'device_del',"
-                           " 'arguments': {"
-                           "   'id': 'usbdev%d'"
-                           "}}", port);
-    response = qmp(cmd);
-    g_free(cmd);
+    response = qmp_args("device_del", "{ 'id': %s }", id);
     g_assert(response);
     g_assert(qdict_haskey(response, "event"));
     g_assert(!strcmp(qdict_get_str(response, "event"), "DEVICE_DELETED"));
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (17 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 18/22] tests/libqos/usb: Clean up string interpolation into QMP input Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 15:59   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 20/22] tests/libqos/pci: Clean up string interpolation into QMP input Eric Blake
                   ` (4 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

Leaving interpolation into JSON to qobject_from_jsonf() is more
robust than building QMP input manually; however, we have a few
places where code is already creating a QDict to interpolate
individual arguments, which cannot be reproduced with the
qobject_from_jsonf() parser.  Expose a public wrapper
qmp_args_dict() for the internal helper qmp_args_dict_async()
that we needed earlier for qmp_args(), and fix a test to use
the new helper.

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h               | 9 +++++++++
 tests/libqtest.c               | 6 ++++++
 tests/device-introspect-test.c | 3 +--
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 86ca7fa581..193adf1eb9 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -499,6 +499,15 @@ QDict *qmp_cmd(const char *cmd);
 void qmp_cmd_async(const char *cmd);

 /**
+ * qmp_args_dict:
+ * @cmd: QMP command to send to QEMU.
+ * @args: Arguments for the command; will have reference count reduced.
+ *
+ * Sends a QMP message to QEMU and returns the response.
+ */
+QDict *qmp_args_dict(const char *cmd, QDict *args);
+
+/**
  * qmp_args:
  * @cmd: QMP command to send to QEMU.
  * @fmt...: Arguments for the command; formats arguments through
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 49786cf2d7..5012ecf929 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -875,6 +875,12 @@ static void qmp_args_dict_async(const char *cmd, QDict *args)
     qtest_qmp_send(global_qtest, "{'execute':%s, 'arguments':%p}", cmd, args);
 }

+QDict *qmp_args_dict(const char *cmd, QDict *args)
+{
+    qmp_args_dict_async(cmd, args);
+    return qtest_qmp_receive(global_qtest);
+}
+
 QDict *qmp_args(const char *cmd, const char *fmt, ...)
 {
     va_list ap;
diff --git a/tests/device-introspect-test.c b/tests/device-introspect-test.c
index e1fcd3b6c6..d2de4a5fc0 100644
--- a/tests/device-introspect-test.c
+++ b/tests/device-introspect-test.c
@@ -36,8 +36,7 @@ static QList *qom_list_types(const char *implements, bool abstract)
     if (implements) {
         qdict_put_str(args, "implements", implements);
     }
-    resp = qmp("{'execute': 'qom-list-types',"
-               " 'arguments': %p }", args);
+    resp = qmp_args_dict("qom-list-types", args);
     g_assert(qdict_haskey(resp, "return"));
     ret = qdict_get_qlist(resp, "return");
     QINCREF(ret);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 20/22] tests/libqos/pci: Clean up string interpolation into QMP input
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (18 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp() Eric Blake
                   ` (3 subsequent siblings)
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, Stefan Hajnoczi, open list:virtio-blk

From: Markus Armbruster <armbru@redhat.com>

Leaving interpolation into JSON to qmp() is more robust than building
QMP input manually, as explained in previous commits.

The case in qpci_plug_device_test() is a bit complicated: it
interpolates several JSON object members, not just a value.  Clean it
up by passing them in as QDict rather than string, so we can leave
interpolation to qmp() here and to qobject_from_jsonf() in callers.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1500645206-13559-7-git-send-email-armbru@redhat.com>
[use qmp_args_dict for a slightly smaller diff, fix '%s' typo in ivshmem-test]
Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqos/pci.h      |  2 +-
 tests/ivshmem-test.c    | 10 +++++-----
 tests/libqos/pci.c      | 32 +++++++++++++++++---------------
 tests/virtio-blk-test.c |  5 ++++-
 4 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/tests/libqos/pci.h b/tests/libqos/pci.h
index ed480614ff..c981061703 100644
--- a/tests/libqos/pci.h
+++ b/tests/libqos/pci.h
@@ -109,6 +109,6 @@ void qpci_iounmap(QPCIDevice *dev, QPCIBar addr);
 QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr);

 void qpci_plug_device_test(const char *driver, const char *id,
-                           uint8_t slot, const char *opts);
+                           uint8_t slot, QDict *extra_args);
 void qpci_unplug_acpi_device_test(const char *id, uint8_t slot);
 #endif
diff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c
index 37763425ee..4cb5a030da 100644
--- a/tests/ivshmem-test.c
+++ b/tests/ivshmem-test.c
@@ -14,6 +14,7 @@
 #include "libqos/libqos-pc.h"
 #include "libqos/libqos-spapr.h"
 #include "libqtest.h"
+#include "qapi/qmp/qjson.h"
 #include "qemu-common.h"

 #define TMPSHMSIZE (1 << 20)
@@ -419,19 +420,18 @@ static void test_ivshmem_server_irq(void)
 static void test_ivshmem_hotplug(void)
 {
     const char *arch = qtest_get_arch();
-    gchar *opts;
+    QObject *extra_args = qobject_from_jsonf("{ 'shm': %s, 'size': '1M' }",
+                                             tmpshm);

     qtest_start("");

-    opts = g_strdup_printf("'shm': '%s', 'size': '1M'", tmpshm);
-
-    qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP, opts);
+    qpci_plug_device_test("ivshmem", "iv1", PCI_SLOT_HP,
+                          qobject_to_qdict(extra_args));
     if (strcmp(arch, "ppc64") != 0) {
         qpci_unplug_acpi_device_test("iv1", PCI_SLOT_HP);
     }

     qtest_end();
-    g_free(opts);
 }

 static void test_ivshmem_memdev(void)
diff --git a/tests/libqos/pci.c b/tests/libqos/pci.c
index 2dcdeade2a..68623795b7 100644
--- a/tests/libqos/pci.c
+++ b/tests/libqos/pci.c
@@ -14,6 +14,7 @@
 #include "libqos/pci.h"

 #include "hw/pci/pci_regs.h"
+#include "qapi/qmp/qjson.h"
 #include "qemu/host-utils.h"

 void qpci_device_foreach(QPCIBus *bus, int vendor_id, int device_id,
@@ -392,22 +393,23 @@ QPCIBar qpci_legacy_iomap(QPCIDevice *dev, uint16_t addr)
 }

 void qpci_plug_device_test(const char *driver, const char *id,
-                           uint8_t slot, const char *opts)
+                           uint8_t slot, QDict *extra_args)
 {
-    QDict *response;
-    char *cmd;
-
-    cmd = g_strdup_printf("{'execute': 'device_add',"
-                          " 'arguments': {"
-                          "   'driver': '%s',"
-                          "   'addr': '%d',"
-                          "   %s%s"
-                          "   'id': '%s'"
-                          "}}", driver, slot,
-                          opts ? opts : "", opts ? "," : "",
-                          id);
-    response = qmp(cmd);
-    g_free(cmd);
+    char addr[8];
+    QDict *args, *response;
+
+    sprintf(addr, "%d", slot);
+    args = qobject_to_qdict(
+        qobject_from_jsonf("{ 'driver': %s, 'addr': %s, 'id': %s}",
+                           driver, addr, id));
+
+    if (extra_args) {
+        qdict_join(args, extra_args, true);
+        QDECREF(extra_args);
+    }
+
+    response = qmp_args_dict("device_add", args);
+
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c
index 649ba03c92..78a9ebfb0d 100644
--- a/tests/virtio-blk-test.c
+++ b/tests/virtio-blk-test.c
@@ -16,6 +16,7 @@
 #include "libqos/virtio-pci.h"
 #include "libqos/virtio-mmio.h"
 #include "libqos/malloc-generic.h"
+#include "qapi/qmp/qjson.h"
 #include "qemu/bswap.h"
 #include "standard-headers/linux/virtio_ids.h"
 #include "standard-headers/linux/virtio_config.h"
@@ -656,12 +657,13 @@ static void pci_hotplug(void)
     QVirtioPCIDevice *dev;
     QOSState *qs;
     const char *arch = qtest_get_arch();
+    QObject *extra_args = qobject_from_jsonf("{ 'drive': 'drive1' }");

     qs = pci_test_start();

     /* plug secondary disk */
     qpci_plug_device_test("virtio-blk-pci", "drv1", PCI_SLOT_HP,
-                          "'drive': 'drive1'");
+                          qobject_to_qdict(extra_args));

     dev = virtio_blk_pci_init(qs->pcibus, PCI_SLOT_HP);
     g_assert(dev);
@@ -672,6 +674,7 @@ static void pci_hotplug(void)
     if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
         qpci_unplug_acpi_device_test("drv1", PCI_SLOT_HP);
     }
+
     qtest_shutdown(qs);
 }

-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (19 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 20/22] tests/libqos/pci: Clean up string interpolation into QMP input Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-09 16:01   ` Markus Armbruster
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 22/22] libqtest: Rename qmp_cmd() to qmp() Eric Blake
                   ` (2 subsequent siblings)
  23 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru

All callers have been converted to a form of qmp_cmd() or
qmp_args() that takes the command name with less boilerplate.
Therefore, we also know that all commands are using
interpolation, and can remove an assertion.

This also means that we have fixed the testsuite to comply with
-Wformat checking on the strings being interpolated for qmp()
(similar to what we previously did for strings used in hmp(), and
matching the checking present on qobject_from_jsonf()).

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h | 20 +-------------------
 tests/libqtest.c | 32 ++++----------------------------
 2 files changed, 5 insertions(+), 47 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 193adf1eb9..04b36a7b11 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -457,15 +457,6 @@ static inline void qtest_end(void)
 }

 /**
- * qmp:
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- *
- * Sends a QMP message to QEMU and returns the response.
- */
-QDict *qmp(const char *fmt, ...);
-
-/**
  * qmp_raw:
  * @msg: Raw QMP message to send to qemu.
  *
@@ -474,15 +465,6 @@ QDict *qmp(const char *fmt, ...);
 QDict *qmp_raw(const char *msg);

 /**
- * qmp_async:
- * @fmt...: QMP message to send to qemu; formats arguments through
- * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
- *
- * Sends a QMP message to QEMU and leaves the response in the stream.
- */
-void qmp_async(const char *fmt, ...);
-
-/**
  * qmp_cmd:
  * @cmd: QMP command, with no arguments.
  *
@@ -530,7 +512,7 @@ void qmp_args_async(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
 /**
  * qmp_discard_response:
  *
- * Read and discard a QMP response, typically after qmp_async().
+ * Read and discard a QMP response, typically after qmp_cmd_async().
  */
 void qmp_discard_response(void);

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 5012ecf929..4597d4ac66 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -453,17 +453,12 @@ static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)
     QString *qstr;
     const char *str;

-    assert(strstr(fmt, "execute"));
-
     /*
-     * A round trip through QObject is only needed if % interpolation
-     * is used.  We interpolate through QObject rather than sprintf in
-     * order to escape strings properly.
+     * A round trip through QObject (and not sprintf) is needed
+     * because % interpolation is used, and we must escape strings
+     * properly.
      */
-    if (!strchr(fmt, '%')) {
-        qmp_fd_send(s->qmp_fd, fmt);
-        return;
-    }
+    assert(strchr(fmt, '%'));

     qobj = qobject_from_jsonv(fmt, ap);
     qstr = qobject_to_json(qobj);
@@ -833,31 +828,12 @@ void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
     qtest_rsp(s, 0);
 }

-QDict *qmp(const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    qtest_qmp_sendv(global_qtest, fmt, ap);
-    va_end(ap);
-    return qtest_qmp_receive(global_qtest);
-}
-
 QDict *qmp_raw(const char *msg)
 {
     qmp_fd_send(global_qtest->qmp_fd, msg);
     return qtest_qmp_receive(global_qtest);
 }

-void qmp_async(const char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    qtest_qmp_sendv(global_qtest, fmt, ap);
-    va_end(ap);
-}
-
 QDict *qmp_cmd(const char *cmd)
 {
     qmp_cmd_async(cmd);
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* [Qemu-devel] [PATCH v4 22/22] libqtest: Rename qmp_cmd() to qmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (20 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp() Eric Blake
@ 2017-08-04  1:25 ` Eric Blake
  2017-08-04  1:54 ` [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() no-reply
  2017-08-04  2:02 ` no-reply
  23 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-04  1:25 UTC (permalink / raw)
  To: qemu-devel
  Cc: armbru, John Snow, Andreas Färber, Jason Wang, Ben Warren,
	open list:IDE

Now that the previous patch got rid of the old signature of qmp(),
we can go back to using the shortest possible name for the common
action.

Performed mechanically with:
 for f in $(git grep -l qmp_cmd tests/); do
   case $f in *qemu-iotests*) continue;; esac
   sed -i s/qmp_cmd/qmp/ $f; done

Signed-off-by: Eric Blake <eblake@redhat.com>
---
 tests/libqtest.h               | 10 +++++-----
 tests/libqtest.c               |  8 ++++----
 tests/ahci-test.c              |  2 +-
 tests/boot-order-test.c        |  2 +-
 tests/ide-test.c               |  2 +-
 tests/libqos/ahci.c            |  4 ++--
 tests/libqos/libqos.c          |  4 ++--
 tests/numa-test.c              |  2 +-
 tests/postcopy-test.c          |  8 ++++----
 tests/q35-test.c               |  2 +-
 tests/qmp-test.c               |  8 ++++----
 tests/qom-test.c               |  2 +-
 tests/test-filter-mirror.c     |  2 +-
 tests/test-filter-redirector.c |  4 ++--
 tests/test-x86-cpuid-compat.c  |  2 +-
 tests/virtio-net-test.c        |  6 +++---
 tests/vmgenid-test.c           |  2 +-
 tests/wdt_ib700-test.c         |  2 +-
 18 files changed, 36 insertions(+), 36 deletions(-)

diff --git a/tests/libqtest.h b/tests/libqtest.h
index 04b36a7b11..874f0f9c35 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -465,20 +465,20 @@ static inline void qtest_end(void)
 QDict *qmp_raw(const char *msg);

 /**
- * qmp_cmd:
+ * qmp:
  * @cmd: QMP command, with no arguments.
  *
  * Sends a QMP message to QEMU and returns the response.
  */
-QDict *qmp_cmd(const char *cmd);
+QDict *qmp(const char *cmd);

 /**
- * qmp_cmd_async:
+ * qmp_async:
  * @cmd: QMP command, with no arguments.
  *
  * Sends a QMP message to QEMU and leaves the response in the stream.
  */
-void qmp_cmd_async(const char *cmd);
+void qmp_async(const char *cmd);

 /**
  * qmp_args_dict:
@@ -512,7 +512,7 @@ void qmp_args_async(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
 /**
  * qmp_discard_response:
  *
- * Read and discard a QMP response, typically after qmp_cmd_async().
+ * Read and discard a QMP response, typically after qmp_async().
  */
 void qmp_discard_response(void);

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 4597d4ac66..50e6c312a4 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -834,13 +834,13 @@ QDict *qmp_raw(const char *msg)
     return qtest_qmp_receive(global_qtest);
 }

-QDict *qmp_cmd(const char *cmd)
+QDict *qmp(const char *cmd)
 {
-    qmp_cmd_async(cmd);
+    qmp_async(cmd);
     return qtest_qmp_receive(global_qtest);
 }

-void qmp_cmd_async(const char *cmd)
+void qmp_async(const char *cmd)
 {
     qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
 }
@@ -912,7 +912,7 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine))
     const char *mname;

     qtest_start("-machine none");
-    response = qmp_cmd("query-machines");
+    response = qmp("query-machines");
     g_assert(response);
     list = qdict_get_qlist(response, "return");
     g_assert(list);
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index ee8a539cf6..96a7249157 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -1385,7 +1385,7 @@ static void test_flush_migrate(void)
     ahci_migrate(src, dst, uri);

     /* Complete the command */
-    qmp_cmd_async("cont");
+    qmp_async("cont");
     qmp_eventwait("RESUME");
     ahci_command_wait(dst, cmd);
     ahci_command_verify(dst, cmd);
diff --git a/tests/boot-order-test.c b/tests/boot-order-test.c
index 0be3333e6b..cd883c05c7 100644
--- a/tests/boot-order-test.c
+++ b/tests/boot-order-test.c
@@ -38,7 +38,7 @@ static void test_a_boot_order(const char *machine,
     qtest_start(args);
     actual = read_boot_order();
     g_assert_cmphex(actual, ==, expected_boot);
-    qmp_cmd_async("system_reset");
+    qmp_async("system_reset");
     /*
      * system_reset only requests reset.  We get a RESET event after
      * the actual reset completes.  Need to wait for that.
diff --git a/tests/ide-test.c b/tests/ide-test.c
index 56a02b1c7f..5819c2ed24 100644
--- a/tests/ide-test.c
+++ b/tests/ide-test.c
@@ -651,7 +651,7 @@ static void test_retry_flush(const char *machine)
     qmp_eventwait("STOP");

     /* Complete the command */
-    qmp_cmd_async("cont");
+    qmp_async("cont");
     qmp_discard_response();

     /* Check registers */
diff --git a/tests/libqos/ahci.c b/tests/libqos/ahci.c
index 06b9ce3a13..8bdf8ef246 100644
--- a/tests/libqos/ahci.c
+++ b/tests/libqos/ahci.c
@@ -668,7 +668,7 @@ void ahci_exec(AHCIQState *ahci, uint8_t port,
         g_assert_cmpint(rc, ==, 0);
     }
     if (opts->error) {
-        qmp_cmd_async("cont");
+        qmp_async("cont");
         qmp_eventwait("RESUME");
     }

@@ -706,7 +706,7 @@ AHCICommand *ahci_guest_io_halt(AHCIQState *ahci, uint8_t port,
 void ahci_guest_io_resume(AHCIQState *ahci, AHCICommand *cmd)
 {
     /* Complete the command */
-    qmp_cmd_async("cont");
+    qmp_async("cont");
     qmp_eventwait("RESUME");
     ahci_command_wait(ahci, cmd);
     ahci_command_verify(ahci, cmd);
diff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c
index ba2707f89e..c215b81833 100644
--- a/tests/libqos/libqos.c
+++ b/tests/libqos/libqos.c
@@ -93,7 +93,7 @@ void migrate(QOSState *from, QOSState *to, const char *uri)
     set_context(from);

     /* Is the machine currently running? */
-    rsp = qmp_cmd("query-status");
+    rsp = qmp("query-status");
     g_assert(qdict_haskey(rsp, "return"));
     sub = qdict_get_qdict(rsp, "return");
     g_assert(qdict_haskey(sub, "running"));
@@ -120,7 +120,7 @@ void migrate(QOSState *from, QOSState *to, const char *uri)

     /* Otherwise, we need to wait: poll until migration is completed. */
     while (1) {
-        rsp = qmp_cmd("query-migrate");
+        rsp = qmp("query-migrate");
         g_assert(qdict_haskey(rsp, "return"));
         sub = qdict_get_qdict(rsp, "return");
         g_assert(qdict_haskey(sub, "status"));
diff --git a/tests/numa-test.c b/tests/numa-test.c
index d98500012f..237a9387d2 100644
--- a/tests/numa-test.c
+++ b/tests/numa-test.c
@@ -74,7 +74,7 @@ static void test_mon_partial(const void *data)

 static QList *get_cpus(QDict **resp)
 {
-    *resp = qmp_cmd("query-cpus");
+    *resp = qmp("query-cpus");
     g_assert(*resp);
     g_assert(qdict_haskey(*resp, "return"));
     return qdict_get_qlist(*resp, "return");
diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
index 4e585006a8..98478f7f14 100644
--- a/tests/postcopy-test.c
+++ b/tests/postcopy-test.c
@@ -252,7 +252,7 @@ static uint64_t get_migration_pass(void)
     QDict *rsp, *rsp_return, *rsp_ram;
     uint64_t result;

-    rsp = return_or_event(qmp_cmd("query-migrate"));
+    rsp = return_or_event(qmp("query-migrate"));
     rsp_return = qdict_get_qdict(rsp, "return");
     if (!qdict_haskey(rsp_return, "ram")) {
         /* Still in setup */
@@ -273,7 +273,7 @@ static void wait_for_migration_complete(void)
     do {
         const char *status;

-        rsp = return_or_event(qmp_cmd("query-migrate"));
+        rsp = return_or_event(qmp("query-migrate"));
         rsp_return = qdict_get_qdict(rsp, "return");
         status = qdict_get_str(rsp_return, "status");
         completed = strcmp(status, "completed") == 0;
@@ -445,7 +445,7 @@ static void test_migrate(void)

     wait_for_migration_pass();

-    rsp = return_or_event(qmp_cmd("migrate-start-postcopy"));
+    rsp = return_or_event(qmp("migrate-start-postcopy"));
     g_assert(qdict_haskey(rsp, "return"));
     QDECREF(rsp);

@@ -472,7 +472,7 @@ static void test_migrate(void)
         usleep(10 * 1000);
     } while (dest_byte_a == dest_byte_b);

-    qmp_cmd_async("stop");
+    qmp_async("stop");
     qmp_discard_response();
     /* With it stopped, check nothing changes */
     qtest_memread(to, start_address, &dest_byte_c, 1);
diff --git a/tests/q35-test.c b/tests/q35-test.c
index 122872b90d..20de9b0937 100644
--- a/tests/q35-test.c
+++ b/tests/q35-test.c
@@ -105,7 +105,7 @@ static void test_smram_lock(void)
     g_assert(smram_test_bit(pcidev, MCH_HOST_BRIDGE_SMRAM_D_OPEN) == false);

     /* reset */
-    response = qmp_cmd("system_reset");
+    response = qmp("system_reset");
     g_assert(response);
     g_assert(!qdict_haskey(response, "error"));
     QDECREF(response);
diff --git a/tests/qmp-test.c b/tests/qmp-test.c
index 082c5f7e8d..150df1bf2e 100644
--- a/tests/qmp-test.c
+++ b/tests/qmp-test.c
@@ -92,7 +92,7 @@ static void test_qmp_protocol(void)
     QDECREF(resp);

     /* Test valid command before handshake */
-    resp = qmp_cmd("query-version");
+    resp = qmp("query-version");
     g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
     QDECREF(resp);

@@ -100,18 +100,18 @@ static void test_qmp_protocol(void)
     test_malformed();

     /* Test handshake */
-    resp = qmp_cmd("qmp_capabilities");
+    resp = qmp("qmp_capabilities");
     ret = qdict_get_qdict(resp, "return");
     g_assert(ret && !qdict_size(ret));
     QDECREF(resp);

     /* Test repeated handshake */
-    resp = qmp_cmd("qmp_capabilities");
+    resp = qmp("qmp_capabilities");
     g_assert_cmpstr(get_error_class(resp), ==, "CommandNotFound");
     QDECREF(resp);

     /* Test valid command */
-    resp = qmp_cmd("query-version");
+    resp = qmp("query-version");
     test_version(qdict_get(resp, "return"));
     QDECREF(resp);

diff --git a/tests/qom-test.c b/tests/qom-test.c
index 3c315cf864..2970f62bf5 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -95,7 +95,7 @@ static void test_machine(gconstpointer data)

     test_properties("/machine", true);

-    response = qmp_cmd("quit");
+    response = qmp("quit");
     g_assert(qdict_haskey(response, "return"));
     QDECREF(response);

diff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c
index 0fb87c124d..8980c288d4 100644
--- a/tests/test-filter-mirror.c
+++ b/tests/test-filter-mirror.c
@@ -57,7 +57,7 @@ static void test_mirror(void)
     };

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_cmd_async("query-status");
+    qmp_async("query-status");
     qmp_discard_response();
     ret = iov_send(send_sock[0], iov, 2, 0, sizeof(size) + sizeof(send_buf));
     g_assert_cmpint(ret, ==, sizeof(send_buf) + sizeof(size));
diff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c
index 00f58f63b5..14ea136b4d 100644
--- a/tests/test-filter-redirector.c
+++ b/tests/test-filter-redirector.c
@@ -99,7 +99,7 @@ static void test_redirector_tx(void)
     g_assert_cmpint(recv_sock, !=, -1);

     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_cmd_async("query-status");
+    qmp_async("query-status");
     qmp_discard_response();

     struct iovec iov[] = {
@@ -185,7 +185,7 @@ static void test_redirector_rx(void)
     send_sock = unix_connect(sock_path1, NULL);
     g_assert_cmpint(send_sock, !=, -1);
     /* send a qmp command to guarantee that 'connected' is setting to true. */
-    qmp_cmd_async("query-status");
+    qmp_async("query-status");
     qmp_discard_response();

     ret = iov_send(send_sock, iov, 2, 0, sizeof(size) + sizeof(send_buf));
diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
index 536e1cae2c..9a0b42475f 100644
--- a/tests/test-x86-cpuid-compat.c
+++ b/tests/test-x86-cpuid-compat.c
@@ -13,7 +13,7 @@ static char *get_cpu0_qom_path(void)
     QDict *cpu0;
     char *path;

-    resp = qmp_cmd("query-cpus");
+    resp = qmp("query-cpus");
     g_assert(qdict_haskey(resp, "return"));
     ret = qdict_get_qlist(resp, "return");

diff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c
index 5d934d19c2..e204a9c561 100644
--- a/tests/virtio-net-test.c
+++ b/tests/virtio-net-test.c
@@ -167,7 +167,7 @@ static void rx_stop_cont_test(QVirtioDevice *dev,
     free_head = qvirtqueue_add(vq, req_addr, 64, true, false);
     qvirtqueue_kick(dev, vq, free_head);

-    qmp_cmd_async("stop");
+    qmp_async("stop");
     qmp_discard_response();

     ret = iov_send(socket, iov, 2, 0, sizeof(len) + sizeof(test));
@@ -176,9 +176,9 @@ static void rx_stop_cont_test(QVirtioDevice *dev,
     /* We could check the status, but this command is more importantly to
      * ensure the packet data gets queued in QEMU, before we do 'cont'.
      */
-    qmp_cmd_async("query-status");
+    qmp_async("query-status");
     qmp_discard_response();
-    qmp_cmd_async("cont");
+    qmp_async("cont");
     qmp_discard_response();

     qvirtio_wait_used_elem(dev, vq, free_head, QVIRTIO_NET_TIMEOUT_US);
diff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c
index 0842833eba..44385adb38 100644
--- a/tests/vmgenid-test.c
+++ b/tests/vmgenid-test.c
@@ -118,7 +118,7 @@ static void read_guid_from_monitor(QemuUUID *guid)
     QDict *rsp, *rsp_ret;
     const char *guid_str;

-    rsp = qmp_cmd("query-vm-generation-id");
+    rsp = qmp("query-vm-generation-id");
     if (qdict_haskey(rsp, "return")) {
         rsp_ret = qdict_get_qdict(rsp, "return");
         g_assert(qdict_haskey(rsp_ret, "guid"));
diff --git a/tests/wdt_ib700-test.c b/tests/wdt_ib700-test.c
index a5fd795cc9..c22e4f8fc3 100644
--- a/tests/wdt_ib700-test.c
+++ b/tests/wdt_ib700-test.c
@@ -13,7 +13,7 @@

 static void qmp_check_no_event(void)
 {
-    QDict *resp = qmp_cmd("query-status");
+    QDict *resp = qmp("query-status");
     g_assert(qdict_haskey(resp, "return"));
     QDECREF(resp);
 }
-- 
2.13.3

^ permalink raw reply related	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (21 preceding siblings ...)
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 22/22] libqtest: Rename qmp_cmd() to qmp() Eric Blake
@ 2017-08-04  1:54 ` no-reply
  2017-08-04 11:50   ` Eric Blake
  2017-08-07  8:09   ` Fam Zheng
  2017-08-04  2:02 ` no-reply
  23 siblings, 2 replies; 66+ messages in thread
From: no-reply @ 2017-08-04  1:54 UTC (permalink / raw)
  To: eblake; +Cc: famz, qemu-devel, armbru

Hi,

This series failed automatic build test. Please find the testing commands and
their output below. If you have docker installed, you can probably reproduce it
locally.

Subject: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
Message-id: 20170804012551.2714-1-eblake@redhat.com
Type: series

=== TEST SCRIPT BEGIN ===
#!/bin/bash
set -e
git submodule update --init dtc
# Let docker tests dump environment info
export SHOW_ENV=1
export J=8
time make docker-test-quick@centos6
time make docker-test-build@min-glib
time make docker-test-mingw@fedora
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 t [tag update]            patchew/1501692241-23310-1-git-send-email-peter.maydell@linaro.org -> patchew/1501692241-23310-1-git-send-email-peter.maydell@linaro.org
 * [new tag]               patchew/20170804012551.2714-1-eblake@redhat.com -> patchew/20170804012551.2714-1-eblake@redhat.com
Switched to a new branch 'test'
25d1d3e326 libqtest: Rename qmp_cmd() to qmp()
09d1c5f657 libqtest: Drop now-unused qmp()
0524247e82 tests/libqos/pci: Clean up string interpolation into QMP input
04c8567b62 libqtest: Add qmp_args_dict() helper
a919f621a5 tests/libqos/usb: Clean up string interpolation into QMP input
ef30c8a4db libqtest: Add qmp_args() helper
f3ab2876ae libqtest: Add qmp_cmd() helper
8de753188c libqtest: Delete qtest_qmp() wrappers
70107888b6 libqtest: Separate qmp_discard_response() from command
f1b80c24d0 libqtest: Add qmp_raw()
5b2e91aad2 libqtest: Change qmp_fd_send() to drop varargs
d2734fc6f7 test-qga: Simplify command construction
9afca5aa84 libqtest: Skip round-trip through QObject
df5c79a57b qtest: Document calling conventions
a4f21de576 qtest: Avoid passing raw strings through hmp()
92906b7187 numa-test: Use hmp()
19b14cb945 qobject: Perform %% interpolation in qobject_from_jsonf()
5461f67f74 qobject: Simplify qobject_from_jsonv()
f01023f518 tests: Add assertion for no qmp("")
c21259c314 tests/libqtest: Clean up how we read the QMP greeting
ecc0b4c2ee tests: Clean up wait for event
817e62311e qobject: Accept "%"PRId64 in qobject_from_jsonf()

=== OUTPUT BEGIN ===
Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc'
Cloning into '/var/tmp/patchew-tester-tmp-he2066gt/src/dtc'...
Submodule path 'dtc': checked out '558cd81bdd432769b59bff01240c44f82cfb1a9d'
  BUILD   centos6
make[1]: Entering directory '/var/tmp/patchew-tester-tmp-he2066gt/src'
  ARCHIVE qemu.tgz
  ARCHIVE dtc.tgz
  COPY    RUNNER
    RUN test-quick in qemu:centos6 
Packages installed:
SDL-devel-1.2.14-7.el6_7.1.x86_64
bison-2.4.1-5.el6.x86_64
ccache-3.1.6-2.el6.x86_64
epel-release-6-8.noarch
flex-2.5.35-9.el6.x86_64
gcc-4.4.7-18.el6.x86_64
git-1.7.1-8.el6.x86_64
glib2-devel-2.28.8-9.el6.x86_64
libfdt-devel-1.4.0-1.el6.x86_64
make-3.81-23.el6.x86_64
package g++ is not installed
pixman-devel-0.32.8-1.el6.x86_64
tar-1.23-15.el6_8.x86_64
zlib-devel-1.2.3-29.el6.x86_64

Environment variables:
PACKAGES=libfdt-devel ccache     tar git make gcc g++ flex bison     zlib-devel glib2-devel SDL-devel pixman-devel     epel-release
HOSTNAME=62a8e8853e87
TERM=xterm
MAKEFLAGS= -j8
HISTSIZE=1000
J=8
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
CCACHE_DIR=/var/tmp/ccache
EXTRA_CONFIGURE_OPTS=
V=
SHOW_ENV=1
MAIL=/var/spool/mail/root
PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
LANG=en_US.UTF-8
TARGET_LIST=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
TEST_DIR=/tmp/qemu-test
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
FEATURES= dtc
DEBUG=
G_BROKEN_FILENAMES=1
CCACHE_HASHDIR=
_=/usr/bin/env

Configure options:
--enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/var/tmp/qemu-build/install
No C++ compiler available; disabling C++ specific optional code
Install prefix    /var/tmp/qemu-build/install
BIOS directory    /var/tmp/qemu-build/install/share/qemu
binary directory  /var/tmp/qemu-build/install/bin
library directory /var/tmp/qemu-build/install/lib
module directory  /var/tmp/qemu-build/install/lib/qemu
libexec directory /var/tmp/qemu-build/install/libexec
include directory /var/tmp/qemu-build/install/include
config directory  /var/tmp/qemu-build/install/etc
local state directory   /var/tmp/qemu-build/install/var
Manual directory  /var/tmp/qemu-build/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /tmp/qemu-test/src
C compiler        cc
Host C compiler   cc
C++ compiler      
Objective-C compiler cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1   -I$(SRC_PATH)/dtc/libfdt -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include   -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-all
LDFLAGS           -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g 
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          x86_64
host big endian   no
target list       x86_64-softmmu aarch64-softmmu
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
pixman            system
SDL support       yes (1.2.14)
GTK support       no 
GTK GL support    no
VTE support       no 
TLS priority      NORMAL
GNUTLS support    no
GNUTLS rnd        no
libgcrypt         no
libgcrypt kdf     no
nettle            no 
nettle kdf        no
libtasn1          no
curses support    no
virgl support     no
curl support      no
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    no
VNC support       yes
VNC SASL support  no
VNC JPEG support  no
VNC PNG support   no
xen support       no
brlapi support    no
bluez  support    no
Documentation     no
PIE               yes
vde support       no
netmap support    no
Linux AIO support no
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
RDMA support      no
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
libcap-ng support no
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
Trace backends    log
spice support     no 
rbd support       no
xfsctl support    no
smartcard support no
libusb            no
usb net redir     no
OpenGL support    no
OpenGL dmabufs    no
libiscsi support  no
libnfs support    no
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
crypto afalg      no
GlusterFS support no
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   no
TPM passthrough   yes
QOM debugging     yes
Live block migration yes
lzo support       no
snappy support    no
bzip2 support     no
NUMA host support no
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
VxHS block device no
  GEN     x86_64-softmmu/config-devices.mak.tmp
mkdir -p dtc/libfdt
mkdir -p dtc/tests
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     config-host.h
  GEN     qemu-options.def
  GEN     qmp-commands.h
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     qapi-event.h
  GEN     x86_64-softmmu/config-devices.mak
  GEN     aarch64-softmmu/config-devices.mak
  GEN     qmp-marshal.c
  GEN     qapi-types.c
  GEN     qapi-visit.c
  GEN     qapi-event.c
  GEN     qmp-introspect.h
  GEN     qmp-introspect.c
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     tests/test-qapi-event.h
  GEN     tests/test-qmp-commands.h
  GEN     tests/test-qmp-introspect.h
  GEN     trace-root.h
  GEN     util/trace.h
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     migration/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     ui/trace.h
  GEN     audio/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     accel/tcg/trace.h
  GEN     accel/kvm/trace.h
  GEN     nbd/trace.h
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     crypto/trace.c
  GEN     io/trace.c
  GEN     migration/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/display/trace.c
  GEN     hw/input/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/xen/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/sparc/trace.c
  GEN     target/s390x/trace.c
  GEN     target/ppc/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     accel/tcg/trace.c
  GEN     accel/kvm/trace.c
  GEN     nbd/trace.c
  GEN     config-all-devices.mak
	 DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c
	 DEP /tmp/qemu-test/src/dtc/tests/trees.S
	 DEP /tmp/qemu-test/src/dtc/tests/testutils.c
	 DEP /tmp/qemu-test/src/dtc/tests/value-labels.c
	 DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c
	 DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/check_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c
	 DEP /tmp/qemu-test/src/dtc/tests/overlay.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c
	 DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c
	 DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c
	 DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c
	 DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c
	 DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c
	 DEP /tmp/qemu-test/src/dtc/tests/incbin.c
	 DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c
	 DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c
	 DEP /tmp/qemu-test/src/dtc/tests/path-references.c
	 DEP /tmp/qemu-test/src/dtc/tests/references.c
	 DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c
	 DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/del_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/set_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/open_pack.c
	 DEP /tmp/qemu-test/src/dtc/tests/nopulate.c
	 DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c
	 DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c
	 DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/nop_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c
	 DEP /tmp/qemu-test/src/dtc/tests/stringlist.c
	 DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/notfound.c
	 DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c
	 DEP /tmp/qemu-test/src/dtc/tests/char_literal.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_alias.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c
	 DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_path.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_name.c
	 DEP /tmp/qemu-test/src/dtc/tests/getprop.c
	 DEP /tmp/qemu-test/src/dtc/tests/path_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c
	 DEP /tmp/qemu-test/src/dtc/tests/find_property.c
	 DEP /tmp/qemu-test/src/dtc/tests/root_node.c
	 DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c
	 DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c
	 DEP /tmp/qemu-test/src/dtc/util.c
	 DEP /tmp/qemu-test/src/dtc/fdtput.c
	 DEP /tmp/qemu-test/src/dtc/fdtget.c
	 DEP /tmp/qemu-test/src/dtc/fdtdump.c
	 LEX convert-dtsv0-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/srcpos.c
	 BISON dtc-parser.tab.c
	 LEX dtc-lexer.lex.c
	 DEP /tmp/qemu-test/src/dtc/treesource.c
	 DEP /tmp/qemu-test/src/dtc/livetree.c
	 DEP /tmp/qemu-test/src/dtc/flattree.c
	 DEP /tmp/qemu-test/src/dtc/fstree.c
	 DEP /tmp/qemu-test/src/dtc/dtc.c
	 DEP /tmp/qemu-test/src/dtc/data.c
	 DEP /tmp/qemu-test/src/dtc/checks.c
	 DEP convert-dtsv0-lexer.lex.c
	 DEP dtc-parser.tab.c
	 DEP dtc-lexer.lex.c
	CHK version_gen.h
	UPD version_gen.h
	 DEP /tmp/qemu-test/src/dtc/util.c
	 CC libfdt/fdt.o
	 CC libfdt/fdt_ro.o
	 CC libfdt/fdt_wip.o
	 CC libfdt/fdt_sw.o
	 CC libfdt/fdt_addresses.o
	 CC libfdt/fdt_strerror.o
	 CC libfdt/fdt_empty_tree.o
	 CC libfdt/fdt_rw.o
	 CC libfdt/fdt_overlay.o
	 AR libfdt/libfdt.a
ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
  CC      tests/qemu-iotests/socket_scm_helper.o
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qapi-visit.c
  CC      qmp-introspect.o
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  CC      qapi-types.o
  CC      qapi-visit.o
  CC      qapi-event.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/osdep.o
  CC      util/cutils.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/aio-posix.o
  CC      util/iohandler.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/qemu-openpty.o
  CC      util/qemu-thread-posix.o
  CC      util/memfd.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/error.o
  CC      util/qemu-error.o
  CC      util/id.o
  CC      util/iov.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/keyval.o
  CC      util/qemu-progress.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-ucontext.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      trace-root.o
  CC      util/trace.o
  CC      crypto/trace.o
  CC      io/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/net/trace.o
  CC      hw/intc/trace.o
  CC      hw/virtio/trace.o
  CC      hw/audio/trace.o
  CC      hw/misc/trace.o
  CC      hw/usb/trace.o
  CC      hw/nvram/trace.o
  CC      hw/scsi/trace.o
  CC      hw/display/trace.o
  CC      hw/input/trace.o
  CC      hw/timer/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sd/trace.o
  CC      hw/dma/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      ui/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/sparc/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      linux-user/trace.o
  CC      qom/trace.o
  CC      qapi/trace.o
  CC      accel/tcg/trace.o
  CC      accel/kvm/trace.o
  CC      nbd/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread-lock.o
  CC      stubs/iothread.o
  CC      stubs/is-daemonized.o
  CC      stubs/machine-init-done.o
  CC      stubs/monitor.o
  CC      stubs/migr-blocker.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/set-fd-handler.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vm-stop.o
  CC      stubs/vmstate.o
  CC      stubs/qmp_pc_dimm_device_list.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      contrib/ivshmem-server/main.o
  CC      qemu-nbd.o
  CC      block.o
  CC      blockjob.o
  CC      replication.o
  CC      qemu-io-cmds.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-check.o
  CC      block/qed-cluster.o
  CC      block/vhdx.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/qapi.o
  CC      block/file-posix.o
  CC      block/mirror.o
  CC      block/null.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/backup.o
  CC      block/write-threshold.o
  CC      block/replication.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-glib.o
  CC      crypto/hmac.o
  CC      crypto/hmac-glib.o
  CC      crypto/desrfb.o
  CC      crypto/aes.o
  CC      crypto/tlscreds.o
  CC      crypto/cipher.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-platform.o
  CC      crypto/pbkdf.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/xts.o
  CC      crypto/afsplit.o
  CC      crypto/block.o
  CC      crypto/block-luks.o
  CC      crypto/block-qcow.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/task.o
  CC      io/dns-resolver.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  CC      qom/object_interfaces.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      qemu-bridge-helper.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-posix.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qmp-marshal.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/sdlaudio.o
  CC      audio/ossaudio.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-ram.o
  CC      backends/hostmem-file.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      disas/arm.o
  CC      disas/i386.o
  CC      fsdev/qemu-fsdev-dummy.o
  CC      fsdev/qemu-fsdev-opts.o
  CC      fsdev/qemu-fsdev-throttle.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/es1370.o
  CC      hw/audio/sb16.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/gus.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/soundhw.o
  CC      hw/block/block.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/core.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/parallel.o
  CC      hw/char/pl011.o
  CC      hw/char/serial.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/virtio-console.o
  CC      hw/char/debugcon.o
  CC      hw/char/imx_serial.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/sysbus.o
  CC      hw/core/ptimer.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/or-irq.o
  CC      hw/core/register.o
  CC      hw/core/platform-bus.o
  CC      hw/cpu/core.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/pl110.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/blizzard.o
  CC      hw/display/framebuffer.o
  CC      hw/display/tc6393xb.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/ps2.o
  CC      hw/input/vmmouse.o
  CC      hw/input/tsc2005.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/input/virtio-input-host.o
  CC      hw/intc/pl190.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/apm.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/unimp.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/smc91c111.o
  CC      hw/net/xgmac.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/i8254.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/pl031.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/tpm/tpm_passthrough.o
  CC      hw/tpm/tpm_util.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/host-stub.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/watchdog/watchdog.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/tls.o
  CC      migration/exec.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/page_cache.o
  CC      migration/vmstate-types.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/qemu-file.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/block.o
  CC      net/net.o
  CC      migration/qjson.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/queue.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/eth.o
  CC      net/l2tpv3.o
  CC      net/dump.o
  CC      net/slirp.o
  CC      net/vhost-user.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo.o
  CC      net/filter-replay.o
  CC      net/filter-rewriter.o
  CC      net/colo-compare.o
  CC      net/tap.o
  CC      net/tap-linux.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-input.o
  CC      replay/replay-char.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-audio.o
  CC      replay/replay-net.o
/tmp/qemu-test/src/replay/replay-internal.c: In function ‘replay_put_array’:
/tmp/qemu-test/src/replay/replay-internal.c:65: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dhcpv6.o
  CC      slirp/dnssearch.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_timer.o
  CC      slirp/tcp_output.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/tftp.o
  CC      slirp/bootp.o
/tmp/qemu-test/src/slirp/tcp_input.c: In function ‘tcp_input’:
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_p’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_len’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_tos’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_id’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_off’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_ttl’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_sum’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_src.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_dst.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:220: warning: ‘save_ip6.ip_nh’ may be used uninitialized in this function
  CC      slirp/arp_table.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/cursor.o
  CC      ui/console.o
  CC      ui/keymaps.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-legacy.o
  CC      ui/input-linux.o
  CC      ui/sdl.o
  CC      ui/sdl_zoom.o
  CC      ui/x_keymap.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-jobs.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-pty.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  LINK    tests/qemu-iotests/socket_scm_helper
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  AR      libqemuutil.a
  AR      libqemustub.a
  CC      qemu-img.o
  CC      optionrom/linuxboot_dma.o
  AS      optionrom/linuxboot.o
  AS      optionrom/multiboot.o
  AS      optionrom/kvmvapic.o
cc: unrecognized option '-no-integrated-as'
cc: unrecognized option '-no-integrated-as'
  BUILD   optionrom/linuxboot_dma.img
  LINK    ivshmem-client
  BUILD   optionrom/linuxboot.img
  BUILD   optionrom/multiboot.img
  BUILD   optionrom/linuxboot.raw
  BUILD   optionrom/linuxboot_dma.raw
  BUILD   optionrom/kvmvapic.img
  SIGN    optionrom/linuxboot.bin
  SIGN    optionrom/linuxboot_dma.bin
  BUILD   optionrom/multiboot.raw
  BUILD   optionrom/kvmvapic.raw
  SIGN    optionrom/multiboot.bin
  LINK    ivshmem-server
  SIGN    optionrom/kvmvapic.bin
  LINK    qemu-nbd
  LINK    qemu-io
  LINK    qemu-bridge-helper
  LINK    qemu-ga
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/hmp-commands-info.h
  GEN     x86_64-softmmu/config-target.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     aarch64-softmmu/config-target.h
  CC      x86_64-softmmu/tcg/optimize.o
  CC      x86_64-softmmu/exec.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/tcg/tcg-runtime.o
  CC      aarch64-softmmu/exec.o
  CC      x86_64-softmmu/disas.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/fpu/softfloat.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      x86_64-softmmu/hax-stub.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/arch_init.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/tcg/tcg-runtime.o
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/disas.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      aarch64-softmmu/hax-stub.o
  CC      aarch64-softmmu/arch_init.o
  CC      aarch64-softmmu/cpus.o
  CC      aarch64-softmmu/monitor.o
  CC      aarch64-softmmu/balloon.o
  CC      aarch64-softmmu/gdbstub.o
  CC      x86_64-softmmu/cpus.o
  CC      aarch64-softmmu/ioport.o
  CC      aarch64-softmmu/numa.o
  CC      aarch64-softmmu/qtest.o
  CC      aarch64-softmmu/memory.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      x86_64-softmmu/monitor.o
  CC      aarch64-softmmu/dump.o
  CC      aarch64-softmmu/migration/ram.o
  CC      aarch64-softmmu/accel/accel.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      x86_64-softmmu/gdbstub.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/balloon.o
  CC      x86_64-softmmu/ioport.o
  CC      x86_64-softmmu/numa.o
  CC      x86_64-softmmu/qtest.o
  CC      x86_64-softmmu/memory.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/dump.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      x86_64-softmmu/accel/accel.o
  CC      x86_64-softmmu/migration/ram.o
  CC      x86_64-softmmu/accel/kvm/kvm-all.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  LINK    qemu-img
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      x86_64-softmmu/hw/core/generic-loader.o
  CC      x86_64-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      x86_64-softmmu/hw/misc/vmport.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      x86_64-softmmu/hw/misc/ivshmem.o
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      x86_64-softmmu/hw/misc/hyperv_testdev.o
  CC      x86_64-softmmu/hw/misc/mmio_interface.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi.o
  CC      x86_64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      x86_64-softmmu/hw/vfio/common.o
  CC      x86_64-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      x86_64-softmmu/hw/vfio/pci-quirks.o
  CC      x86_64-softmmu/hw/vfio/platform.o
  CC      x86_64-softmmu/hw/vfio/spapr.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      x86_64-softmmu/hw/virtio/vhost.o
  CC      x86_64-softmmu/hw/virtio/vhost-backend.o
  CC      x86_64-softmmu/hw/virtio/vhost-vsock.o
  CC      x86_64-softmmu/hw/virtio/vhost-user.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
/tmp/qemu-test/src/hw/i386/pc_piix.c: In function ‘igd_passthrough_isa_bridge_create’:
/tmp/qemu-test/src/hw/i386/pc_piix.c:1065: warning: ‘pch_rev_id’ may be used uninitialized in this function
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
/tmp/qemu-test/src/hw/i386/acpi-build.c: In function ‘build_append_pci_bus_devices’:
/tmp/qemu-test/src/hw/i386/acpi-build.c:539: warning: ‘notify_method’ may be used uninitialized in this function
  CC      x86_64-softmmu/hw/i386/pci-assign-load-rom.o
  CC      aarch64-softmmu/hw/core/generic-loader.o
  CC      x86_64-softmmu/hw/i386/kvm/clock.o
  CC      aarch64-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      x86_64-softmmu/hw/i386/kvm/apic.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      x86_64-softmmu/hw/i386/kvm/i8259.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      x86_64-softmmu/hw/i386/kvm/ioapic.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      x86_64-softmmu/hw/i386/kvm/i8254.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      x86_64-softmmu/hw/i386/kvm/pci-assign.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      x86_64-softmmu/target/i386/machine.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      x86_64-softmmu/target/i386/hyperv.o
  CC      x86_64-softmmu/target/i386/kvm.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/hw/misc/ivshmem.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      x86_64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi.o
  CC      aarch64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      aarch64-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/hw/vfio/pci-quirks.o
  CC      aarch64-softmmu/hw/vfio/calxeda-xgmac.o
  CC      aarch64-softmmu/hw/vfio/amd-xgbe.o
  CC      aarch64-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/virtio/vhost-user.o
  CC      aarch64-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      aarch64-softmmu/hw/arm/digic.o
  LINK    x86_64-softmmu/qemu-system-x86_64
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      aarch64-softmmu/hw/arm/xlnx-ep108.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/hw/arm/mps2.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      aarch64-softmmu/target/arm/psci.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  CC      aarch64-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      aarch64-softmmu/target/arm/cpu.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      aarch64-softmmu/trace/generated-helpers.o
/tmp/qemu-test/src/target/arm/translate-a64.c: In function ‘handle_shri_with_rndacc’:
/tmp/qemu-test/src/target/arm/translate-a64.c:6357: warning: ‘tcg_src_hi’ may be used uninitialized in this function
/tmp/qemu-test/src/target/arm/translate-a64.c: In function ‘disas_simd_scalar_two_reg_misc’:
/tmp/qemu-test/src/target/arm/translate-a64.c:8084: warning: ‘rmode’ may be used uninitialized in this function
  LINK    aarch64-softmmu/qemu-system-aarch64
  TEST    tests/qapi-schema/alternate-any.out
  TEST    tests/qapi-schema/alternate-array.out
  TEST    tests/qapi-schema/alternate-base.out
  TEST    tests/qapi-schema/alternate-conflict-enum-bool.out
  TEST    tests/qapi-schema/alternate-conflict-enum-int.out
  TEST    tests/qapi-schema/alternate-clash.out
  TEST    tests/qapi-schema/alternate-conflict-dict.out
  TEST    tests/qapi-schema/alternate-conflict-string.out
  TEST    tests/qapi-schema/alternate-empty.out
  TEST    tests/qapi-schema/alternate-nested.out
  TEST    tests/qapi-schema/alternate-unknown.out
  TEST    tests/qapi-schema/args-alternate.out
  TEST    tests/qapi-schema/args-any.out
  TEST    tests/qapi-schema/args-array-empty.out
  TEST    tests/qapi-schema/args-array-unknown.out
  TEST    tests/qapi-schema/args-bad-boxed.out
  TEST    tests/qapi-schema/args-boxed-anon.out
  TEST    tests/qapi-schema/args-boxed-empty.out
  TEST    tests/qapi-schema/args-boxed-string.out
  TEST    tests/qapi-schema/args-int.out
  TEST    tests/qapi-schema/args-invalid.out
  TEST    tests/qapi-schema/args-member-array-bad.out
  TEST    tests/qapi-schema/args-member-case.out
  TEST    tests/qapi-schema/args-member-unknown.out
  TEST    tests/qapi-schema/args-name-clash.out
  TEST    tests/qapi-schema/args-union.out
  TEST    tests/qapi-schema/args-unknown.out
  TEST    tests/qapi-schema/bad-base.out
  TEST    tests/qapi-schema/bad-data.out
  TEST    tests/qapi-schema/bad-ident.out
  TEST    tests/qapi-schema/bad-type-bool.out
  TEST    tests/qapi-schema/bad-type-dict.out
  TEST    tests/qapi-schema/bad-type-int.out
  TEST    tests/qapi-schema/base-cycle-direct.out
  TEST    tests/qapi-schema/base-cycle-indirect.out
  TEST    tests/qapi-schema/command-int.out
  TEST    tests/qapi-schema/comments.out
  TEST    tests/qapi-schema/doc-bad-alternate-member.out
  TEST    tests/qapi-schema/doc-bad-command-arg.out
  TEST    tests/qapi-schema/doc-bad-symbol.out
  TEST    tests/qapi-schema/doc-bad-union-member.out
  TEST    tests/qapi-schema/doc-before-include.out
  TEST    tests/qapi-schema/doc-before-pragma.out
  TEST    tests/qapi-schema/doc-duplicated-arg.out
  TEST    tests/qapi-schema/doc-duplicated-return.out
  TEST    tests/qapi-schema/doc-empty-arg.out
  TEST    tests/qapi-schema/doc-duplicated-since.out
  TEST    tests/qapi-schema/doc-empty-section.out
  TEST    tests/qapi-schema/doc-empty-symbol.out
  TEST    tests/qapi-schema/doc-good.out
  TEST    tests/qapi-schema/doc-interleaved-section.out
  TEST    tests/qapi-schema/doc-invalid-end.out
  TEST    tests/qapi-schema/doc-invalid-end2.out
  TEST    tests/qapi-schema/doc-invalid-return.out
  TEST    tests/qapi-schema/doc-invalid-section.out
  TEST    tests/qapi-schema/doc-invalid-start.out
  TEST    tests/qapi-schema/doc-missing.out
  TEST    tests/qapi-schema/doc-missing-colon.out
  TEST    tests/qapi-schema/doc-missing-expr.out
  TEST    tests/qapi-schema/doc-missing-space.out
  TEST    tests/qapi-schema/doc-no-symbol.out
  TEST    tests/qapi-schema/double-data.out
  TEST    tests/qapi-schema/double-type.out
  TEST    tests/qapi-schema/duplicate-key.out
  TEST    tests/qapi-schema/empty.out
  TEST    tests/qapi-schema/enum-bad-name.out
  TEST    tests/qapi-schema/enum-bad-prefix.out
  TEST    tests/qapi-schema/enum-clash-member.out
  TEST    tests/qapi-schema/enum-dict-member.out
  TEST    tests/qapi-schema/enum-int-member.out
  TEST    tests/qapi-schema/enum-missing-data.out
  TEST    tests/qapi-schema/enum-member-case.out
  TEST    tests/qapi-schema/enum-wrong-data.out
  TEST    tests/qapi-schema/escape-outside-string.out
  TEST    tests/qapi-schema/escape-too-big.out
  TEST    tests/qapi-schema/escape-too-short.out
  TEST    tests/qapi-schema/event-boxed-empty.out
  TEST    tests/qapi-schema/event-case.out
  TEST    tests/qapi-schema/event-nest-struct.out
  TEST    tests/qapi-schema/flat-union-array-branch.out
  TEST    tests/qapi-schema/flat-union-bad-base.out
  TEST    tests/qapi-schema/flat-union-bad-discriminator.out
  TEST    tests/qapi-schema/flat-union-base-any.out
  TEST    tests/qapi-schema/flat-union-base-union.out
  TEST    tests/qapi-schema/flat-union-clash-member.out
  TEST    tests/qapi-schema/flat-union-empty.out
  TEST    tests/qapi-schema/flat-union-incomplete-branch.out
  TEST    tests/qapi-schema/flat-union-inline.out
  TEST    tests/qapi-schema/flat-union-int-branch.out
  TEST    tests/qapi-schema/flat-union-invalid-branch-key.out
  TEST    tests/qapi-schema/flat-union-invalid-discriminator.out
  TEST    tests/qapi-schema/flat-union-no-base.out
  TEST    tests/qapi-schema/flat-union-optional-discriminator.out
  TEST    tests/qapi-schema/flat-union-string-discriminator.out
  TEST    tests/qapi-schema/funny-char.out
  TEST    tests/qapi-schema/ident-with-escape.out
  TEST    tests/qapi-schema/include-before-err.out
  TEST    tests/qapi-schema/include-cycle.out
  TEST    tests/qapi-schema/include-extra-junk.out
  TEST    tests/qapi-schema/include-format-err.out
  TEST    tests/qapi-schema/include-nested-err.out
  TEST    tests/qapi-schema/include-no-file.out
  TEST    tests/qapi-schema/include-non-file.out
  TEST    tests/qapi-schema/include-relpath.out
  TEST    tests/qapi-schema/include-repetition.out
  TEST    tests/qapi-schema/include-self-cycle.out
  TEST    tests/qapi-schema/include-simple.out
  TEST    tests/qapi-schema/indented-expr.out
  TEST    tests/qapi-schema/leading-comma-list.out
  TEST    tests/qapi-schema/leading-comma-object.out
  TEST    tests/qapi-schema/missing-colon.out
  TEST    tests/qapi-schema/missing-comma-list.out
  TEST    tests/qapi-schema/missing-comma-object.out
  TEST    tests/qapi-schema/missing-type.out
  TEST    tests/qapi-schema/nested-struct-data.out
  TEST    tests/qapi-schema/non-objects.out
  TEST    tests/qapi-schema/pragma-doc-required-crap.out
  TEST    tests/qapi-schema/pragma-extra-junk.out
  TEST    tests/qapi-schema/pragma-name-case-whitelist-crap.out
  TEST    tests/qapi-schema/pragma-non-dict.out
  TEST    tests/qapi-schema/pragma-returns-whitelist-crap.out
  TEST    tests/qapi-schema/qapi-schema-test.out
  TEST    tests/qapi-schema/quoted-structural-chars.out
  TEST    tests/qapi-schema/redefined-builtin.out
  TEST    tests/qapi-schema/redefined-command.out
  TEST    tests/qapi-schema/redefined-event.out
  TEST    tests/qapi-schema/redefined-type.out
  TEST    tests/qapi-schema/reserved-command-q.out
  TEST    tests/qapi-schema/reserved-enum-q.out
  TEST    tests/qapi-schema/reserved-member-has.out
  TEST    tests/qapi-schema/reserved-member-q.out
  TEST    tests/qapi-schema/reserved-member-u.out
  TEST    tests/qapi-schema/reserved-member-underscore.out
  TEST    tests/qapi-schema/reserved-type-kind.out
  TEST    tests/qapi-schema/reserved-type-list.out
  TEST    tests/qapi-schema/returns-alternate.out
  TEST    tests/qapi-schema/returns-array-bad.out
  TEST    tests/qapi-schema/returns-dict.out
  TEST    tests/qapi-schema/returns-unknown.out
  TEST    tests/qapi-schema/returns-whitelist.out
  TEST    tests/qapi-schema/struct-base-clash-deep.out
  TEST    tests/qapi-schema/struct-base-clash.out
  TEST    tests/qapi-schema/struct-data-invalid.out
  TEST    tests/qapi-schema/struct-member-invalid.out
  TEST    tests/qapi-schema/trailing-comma-list.out
  TEST    tests/qapi-schema/trailing-comma-object.out
  TEST    tests/qapi-schema/type-bypass-bad-gen.out
  TEST    tests/qapi-schema/unclosed-list.out
  TEST    tests/qapi-schema/unclosed-object.out
  TEST    tests/qapi-schema/unclosed-string.out
  TEST    tests/qapi-schema/unicode-str.out
  TEST    tests/qapi-schema/union-base-empty.out
  TEST    tests/qapi-schema/union-base-no-discriminator.out
  TEST    tests/qapi-schema/union-branch-case.out
  TEST    tests/qapi-schema/union-clash-branches.out
  TEST    tests/qapi-schema/union-empty.out
  TEST    tests/qapi-schema/union-invalid-base.out
  TEST    tests/qapi-schema/union-optional-branch.out
  TEST    tests/qapi-schema/union-unknown.out
  TEST    tests/qapi-schema/unknown-escape.out
  TEST    tests/qapi-schema/unknown-expr-key.out
  GEN     tests/qapi-schema/doc-good.test.texi
  CC      tests/check-qdict.o
  CC      tests/test-char.o
  CC      tests/check-qnum.o
  CC      tests/check-qstring.o
  CC      tests/check-qlist.o
  CC      tests/check-qnull.o
  CC      tests/check-qjson.o
  CC      tests/test-qobject-output-visitor.o
  GEN     tests/test-qapi-visit.c
  GEN     tests/test-qapi-types.c
  GEN     tests/test-qapi-event.c
  GEN     tests/test-qmp-introspect.c
  CC      tests/test-clone-visitor.o
  CC      tests/test-qobject-input-visitor.o
  CC      tests/test-qmp-commands.o
  GEN     tests/test-qmp-marshal.c
  CC      tests/test-string-input-visitor.o
  CC      tests/test-string-output-visitor.o
  CC      tests/test-qmp-event.o
  CC      tests/test-opts-visitor.o
  CC      tests/test-coroutine.o
  CC      tests/iothread.o
  CC      tests/test-visitor-serialization.o
  CC      tests/test-iov.o
  CC      tests/test-aio.o
  CC      tests/test-throttle.o
  CC      tests/test-thread-pool.o
  CC      tests/test-aio-multithread.o
  CC      tests/test-hbitmap.o
  CC      tests/test-blockjob.o
  CC      tests/test-blockjob-txn.o
  CC      tests/test-x86-cpuid.o
  CC      tests/test-vmstate.o
  CC      tests/test-xbzrle.o
  CC      tests/test-cutils.o
  CC      tests/test-shift128.o
  CC      tests/test-mul64.o
  CC      tests/test-int128.o
  CC      tests/rcutorture.o
  CC      tests/test-rcu-list.o
/tmp/qemu-test/src/tests/test-int128.c:180: warning: ‘__noclone__’ attribute directive ignored
  CC      tests/test-qdist.o
  CC      tests/test-qht.o
  CC      tests/test-qht-par.o
  CC      tests/qht-bench.o
  CC      tests/test-bitops.o
  CC      tests/test-bitcnt.o
  CC      tests/check-qom-interface.o
  CC      tests/test-qemu-opts.o
  CC      tests/check-qom-proplist.o
  CC      tests/test-keyval.o
  CC      tests/test-write-threshold.o
  CC      tests/test-crypto-hash.o
  CC      tests/test-crypto-hmac.o
  CC      tests/test-crypto-cipher.o
  CC      tests/test-crypto-secret.o
  CC      tests/test-qga.o
  CC      tests/libqtest.o
  CC      tests/test-timed-average.o
  CC      tests/test-io-task.o
  CC      tests/test-io-channel-socket.o
  CC      tests/io-channel-helpers.o
  CC      tests/test-io-channel-file.o
  CC      tests/test-io-channel-command.o
  CC      tests/test-io-channel-buffer.o
  CC      tests/test-base64.o
  CC      tests/test-crypto-ivgen.o
  CC      tests/test-crypto-afsplit.o
  CC      tests/test-crypto-xts.o
  CC      tests/test-crypto-block.o
  CC      tests/test-logging.o
  CC      tests/test-replication.o
  CC      tests/test-bufferiszero.o
  CC      tests/test-uuid.o
  CC      tests/ptimer-test.o
  CC      tests/ptimer-test-stubs.o
  CC      tests/test-qapi-util.o
  CC      tests/vhost-user-test.o
  CC      tests/libqos/fw_cfg.o
  CC      tests/libqos/pci.o
  CC      tests/libqos/malloc.o
  CC      tests/libqos/i2c.o
  CC      tests/libqos/libqos.o
  CC      tests/libqos/malloc-spapr.o
  CC      tests/libqos/libqos-spapr.o
  CC      tests/libqos/rtas.o
  CC      tests/libqos/pci-spapr.o
/tmp/qemu-test/src/tests/test-qga.c: In function ‘test_qga_set_time’:
/tmp/qemu-test/src/tests/test-qga.c:652: warning: implicit declaration of function ‘qmp_fd’
/tmp/qemu-test/src/tests/test-qga.c:652: warning: nested extern declaration of ‘qmp_fd’
/tmp/qemu-test/src/tests/test-qga.c:652: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c:661: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c:667: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c:678: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c: In function ‘test_qga_fstrim’:
/tmp/qemu-test/src/tests/test-qga.c:693: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c: In function ‘test_qga_fsfreeze_and_thaw’:
/tmp/qemu-test/src/tests/test-qga.c:839: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c:844: warning: assignment makes pointer from integer without a cast
/tmp/qemu-test/src/tests/test-qga.c:851: warning: assignment makes pointer from integer without a cast
  CC      tests/libqos/pci-pc.o
  CC      tests/libqos/malloc-pc.o
  CC      tests/libqos/libqos-pc.o
  CC      tests/libqos/ahci.o
  CC      tests/libqos/virtio.o
  CC      tests/libqos/virtio-pci.o
  CC      tests/libqos/virtio-mmio.o
  CC      tests/libqos/malloc-generic.o
  CC      tests/endianness-test.o
  CC      tests/fdc-test.o
  CC      tests/ide-test.o
  CC      tests/ahci-test.o
  CC      tests/hd-geo-test.o
  CC      tests/boot-order-test.o
  CC      tests/bios-tables-test.o
  CC      tests/boot-sector.o
  CC      tests/acpi-utils.o
  CC      tests/boot-serial-test.o
  CC      tests/pxe-test.o
  CC      tests/rtc-test.o
  CC      tests/ipmi-kcs-test.o
  CC      tests/ipmi-bt-test.o
  CC      tests/i440fx-test.o
  CC      tests/fw_cfg-test.o
  CC      tests/drive_del-test.o
  CC      tests/wdt_ib700-test.o
  CC      tests/tco-test.o
  CC      tests/e1000-test.o
  CC      tests/e1000e-test.o
  CC      tests/rtl8139-test.o
  CC      tests/pcnet-test.o
  CC      tests/eepro100-test.o
  CC      tests/ne2000-test.o
  CC      tests/nvme-test.o
  CC      tests/ac97-test.o
  CC      tests/es1370-test.o
  CC      tests/virtio-net-test.o
  CC      tests/virtio-balloon-test.o
  CC      tests/virtio-blk-test.o
  CC      tests/virtio-rng-test.o
  CC      tests/virtio-scsi-test.o
  CC      tests/virtio-serial-test.o
  CC      tests/virtio-console-test.o
  CC      tests/tpci200-test.o
  CC      tests/ipoctal232-test.o
  CC      tests/display-vga-test.o
  CC      tests/intel-hda-test.o
  CC      tests/ivshmem-test.o
  CC      tests/megasas-test.o
  CC      tests/vmxnet3-test.o
  CC      tests/pvpanic-test.o
  CC      tests/i82801b11-test.o
  CC      tests/ioh3420-test.o
  CC      tests/usb-hcd-ohci-test.o
  CC      tests/libqos/usb.o
  CC      tests/usb-hcd-uhci-test.o
  CC      tests/usb-hcd-ehci-test.o
  CC      tests/usb-hcd-xhci-test.o
  CC      tests/pc-cpu-test.o
  CC      tests/q35-test.o
  CC      tests/vmgenid-test.o
  CC      tests/test-netfilter.o
  CC      tests/test-filter-mirror.o
  CC      tests/test-filter-redirector.o
  CC      tests/postcopy-test.o
  CC      tests/test-x86-cpuid-compat.o
  CC      tests/numa-test.o
  CC      tests/qmp-test.o
  CC      tests/device-introspect-test.o
  CC      tests/qom-test.o
  CC      tests/test-hmp.o
  LINK    tests/check-qdict
  LINK    tests/test-char
  LINK    tests/check-qnum
  LINK    tests/check-qstring
  LINK    tests/check-qlist
  LINK    tests/check-qnull
  LINK    tests/check-qjson
  CC      tests/test-qapi-visit.o
  CC      tests/test-qapi-types.o
  CC      tests/test-qapi-event.o
  CC      tests/test-qmp-introspect.o
  CC      tests/test-qmp-marshal.o
  LINK    tests/test-coroutine
  LINK    tests/test-visitor-serialization
  LINK    tests/test-iov
  LINK    tests/test-aio
  LINK    tests/test-aio-multithread
  LINK    tests/test-throttle
  LINK    tests/test-thread-pool
  LINK    tests/test-hbitmap
  LINK    tests/test-blockjob
  LINK    tests/test-blockjob-txn
  LINK    tests/test-x86-cpuid
  LINK    tests/test-xbzrle
  LINK    tests/test-vmstate
  LINK    tests/test-cutils
  LINK    tests/test-shift128
  LINK    tests/test-mul64
  LINK    tests/test-int128
  LINK    tests/rcutorture
  LINK    tests/test-rcu-list
  LINK    tests/test-qdist
  LINK    tests/test-qht
  LINK    tests/qht-bench
  LINK    tests/test-bitops
  LINK    tests/test-bitcnt
  LINK    tests/check-qom-interface
  LINK    tests/check-qom-proplist
  LINK    tests/test-qemu-opts
  LINK    tests/test-keyval
  LINK    tests/test-write-threshold
  LINK    tests/test-crypto-hash
  LINK    tests/test-crypto-hmac
  LINK    tests/test-crypto-cipher
  LINK    tests/test-crypto-secret
  LINK    tests/test-qga
  LINK    tests/test-timed-average
  LINK    tests/test-io-task
  LINK    tests/test-io-channel-socket
tests/test-qga.o: In function `test_qga_fsfreeze_and_thaw':
/tmp/qemu-test/src/tests/test-qga.c:839: undefined reference to `qmp_fd'
/tmp/qemu-test/src/tests/test-qga.c:844: undefined reference to `qmp_fd'
/tmp/qemu-test/src/tests/test-qga.c:851: undefined reference to `qmp_fd'
tests/test-qga.o: In function `test_qga_fstrim':
/tmp/qemu-test/src/tests/test-qga.c:692: undefined reference to `qmp_fd'
tests/test-qga.o: In function `test_qga_set_time':
/tmp/qemu-test/src/tests/test-qga.c:652: undefined reference to `qmp_fd'
tests/test-qga.o:/tmp/qemu-test/src/tests/test-qga.c:660: more undefined references to `qmp_fd' follow
collect2: ld returned 1 exit status
make: *** [tests/test-qga] Error 1
make: *** Waiting for unfinished jobs....
make: *** wait: No child processes.  Stop.
Traceback (most recent call last):
  File "./tests/docker/docker.py", line 382, in <module>
    sys.exit(main())
  File "./tests/docker/docker.py", line 379, in main
    return args.cmdobj.run(args, argv)
  File "./tests/docker/docker.py", line 237, in run
    return Docker().run(argv, args.keep, quiet=args.quiet)
  File "./tests/docker/docker.py", line 205, in run
    quiet=quiet)
  File "./tests/docker/docker.py", line 123, in _do_check
    return subprocess.check_call(self._command + cmd, **kwargs)
  File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['docker', 'run', '--label', 'com.qemu.instance.uuid=98884d3278b711e7a64b52540069c830', '-u', '0', '-t', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/var/tmp/patchew-tester-tmp-he2066gt/src/docker-src.2017-08-03-21.52.35.497:/var/tmp/qemu:z,ro', '-v', '/root/.cache/qemu-docker-ccache:/var/tmp/ccache:z', 'qemu:centos6', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2
make[1]: *** [tests/docker/Makefile.include:139: docker-run] Error 1
make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-he2066gt/src'
make: *** [tests/docker/Makefile.include:168: docker-run-test-quick@centos6] Error 2

real	1m41.834s
user	0m5.158s
sys	0m1.713s
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
                   ` (22 preceding siblings ...)
  2017-08-04  1:54 ` [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() no-reply
@ 2017-08-04  2:02 ` no-reply
  23 siblings, 0 replies; 66+ messages in thread
From: no-reply @ 2017-08-04  2:02 UTC (permalink / raw)
  To: eblake; +Cc: famz, qemu-devel, armbru

Hi,

This series failed build test on s390x host. Please find the details below.

Subject: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
Message-id: 20170804012551.2714-1-eblake@redhat.com
Type: series

=== TEST SCRIPT BEGIN ===
#!/bin/bash
# Testing script will be invoked under the git checkout with
# HEAD pointing to a commit that has the patches applied on top of "base"
# branch
set -e
echo "=== ENV ==="
env
echo "=== PACKAGES ==="
rpm -qa
echo "=== TEST BEGIN ==="
CC=$HOME/bin/cc
INSTALL=$PWD/install
BUILD=$PWD/build
echo -n "Using CC: "
realpath $CC
mkdir -p $BUILD $INSTALL
SRC=$PWD
cd $BUILD
$SRC/configure --cc=$CC --prefix=$INSTALL
make -j4
# XXX: we need reliable clean up
# make check -j4 V=1
make install
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
 - [tag update]      patchew/1501692241-23310-1-git-send-email-peter.maydell@linaro.org -> patchew/1501692241-23310-1-git-send-email-peter.maydell@linaro.org
 * [new tag]         patchew/20170804012551.2714-1-eblake@redhat.com -> patchew/20170804012551.2714-1-eblake@redhat.com
Switched to a new branch 'test'
25d1d3e libqtest: Rename qmp_cmd() to qmp()
09d1c5f libqtest: Drop now-unused qmp()
0524247 tests/libqos/pci: Clean up string interpolation into QMP input
04c8567 libqtest: Add qmp_args_dict() helper
a919f62 tests/libqos/usb: Clean up string interpolation into QMP input
ef30c8a libqtest: Add qmp_args() helper
f3ab287 libqtest: Add qmp_cmd() helper
8de7531 libqtest: Delete qtest_qmp() wrappers
7010788 libqtest: Separate qmp_discard_response() from command
f1b80c2 libqtest: Add qmp_raw()
5b2e91a libqtest: Change qmp_fd_send() to drop varargs
d2734fc test-qga: Simplify command construction
9afca5a libqtest: Skip round-trip through QObject
df5c79a qtest: Document calling conventions
a4f21de qtest: Avoid passing raw strings through hmp()
92906b7 numa-test: Use hmp()
19b14cb qobject: Perform %% interpolation in qobject_from_jsonf()
5461f67 qobject: Simplify qobject_from_jsonv()
f01023f tests: Add assertion for no qmp("")
c21259c tests/libqtest: Clean up how we read the QMP greeting
ecc0b4c tests: Clean up wait for event
817e623 qobject: Accept "%"PRId64 in qobject_from_jsonf()

=== OUTPUT BEGIN ===
=== ENV ===
XDG_SESSION_ID=11990
SHELL=/bin/sh
USER=fam
PATCHEW=/home/fam/patchew/patchew-cli -s http://patchew.org --nodebug
PATH=/usr/bin:/bin
PWD=/var/tmp/patchew-tester-tmp-s55iq6fb/src
LANG=en_US.UTF-8
HOME=/home/fam
SHLVL=2
LOGNAME=fam
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1012/bus
XDG_RUNTIME_DIR=/run/user/1012
_=/usr/bin/env
=== PACKAGES ===
gpg-pubkey-873529b8-54e386ff
xz-libs-5.2.2-2.fc24.s390x
libxshmfence-1.2-3.fc24.s390x
giflib-4.1.6-15.fc24.s390x
trousers-lib-0.3.13-6.fc24.s390x
ncurses-base-6.0-6.20160709.fc25.noarch
gmp-6.1.1-1.fc25.s390x
libidn-1.33-1.fc25.s390x
slang-2.3.0-7.fc25.s390x
pkgconfig-0.29.1-1.fc25.s390x
alsa-lib-1.1.1-2.fc25.s390x
yum-metadata-parser-1.1.4-17.fc25.s390x
python3-slip-dbus-0.6.4-4.fc25.noarch
python2-cssselect-0.9.2-1.fc25.noarch
createrepo_c-libs-0.10.0-6.fc25.s390x
initscripts-9.69-1.fc25.s390x
parted-3.2-21.fc25.s390x
flex-2.6.0-3.fc25.s390x
colord-libs-1.3.4-1.fc25.s390x
python-osbs-client-0.33-3.fc25.noarch
perl-Pod-Simple-3.35-1.fc25.noarch
python2-simplejson-3.10.0-1.fc25.s390x
brltty-5.4-2.fc25.s390x
librados2-10.2.4-2.fc25.s390x
tcp_wrappers-7.6-83.fc25.s390x
libcephfs_jni1-10.2.4-2.fc25.s390x
nettle-devel-3.3-1.fc25.s390x
bzip2-devel-1.0.6-21.fc25.s390x
libuuid-2.28.2-2.fc25.s390x
python3-dnf-1.1.10-6.fc25.noarch
texlive-kpathsea-doc-svn41139-33.fc25.1.noarch
openssh-7.4p1-4.fc25.s390x
texlive-kpathsea-bin-svn40473-33.20160520.fc25.1.s390x
texlive-graphics-svn41015-33.fc25.1.noarch
texlive-dvipdfmx-def-svn40328-33.fc25.1.noarch
texlive-mfware-svn40768-33.fc25.1.noarch
texlive-texlive-scripts-svn41433-33.fc25.1.noarch
texlive-euro-svn22191.1.1-33.fc25.1.noarch
texlive-etex-svn37057.0-33.fc25.1.noarch
texlive-iftex-svn29654.0.2-33.fc25.1.noarch
texlive-palatino-svn31835.0-33.fc25.1.noarch
texlive-texlive-docindex-svn41430-33.fc25.1.noarch
texlive-xunicode-svn30466.0.981-33.fc25.1.noarch
texlive-koma-script-svn41508-33.fc25.1.noarch
texlive-pst-grad-svn15878.1.06-33.fc25.1.noarch
texlive-pst-blur-svn15878.2.0-33.fc25.1.noarch
texlive-jknapltx-svn19440.0-33.fc25.1.noarch
texinfo-6.1-4.fc25.s390x
openssl-devel-1.0.2k-1.fc25.s390x
gdk-pixbuf2-2.36.6-1.fc25.s390x
nspr-4.14.0-2.fc25.s390x
nss-softokn-freebl-3.30.2-1.0.fc25.s390x
jansson-2.10-2.fc25.s390x
fedora-repos-25-4.noarch
python3-libs-3.5.3-6.fc25.s390x
perl-Errno-1.25-387.fc25.s390x
acl-2.2.52-13.fc25.s390x
pcre2-utf16-10.23-8.fc25.s390x
pango-1.40.5-1.fc25.s390x
systemd-pam-231-17.fc25.s390x
python2-gluster-3.10.4-1.fc25.s390x
NetworkManager-libnm-1.4.4-5.fc25.s390x
selinux-policy-3.13.1-225.18.fc25.noarch
poppler-0.45.0-5.fc25.s390x
ccache-3.3.4-1.fc25.s390x
valgrind-3.12.0-9.fc25.s390x
perl-open-1.10-387.fc25.noarch
libaio-0.3.110-6.fc24.s390x
libfontenc-1.1.3-3.fc24.s390x
lzo-2.08-8.fc24.s390x
isl-0.14-5.fc24.s390x
libXau-1.0.8-6.fc24.s390x
linux-atm-libs-2.5.1-14.fc24.s390x
libXext-1.3.3-4.fc24.s390x
libXxf86vm-1.1.4-3.fc24.s390x
bison-3.0.4-4.fc24.s390x
perl-srpm-macros-1-20.fc25.noarch
gawk-4.1.3-8.fc25.s390x
libwayland-client-1.12.0-1.fc25.s390x
perl-Exporter-5.72-366.fc25.noarch
perl-version-0.99.17-1.fc25.s390x
fftw-libs-double-3.3.5-3.fc25.s390x
libssh2-1.8.0-1.fc25.s390x
ModemManager-glib-1.6.4-1.fc25.s390x
newt-python3-0.52.19-2.fc25.s390x
python-munch-2.0.4-3.fc25.noarch
python-bugzilla-1.2.2-4.fc25.noarch
libedit-3.1-16.20160618cvs.fc25.s390x
createrepo_c-0.10.0-6.fc25.s390x
device-mapper-multipath-libs-0.4.9-83.fc25.s390x
yum-3.4.3-510.fc25.noarch
dracut-config-rescue-044-78.fc25.s390x
mozjs17-17.0.0-16.fc25.s390x
libselinux-2.5-13.fc25.s390x
libgo-devel-6.3.1-1.fc25.s390x
python2-pyparsing-2.1.10-1.fc25.noarch
cairo-gobject-1.14.8-1.fc25.s390x
ethtool-4.8-1.fc25.s390x
xorg-x11-proto-devel-7.7-20.fc25.noarch
brlapi-0.6.5-2.fc25.s390x
librados-devel-10.2.4-2.fc25.s390x
libXinerama-devel-1.1.3-6.fc24.s390x
lua-posix-33.3.1-3.fc25.s390x
usbredir-devel-0.7.1-2.fc24.s390x
libepoxy-1.4.1-1.fc25.s390x
python3-dnf-plugins-core-0.1.21-5.fc25.noarch
texlive-pdftex-doc-svn41149-33.fc25.1.noarch
openssh-clients-7.4p1-4.fc25.s390x
iptables-1.6.0-3.fc25.s390x
texlive-texlive.infra-svn41280-33.fc25.1.noarch
texlive-graphics-cfg-svn40269-33.fc25.1.noarch
texlive-bibtex-svn40768-33.fc25.1.noarch
texlive-mfware-bin-svn40473-33.20160520.fc25.1.s390x
texlive-texlive-scripts-bin-svn29741.0-33.20160520.fc25.1.noarch
texlive-sauerj-svn15878.0-33.fc25.1.noarch
texlive-enctex-svn34957.0-33.fc25.1.noarch
texlive-ifetex-svn24853.1.2-33.fc25.1.noarch
texlive-ntgclass-svn15878.2.1a-33.fc25.1.noarch
texlive-tex-gyre-math-svn41264-33.fc25.1.noarch
texlive-bera-svn20031.0-33.fc25.1.noarch
texlive-ms-svn29849.0-33.fc25.1.noarch
texlive-pst-fill-svn15878.1.01-33.fc25.1.noarch
texlive-ctable-svn38672-33.fc25.1.noarch
texlive-extsizes-svn17263.1.4a-33.fc25.1.noarch
texlive-collection-latexrecommended-svn35765.0-33.20160520.fc25.1.noarch
perl-Filter-1.57-1.fc25.s390x
krb5-workstation-1.14.4-7.fc25.s390x
python2-rpm-macros-3-12.fc25.noarch
libglvnd-egl-0.2.999-14.20170308git8e6e102.fc25.s390x
libglvnd-opengl-0.2.999-14.20170308git8e6e102.fc25.s390x
gdbm-1.13-1.fc25.s390x
nss-util-3.30.2-1.0.fc25.s390x
libcrypt-nss-2.24-9.fc25.s390x
libtasn1-4.12-1.fc25.s390x
fedora-release-25-2.noarch
gdb-headless-7.12.1-48.fc25.s390x
perl-macros-5.24.2-387.fc25.s390x
sqlite-devel-3.14.2-2.fc25.s390x
pcre-devel-8.41-1.fc25.s390x
libX11-1.6.5-1.fc25.s390x
coreutils-8.25-17.fc25.s390x
python2-openidc-client-0-3.20170523git77cb3ee.fc25.noarch
nss-sysinit-3.30.2-1.1.fc25.s390x
systemtap-client-3.1-5.fc25.s390x
nss-devel-3.30.2-1.1.fc25.s390x
firewalld-0.4.4.5-1.fc25.noarch
rpmlint-1.9-9.fc25.noarch
system-python-3.5.3-6.fc25.s390x
gpg-pubkey-efe550f5-5220ba41
gpg-pubkey-81b46521-55b3ca9a
filesystem-3.2-37.fc24.s390x
libffi-3.1-9.fc24.s390x
keyutils-libs-1.5.9-8.fc24.s390x
libnfnetlink-1.0.1-8.fc24.s390x
libtheora-1.1.1-14.fc24.s390x
xml-common-0.6.3-44.fc24.noarch
autoconf-2.69-22.fc24.noarch
libXt-1.1.5-3.fc24.s390x
kbd-legacy-2.0.3-3.fc24.noarch
ghostscript-fonts-5.50-35.fc24.noarch
libXevie-1.0.3-11.fc24.s390x
libcap-2.25-2.fc25.s390x
mpfr-3.1.5-1.fc25.s390x
perl-Carp-1.40-365.fc25.noarch
libmnl-1.0.4-1.fc25.s390x
perl-Unicode-EastAsianWidth-1.33-8.fc25.noarch
libwayland-cursor-1.12.0-1.fc25.s390x
python-krbV-1.0.90-12.fc25.s390x
python2-urllib3-1.15.1-3.fc25.noarch
fipscheck-1.4.1-11.fc25.s390x
libndp-1.6-1.fc25.s390x
gnupg2-2.1.13-2.fc25.s390x
libXfixes-5.0.3-1.fc25.s390x
adwaita-icon-theme-3.22.0-1.fc25.noarch
dconf-0.26.0-1.fc25.s390x
ncurses-devel-6.0-6.20160709.fc25.s390x
dejagnu-1.6-1.fc25.noarch
libstdc++-devel-6.3.1-1.fc25.s390x
device-mapper-1.02.136-3.fc25.s390x
subversion-1.9.5-1.fc25.s390x
libtool-ltdl-2.4.6-13.fc25.s390x
libevent-2.0.22-1.fc25.s390x
atk-devel-2.22.0-1.fc25.s390x
libev-4.24-1.fc25.s390x
xorg-x11-fonts-Type1-7.5-16.fc24.noarch
brlapi-devel-0.6.5-2.fc25.s390x
pulseaudio-libs-10.0-2.fc25.s390x
glib2-2.50.3-1.fc25.s390x
python2-rpm-4.13.0.1-1.fc25.s390x
dnf-1.1.10-6.fc25.noarch
texlive-metafont-bin-svn40987-33.20160520.fc25.1.s390x
texlive-xkeyval-svn35741.2.7a-33.fc25.1.noarch
texlive-euler-svn17261.2.5-33.fc25.1.noarch
texlive-mptopdf-svn41282-33.fc25.1.noarch
texlive-wasy-svn35831.0-33.fc25.1.noarch
texlive-avantgar-svn31835.0-33.fc25.1.noarch
texlive-eurosym-svn17265.1.4_subrfix-33.fc25.1.noarch
texlive-knuth-lib-svn35820.0-33.fc25.1.noarch
texlive-parallel-svn15878.0-33.fc25.1.noarch
texlive-texlive-msg-translations-svn41431-33.fc25.1.noarch
texlive-latex-svn40218-33.fc25.1.noarch
texlive-lualatex-math-svn40621-33.fc25.1.noarch
texlive-auto-pst-pdf-svn23723.0.6-33.fc25.1.noarch
texlive-powerdot-svn38984-33.fc25.1.noarch
texlive-wasysym-svn15878.2.0-33.fc25.1.noarch
ImageMagick-libs-6.9.3.0-6.fc25.s390x
geoclue2-2.4.5-1.fc25.s390x
perl-IO-Socket-IP-0.39-1.fc25.noarch
python2-pyasn1-0.2.3-1.fc25.noarch
libglvnd-0.2.999-14.20170308git8e6e102.fc25.s390x
libglvnd-gles-0.2.999-14.20170308git8e6e102.fc25.s390x
gdk-pixbuf2-devel-2.36.6-1.fc25.s390x
at-spi2-core-devel-2.22.1-1.fc25.s390x
libacl-2.2.52-13.fc25.s390x
perl-libs-5.24.2-387.fc25.s390x
mesa-libglapi-17.0.5-3.fc25.s390x
kernel-headers-4.11.10-200.fc25.s390x
p11-kit-devel-0.23.2-4.fc25.s390x
python3-rpmconf-1.0.19-1.fc25.noarch
sqlite-3.14.2-2.fc25.s390x
pcre-utf32-8.41-1.fc25.s390x
libX11-common-1.6.5-1.fc25.noarch
coreutils-common-8.25-17.fc25.s390x
mesa-libEGL-17.0.5-3.fc25.s390x
nss-3.30.2-1.1.fc25.s390x
systemtap-runtime-3.1-5.fc25.s390x
NetworkManager-glib-1.4.4-5.fc25.s390x
audit-2.7.7-1.fc25.s390x
perl-Time-HiRes-1.9742-1.fc25.s390x
libsolv-0.6.28-1.fc25.s390x
gpg-pubkey-34ec9cba-54e38751
gpg-pubkey-030d5aed-55b577f0
basesystem-11-2.fc24.noarch
libmpc-1.0.2-5.fc24.s390x
libunistring-0.9.4-3.fc24.s390x
libmodman-2.0.1-12.fc24.s390x
lsscsi-0.28-3.fc24.s390x
kbd-misc-2.0.3-3.fc24.noarch
kmod-23-1.fc25.s390x
newt-0.52.19-2.fc25.s390x
perl-Text-Unidecode-1.27-3.fc25.noarch
plymouth-core-libs-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
which-2.21-1.fc25.s390x
python3-slip-0.6.4-4.fc25.noarch
python3-systemd-232-1.fc25.s390x
python-lockfile-0.11.0-4.fc25.noarch
python2-requests-2.10.0-4.fc25.noarch
libnghttp2-1.13.0-2.fc25.s390x
python-urlgrabber-3.10.1-9.fc25.noarch
iputils-20161105-1.fc25.s390x
rest-0.8.0-1.fc25.s390x
adwaita-cursor-theme-3.22.0-1.fc25.noarch
authconfig-6.2.10-14.fc25.s390x
automake-1.15-7.fc25.noarch
shared-mime-info-1.8-1.fc25.s390x
pigz-2.3.4-1.fc25.s390x
device-mapper-libs-1.02.136-3.fc25.s390x
dnsmasq-2.76-2.fc25.s390x
fedora-packager-0.6.0.1-1.fc25.noarch
gcc-c++-6.3.1-1.fc25.s390x
libwebp-0.5.2-1.fc25.s390x
boost-system-1.60.0-10.fc25.s390x
libasyncns-0.8-10.fc24.s390x
libXau-devel-1.0.8-6.fc24.s390x
libverto-libev-0.2.6-6.fc24.s390x
python3-html5lib-0.999-9.fc25.noarch
ttmkfdir-3.0.9-48.fc24.s390x
pulseaudio-libs-glib2-10.0-2.fc25.s390x
wpa_supplicant-2.6-1.fc25.s390x
texlive-lib-2016-33.20160520.fc25.s390x
libXi-devel-1.7.9-1.fc25.s390x
python3-distro-1.0.3-1.fc25.noarch
rpm-plugin-systemd-inhibit-4.13.0.1-1.fc25.s390x
texlive-texlive-common-doc-svn40682-33.fc25.1.noarch
packagedb-cli-2.14.1-1.fc25.noarch
texlive-metafont-svn40793-33.fc25.1.noarch
texlive-tools-svn40934-33.fc25.1.noarch
texlive-enumitem-svn24146.3.5.2-33.fc25.1.noarch
texlive-mptopdf-bin-svn18674.0-33.20160520.fc25.1.noarch
texlive-underscore-svn18261.0-33.fc25.1.noarch
texlive-anysize-svn15878.0-33.fc25.1.noarch
texlive-euenc-svn19795.0.1h-33.fc25.1.noarch
texlive-kastrup-svn15878.0-33.fc25.1.noarch
texlive-paralist-svn39247-33.fc25.1.noarch
texlive-texlive-en-svn41185-33.fc25.1.noarch
texlive-tipa-svn29349.1.3-33.fc25.1.noarch
texlive-currfile-svn40725-33.fc25.1.noarch
texlive-pst-node-svn40743-33.fc25.1.noarch
texlive-pst-slpe-svn24391.1.31-33.fc25.1.noarch
texlive-typehtml-svn17134.0-33.fc25.1.noarch
SDL2-devel-2.0.5-3.fc25.s390x
libcroco-0.6.11-3.fc25.s390x
bluez-libs-devel-5.44-1.fc25.s390x
kernel-4.10.8-200.fc25.s390x
expat-2.2.1-1.fc25.s390x
system-python-libs-3.5.3-6.fc25.s390x
pcre2-10.23-8.fc25.s390x
firewalld-filesystem-0.4.4.5-1.fc25.noarch
pcre-cpp-8.41-1.fc25.s390x
python3-firewall-0.4.4.5-1.fc25.noarch
freetype-devel-2.6.5-9.fc25.s390x
pcre-utf16-8.41-1.fc25.s390x
linux-firmware-20170605-74.git37857004.fc25.noarch
distribution-gpg-keys-1.12-1.fc25.noarch
kernel-modules-4.11.10-200.fc25.s390x
gnutls-devel-3.5.14-1.fc25.s390x
systemtap-devel-3.1-5.fc25.s390x
java-1.8.0-openjdk-1.8.0.131-1.b12.fc25.s390x
polkit-0.113-8.fc25.s390x
perl-SelfLoader-1.23-387.fc25.noarch
libdb-utils-5.3.28-24.fc25.s390x
fontpackages-filesystem-1.44-17.fc24.noarch
groff-base-1.22.3-8.fc24.s390x
ilmbase-2.2.0-5.fc24.s390x
OpenEXR-libs-2.2.0-5.fc24.s390x
hesiod-3.2.1-6.fc24.s390x
sysfsutils-2.1.0-19.fc24.s390x
ocaml-srpm-macros-2-4.fc24.noarch
mailx-12.5-19.fc24.s390x
ncurses-libs-6.0-6.20160709.fc25.s390x
ipset-libs-6.29-1.fc25.s390x
gmp-devel-6.1.1-1.fc25.s390x
python-pip-8.1.2-2.fc25.noarch
harfbuzz-1.3.2-1.fc25.s390x
python2-iniparse-0.4-20.fc25.noarch
python3-iniparse-0.4-20.fc25.noarch
python3-kickstart-2.32-1.fc25.noarch
perl-Net-SSLeay-1.78-1.fc25.s390x
drpm-0.3.0-3.fc25.s390x
glib-networking-2.50.0-1.fc25.s390x
webkitgtk3-2.4.11-3.fc25.s390x
libXaw-1.0.13-4.fc25.s390x
xorg-x11-font-utils-7.5-32.fc25.s390x
hardlink-1.1-1.fc25.s390x
libcom_err-1.43.3-1.fc25.s390x
python2-dateutil-2.6.0-1.fc25.noarch
libXpm-3.5.12-1.fc25.s390x
python2-smmap-2.0.1-1.fc25.noarch
poppler-data-0.4.7-6.fc25.noarch
librbd1-10.2.4-2.fc25.s390x
perl-Digest-MD5-2.55-2.fc25.s390x
wayland-protocols-devel-1.7-1.fc25.noarch
texi2html-5.0-4.fc24.noarch
libxkbcommon-0.7.1-1.fc25.s390x
libuuid-devel-2.28.2-2.fc25.s390x
libcacard-2.5.3-1.fc25.s390x
libwmf-lite-0.2.8.4-50.fc25.s390x
texlive-tetex-svn41059-33.fc25.1.noarch
texlive-thumbpdf-svn34621.3.16-33.fc25.1.noarch
texlive-carlisle-svn18258.0-33.fc25.1.noarch
texlive-makeindex-bin-svn40473-33.20160520.fc25.1.s390x
texlive-pdftex-svn41149-33.fc25.1.noarch
texlive-csquotes-svn39538-33.fc25.1.noarch
texlive-courier-svn35058.0-33.fc25.1.noarch
texlive-helvetic-svn31835.0-33.fc25.1.noarch
texlive-mfnfss-svn19410.0-33.fc25.1.noarch
texlive-sepnum-svn20186.2.0-33.fc25.1.noarch
texlive-utopia-svn15878.0-33.fc25.1.noarch
texlive-luatexbase-svn38550-33.fc25.1.noarch
texlive-pst-3d-svn17257.1.10-33.fc25.1.noarch
texlive-latex-bin-bin-svn14050.0-33.20160520.fc25.1.noarch
texlive-l3experimental-svn41163-33.fc25.1.noarch
net-tools-2.0-0.40.20160329git.fc25.s390x
perl-Pod-Perldoc-3.28-1.fc25.noarch
openssl-1.0.2k-1.fc25.s390x
man-pages-4.06-4.fc25.noarch
python3-magic-5.29-4.fc25.noarch
libxml2-2.9.4-2.fc25.s390x
nss-softokn-3.30.2-1.0.fc25.s390x
p11-kit-trust-0.23.2-4.fc25.s390x
emacs-filesystem-25.2-2.fc25.noarch
python3-dateutil-2.6.0-1.fc25.noarch
perl-threads-shared-1.57-1.fc25.s390x
libnotify-0.7.7-1.fc25.s390x
unzip-6.0-32.fc25.s390x
pango-devel-1.40.5-1.fc25.s390x
libdrm-2.4.81-1.fc25.s390x
python-beautifulsoup4-4.6.0-1.fc25.noarch
libcurl-7.51.0-7.fc25.s390x
dhcp-client-4.3.5-3.fc25.s390x
python2-fedora-0.9.0-6.fc25.noarch
emacs-25.2-2.fc25.s390x
gdb-7.12.1-48.fc25.s390x
expat-devel-2.2.1-1.fc25.s390x
gpg-pubkey-95a43f54-5284415a
dejavu-fonts-common-2.35-3.fc24.noarch
libSM-1.2.2-4.fc24.s390x
diffutils-3.3-13.fc24.s390x
libogg-1.3.2-5.fc24.s390x
hunspell-en-US-0.20140811.1-5.fc24.noarch
libdaemon-0.14-10.fc24.s390x
patch-2.7.5-3.fc24.s390x
libsysfs-2.1.0-19.fc24.s390x
procmail-3.22-39.fc24.s390x
libXdamage-1.1.4-8.fc24.s390x
libotf-0.9.13-7.fc24.s390x
urw-fonts-2.4-22.fc24.noarch
crontabs-1.11-12.20150630git.fc24.noarch
ppp-2.4.7-9.fc24.s390x
cyrus-sasl-2.1.26-26.2.fc24.s390x
zlib-devel-1.2.8-10.fc24.s390x
time-1.7-49.fc24.s390x
gpg-pubkey-fdb19c98-56fd6333
libcap-ng-0.7.8-1.fc25.s390x
binutils-2.26.1-1.fc25.s390x
lcms2-2.8-2.fc25.s390x
libcomps-0.1.7-5.fc25.s390x
apr-1.5.2-4.fc25.s390x
perl-constant-1.33-367.fc25.noarch
perl-Data-Dumper-2.161-1.fc25.s390x
ipcalc-0.1.8-1.fc25.s390x
gmp-c++-6.1.1-1.fc25.s390x
fontconfig-2.12.1-1.fc25.s390x
enchant-1.6.0-14.fc25.s390x
pyliblzma-0.5.3-16.fc25.s390x
libsepol-devel-2.5-10.fc25.s390x
python3-ordered-set-2.0.0-4.fc25.noarch
python-ipaddress-1.0.16-3.fc25.noarch
python2-kerberos-1.2.5-1.fc25.s390x
python2-pysocks-1.5.6-5.fc25.noarch
fipscheck-lib-1.4.1-11.fc25.s390x
libatomic_ops-7.4.4-1.fc25.s390x
net-snmp-agent-libs-5.7.3-13.fc25.s390x
dracut-044-78.fc25.s390x
python2-pygpgme-0.3-18.fc25.s390x
orc-0.4.26-1.fc25.s390x
yum-utils-1.1.31-511.fc25.noarch
libXrender-0.9.10-1.fc25.s390x
libXrandr-1.5.1-1.fc25.s390x
go-srpm-macros-2-7.fc25.noarch
gnupg2-smime-2.1.13-2.fc25.s390x
guile-devel-2.0.13-1.fc25.s390x
uboot-tools-2016.09.01-2.fc25.s390x
pykickstart-2.32-1.fc25.noarch
python-bunch-1.0.1-9.fc25.noarch
perl-generators-1.10-1.fc25.noarch
perl-Mozilla-CA-20160104-3.fc25.noarch
bzip2-libs-1.0.6-21.fc25.s390x
libpng-1.6.27-1.fc25.s390x
desktop-file-utils-0.23-2.fc25.s390x
python2-cccolutils-1.4-1.fc25.s390x
python2-lxml-3.7.2-1.fc25.s390x
redhat-rpm-config-45-1.fc25.noarch
device-mapper-event-libs-1.02.136-3.fc25.s390x
lvm2-libs-2.02.167-3.fc25.s390x
python2-gitdb-2.0.0-1.fc25.noarch
gcc-gfortran-6.3.1-1.fc25.s390x
libselinux-python-2.5-13.fc25.s390x
openjpeg2-2.1.2-3.fc25.s390x
boost-thread-1.60.0-10.fc25.s390x
librbd-devel-10.2.4-2.fc25.s390x
libXcursor-devel-1.1.14-6.fc24.s390x
latex2html-2012-7.fc24.noarch
lksctp-tools-1.0.16-5.fc24.s390x
libfdt-1.4.2-1.fc25.s390x
libXft-devel-2.3.2-4.fc24.s390x
libattr-devel-2.4.47-16.fc24.s390x
libiscsi-devel-1.15.0-2.fc24.s390x
gettext-0.19.8.1-3.fc25.s390x
libjpeg-turbo-devel-1.5.1-0.fc25.s390x
pulseaudio-libs-devel-10.0-2.fc25.s390x
libepoxy-devel-1.4.1-1.fc25.s390x
krb5-libs-1.14.4-7.fc25.s390x
libmount-2.28.2-2.fc25.s390x
python3-decorator-4.0.11-1.fc25.noarch
rpm-plugin-selinux-4.13.0.1-1.fc25.s390x
tzdata-java-2017b-1.fc25.noarch
python-srpm-macros-3-12.fc25.noarch
libsmartcols-2.28.2-2.fc25.s390x
kernel-core-4.10.5-200.fc25.s390x
kernel-modules-4.10.5-200.fc25.s390x
texlive-kpathsea-svn41139-33.fc25.1.noarch
texlive-amsmath-svn41561-33.fc25.1.noarch
texlive-thumbpdf-bin-svn6898.0-33.20160520.fc25.1.noarch
texlive-psnfss-svn33946.9.2a-33.fc25.1.noarch
texlive-subfig-svn15878.1.3-33.fc25.1.noarch
texlive-fancybox-svn18304.1.4-33.fc25.1.noarch
texlive-lua-alt-getopt-svn29349.0.7.0-33.fc25.1.noarch
texlive-natbib-svn20668.8.31b-33.fc25.1.noarch
texlive-pdftex-bin-svn40987-33.20160520.fc25.1.s390x
texlive-xdvi-svn40768-33.fc25.1.noarch
texlive-crop-svn15878.1.5-33.fc25.1.noarch
texlive-babel-english-svn30264.3.3p-33.fc25.1.noarch
texlive-cmextra-svn32831.0-33.fc25.1.noarch
texlive-fancyhdr-svn15878.3.1-33.fc25.1.noarch
texlive-luatex-svn40963-33.fc25.1.noarch
texlive-knuth-local-svn38627-33.fc25.1.noarch
texlive-mflogo-font-svn36898.1.002-33.fc25.1.noarch
texlive-parskip-svn19963.2.0-33.fc25.1.noarch
texlive-section-svn20180.0-33.fc25.1.noarch
texlive-textcase-svn15878.0-33.fc25.1.noarch
texlive-updmap-map-svn41159-33.fc25.1.noarch
texlive-attachfile-svn38830-33.fc25.1.noarch
libglvnd-glx-0.2.999-14.20170308git8e6e102.fc25.s390x
libglvnd-core-devel-0.2.999-14.20170308git8e6e102.fc25.s390x
python-magic-5.29-4.fc25.noarch
glibc-common-2.24-9.fc25.s390x
sqlite-libs-3.14.2-2.fc25.s390x
libtiff-4.0.8-1.fc25.s390x
libdb-5.3.28-24.fc25.s390x
glusterfs-client-xlators-3.10.4-1.fc25.s390x
nss-util-devel-3.30.2-1.0.fc25.s390x
gnutls-3.5.14-1.fc25.s390x
bind-license-9.10.5-2.P2.fc25.noarch
mesa-libGLES-17.0.5-3.fc25.s390x
python3-requests-kerberos-0.10.0-2.fc25.noarch
python3-pyOpenSSL-16.2.0-1.fc25.noarch
perl-threads-2.16-1.fc25.s390x
cryptsetup-libs-1.7.5-1.fc25.s390x
vim-minimal-8.0.705-1.fc25.s390x
netpbm-10.79.00-1.fc25.s390x
qrencode-libs-3.4.4-1.fc25.s390x
mariadb-config-10.1.24-3.fc25.s390x
gstreamer1-plugins-base-1.10.5-1.fc25.s390x
elfutils-default-yama-scope-0.169-1.fc25.noarch
glusterfs-3.10.4-1.fc25.s390x
systemd-udev-231-17.fc25.s390x
python2-koji-1.13.0-2.fc25.noarch
unbound-libs-1.6.3-1.fc25.s390x
openldap-2.4.44-11.fc25.s390x
koji-1.13.0-2.fc25.noarch
bind99-libs-9.9.10-2.P3.fc25.s390x
libcurl-devel-7.51.0-7.fc25.s390x
mesa-libGL-devel-17.0.5-3.fc25.s390x
python2-sssdconfig-1.15.2-5.fc25.noarch
webkitgtk4-plugin-process-gtk2-2.16.5-1.fc25.s390x
graphite2-devel-1.3.10-1.fc25.s390x
systemtap-sdt-devel-3.1-5.fc25.s390x
iproute-tc-4.11.0-1.fc25.s390x
libarchive-3.2.2-2.fc25.s390x
publicsuffix-list-dafsa-20170424-1.fc25.noarch
texlive-luaotfload-svn40902-33.fc25.1.noarch
texlive-unicode-math-svn38462-33.fc25.1.noarch
texlive-fancyvrb-svn18492.2.8-33.fc25.1.noarch
texlive-pst-pdf-bin-svn7838.0-33.20160520.fc25.1.noarch
texlive-amscls-svn36804.0-33.fc25.1.noarch
texlive-ltxmisc-svn21927.0-33.fc25.1.noarch
texlive-breqn-svn38099.0.98d-33.fc25.1.noarch
texlive-xetex-def-svn40327-33.fc25.1.noarch
openssh-server-7.4p1-4.fc25.s390x
sendmail-8.15.2-8.fc25.s390x
tzdata-2017b-1.fc25.noarch
hunspell-1.4.1-2.fc25.s390x
gpg-pubkey-8e1431d5-53bcbac7
zlib-1.2.8-10.fc24.s390x
sed-4.2.2-15.fc24.s390x
psmisc-22.21-8.fc24.s390x
gpm-libs-1.20.7-9.fc24.s390x
zip-3.0-16.fc24.s390x
libyubikey-1.13-2.fc24.s390x
sg3_utils-libs-1.41-3.fc24.s390x
polkit-pkla-compat-0.1-7.fc24.s390x
passwd-0.79-8.fc24.s390x
trousers-0.3.13-6.fc24.s390x
grubby-8.40-3.fc24.s390x
rootfiles-8.1-19.fc24.noarch
nettle-3.3-1.fc25.s390x
libksba-1.3.5-1.fc25.s390x
perl-Text-ParseWords-3.30-365.fc25.noarch
perl-PathTools-3.63-366.fc25.s390x
perl-File-Temp-0.23.04-365.fc25.noarch
fuse-libs-2.9.7-1.fc25.s390x
perl-Pod-Escapes-1.07-365.fc25.noarch
perl-Term-ANSIColor-4.05-2.fc25.noarch
perl-URI-1.71-5.fc25.noarch
libXfont-1.5.2-1.fc25.s390x
python-six-1.10.0-3.fc25.noarch
dbus-glib-0.108-1.fc25.s390x
gobject-introspection-1.50.0-1.fc25.s390x
libpwquality-1.3.0-6.fc25.s390x
python-gobject-base-3.22.0-1.fc25.s390x
python-html5lib-0.999-9.fc25.noarch
python3-dbus-1.2.4-2.fc25.s390x
python3-chardet-2.3.0-1.fc25.noarch
python3-urllib3-1.15.1-3.fc25.noarch
python-offtrac-0.1.0-7.fc25.noarch
python2-cryptography-1.5.3-3.fc25.s390x
python2-requests-kerberos-0.10.0-2.fc25.noarch
libserf-1.3.9-1.fc25.s390x
libdatrie-0.2.9-3.fc25.s390x
s390utils-base-1.36.0-1.fc25.s390x
kpartx-0.4.9-83.fc25.s390x
s390utils-cpuplugd-1.36.0-1.fc25.s390x
s390utils-osasnmpd-1.36.0-1.fc25.s390x
python-dnf-plugins-extras-common-0.0.12-4.fc25.noarch
fpc-srpm-macros-1.0-1.fc25.noarch
libuser-0.62-4.fc25.s390x
man-db-2.7.5-3.fc25.s390x
python-systemd-doc-232-1.fc25.s390x
lz4-1.7.5-1.fc25.s390x
tar-1.29-3.fc25.s390x
bodhi-client-0.9.12.2-6.fc25.noarch
cairo-1.14.8-1.fc25.s390x
gcc-go-6.3.1-1.fc25.s390x
cracklib-dicts-2.9.6-4.fc25.s390x
libselinux-python3-2.5-13.fc25.s390x
python2-enchant-1.6.8-1.fc25.noarch
boost-iostreams-1.60.0-10.fc25.s390x
userspace-rcu-0.9.2-2.fc25.s390x
libXext-devel-1.3.3-4.fc24.s390x
libXrandr-devel-1.5.1-1.fc25.s390x
perl-XML-XPath-1.39-1.fc25.noarch
python3-lxml-3.7.2-1.fc25.s390x
libiscsi-1.15.0-2.fc24.s390x
fontconfig-devel-2.12.1-1.fc25.s390x
libfdt-devel-1.4.2-1.fc25.s390x
ceph-devel-compat-10.2.4-2.fc25.s390x
zlib-static-1.2.8-10.fc24.s390x
chrpath-0.16-3.fc24.s390x
info-6.1-4.fc25.s390x
iptables-libs-1.6.0-3.fc25.s390x
libfdisk-2.28.2-2.fc25.s390x
dnf-plugins-core-0.1.21-5.fc25.noarch
perl-Storable-2.56-368.fc25.s390x
python2-decorator-4.0.11-1.fc25.noarch
libnetfilter_conntrack-1.0.6-2.fc25.s390x
texlive-texlive.infra-bin-svn40312-33.20160520.fc25.1.s390x
texlive-ifluatex-svn41346-33.fc25.1.noarch
texlive-fp-svn15878.0-33.fc25.1.noarch
texlive-latex-fonts-svn28888.0-33.fc25.1.noarch
texlive-bibtex-bin-svn40473-33.20160520.fc25.1.s390x
texlive-glyphlist-svn28576.0-33.fc25.1.noarch
texlive-marvosym-svn29349.2.2a-33.fc25.1.noarch
texlive-tex-bin-svn40987-33.20160520.fc25.1.s390x
texlive-texconfig-svn40768-33.fc25.1.noarch
texlive-wasy2-ps-svn35830.0-33.fc25.1.noarch
texlive-psfrag-svn15878.3.04-33.fc25.1.noarch
texlive-charter-svn15878.0-33.fc25.1.noarch
texlive-ec-svn25033.1.0-33.fc25.1.noarch
texlive-lineno-svn21442.4.41-33.fc25.1.noarch
texlive-hyphen-base-svn41138-33.fc25.1.noarch
texlive-manfnt-font-svn35799.0-33.fc25.1.noarch
texlive-ncntrsbk-svn31835.0-33.fc25.1.noarch
texlive-pst-math-svn34786.0.63-33.fc25.1.noarch
texlive-symbol-svn31835.0-33.fc25.1.noarch
texlive-environ-svn33821.0.3-33.fc25.1.noarch
texlive-algorithms-svn38085.0.1-33.fc25.1.noarch
kernel-core-4.10.8-200.fc25.s390x
libglvnd-devel-0.2.999-14.20170308git8e6e102.fc25.s390x
python3-hawkey-0.6.4-3.fc25.s390x
glibc-all-langpacks-2.24-9.fc25.s390x
freetype-2.6.5-9.fc25.s390x
mesa-libwayland-egl-17.0.5-3.fc25.s390x
libicu-57.1-5.fc25.s390x
nspr-devel-4.14.0-2.fc25.s390x
libnl3-cli-3.2.29-3.fc25.s390x
cups-libs-2.2.0-9.fc25.s390x
bind-libs-lite-9.10.5-2.P2.fc25.s390x
ca-certificates-2017.2.14-1.0.fc25.noarch
python3-kerberos-1.2.5-1.fc25.s390x
python3-cryptography-1.5.3-3.fc25.s390x
perl-IO-1.36-387.fc25.s390x
dhcp-libs-4.3.5-3.fc25.s390x
rsync-3.1.2-4.fc25.s390x
make-4.1-6.fc25.s390x
pcre2-devel-10.23-8.fc25.s390x
quota-4.03-8.fc25.s390x
libX11-devel-1.6.5-1.fc25.s390x
ghostscript-9.20-9.fc25.s390x
dbus-1.11.14-1.fc25.s390x
rpcbind-0.2.4-6.rc2.fc25.s390x
pyOpenSSL-16.2.0-1.fc25.noarch
glusterfs-devel-3.10.4-1.fc25.s390x
nss-tools-3.30.2-1.1.fc25.s390x
python3-pycurl-7.43.0-6.fc25.s390x
bind99-license-9.9.10-2.P3.fc25.noarch
curl-7.51.0-7.fc25.s390x
glusterfs-api-devel-3.10.4-1.fc25.s390x
python-firewall-0.4.4.5-1.fc25.noarch
netpbm-progs-10.79.00-1.fc25.s390x
libsndfile-1.0.28-3.fc25.s390x
python3-sssdconfig-1.15.2-5.fc25.noarch
wget-1.18-3.fc25.s390x
libsemanage-2.5-9.fc25.s390x
telnet-0.17-68.fc25.s390x
texlive-ifplatform-svn21156.0.4-33.fc25.1.noarch
texlive-eso-pic-svn37925.2.0g-33.fc25.1.noarch
texlive-xcolor-svn41044-33.fc25.1.noarch
texlive-pst-eps-svn15878.1.0-33.fc25.1.noarch
texlive-pst-text-svn15878.1.00-33.fc25.1.noarch
texlive-rotating-svn16832.2.16b-33.fc25.1.noarch
texlive-pdfpages-svn40638-33.fc25.1.noarch
texlive-cm-super-svn15878.0-33.fc25.1.noarch
texlive-xetex-svn41438-33.fc25.1.noarch
dnf-yum-1.1.10-6.fc25.noarch
libseccomp-devel-2.3.2-1.fc25.s390x
gpgme-1.8.0-10.fc25.s390x
apr-util-1.5.4-3.fc24.s390x
jbigkit-libs-2.1-5.fc24.s390x
pixman-0.34.0-2.fc24.s390x
dwz-0.12-2.fc24.s390x
expect-5.45-22.fc24.s390x
libsigsegv-2.10-10.fc24.s390x
fakeroot-libs-1.20.2-4.fc24.s390x
m17n-lib-1.7.0-5.fc24.s390x
libverto-0.2.6-6.fc24.s390x
libXmu-1.1.2-4.fc24.s390x
libXcursor-1.1.14-6.fc24.s390x
python-kitchen-1.2.4-2.fc24.noarch
fakeroot-1.20.2-4.fc24.s390x
blktrace-1.1.0-3.fc24.s390x
usermode-1.111-8.fc24.s390x
kbd-2.0.3-3.fc24.s390x
libaio-devel-0.3.110-6.fc24.s390x
web-assets-filesystem-5-4.fc24.noarch
libgpg-error-1.24-1.fc25.s390x
findutils-4.6.0-8.fc25.s390x
libassuan-2.4.3-1.fc25.s390x
libusbx-1.0.21-1.fc25.s390x
libxslt-1.1.28-13.fc25.s390x
libmetalink-0.1.3-1.fc25.s390x
perl-MIME-Base64-3.15-365.fc25.s390x
ncurses-6.0-6.20160709.fc25.s390x
libwayland-server-1.12.0-1.fc25.s390x
perl-Fedora-VSP-0.001-4.fc25.noarch
perl-libintl-perl-1.26-1.fc25.s390x
shadow-utils-4.2.1-11.fc25.s390x
atk-2.22.0-1.fc25.s390x
pam-1.3.0-1.fc25.s390x
harfbuzz-icu-1.3.2-1.fc25.s390x
libsecret-0.18.5-2.fc25.s390x
s390utils-iucvterm-1.36.0-1.fc25.s390x
python3-requests-2.10.0-4.fc25.noarch
pyusb-1.0.0-2.fc25.noarch
python-enum34-1.0.4-6.fc25.noarch
pyxattr-0.5.3-8.fc25.s390x
libbabeltrace-1.4.0-3.fc25.s390x
libthai-0.1.25-1.fc25.s390x
deltarpm-3.6-17.fc25.s390x
s390utils-mon_statd-1.36.0-1.fc25.s390x
device-mapper-multipath-0.4.9-83.fc25.s390x
python3-pygpgme-0.3-18.fc25.s390x
libreport-filesystem-2.8.0-1.fc25.s390x
ghc-srpm-macros-1.4.2-4.fc25.noarch
rpmdevtools-8.9-1.fc25.noarch
python-dnf-plugins-extras-migrate-0.0.12-4.fc25.noarch
perl-IO-Socket-SSL-2.038-1.fc25.noarch
perl-File-ShareDir-1.102-7.fc25.noarch
tcl-8.6.6-1.fc25.s390x
bzip2-1.0.6-21.fc25.s390x
libss-1.43.3-1.fc25.s390x
libselinux-utils-2.5-13.fc25.s390x
python3-enchant-1.6.8-1.fc25.noarch
python2-dockerfile-parse-0.0.5-7.fc25.noarch
systemd-bootchart-231-2.fc25.s390x
gcc-objc-6.3.1-1.fc25.s390x
e2fsprogs-1.43.3-1.fc25.s390x
libstdc++-static-6.3.1-1.fc25.s390x
libpng-devel-1.6.27-1.fc25.s390x
perl-XML-Parser-2.44-5.fc25.s390x
lttng-ust-2.8.1-2.fc25.s390x
libXfixes-devel-5.0.3-1.fc25.s390x
libXcomposite-devel-0.4.4-8.fc24.s390x
python3-javapackages-4.7.0-6.1.fc25.noarch
libcephfs_jni-devel-10.2.4-2.fc25.s390x
keyutils-libs-devel-1.5.9-8.fc24.s390x
harfbuzz-devel-1.3.2-1.fc25.s390x
libidn-devel-1.33-1.fc25.s390x
libnfs-1.9.8-2.fc24.s390x
libssh2-devel-1.8.0-1.fc25.s390x
qemu-sanity-check-nodeps-1.1.5-5.fc24.s390x
alsa-lib-devel-1.1.1-2.fc25.s390x
libpsl-0.17.0-1.fc25.s390x
libseccomp-2.3.2-1.fc25.s390x
copy-jdk-configs-2.2-2.fc25.noarch
json-glib-1.2.6-1.fc25.s390x
python2-dnf-1.1.10-6.fc25.noarch
python2-GitPython-2.1.3-1.fc25.noarch
texlive-tetex-bin-svn36770.0-33.20160520.fc25.1.noarch
texlive-amsfonts-svn29208.3.04-33.fc25.1.noarch
texlive-babel-svn40706-33.fc25.1.noarch
texlive-colortbl-svn29803.v1.0a-33.fc25.1.noarch
texlive-babelbib-svn25245.1.31-33.fc25.1.noarch
texlive-footmisc-svn23330.5.5b-33.fc25.1.noarch
texlive-makeindex-svn40768-33.fc25.1.noarch
texlive-plain-svn40274-33.fc25.1.noarch
texlive-texconfig-bin-svn29741.0-33.20160520.fc25.1.noarch
texlive-zapfding-svn31835.0-33.fc25.1.noarch
texlive-microtype-svn41127-33.fc25.1.noarch
texlive-bookman-svn31835.0-33.fc25.1.noarch
texlive-dvisvgm-def-svn41011-33.fc25.1.noarch
texlive-finstrut-svn21719.0.5-33.fc25.1.noarch
texlive-hyph-utf8-svn41189-33.fc25.1.noarch
texlive-lualibs-svn40370-33.fc25.1.noarch
kernel-modules-4.10.8-200.fc25.s390x
python2-hawkey-0.6.4-3.fc25.s390x
glibc-2.24-9.fc25.s390x
elfutils-libelf-0.169-1.fc25.s390x
libsoup-2.56.0-3.fc25.s390x
libnl3-3.2.29-3.fc25.s390x
gstreamer1-1.10.5-1.fc25.s390x
polkit-libs-0.113-8.fc25.s390x
libtirpc-1.0.2-0.fc25.s390x
emacs-common-25.2-2.fc25.s390x
libteam-1.27-1.fc25.s390x
python3-3.5.3-6.fc25.s390x
python3-pyasn1-0.2.3-1.fc25.noarch
perl-File-Path-2.12-366.fc25.noarch
mesa-libwayland-egl-devel-17.0.5-3.fc25.s390x
libacl-devel-2.2.52-13.fc25.s390x
lua-libs-5.3.4-3.fc25.s390x
pcre2-utf32-10.23-8.fc25.s390x
quota-nls-4.03-8.fc25.noarch
gtk3-3.22.16-1.fc25.s390x
ghostscript-x11-9.20-9.fc25.s390x
systemd-231-17.fc25.s390x
glusterfs-api-3.10.4-1.fc25.s390x
glusterfs-extra-xlators-3.10.4-1.fc25.s390x
glusterfs-server-3.10.4-1.fc25.s390x
java-1.8.0-openjdk-headless-1.8.0.131-1.b12.fc25.s390x
git-2.9.4-1.fc25.s390x
dhcp-common-4.3.5-3.fc25.noarch
python2-rpkg-1.49-5.fc25.noarch
vte291-devel-0.46.2-1.fc25.s390x
python-devel-2.7.13-2.fc25.s390x
elfutils-0.169-1.fc25.s390x
lua-5.3.4-3.fc25.s390x
python3-beautifulsoup4-4.6.0-1.fc25.noarch
libmicrohttpd-0.9.55-1.fc25.s390x
screen-4.6.1-1.fc25.s390x
strace-4.18-1.fc25.s390x
texlive-mparhack-svn15878.1.4-33.fc25.1.noarch
texlive-pspicture-svn15878.0-33.fc25.1.noarch
texlive-soul-svn15878.2.4-33.fc25.1.noarch
texlive-trimspaces-svn15878.1.1-33.fc25.1.noarch
texlive-varwidth-svn24104.0.92-33.fc25.1.noarch
texlive-geometry-svn19716.5.6-33.fc25.1.noarch
texlive-memoir-svn41203-33.fc25.1.noarch
texlive-pgf-svn40966-33.fc25.1.noarch
texlive-pst-coil-svn37377.1.07-33.fc25.1.noarch
texlive-pst-plot-svn41242-33.fc25.1.noarch
texlive-latex-bin-svn41438-33.fc25.1.noarch
texlive-ucs-svn35853.2.2-33.fc25.1.noarch
texlive-ae-svn15878.1.4-33.fc25.1.noarch
texlive-xetex-bin-svn41091-33.20160520.fc25.1.s390x
fedora-upgrade-26.1-1.fc25.noarch
fedpkg-1.28-1.fc25.noarch
perl-Thread-Queue-3.12-1.fc25.noarch
cdparanoia-libs-10.2-21.fc24.s390x
ustr-1.0.4-21.fc24.s390x
libusb-0.1.5-7.fc24.s390x
readline-devel-6.3-8.fc24.s390x
chkconfig-1.8-1.fc25.s390x
avahi-libs-0.6.32-4.fc25.s390x
perl-Unicode-Normalize-1.25-365.fc25.s390x
perl-libnet-3.10-1.fc25.noarch
perl-podlators-4.09-1.fc25.noarch
dbus-python-1.2.4-2.fc25.s390x
libgnome-keyring-3.12.0-7.fc25.s390x
python-backports-1.0-8.fc25.s390x
python-pycparser-2.14-7.fc25.noarch
plymouth-scripts-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
cronie-1.5.1-2.fc25.s390x
python2-librepo-1.7.18-3.fc25.s390x
libXv-1.0.11-1.fc25.s390x
python2-ndg_httpsclient-0.4.0-4.fc25.noarch
btrfs-progs-4.6.1-1.fc25.s390x
libgcc-6.3.1-1.fc25.s390x
libgomp-6.3.1-1.fc25.s390x
perl-Encode-2.88-5.fc25.s390x
cracklib-2.9.6-4.fc25.s390x
libobjc-6.3.1-1.fc25.s390x
gcc-6.3.1-1.fc25.s390x
python3-dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
boost-random-1.60.0-10.fc25.s390x
libref_array-0.1.5-29.fc25.s390x
libXrender-devel-0.9.10-1.fc25.s390x
javapackages-tools-4.7.0-6.1.fc25.noarch
keyutils-1.5.9-8.fc24.s390x
libcom_err-devel-1.43.3-1.fc25.s390x
lzo-minilzo-2.08-8.fc24.s390x
libusbx-devel-1.0.21-1.fc25.s390x
virglrenderer-devel-0.5.0-1.20160411git61846f92f.fc25.s390x
acpica-tools-20160831-1.fc25.s390x
grep-2.27-2.fc25.s390x
dnf-conf-1.1.10-6.fc25.noarch
crypto-policies-20160921-4.gitf3018dd.fc25.noarch
rpm-build-libs-4.13.0.1-1.fc25.s390x
libnfsidmap-0.27-1.fc25.s390x
SDL2-2.0.5-3.fc25.s390x
texlive-etex-pkg-svn39355-33.fc25.1.noarch
texlive-multido-svn18302.1.42-33.fc25.1.noarch
texlive-gsftopk-svn40768-33.fc25.1.noarch
texlive-pst-ovl-svn40873-33.fc25.1.noarch
texlive-ltabptch-svn17533.1.74d-33.fc25.1.noarch
texlive-cite-svn36428.5.5-33.fc25.1.noarch
texlive-fpl-svn15878.1.002-33.fc25.1.noarch
texlive-mathpazo-svn15878.1.003-33.fc25.1.noarch
texlive-rcs-svn15878.0-33.fc25.1.noarch
texlive-type1cm-svn21820.0-33.fc25.1.noarch
texlive-l3kernel-svn41246-33.fc25.1.noarch
texlive-hyperref-svn41396-33.fc25.1.noarch
texlive-pst-tree-svn24142.1.12-33.fc25.1.noarch
texlive-sansmathaccent-svn30187.0-33.fc25.1.noarch
texlive-dvipdfmx-bin-svn40273-33.20160520.fc25.1.s390x
texlive-zapfchan-svn31835.0-33.fc25.1.noarch
glib2-static-2.50.3-1.fc25.s390x
bash-completion-2.5-1.fc25.noarch
glusterfs-libs-3.10.4-1.fc25.s390x
p11-kit-0.23.2-4.fc25.s390x
hyphen-2.8.8-4.fc24.s390x
gnutls-c++-3.5.14-1.fc25.s390x
python3-idna-2.5-1.fc25.noarch
nss-softokn-devel-3.30.2-1.0.fc25.s390x
less-481-7.fc25.s390x
rpmconf-base-1.0.19-1.fc25.noarch
gtk2-2.24.31-2.fc25.s390x
mesa-libgbm-17.0.5-3.fc25.s390x
nfs-utils-2.1.1-5.rc4.fc25.s390x
perl-Git-2.9.4-1.fc25.noarch
mock-1.4.2-1.fc25.noarch
mc-4.8.19-5.fc25.s390x
pcre-static-8.41-1.fc25.s390x
bind-libs-9.10.5-2.P2.fc25.s390x
libproxy-0.4.15-2.fc25.s390x
gpg-pubkey-a29cb19c-53bcbba6
m4-1.4.17-9.fc24.s390x
liblockfile-1.09-4.fc24.s390x
sg3_utils-1.41-3.fc24.s390x
libXinerama-1.1.3-6.fc24.s390x
libXft-2.3.2-4.fc24.s390x
tcp_wrappers-libs-7.6-83.fc25.s390x
perl-Text-Tabs+Wrap-2013.0523-365.fc25.noarch
perl-Error-0.17024-7.fc25.noarch
perl-Term-Cap-1.17-365.fc25.noarch
perl-Pod-Usage-1.69-1.fc25.noarch
device-mapper-persistent-data-0.6.3-1.fc25.s390x
net-snmp-libs-5.7.3-13.fc25.s390x
python3-six-1.10.0-3.fc25.noarch
python3-pysocks-1.5.6-5.fc25.noarch
python-chardet-2.3.0-1.fc25.noarch
python2-cffi-1.7.0-2.fc25.s390x
gc-devel-7.4.4-1.fc25.s390x
plymouth-0.9.3-0.6.20160620git0e65b86c.fc25.s390x
ebtables-2.0.10-21.fc25.s390x
python3-librepo-1.7.18-3.fc25.s390x
net-snmp-5.7.3-13.fc25.s390x
at-spi2-atk-2.22.0-1.fc25.s390x
avahi-autoipd-0.6.32-4.fc25.s390x
libgo-6.3.1-1.fc25.s390x
cpp-6.3.1-1.fc25.s390x
pyparsing-2.1.10-1.fc25.noarch
python3-pyparsing-2.1.10-1.fc25.noarch
libcollection-0.7.0-29.fc25.s390x
libcephfs-devel-10.2.4-2.fc25.s390x
libXdamage-devel-1.1.4-8.fc24.s390x
libverto-devel-0.2.6-6.fc24.s390x
snappy-1.1.3-2.fc24.s390x
cairo-gobject-devel-1.14.8-1.fc25.s390x
cyrus-sasl-devel-2.1.26-26.2.fc24.s390x
libXi-1.7.9-1.fc25.s390x
texlive-base-2016-33.20160520.fc25.noarch
python3-rpm-4.13.0.1-1.fc25.s390x
texlive-booktabs-svn40846-33.fc25.1.noarch
texlive-lm-svn28119.2.004-33.fc25.1.noarch
texlive-gsftopk-bin-svn40473-33.20160520.fc25.1.s390x
texlive-tex-svn40793-33.fc25.1.noarch
texlive-fancyref-svn15878.0.9c-33.fc25.1.noarch
texlive-chngcntr-svn17157.1.0a-33.fc25.1.noarch
texlive-fix2col-svn38770-33.fc25.1.noarch
texlive-marginnote-svn41382-33.fc25.1.noarch
texlive-pxfonts-svn15878.0-33.fc25.1.noarch
texlive-txfonts-svn15878.0-33.fc25.1.noarch
texlive-l3packages-svn41246-33.fc25.1.noarch
texlive-oberdiek-svn41346-33.fc25.1.noarch
texlive-pst-tools-svn34067.0.05-33.fc25.1.noarch
texlive-tex-gyre-svn18651.2.004-33.fc25.1.noarch
texlive-dvipdfmx-svn41149-33.fc25.1.noarch
texlive-collection-fontsrecommended-svn35830.0-33.20160520.fc25.1.noarch
libcacard-devel-2.5.3-1.fc25.s390x
ykpers-1.18.0-2.fc25.s390x
python2-idna-2.5-1.fc25.noarch
file-libs-5.29-4.fc25.s390x
policycoreutils-2.5-20.fc25.s390x
libgcrypt-1.7.8-1.fc25.s390x
pcre-8.41-1.fc25.s390x
GeoIP-1.6.11-1.fc25.s390x
ghostscript-core-9.20-9.fc25.s390x
python3-cffi-1.7.0-2.fc25.s390x
nss-softokn-freebl-devel-3.30.2-1.0.fc25.s390x
json-c-0.12.1-2.fc25.s390x
vim-common-8.0.705-1.fc25.s390x
vte291-0.46.2-1.fc25.s390x
libdrm-devel-2.4.81-1.fc25.s390x
gssproxy-0.7.0-9.fc25.s390x
git-core-doc-2.9.4-1.fc25.s390x
systemtap-3.1-5.fc25.s390x
mesa-libgbm-devel-17.0.5-3.fc25.s390x
vim-enhanced-8.0.705-1.fc25.s390x
glibc-static-2.24-9.fc25.s390x
libgusb-0.2.10-1.fc25.s390x
python-async-0.6.1-9.fc22.s390x
dejavu-sans-mono-fonts-2.35-3.fc24.noarch
popt-1.16-7.fc24.s390x
cyrus-sasl-lib-2.1.26-26.2.fc24.s390x
xz-5.2.2-2.fc24.s390x
libpipeline-1.4.1-2.fc24.s390x
pinentry-0.9.7-2.fc24.s390x
pth-2.0.7-27.fc24.s390x
libsepol-2.5-10.fc25.s390x
libxcb-1.12-1.fc25.s390x
perl-Getopt-Long-2.49.1-1.fc25.noarch
avahi-glib-0.6.32-4.fc25.s390x
python3-pip-8.1.2-2.fc25.noarch
python3-libcomps-0.1.7-5.fc25.s390x
python-slip-0.6.4-4.fc25.noarch
python2-libcomps-0.1.7-5.fc25.s390x
gc-7.4.4-1.fc25.s390x
s390utils-cmsfs-1.36.0-1.fc25.s390x
newt-python-0.52.19-2.fc25.s390x
qt5-srpm-macros-5.7.1-1.fc25.noarch
device-mapper-event-1.02.136-3.fc25.s390x
perl-Class-Inspector-1.31-2.fc25.noarch
libbasicobjects-0.1.1-29.fc25.s390x
libradosstriper1-10.2.4-2.fc25.s390x
libXxf86vm-devel-1.1.4-3.fc24.s390x
zziplib-0.13.62-7.fc24.s390x
libpaper-1.1.24-12.fc24.s390x
libini_config-1.3.0-29.fc25.s390x
snappy-devel-1.1.3-2.fc24.s390x
libcap-ng-devel-0.7.8-1.fc25.s390x
libxkbcommon-devel-0.7.1-1.fc25.s390x
openssl-libs-1.0.2k-1.fc25.s390x
libkadm5-1.14.4-7.fc25.s390x
rpm-libs-4.13.0.1-1.fc25.s390x
util-linux-2.28.2-2.fc25.s390x
texlive-etoolbox-svn38031.2.2a-33.fc25.1.noarch
texlive-dvips-svn41149-33.fc25.1.noarch
texlive-latexconfig-svn40274-33.fc25.1.noarch
texlive-tex-ini-files-svn40533-33.fc25.1.noarch
texlive-qstest-svn15878.0-33.fc25.1.noarch
texlive-cmap-svn41168-33.fc25.1.noarch
texlive-luatex-bin-svn41091-33.20160520.fc25.1.s390x
texlive-mflogo-svn38628-33.fc25.1.noarch
texlive-sansmath-svn17997.1.1-33.fc25.1.noarch
texlive-unicode-data-svn39808-33.fc25.1.noarch
texlive-luaotfload-bin-svn34647.0-33.20160520.fc25.1.noarch
texlive-listings-svn37534.1.6-33.fc25.1.noarch
texlive-pstricks-svn41321-33.fc25.1.noarch
texlive-metalogo-svn18611.0.12-33.fc25.1.noarch
texlive-collection-latex-svn41011-33.20160520.fc25.1.noarch
kernel-4.10.5-200.fc25.s390x
python2-dnf-plugins-core-0.1.21-5.fc25.noarch
xkeyboard-config-2.20-2.fc25.noarch
file-5.29-4.fc25.s390x
perl-Test-Harness-3.39-1.fc25.noarch
systemd-libs-231-17.fc25.s390x
webkitgtk4-jsc-2.16.5-1.fc25.s390x
gtk-update-icon-cache-3.22.16-1.fc25.s390x
glibc-devel-2.24-9.fc25.s390x
python3-pycparser-2.14-7.fc25.noarch
kernel-devel-4.11.10-200.fc25.s390x
gsm-1.0.17-1.fc25.s390x
vim-filesystem-8.0.705-1.fc25.s390x
webkitgtk4-2.16.5-1.fc25.s390x
python-2.7.13-2.fc25.s390x
glusterfs-fuse-3.10.4-1.fc25.s390x
git-core-2.9.4-1.fc25.s390x
selinux-policy-targeted-3.13.1-225.18.fc25.noarch
kernel-4.11.10-200.fc25.s390x
rpmconf-1.0.19-1.fc25.noarch
teamd-1.27-1.fc25.s390x
jasper-libs-1.900.13-4.fc25.s390x
libattr-2.4.47-16.fc24.s390x
libvisual-0.4.0-20.fc24.s390x
libpcap-1.7.4-2.fc24.s390x
libutempter-1.1.6-8.fc24.s390x
libgudev-230-3.fc24.s390x
popt-devel-1.16-7.fc24.s390x
hicolor-icon-theme-0.15-3.fc24.noarch
setup-2.10.4-1.fc25.noarch
bash-4.3.43-4.fc25.s390x
libjpeg-turbo-1.5.1-0.fc25.s390x
perl-Socket-2.024-1.fc25.s390x
perl-HTTP-Tiny-0.070-1.fc25.noarch
ipset-6.29-1.fc25.s390x
python2-setuptools-25.1.1-1.fc25.noarch
gsettings-desktop-schemas-3.22.0-1.fc25.s390x
python3-setuptools-25.1.1-1.fc25.noarch
python-slip-dbus-0.6.4-4.fc25.noarch
python2-ply-3.8-2.fc25.noarch
dtc-1.4.2-1.fc25.s390x
guile-2.0.13-1.fc25.s390x
cronie-anacron-1.5.1-2.fc25.s390x
libXtst-1.2.3-1.fc25.s390x
iso-codes-3.70-1.fc25.noarch
s390utils-1.36.0-1.fc25.s390x
python-backports-ssl_match_hostname-3.5.0.1-3.fc25.noarch
fedora-cert-0.6.0.1-1.fc25.noarch
libstdc++-6.3.1-1.fc25.s390x
subversion-libs-1.9.5-1.fc25.s390x
libgfortran-6.3.1-1.fc25.s390x
dnf-plugin-system-upgrade-0.7.1-4.fc25.noarch
lvm2-2.02.167-3.fc25.s390x
libselinux-devel-2.5-13.fc25.s390x
perl-Time-Local-1.250-1.fc25.noarch
libradosstriper-devel-10.2.4-2.fc25.s390x
flac-libs-1.3.2-1.fc25.s390x
perl-Digest-1.17-366.fc25.noarch
teckit-2.5.1-15.fc24.s390x
libpath_utils-0.2.1-29.fc25.s390x
attr-2.4.47-16.fc24.s390x
usbredir-0.7.1-2.fc24.s390x
cairo-devel-1.14.8-1.fc25.s390x
lzo-devel-2.08-8.fc24.s390x
libcap-devel-2.25-2.fc25.s390x
krb5-devel-1.14.4-7.fc25.s390x
rpm-4.13.0.1-1.fc25.s390x
kernel-devel-4.10.5-200.fc25.s390x
libbsd-0.8.3-1.fc25.s390x
texlive-url-svn32528.3.4-33.fc25.1.noarch
texlive-dvips-bin-svn40987-33.20160520.fc25.1.s390x
texlive-index-svn24099.4.1beta-33.fc25.1.noarch
texlive-setspace-svn24881.6.7a-33.fc25.1.noarch
texlive-mathtools-svn38833-33.fc25.1.noarch
texlive-cm-svn32865.0-33.fc25.1.noarch
texlive-graphics-def-svn41879-33.fc25.1.noarch
texlive-mdwtools-svn15878.1.05.4-33.fc25.1.noarch
texlive-rsfs-svn15878.0-33.fc25.1.noarch
texlive-ucharcat-svn38907-33.fc25.1.noarch
texlive-fontspec-svn41262-33.fc25.1.noarch
texlive-showexpl-svn32737.v0.3l-33.fc25.1.noarch
texlive-pstricks-add-svn40744-33.fc25.1.noarch
texlive-beamer-svn36461.3.36-33.fc25.1.noarch
texlive-collection-basic-svn41149-33.20160520.fc25.1.noarch
rpm-build-4.13.0.1-1.fc25.s390x
xemacs-filesystem-21.5.34-20.20170124hgf412e9f093d4.fc25.noarch
hawkey-0.6.4-3.fc25.s390x
gdk-pixbuf2-modules-2.36.6-1.fc25.s390x
bluez-libs-5.44-1.fc25.s390x
audit-libs-2.7.7-1.fc25.s390x
iproute-4.11.0-1.fc25.s390x
libICE-1.0.9-9.fc25.s390x
glibc-headers-2.24-9.fc25.s390x
python3-ply-3.8-2.fc25.noarch
perl-5.24.2-387.fc25.s390x
graphite2-1.3.10-1.fc25.s390x
vte-profile-0.46.2-1.fc25.s390x
gtk3-devel-3.22.16-1.fc25.s390x
python-libs-2.7.13-2.fc25.s390x
mesa-libGL-17.0.5-3.fc25.s390x
python2-pycurl-7.43.0-6.fc25.s390x
NetworkManager-1.4.4-5.fc25.s390x
mesa-libEGL-devel-17.0.5-3.fc25.s390x
mariadb-libs-10.1.24-3.fc25.s390x
mesa-libGLES-devel-17.0.5-3.fc25.s390x
hostname-3.15-8.fc25.s390x
gpg-pubkey-a0a7badb-52844296
readline-6.3-8.fc24.s390x
cpio-2.12-3.fc24.s390x
libXcomposite-0.4.4-8.fc24.s390x
procps-ng-3.3.10-11.fc24.s390x
GConf2-3.2.6-16.fc24.s390x
xz-devel-5.2.2-2.fc24.s390x
fedora-logos-22.0.0-3.fc24.s390x
gpg-pubkey-e372e838-56fd7943
kmod-libs-23-1.fc25.s390x
perl-parent-0.236-1.fc25.noarch
perl-TermReadKey-2.37-1.fc25.s390x
ncurses-c++-libs-6.0-6.20160709.fc25.s390x
gzip-1.8-1.fc25.s390x
python3-gobject-base-3.22.0-1.fc25.s390x
python2-yubico-1.3.2-3.fc25.noarch
s390utils-ziomon-1.36.0-1.fc25.s390x
librepo-1.7.18-3.fc25.s390x
librsvg2-2.40.16-2.fc25.s390x
gnat-srpm-macros-4-1.fc25.noarch
python-decoratortools-1.8-12.fc25.noarch
m17n-db-1.7.0-7.fc25.noarch
e2fsprogs-libs-1.43.3-1.fc25.s390x
libvorbis-1.3.5-1.fc25.s390x
gcc-gdb-plugin-6.3.1-1.fc25.s390x
npth-1.3-1.fc25.s390x
libcephfs1-10.2.4-2.fc25.s390x
wayland-devel-1.12.0-1.fc25.s390x
libxcb-devel-1.12-1.fc25.s390x
perl-encoding-2.19-5.fc25.s390x
python3-cssselect-0.9.2-1.fc25.noarch
gettext-libs-0.19.8.1-3.fc25.s390x
at-spi2-atk-devel-2.22.0-1.fc25.s390x
virglrenderer-0.5.0-1.20160411git61846f92f.fc25.s390x
pixman-devel-0.34.0-2.fc24.s390x
libnfs-devel-1.9.8-2.fc24.s390x
libblkid-2.28.2-2.fc25.s390x
glib2-devel-2.50.3-1.fc25.s390x
texlive-ifxetex-svn19685.0.5-33.fc25.1.noarch
texlive-caption-svn41409-33.fc25.1.noarch
texlive-float-svn15878.1.3d-33.fc25.1.noarch
texlive-pdftex-def-svn22653.0.06d-33.fc25.1.noarch
texlive-xdvi-bin-svn40750-33.20160520.fc25.1.s390x
texlive-beton-svn15878.0-33.fc25.1.noarch
texlive-filecontents-svn24250.1.3-33.fc25.1.noarch
texlive-lm-math-svn36915.1.959-33.fc25.1.noarch
texlive-pslatex-svn16416.0-33.fc25.1.noarch
texlive-times-svn35058.0-33.fc25.1.noarch
texlive-breakurl-svn29901.1.40-33.fc25.1.noarch
texlive-filehook-svn24280.0.5d-33.fc25.1.noarch
texlive-pst-pdf-svn31660.1.1v-33.fc25.1.noarch
texlive-seminar-svn34011.1.62-33.fc25.1.noarch
texlive-xetexconfig-svn41133-33.fc25.1.noarch
python-rpm-macros-3-12.fc25.noarch
rpm-devel-4.13.0.1-1.fc25.s390x
nss-pem-1.0.3-3.fc25.s390x
at-spi2-core-2.22.1-1.fc25.s390x
GeoIP-GeoLite-data-2017.04-1.fc25.noarch
kernel-devel-4.10.8-200.fc25.s390x
dbus-libs-1.11.14-1.fc25.s390x
perl-Scalar-List-Utils-1.48-1.fc25.s390x
libidn2-2.0.2-1.fc25.s390x
libtasn1-devel-4.12-1.fc25.s390x
python3-koji-1.13.0-2.fc25.noarch
glusterfs-cli-3.10.4-1.fc25.s390x
opus-1.1.5-1.fc25.s390x
mariadb-common-10.1.24-3.fc25.s390x
elfutils-libs-0.169-1.fc25.s390x
kernel-core-4.11.10-200.fc25.s390x
gnutls-dane-3.5.14-1.fc25.s390x
systemd-container-231-17.fc25.s390x
sudo-1.8.20p2-1.fc25.s390x
dbus-devel-1.11.14-1.fc25.s390x
perl-Module-CoreList-5.20170621-1.fc25.noarch
libicu-devel-57.1-5.fc25.s390x
js-jquery-2.2.4-3.fc25.noarch
=== TEST BEGIN ===
Using CC: /home/fam/bin/cc
Install prefix    /var/tmp/patchew-tester-tmp-s55iq6fb/src/install
BIOS directory    /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/share/qemu
binary directory  /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/bin
library directory /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/lib
module directory  /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/lib/qemu
libexec directory /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/libexec
include directory /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/include
config directory  /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/etc
local state directory   /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/var
Manual directory  /var/tmp/patchew-tester-tmp-s55iq6fb/src/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /var/tmp/patchew-tester-tmp-s55iq6fb/src
C compiler        /home/fam/bin/cc
Host C compiler   cc
C++ compiler      c++
Objective-C compiler /home/fam/bin/cc
ARFLAGS           rv
CFLAGS            -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g 
QEMU_CFLAGS       -I/usr/include/pixman-1  -Werror -DHAS_LIBSSH2_SFTP_FSYNC -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DNCURSES_WIDECHAR -D_GNU_SOURCE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv  -Wendif-labels -Wno-shift-negative-value -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strong -I/usr/include/p11-kit-1    -I/usr/include/libpng16 -I/usr/include/libdrm  -I/usr/include/cacard -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/libusb-1.0 
LDFLAGS           -Wl,--warn-common -m64 -g 
make              make
install           install
python            python -B
smbd              /usr/sbin/smbd
module support    no
host CPU          s390x
host big endian   yes
target list       aarch64-softmmu alpha-softmmu arm-softmmu cris-softmmu i386-softmmu lm32-softmmu m68k-softmmu microblazeel-softmmu microblaze-softmmu mips64el-softmmu mips64-softmmu mipsel-softmmu mips-softmmu moxie-softmmu nios2-softmmu or1k-softmmu ppc64-softmmu ppcemb-softmmu ppc-softmmu s390x-softmmu sh4eb-softmmu sh4-softmmu sparc64-softmmu sparc-softmmu tricore-softmmu unicore32-softmmu x86_64-softmmu xtensaeb-softmmu xtensa-softmmu aarch64-linux-user alpha-linux-user armeb-linux-user arm-linux-user cris-linux-user hppa-linux-user i386-linux-user m68k-linux-user microblazeel-linux-user microblaze-linux-user mips64el-linux-user mips64-linux-user mipsel-linux-user mips-linux-user mipsn32el-linux-user mipsn32-linux-user nios2-linux-user or1k-linux-user ppc64abi32-linux-user ppc64le-linux-user ppc64-linux-user ppc-linux-user s390x-linux-user sh4eb-linux-user sh4-linux-user sparc32plus-linux-user sparc64-linux-user sparc-linux-user tilegx-linux-user x86_64-linux-user
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
pixman            system
SDL support       yes (2.0.5)
GTK support       yes (3.22.16)
GTK GL support    yes
VTE support       yes (0.46.2)
TLS priority      NORMAL
GNUTLS support    yes
GNUTLS rnd        yes
libgcrypt         no
libgcrypt kdf     no
nettle            yes (3.3)
nettle kdf        yes
libtasn1          yes
curses support    yes
virgl support     yes
curl support      yes
mingw32 support   no
Audio drivers     oss
Block whitelist (rw) 
Block whitelist (ro) 
VirtFS support    yes
VNC support       yes
VNC SASL support  yes
VNC JPEG support  yes
VNC PNG support   yes
xen support       no
brlapi support    yes
bluez  support    yes
Documentation     yes
PIE               no
vde support       no
netmap support    no
Linux AIO support yes
ATTR/XATTR support yes
Install blobs     yes
KVM support       yes
HAX support       no
TCG support       yes
TCG debug enabled no
TCG interpreter   no
RDMA support      no
fdt support       yes
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
libcap-ng support yes
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
Trace backends    log
spice support     no 
rbd support       yes
xfsctl support    no
smartcard support yes
libusb            yes
usb net redir     yes
OpenGL support    yes
OpenGL dmabufs    yes
libiscsi support  yes
libnfs support    yes
build guest agent yes
QGA VSS support   no
QGA w32 disk info no
QGA MSI support   no
seccomp support   no
coroutine backend ucontext
coroutine pool    yes
debug stack usage no
crypto afalg      no
GlusterFS support yes
gcov              gcov
gcov enabled      no
TPM support       yes
libssh2 support   yes
TPM passthrough   no
QOM debugging     yes
Live block migration yes
lzo support       yes
snappy support    yes
bzip2 support     yes
NUMA host support no
tcmalloc support  no
jemalloc support  no
avx2 optimization no
replication support yes
VxHS block device no
  GEN     aarch64-softmmu/config-devices.mak.tmp
  GEN     alpha-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak.tmp
  GEN     cris-softmmu/config-devices.mak
  GEN     i386-softmmu/config-devices.mak.tmp
  GEN     arm-softmmu/config-devices.mak
  GEN     alpha-softmmu/config-devices.mak
  GEN     lm32-softmmu/config-devices.mak.tmp
  GEN     aarch64-softmmu/config-devices.mak
  GEN     m68k-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak.tmp
  GEN     lm32-softmmu/config-devices.mak
  GEN     i386-softmmu/config-devices.mak
  GEN     m68k-softmmu/config-devices.mak
  GEN     microblaze-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak.tmp
  GEN     mips64-softmmu/config-devices.mak.tmp
  GEN     microblazeel-softmmu/config-devices.mak
  GEN     microblaze-softmmu/config-devices.mak
  GEN     mipsel-softmmu/config-devices.mak.tmp
  GEN     mips-softmmu/config-devices.mak.tmp
  GEN     mips64el-softmmu/config-devices.mak
  GEN     moxie-softmmu/config-devices.mak.tmp
  GEN     mips64-softmmu/config-devices.mak
  GEN     nios2-softmmu/config-devices.mak.tmp
  GEN     mipsel-softmmu/config-devices.mak
  GEN     mips-softmmu/config-devices.mak
  GEN     moxie-softmmu/config-devices.mak
  GEN     or1k-softmmu/config-devices.mak.tmp
  GEN     ppc64-softmmu/config-devices.mak.tmp
  GEN     ppcemb-softmmu/config-devices.mak.tmp
  GEN     nios2-softmmu/config-devices.mak
  GEN     ppc-softmmu/config-devices.mak.tmp
  GEN     or1k-softmmu/config-devices.mak
  GEN     s390x-softmmu/config-devices.mak.tmp
  GEN     ppc64-softmmu/config-devices.mak
  GEN     ppcemb-softmmu/config-devices.mak
  GEN     s390x-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak.tmp
  GEN     sh4-softmmu/config-devices.mak.tmp
  GEN     ppc-softmmu/config-devices.mak
  GEN     sparc-softmmu/config-devices.mak.tmp
  GEN     sparc64-softmmu/config-devices.mak.tmp
  GEN     sh4-softmmu/config-devices.mak
  GEN     sh4eb-softmmu/config-devices.mak
  GEN     unicore32-softmmu/config-devices.mak.tmp
  GEN     tricore-softmmu/config-devices.mak.tmp
  GEN     sparc-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak.tmp
  GEN     sparc64-softmmu/config-devices.mak
  GEN     tricore-softmmu/config-devices.mak
  GEN     unicore32-softmmu/config-devices.mak
  GEN     xtensaeb-softmmu/config-devices.mak.tmp
  GEN     xtensa-softmmu/config-devices.mak.tmp
  GEN     aarch64-linux-user/config-devices.mak.tmp
  GEN     xtensa-softmmu/config-devices.mak
  GEN     x86_64-softmmu/config-devices.mak
  GEN     xtensaeb-softmmu/config-devices.mak
  GEN     aarch64-linux-user/config-devices.mak
  GEN     alpha-linux-user/config-devices.mak.tmp
  GEN     armeb-linux-user/config-devices.mak.tmp
  GEN     arm-linux-user/config-devices.mak.tmp
  GEN     cris-linux-user/config-devices.mak.tmp
  GEN     alpha-linux-user/config-devices.mak
  GEN     arm-linux-user/config-devices.mak
  GEN     armeb-linux-user/config-devices.mak
  GEN     hppa-linux-user/config-devices.mak.tmp
  GEN     cris-linux-user/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak.tmp
  GEN     i386-linux-user/config-devices.mak.tmp
  GEN     microblazeel-linux-user/config-devices.mak.tmp
  GEN     hppa-linux-user/config-devices.mak
  GEN     microblazeel-linux-user/config-devices.mak
  GEN     m68k-linux-user/config-devices.mak
  GEN     i386-linux-user/config-devices.mak
  GEN     microblaze-linux-user/config-devices.mak.tmp
  GEN     mips64-linux-user/config-devices.mak.tmp
  GEN     mips64el-linux-user/config-devices.mak.tmp
  GEN     mipsel-linux-user/config-devices.mak.tmp
  GEN     microblaze-linux-user/config-devices.mak
  GEN     mips64-linux-user/config-devices.mak
  GEN     mips64el-linux-user/config-devices.mak
  GEN     mipsel-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak.tmp
  GEN     mipsn32el-linux-user/config-devices.mak.tmp
  GEN     mipsn32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak.tmp
  GEN     mipsn32el-linux-user/config-devices.mak
  GEN     mips-linux-user/config-devices.mak
  GEN     or1k-linux-user/config-devices.mak.tmp
  GEN     mipsn32-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak.tmp
  GEN     nios2-linux-user/config-devices.mak
  GEN     ppc64le-linux-user/config-devices.mak.tmp
  GEN     ppc64-linux-user/config-devices.mak.tmp
  GEN     or1k-linux-user/config-devices.mak
  GEN     ppc64abi32-linux-user/config-devices.mak
  GEN     ppc64le-linux-user/config-devices.mak
  GEN     ppc-linux-user/config-devices.mak.tmp
  GEN     ppc64-linux-user/config-devices.mak
  GEN     s390x-linux-user/config-devices.mak.tmp
  GEN     sh4eb-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak.tmp
  GEN     ppc-linux-user/config-devices.mak
  GEN     s390x-linux-user/config-devices.mak
  GEN     sparc32plus-linux-user/config-devices.mak.tmp
  GEN     sh4eb-linux-user/config-devices.mak
  GEN     sparc64-linux-user/config-devices.mak.tmp
  GEN     sh4-linux-user/config-devices.mak
  GEN     sparc-linux-user/config-devices.mak.tmp
  GEN     tilegx-linux-user/config-devices.mak.tmp
  GEN     sparc32plus-linux-user/config-devices.mak
  GEN     sparc64-linux-user/config-devices.mak
  GEN     x86_64-linux-user/config-devices.mak.tmp
  GEN     sparc-linux-user/config-devices.mak
  GEN     tilegx-linux-user/config-devices.mak
  GEN     config-host.h
  GEN     qemu-options.def
  GEN     x86_64-linux-user/config-devices.mak
  GEN     qmp-commands.h
  GEN     qapi-types.h
  GEN     qapi-visit.h
  GEN     qapi-event.h
  GEN     qmp-marshal.c
  GEN     qapi-types.c
  GEN     qapi-visit.c
  GEN     qapi-event.c
  GEN     qmp-introspect.h
  GEN     qmp-introspect.c
  GEN     trace/generated-tcg-tracers.h
  GEN     trace/generated-helpers.h
  GEN     trace/generated-helpers-wrappers.h
  GEN     trace/generated-helpers.c
  GEN     module_block.h
  GEN     tests/test-qapi-types.h
  GEN     tests/test-qapi-visit.h
  GEN     tests/test-qapi-event.h
  GEN     tests/test-qmp-commands.h
  GEN     tests/test-qmp-introspect.h
  GEN     trace-root.h
  GEN     util/trace.h
  GEN     crypto/trace.h
  GEN     io/trace.h
  GEN     migration/trace.h
  GEN     block/trace.h
  GEN     chardev/trace.h
  GEN     hw/block/trace.h
  GEN     hw/block/dataplane/trace.h
  GEN     hw/char/trace.h
  GEN     hw/intc/trace.h
  GEN     hw/net/trace.h
  GEN     hw/virtio/trace.h
  GEN     hw/audio/trace.h
  GEN     hw/misc/trace.h
  GEN     hw/usb/trace.h
  GEN     hw/scsi/trace.h
  GEN     hw/nvram/trace.h
  GEN     hw/display/trace.h
  GEN     hw/input/trace.h
  GEN     hw/timer/trace.h
  GEN     hw/dma/trace.h
  GEN     hw/sparc/trace.h
  GEN     hw/sd/trace.h
  GEN     hw/isa/trace.h
  GEN     hw/mem/trace.h
  GEN     hw/i386/trace.h
  GEN     hw/i386/xen/trace.h
  GEN     hw/9pfs/trace.h
  GEN     hw/ppc/trace.h
  GEN     hw/pci/trace.h
  GEN     hw/s390x/trace.h
  GEN     hw/vfio/trace.h
  GEN     hw/arm/trace.h
  GEN     hw/acpi/trace.h
  GEN     hw/alpha/trace.h
  GEN     hw/xen/trace.h
  GEN     ui/trace.h
  GEN     audio/trace.h
  GEN     net/trace.h
  GEN     target/arm/trace.h
  GEN     target/i386/trace.h
  GEN     target/mips/trace.h
  GEN     target/sparc/trace.h
  GEN     target/s390x/trace.h
  GEN     target/ppc/trace.h
  GEN     qom/trace.h
  GEN     linux-user/trace.h
  GEN     qapi/trace.h
  GEN     accel/tcg/trace.h
  GEN     accel/kvm/trace.h
  GEN     nbd/trace.h
  GEN     trace-root.c
  GEN     util/trace.c
  GEN     crypto/trace.c
  GEN     io/trace.c
  GEN     migration/trace.c
  GEN     block/trace.c
  GEN     chardev/trace.c
  GEN     hw/block/trace.c
  GEN     hw/block/dataplane/trace.c
  GEN     hw/char/trace.c
  GEN     hw/intc/trace.c
  GEN     hw/net/trace.c
  GEN     hw/virtio/trace.c
  GEN     hw/audio/trace.c
  GEN     hw/misc/trace.c
  GEN     hw/usb/trace.c
  GEN     hw/scsi/trace.c
  GEN     hw/nvram/trace.c
  GEN     hw/display/trace.c
  GEN     hw/input/trace.c
  GEN     hw/timer/trace.c
  GEN     hw/dma/trace.c
  GEN     hw/sparc/trace.c
  GEN     hw/sd/trace.c
  GEN     hw/isa/trace.c
  GEN     hw/mem/trace.c
  GEN     hw/i386/trace.c
  GEN     hw/i386/xen/trace.c
  GEN     hw/9pfs/trace.c
  GEN     hw/ppc/trace.c
  GEN     hw/pci/trace.c
  GEN     hw/s390x/trace.c
  GEN     hw/vfio/trace.c
  GEN     hw/acpi/trace.c
  GEN     hw/arm/trace.c
  GEN     hw/alpha/trace.c
  GEN     hw/xen/trace.c
  GEN     ui/trace.c
  GEN     audio/trace.c
  GEN     net/trace.c
  GEN     target/arm/trace.c
  GEN     target/i386/trace.c
  GEN     target/mips/trace.c
  GEN     target/sparc/trace.c
  GEN     target/ppc/trace.c
  GEN     target/s390x/trace.c
  GEN     qom/trace.c
  GEN     linux-user/trace.c
  GEN     qapi/trace.c
  GEN     accel/tcg/trace.c
  GEN     accel/kvm/trace.c
  GEN     nbd/trace.c
  GEN     config-all-devices.mak
  GEN     qemu-monitor.texi
  GEN     qemu-options.texi
  GEN     docs/version.texi
  GEN     qemu-img-cmds.texi
  GEN     qemu-monitor-info.texi
  CC      tests/qemu-iotests/socket_scm_helper.o
  GEN     qemu-img.1
  GEN     qemu-nbd.8
  GEN     qemu-ga.8
  GEN     docs/interop/qemu-qmp-qapi.texi
  GEN     docs/interop/qemu-ga-qapi.texi
  GEN     fsdev/virtfs-proxy-helper.1
  GEN     qga/qapi-generated/qga-qapi-types.h
  GEN     qga/qapi-generated/qga-qapi-visit.h
  GEN     qga/qapi-generated/qga-qmp-commands.h
  GEN     qga/qapi-generated/qga-qapi-types.c
  GEN     qga/qapi-generated/qga-qmp-marshal.c
  GEN     qga/qapi-generated/qga-qapi-visit.c
  CC      qmp-introspect.o
  CC      qapi-types.o
  CC      qapi-visit.o
  CC      qapi-event.o
  CC      qapi/qapi-visit-core.o
  CC      qapi/qapi-dealloc-visitor.o
  CC      qapi/qobject-input-visitor.o
  CC      qapi/qobject-output-visitor.o
  CC      qapi/qmp-registry.o
  CC      qapi/qmp-dispatch.o
  CC      qapi/string-input-visitor.o
  CC      qapi/string-output-visitor.o
  CC      qapi/opts-visitor.o
  CC      qapi/qapi-clone-visitor.o
  CC      qapi/qmp-event.o
  CC      qapi/qapi-util.o
  CC      qobject/qnull.o
  CC      qobject/qnum.o
  CC      qobject/qstring.o
  CC      qobject/qdict.o
  CC      qobject/qlist.o
  CC      qobject/qbool.o
  CC      qobject/qjson.o
  CC      qobject/qobject.o
  CC      qobject/json-lexer.o
  CC      qobject/json-streamer.o
  CC      qobject/json-parser.o
  CC      trace/control.o
  CC      trace/qmp.o
  CC      util/cutils.o
  CC      util/osdep.o
  CC      util/unicode.o
  CC      util/qemu-timer-common.o
  CC      util/bufferiszero.o
  CC      util/lockcnt.o
  CC      util/aiocb.o
  CC      util/async.o
  CC      util/thread-pool.o
  CC      util/qemu-timer.o
  CC      util/main-loop.o
  CC      util/iohandler.o
  CC      util/aio-posix.o
  CC      util/compatfd.o
  CC      util/event_notifier-posix.o
  CC      util/mmap-alloc.o
  CC      util/oslib-posix.o
  CC      util/qemu-openpty.o
  CC      util/qemu-thread-posix.o
  CC      util/memfd.o
  CC      util/envlist.o
  CC      util/path.o
  CC      util/module.o
  CC      util/host-utils.o
  CC      util/bitmap.o
  CC      util/bitops.o
  CC      util/hbitmap.o
  CC      util/fifo8.o
  CC      util/acl.o
  CC      util/cacheinfo.o
  CC      util/qemu-error.o
  CC      util/error.o
  CC      util/iov.o
  CC      util/id.o
  CC      util/qemu-config.o
  CC      util/qemu-sockets.o
  CC      util/uri.o
  CC      util/notify.o
  CC      util/qemu-option.o
  CC      util/qemu-progress.o
  CC      util/keyval.o
  CC      util/hexdump.o
  CC      util/crc32c.o
  CC      util/uuid.o
  CC      util/throttle.o
  CC      util/getauxval.o
  CC      util/readline.o
  CC      util/rcu.o
  CC      util/qemu-coroutine.o
  CC      util/qemu-coroutine-lock.o
  CC      util/qemu-coroutine-io.o
  CC      util/qemu-coroutine-sleep.o
  CC      util/coroutine-ucontext.o
  CC      util/buffer.o
  CC      util/timed-average.o
  CC      util/base64.o
  CC      util/log.o
  CC      util/qdist.o
  CC      util/qht.o
  CC      util/range.o
  CC      util/stats64.o
  CC      util/systemd.o
  CC      trace-root.o
  CC      util/trace.o
  CC      crypto/trace.o
  CC      io/trace.o
  CC      migration/trace.o
  CC      block/trace.o
  CC      chardev/trace.o
  CC      hw/block/trace.o
  CC      hw/block/dataplane/trace.o
  CC      hw/char/trace.o
  CC      hw/intc/trace.o
  CC      hw/net/trace.o
  CC      hw/virtio/trace.o
  CC      hw/misc/trace.o
  CC      hw/audio/trace.o
  CC      hw/usb/trace.o
  CC      hw/scsi/trace.o
  CC      hw/nvram/trace.o
  CC      hw/display/trace.o
  CC      hw/input/trace.o
  CC      hw/timer/trace.o
  CC      hw/dma/trace.o
  CC      hw/sparc/trace.o
  CC      hw/sd/trace.o
  CC      hw/isa/trace.o
  CC      hw/mem/trace.o
  CC      hw/i386/trace.o
  CC      hw/i386/xen/trace.o
  CC      hw/9pfs/trace.o
  CC      hw/ppc/trace.o
  CC      hw/pci/trace.o
  CC      hw/s390x/trace.o
  CC      hw/vfio/trace.o
  CC      hw/acpi/trace.o
  CC      hw/arm/trace.o
  CC      hw/alpha/trace.o
  CC      hw/xen/trace.o
  CC      ui/trace.o
  CC      audio/trace.o
  CC      net/trace.o
  CC      target/arm/trace.o
  CC      target/i386/trace.o
  CC      target/mips/trace.o
  CC      target/sparc/trace.o
  CC      target/s390x/trace.o
  CC      target/ppc/trace.o
  CC      qom/trace.o
  CC      linux-user/trace.o
  CC      qapi/trace.o
  CC      accel/tcg/trace.o
  CC      accel/kvm/trace.o
  CC      nbd/trace.o
  CC      crypto/pbkdf-stub.o
  CC      stubs/arch-query-cpu-def.o
  CC      stubs/arch-query-cpu-model-expansion.o
  CC      stubs/arch-query-cpu-model-comparison.o
  CC      stubs/arch-query-cpu-model-baseline.o
  CC      stubs/bdrv-next-monitor-owned.o
  CC      stubs/blk-commit-all.o
  CC      stubs/blockdev-close-all-bdrv-states.o
  CC      stubs/clock-warp.o
  CC      stubs/cpu-get-clock.o
  CC      stubs/cpu-get-icount.o
  CC      stubs/dump.o
  CC      stubs/error-printf.o
  CC      stubs/fdset.o
  CC      stubs/gdbstub.o
  CC      stubs/get-vm-name.o
  CC      stubs/iothread-lock.o
  CC      stubs/iothread.o
  CC      stubs/is-daemonized.o
  CC      stubs/linux-aio.o
  CC      stubs/migr-blocker.o
  CC      stubs/monitor.o
  CC      stubs/machine-init-done.o
  CC      stubs/notify-event.o
  CC      stubs/qtest.o
  CC      stubs/replay.o
  CC      stubs/runstate-check.o
  CC      stubs/set-fd-handler.o
  CC      stubs/slirp.o
  CC      stubs/sysbus.o
  CC      stubs/trace-control.o
  CC      stubs/uuid.o
  CC      stubs/vmstate.o
  CC      stubs/vm-stop.o
  CC      stubs/qmp_pc_dimm_device_list.o
  CC      stubs/target-monitor-defs.o
  CC      stubs/target-get-monitor-def.o
  CC      stubs/pc_madt_cpu_entry.o
  CC      stubs/vmgenid.o
  CC      stubs/xen-common.o
  CC      stubs/xen-hvm.o
  CC      contrib/ivshmem-client/ivshmem-client.o
  CC      contrib/ivshmem-client/main.o
  CC      contrib/ivshmem-server/ivshmem-server.o
  CC      contrib/ivshmem-server/main.o
  CC      qemu-nbd.o
  CC      block.o
  CC      blockjob.o
  CC      qemu-io-cmds.o
  CC      replication.o
  CC      block/raw-format.o
  CC      block/qcow.o
  CC      block/vdi.o
  CC      block/vmdk.o
  CC      block/cloop.o
  CC      block/bochs.o
  CC      block/vpc.o
  CC      block/vvfat.o
  CC      block/dmg.o
  CC      block/qcow2.o
  CC      block/qcow2-refcount.o
  CC      block/qcow2-cluster.o
  CC      block/qcow2-snapshot.o
  CC      block/qcow2-cache.o
  CC      block/qcow2-bitmap.o
  CC      block/qed.o
  CC      block/qed-l2-cache.o
  CC      block/qed-table.o
  CC      block/qed-cluster.o
  CC      block/vhdx.o
  CC      block/qed-check.o
  CC      block/vhdx-endian.o
  CC      block/vhdx-log.o
  CC      block/quorum.o
  CC      block/parallels.o
  CC      block/blkdebug.o
  CC      block/blkverify.o
  CC      block/blkreplay.o
  CC      block/block-backend.o
  CC      block/snapshot.o
  CC      block/file-posix.o
  CC      block/qapi.o
  CC      block/linux-aio.o
  CC      block/null.o
  CC      block/mirror.o
  CC      block/commit.o
  CC      block/io.o
  CC      block/throttle-groups.o
  CC      block/nbd.o
  CC      block/nbd-client.o
  CC      block/sheepdog.o
  CC      block/iscsi-opts.o
  CC      block/accounting.o
  CC      block/dirty-bitmap.o
  CC      block/write-threshold.o
  CC      block/backup.o
  CC      block/replication.o
  CC      block/crypto.o
  CC      nbd/server.o
  CC      nbd/client.o
  CC      nbd/common.o
  CC      block/iscsi.o
  CC      block/nfs.o
  CC      block/curl.o
  CC      block/rbd.o
  CC      block/gluster.o
  CC      block/ssh.o
  CC      block/dmg-bz2.o
  CC      crypto/init.o
  CC      crypto/hash.o
  CC      crypto/hash-nettle.o
  CC      crypto/hmac-nettle.o
  CC      crypto/hmac.o
  CC      crypto/aes.o
  CC      crypto/desrfb.o
  CC      crypto/cipher.o
  CC      crypto/tlscreds.o
  CC      crypto/tlscredsanon.o
  CC      crypto/tlscredsx509.o
  CC      crypto/tlssession.o
  CC      crypto/secret.o
  CC      crypto/random-gnutls.o
  CC      crypto/pbkdf.o
  CC      crypto/pbkdf-nettle.o
  CC      crypto/ivgen.o
  CC      crypto/ivgen-essiv.o
  CC      crypto/ivgen-plain.o
  CC      crypto/ivgen-plain64.o
  CC      crypto/afsplit.o
  CC      crypto/xts.o
  CC      crypto/block-qcow.o
  CC      crypto/block.o
  CC      crypto/block-luks.o
  CC      io/channel.o
  CC      io/channel-buffer.o
  CC      io/channel-command.o
  CC      io/channel-file.o
  CC      io/channel-socket.o
  CC      io/channel-tls.o
  CC      io/channel-watch.o
  CC      io/channel-websock.o
  CC      io/channel-util.o
  CC      io/dns-resolver.o
  CC      io/task.o
  CC      qom/object.o
  CC      qom/container.o
  CC      qom/qom-qobject.o
  GEN     qemu-img-cmds.h
  CC      qemu-io.o
  CC      qom/object_interfaces.o
  CC      fsdev/virtfs-proxy-helper.o
  CC      fsdev/9p-marshal.o
  CC      fsdev/9p-iov-marshal.o
  CC      qemu-bridge-helper.o
  CC      blockdev.o
  CC      blockdev-nbd.o
  CC      bootdevice.o
  CC      iothread.o
  CC      qdev-monitor.o
  CC      device-hotplug.o
  CC      os-posix.o
  CC      bt-host.o
  CC      bt-vhci.o
  CC      dma-helpers.o
  CC      vl.o
  CC      tpm.o
  CC      device_tree.o
  CC      qmp-marshal.o
  CC      qmp.o
  CC      hmp.o
  CC      cpus-common.o
  CC      audio/audio.o
  CC      audio/noaudio.o
  CC      audio/wavaudio.o
  CC      audio/mixeng.o
  CC      audio/sdlaudio.o
  CC      audio/ossaudio.o
  CC      audio/wavcapture.o
  CC      backends/rng.o
  CC      backends/rng-egd.o
  CC      backends/rng-random.o
  CC      backends/tpm.o
  CC      backends/hostmem.o
  CC      backends/hostmem-file.o
  CC      backends/hostmem-ram.o
  CC      backends/cryptodev.o
  CC      backends/cryptodev-builtin.o
  CC      block/stream.o
  CC      chardev/msmouse.o
  CC      chardev/wctablet.o
  CC      chardev/testdev.o
  CC      chardev/baum.o
  CC      disas/alpha.o
  CC      disas/arm.o
  CXX     disas/arm-a64.o
  CC      disas/cris.o
  CC      disas/hppa.o
  CC      disas/i386.o
  CC      disas/m68k.o
  CC      disas/microblaze.o
  CC      disas/mips.o
  CC      disas/nios2.o
  CC      disas/moxie.o
  CC      disas/ppc.o
  CC      disas/s390.o
  CC      disas/sh4.o
  CC      disas/sparc.o
  CC      disas/lm32.o
  CXX     disas/libvixl/vixl/utils.o
  CXX     disas/libvixl/vixl/compiler-intrinsics.o
  CXX     disas/libvixl/vixl/a64/instructions-a64.o
  CXX     disas/libvixl/vixl/a64/disasm-a64.o
  CXX     disas/libvixl/vixl/a64/decoder-a64.o
  CC      fsdev/qemu-fsdev.o
  CC      fsdev/qemu-fsdev-opts.o
  CC      fsdev/qemu-fsdev-throttle.o
  CC      fsdev/qemu-fsdev-dummy.o
  CC      hw/9pfs/9p.o
  CC      hw/9pfs/9p-util.o
  CC      hw/9pfs/9p-local.o
  CC      hw/9pfs/9p-xattr.o
  CC      hw/9pfs/9p-xattr-user.o
  CC      hw/9pfs/9p-posix-acl.o
  CC      hw/9pfs/coth.o
  CC      hw/9pfs/cofs.o
  CC      hw/9pfs/codir.o
  CC      hw/9pfs/cofile.o
  CC      hw/9pfs/coxattr.o
  CC      hw/9pfs/9p-synth.o
  CC      hw/9pfs/9p-handle.o
  CC      hw/9pfs/9p-proxy.o
  CC      hw/acpi/core.o
  CC      hw/acpi/piix4.o
  CC      hw/acpi/pcihp.o
  CC      hw/acpi/ich9.o
  CC      hw/acpi/tco.o
  CC      hw/acpi/cpu_hotplug.o
  CC      hw/acpi/memory_hotplug.o
  CC      hw/acpi/cpu.o
  CC      hw/acpi/nvdimm.o
  CC      hw/acpi/vmgenid.o
  CC      hw/acpi/acpi_interface.o
  CC      hw/acpi/bios-linker-loader.o
  CC      hw/acpi/aml-build.o
  CC      hw/acpi/ipmi.o
  CC      hw/acpi/acpi-stub.o
  CC      hw/acpi/ipmi-stub.o
  CC      hw/audio/sb16.o
  CC      hw/audio/es1370.o
  CC      hw/audio/ac97.o
  CC      hw/audio/fmopl.o
  CC      hw/audio/adlib.o
  CC      hw/audio/gus.o
  CC      hw/audio/gusemu_hal.o
  CC      hw/audio/gusemu_mixer.o
  CC      hw/audio/cs4231a.o
  CC      hw/audio/hda-codec.o
  CC      hw/audio/intel-hda.o
  CC      hw/audio/pcspk.o
  CC      hw/audio/wm8750.o
  CC      hw/audio/pl041.o
  CC      hw/audio/lm4549.o
  CC      hw/audio/cs4231.o
  CC      hw/audio/marvell_88w8618.o
  CC      hw/audio/milkymist-ac97.o
  CC      hw/block/block.o
  CC      hw/audio/soundhw.o
  CC      hw/block/cdrom.o
  CC      hw/block/hd-geometry.o
  CC      hw/block/fdc.o
  CC      hw/block/m25p80.o
  CC      hw/block/nand.o
  CC      hw/block/pflash_cfi01.o
  CC      hw/block/pflash_cfi02.o
  CC      hw/block/ecc.o
  CC      hw/block/onenand.o
  CC      hw/block/nvme.o
  CC      hw/bt/core.o
  CC      hw/bt/l2cap.o
  CC      hw/bt/sdp.o
  CC      hw/bt/hci.o
  CC      hw/bt/hid.o
  CC      hw/bt/hci-csr.o
  CC      hw/char/ipoctal232.o
  CC      hw/char/escc.o
  CC      hw/char/parallel.o
  CC      hw/char/serial.o
  CC      hw/char/pl011.o
  CC      hw/char/serial-isa.o
  CC      hw/char/serial-pci.o
  CC      hw/char/virtio-console.o
  CC      hw/char/xilinx_uartlite.o
  CC      hw/char/cadence_uart.o
  CC      hw/char/cmsdk-apb-uart.o
  CC      hw/char/etraxfs_ser.o
  CC      hw/char/debugcon.o
  CC      hw/char/imx_serial.o
  CC      hw/char/lm32_juart.o
  CC      hw/char/grlib_apbuart.o
  CC      hw/char/lm32_uart.o
  CC      hw/char/milkymist-uart.o
  CC      hw/char/sclpconsole.o
  CC      hw/char/sclpconsole-lm.o
  CC      hw/core/qdev.o
  CC      hw/core/qdev-properties.o
  CC      hw/core/bus.o
  CC      hw/core/reset.o
  CC      hw/core/fw-path-provider.o
  CC      hw/core/irq.o
  CC      hw/core/hotplug.o
  CC      hw/core/nmi.o
  CC      hw/core/empty_slot.o
  CC      hw/core/stream.o
  CC      hw/core/ptimer.o
  CC      hw/core/sysbus.o
  CC      hw/core/machine.o
  CC      hw/core/loader.o
  CC      hw/core/loader-fit.o
  CC      hw/core/qdev-properties-system.o
  CC      hw/core/register.o
  CC      hw/core/or-irq.o
  CC      hw/core/platform-bus.o
  CC      hw/cpu/core.o
  CC      hw/display/ads7846.o
  CC      hw/display/cirrus_vga.o
  CC      hw/display/g364fb.o
  CC      hw/display/jazz_led.o
  CC      hw/display/pl110.o
  CC      hw/display/ssd0303.o
  CC      hw/display/ssd0323.o
  CC      hw/display/vga-pci.o
  CC      hw/display/vga-isa.o
  CC      hw/display/vga-isa-mm.o
  CC      hw/display/vmware_vga.o
  CC      hw/display/blizzard.o
  CC      hw/display/exynos4210_fimd.o
  CC      hw/display/framebuffer.o
  CC      hw/display/milkymist-vgafb.o
  CC      hw/display/tc6393xb.o
  CC      hw/display/milkymist-tmu2.o
  CC      hw/dma/puv3_dma.o
  CC      hw/dma/rc4030.o
  CC      hw/dma/pl080.o
  CC      hw/dma/pl330.o
  CC      hw/dma/i82374.o
  CC      hw/dma/i8257.o
  CC      hw/dma/xilinx_axidma.o
  CC      hw/dma/xlnx-zynq-devcfg.o
  CC      hw/dma/etraxfs_dma.o
  CC      hw/dma/sparc32_dma.o
  CC      hw/dma/sun4m_iommu.o
  CC      hw/gpio/max7310.o
  CC      hw/gpio/pl061.o
  CC      hw/gpio/puv3_gpio.o
  CC      hw/gpio/zaurus.o
  CC      hw/gpio/mpc8xxx.o
  CC      hw/gpio/gpio_key.o
  CC      hw/i2c/core.o
  CC      hw/i2c/smbus.o
  CC      hw/i2c/smbus_eeprom.o
  CC      hw/i2c/i2c-ddc.o
  CC      hw/i2c/versatile_i2c.o
  CC      hw/i2c/smbus_ich9.o
  CC      hw/i2c/pm_smbus.o
  CC      hw/i2c/bitbang_i2c.o
  CC      hw/i2c/exynos4210_i2c.o
  CC      hw/i2c/imx_i2c.o
  CC      hw/i2c/aspeed_i2c.o
  CC      hw/ide/core.o
  CC      hw/ide/atapi.o
  CC      hw/ide/qdev.o
  CC      hw/ide/pci.o
  CC      hw/ide/isa.o
  CC      hw/ide/piix.o
  CC      hw/ide/cmd646.o
  CC      hw/ide/macio.o
  CC      hw/ide/mmio.o
  CC      hw/ide/via.o
  CC      hw/ide/microdrive.o
  CC      hw/ide/ahci.o
  CC      hw/ide/ich.o
  CC      hw/input/adb.o
  CC      hw/input/hid.o
  CC      hw/input/lm832x.o
  CC      hw/input/pckbd.o
  CC      hw/input/pl050.o
  CC      hw/input/ps2.o
  CC      hw/input/stellaris_input.o
  CC      hw/input/tsc2005.o
  CC      hw/input/vmmouse.o
  CC      hw/input/virtio-input.o
  CC      hw/input/virtio-input-hid.o
  CC      hw/input/virtio-input-host.o
  CC      hw/intc/heathrow_pic.o
  CC      hw/intc/i8259_common.o
  CC      hw/intc/i8259.o
  CC      hw/intc/pl190.o
  CC      hw/intc/puv3_intc.o
  CC      hw/intc/xilinx_intc.o
  CC      hw/intc/etraxfs_pic.o
  CC      hw/intc/imx_avic.o
  CC      hw/intc/lm32_pic.o
  CC      hw/intc/realview_gic.o
  CC      hw/intc/slavio_intctl.o
  CC      hw/intc/ioapic_common.o
  CC      hw/intc/arm_gic_common.o
  CC      hw/intc/arm_gic.o
  CC      hw/intc/arm_gicv2m.o
  CC      hw/intc/arm_gicv3_common.o
  CC      hw/intc/arm_gicv3.o
  CC      hw/intc/arm_gicv3_dist.o
  CC      hw/intc/arm_gicv3_redist.o
  CC      hw/intc/arm_gicv3_its_common.o
  CC      hw/intc/openpic.o
  CC      hw/intc/intc.o
  CC      hw/ipack/ipack.o
  CC      hw/ipack/tpci200.o
  CC      hw/ipmi/ipmi.o
  CC      hw/ipmi/ipmi_bmc_sim.o
  CC      hw/ipmi/isa_ipmi_kcs.o
  CC      hw/ipmi/ipmi_bmc_extern.o
  CC      hw/ipmi/isa_ipmi_bt.o
  CC      hw/isa/isa-bus.o
  CC      hw/isa/apm.o
  CC      hw/isa/i82378.o
  CC      hw/isa/pc87312.o
  CC      hw/isa/piix4.o
  CC      hw/isa/vt82c686.o
  CC      hw/mem/pc-dimm.o
  CC      hw/mem/nvdimm.o
  CC      hw/misc/applesmc.o
  CC      hw/misc/max111x.o
  CC      hw/misc/tmp105.o
  CC      hw/misc/tmp421.o
  CC      hw/misc/debugexit.o
  CC      hw/misc/sga.o
  CC      hw/misc/pc-testdev.o
  CC      hw/misc/pci-testdev.o
  CC      hw/misc/edu.o
  CC      hw/misc/unimp.o
  CC      hw/misc/arm_l2x0.o
  CC      hw/misc/arm_integrator_debug.o
  CC      hw/misc/a9scu.o
  CC      hw/misc/arm11scu.o
  CC      hw/misc/puv3_pm.o
  CC      hw/misc/macio/macio.o
  CC      hw/misc/macio/cuda.o
  CC      hw/misc/macio/mac_dbdma.o
  CC      hw/net/dp8393x.o
  CC      hw/net/ne2000.o
  CC      hw/net/eepro100.o
  CC      hw/net/pcnet-pci.o
  CC      hw/net/pcnet.o
  CC      hw/net/e1000.o
  CC      hw/net/e1000x_common.o
  CC      hw/net/net_tx_pkt.o
  CC      hw/net/net_rx_pkt.o
  CC      hw/net/e1000e.o
  CC      hw/net/e1000e_core.o
  CC      hw/net/rtl8139.o
  CC      hw/net/vmxnet3.o
  CC      hw/net/smc91c111.o
  CC      hw/net/lan9118.o
  CC      hw/net/ne2000-isa.o
  CC      hw/net/opencores_eth.o
  CC      hw/net/xgmac.o
  CC      hw/net/mipsnet.o
  CC      hw/net/xilinx_axienet.o
  CC      hw/net/allwinner_emac.o
  CC      hw/net/imx_fec.o
  CC      hw/net/cadence_gem.o
  CC      hw/net/stellaris_enet.o
  CC      hw/net/lance.o
  CC      hw/net/ftgmac100.o
  CC      hw/net/rocker/rocker.o
  CC      hw/net/rocker/rocker_fp.o
  CC      hw/net/rocker/rocker_desc.o
  CC      hw/net/rocker/rocker_world.o
  CC      hw/net/rocker/rocker_of_dpa.o
  CC      hw/nvram/ds1225y.o
  CC      hw/nvram/eeprom93xx.o
  CC      hw/nvram/fw_cfg.o
  CC      hw/nvram/chrp_nvram.o
  CC      hw/nvram/mac_nvram.o
  CC      hw/pci-bridge/pci_bridge_dev.o
  CC      hw/pci-bridge/pcie_root_port.o
  CC      hw/pci-bridge/gen_pcie_root_port.o
  CC      hw/pci-bridge/pci_expander_bridge.o
  CC      hw/pci-bridge/xio3130_upstream.o
  CC      hw/pci-bridge/xio3130_downstream.o
  CC      hw/pci-bridge/ioh3420.o
  CC      hw/pci-bridge/i82801b11.o
  CC      hw/pci-bridge/dec.o
  CC      hw/pci-host/pam.o
  CC      hw/pci-host/prep.o
  CC      hw/pci-host/grackle.o
  CC      hw/pci-host/uninorth.o
  CC      hw/pci-host/ppce500.o
  CC      hw/pci-host/versatile.o
  CC      hw/pci-host/apb.o
  CC      hw/pci-host/bonito.o
  CC      hw/pci-host/piix.o
  CC      hw/pci-host/q35.o
  CC      hw/pci-host/gpex.o
  CC      hw/pci-host/xilinx-pcie.o
  CC      hw/pci/pci.o
  CC      hw/pci/pci_bridge.o
  CC      hw/pci/msix.o
  CC      hw/pci/msi.o
  CC      hw/pci/shpc.o
  CC      hw/pci/slotid_cap.o
  CC      hw/pci/pci_host.o
  CC      hw/pci/pcie_host.o
  CC      hw/pci/pcie.o
  CC      hw/pci/pcie_aer.o
  CC      hw/pci/pcie_port.o
  CC      hw/pci/pci-stub.o
  CC      hw/pcmcia/pcmcia.o
  CC      hw/scsi/scsi-disk.o
  CC      hw/scsi/scsi-generic.o
  CC      hw/scsi/scsi-bus.o
  CC      hw/scsi/lsi53c895a.o
  CC      hw/scsi/mptsas.o
  CC      hw/scsi/mptconfig.o
  CC      hw/scsi/mptendian.o
  CC      hw/scsi/megasas.o
  CC      hw/scsi/vmw_pvscsi.o
  CC      hw/scsi/esp.o
  CC      hw/scsi/esp-pci.o
  CC      hw/sd/pl181.o
  CC      hw/sd/ssi-sd.o
  CC      hw/sd/sd.o
  CC      hw/sd/core.o
  CC      hw/sd/sdhci.o
  CC      hw/smbios/smbios.o
  CC      hw/smbios/smbios_type_38.o
  CC      hw/smbios/smbios-stub.o
  CC      hw/smbios/smbios_type_38-stub.o
  CC      hw/ssi/pl022.o
  CC      hw/ssi/ssi.o
  CC      hw/ssi/xilinx_spi.o
  CC      hw/ssi/xilinx_spips.o
  CC      hw/ssi/aspeed_smc.o
  CC      hw/ssi/stm32f2xx_spi.o
  CC      hw/timer/arm_timer.o
  CC      hw/timer/arm_mptimer.o
  CC      hw/timer/armv7m_systick.o
  CC      hw/timer/a9gtimer.o
  CC      hw/timer/cadence_ttc.o
  CC      hw/timer/ds1338.o
  CC      hw/timer/hpet.o
  CC      hw/timer/i8254_common.o
  CC      hw/timer/i8254.o
  CC      hw/timer/m48t59.o
  CC      hw/timer/m48t59-isa.o
  CC      hw/timer/pl031.o
  CC      hw/timer/puv3_ost.o
  CC      hw/timer/twl92230.o
  CC      hw/timer/xilinx_timer.o
  CC      hw/timer/slavio_timer.o
  CC      hw/timer/etraxfs_timer.o
  CC      hw/timer/grlib_gptimer.o
  CC      hw/timer/imx_epit.o
  CC      hw/timer/imx_gpt.o
  CC      hw/timer/lm32_timer.o
  CC      hw/timer/milkymist-sysctl.o
  CC      hw/timer/stm32f2xx_timer.o
  CC      hw/timer/aspeed_timer.o
  CC      hw/timer/sun4v-rtc.o
  CC      hw/timer/cmsdk-apb-timer.o
  CC      hw/tpm/tpm_tis.o
  CC      hw/usb/core.o
  CC      hw/usb/combined-packet.o
  CC      hw/usb/bus.o
  CC      hw/usb/libhw.o
  CC      hw/usb/desc.o
  CC      hw/usb/desc-msos.o
  CC      hw/usb/hcd-uhci.o
  CC      hw/usb/hcd-ohci.o
  CC      hw/usb/hcd-ehci.o
  CC      hw/usb/hcd-ehci-pci.o
  CC      hw/usb/hcd-xhci.o
  CC      hw/usb/hcd-ehci-sysbus.o
  CC      hw/usb/hcd-xhci-nec.o
  CC      hw/usb/hcd-musb.o
  CC      hw/usb/dev-hub.o
  CC      hw/usb/dev-hid.o
  CC      hw/usb/dev-wacom.o
  CC      hw/usb/dev-storage.o
  CC      hw/usb/dev-uas.o
  CC      hw/usb/dev-audio.o
  CC      hw/usb/dev-serial.o
  CC      hw/usb/dev-network.o
  CC      hw/usb/dev-bluetooth.o
  CC      hw/usb/dev-smartcard-reader.o
  CC      hw/usb/ccid-card-passthru.o
  CC      hw/usb/ccid-card-emulated.o
  CC      hw/usb/dev-mtp.o
  CC      hw/usb/redirect.o
  CC      hw/usb/quirks.o
  CC      hw/usb/host-libusb.o
  CC      hw/usb/host-legacy.o
  CC      hw/virtio/virtio-rng.o
  CC      hw/virtio/virtio-pci.o
  CC      hw/virtio/virtio-bus.o
  CC      hw/virtio/virtio-mmio.o
  CC      hw/virtio/vhost-stub.o
  CC      hw/watchdog/watchdog.o
  CC      hw/watchdog/wdt_i6300esb.o
  CC      hw/watchdog/wdt_ib700.o
  CC      hw/watchdog/wdt_diag288.o
  CC      hw/watchdog/wdt_aspeed.o
  CC      migration/migration.o
  CC      migration/socket.o
  CC      migration/fd.o
  CC      migration/exec.o
  CC      migration/tls.o
  CC      migration/channel.o
  CC      migration/savevm.o
  CC      migration/colo-comm.o
  CC      migration/colo.o
  CC      migration/colo-failover.o
  CC      migration/vmstate.o
  CC      migration/vmstate-types.o
  CC      migration/page_cache.o
  CC      migration/qemu-file.o
  CC      migration/global_state.o
  CC      migration/qemu-file-channel.o
  CC      migration/xbzrle.o
  CC      migration/postcopy-ram.o
  CC      migration/qjson.o
  CC      migration/block.o
  CC      net/net.o
  CC      net/queue.o
  CC      net/checksum.o
  CC      net/util.o
  CC      net/hub.o
  CC      net/socket.o
  CC      net/dump.o
  CC      net/eth.o
  CC      net/l2tpv3.o
  CC      net/vhost-user.o
  CC      net/slirp.o
  CC      net/filter.o
  CC      net/filter-buffer.o
  CC      net/filter-mirror.o
  CC      net/colo-compare.o
  CC      net/colo.o
  CC      net/filter-rewriter.o
  CC      net/filter-replay.o
  CC      net/tap.o
  CC      net/tap-linux.o
  CC      qom/cpu.o
  CC      replay/replay.o
  CC      replay/replay-internal.o
  CC      replay/replay-events.o
  CC      replay/replay-time.o
  CC      replay/replay-char.o
  CC      replay/replay-input.o
  CC      replay/replay-snapshot.o
  CC      replay/replay-net.o
  CC      replay/replay-audio.o
  CC      slirp/cksum.o
  CC      slirp/if.o
  CC      slirp/ip_icmp.o
  CC      slirp/ip6_icmp.o
  CC      slirp/ip6_input.o
  CC      slirp/ip6_output.o
  CC      slirp/ip_input.o
  CC      slirp/ip_output.o
  CC      slirp/dnssearch.o
  CC      slirp/dhcpv6.o
  CC      slirp/slirp.o
  CC      slirp/mbuf.o
  CC      slirp/misc.o
  CC      slirp/sbuf.o
  CC      slirp/socket.o
  CC      slirp/tcp_input.o
  CC      slirp/tcp_output.o
  CC      slirp/tcp_subr.o
  CC      slirp/tcp_timer.o
  CC      slirp/udp.o
  CC      slirp/udp6.o
  CC      slirp/bootp.o
  CC      slirp/arp_table.o
  CC      slirp/tftp.o
  CC      slirp/ndp_table.o
  CC      slirp/ncsi.o
  CC      ui/keymaps.o
  CC      ui/console.o
  CC      ui/cursor.o
  CC      ui/qemu-pixman.o
  CC      ui/input.o
  CC      ui/input-keymap.o
  CC      ui/input-linux.o
  CC      ui/input-legacy.o
  CC      ui/sdl2.o
  CC      ui/sdl2-input.o
  CC      ui/sdl2-2d.o
  CC      ui/sdl2-gl.o
  CC      ui/x_keymap.o
  CC      ui/curses.o
  CC      ui/vnc.o
  CC      ui/vnc-enc-zlib.o
  CC      ui/vnc-enc-hextile.o
  CC      ui/vnc-enc-tight.o
  CC      ui/vnc-palette.o
  CC      ui/vnc-enc-zrle.o
  CC      ui/vnc-auth-vencrypt.o
  CC      ui/vnc-ws.o
  CC      ui/vnc-auth-sasl.o
  CC      ui/vnc-jobs.o
  CC      ui/gtk.o
  CC      ui/shader.o
  VERT    ui/shader/texture-blit-vert.h
  FRAG    ui/shader/texture-blit-frag.h
  CC      ui/egl-helpers.o
  CC      ui/egl-context.o
  CC      ui/egl-headless.o
  CC      ui/gtk-gl-area.o
  CC      chardev/char.o
  CC      chardev/char-fd.o
  CC      chardev/char-fe.o
  CC      chardev/char-file.o
  CC      chardev/char-io.o
  CC      chardev/char-mux.o
  CC      chardev/char-null.o
  CC      chardev/char-parallel.o
  CC      chardev/char-pipe.o
  CC      chardev/char-pty.o
  CC      chardev/char-ringbuf.o
  CC      chardev/char-serial.o
  CC      chardev/char-socket.o
  CC      chardev/char-stdio.o
  CC      chardev/char-udp.o
  LINK    tests/qemu-iotests/socket_scm_helper
  CCAS    s390-ccw/start.o
  CC      s390-ccw/main.o
  GEN     qemu-doc.html
  GEN     qemu-doc.txt
  CC      s390-ccw/bootmap.o
  GEN     qemu.1
  CC      s390-ccw/sclp.o
  CC      s390-ccw/virtio-scsi.o
  CC      s390-ccw/virtio.o
  GEN     docs/interop/qemu-qmp-ref.html
  CC      s390-ccw/virtio-blkdev.o
s390-netboot.img not built since roms/SLOF/ is not available.
  BUILD   s390-ccw/s390-ccw.elf
  GEN     docs/interop/qemu-qmp-ref.txt
  STRIP   s390-ccw/s390-ccw.img
  GEN     docs/interop/qemu-qmp-ref.7
  GEN     docs/interop/qemu-ga-ref.html
  GEN     docs/interop/qemu-ga-ref.txt
  GEN     docs/interop/qemu-ga-ref.7
  CC      qga/commands.o
  CC      qga/guest-agent-command-state.o
  CC      qga/main.o
  CC      qga/commands-posix.o
  CC      qga/channel-posix.o
  CC      qga/qapi-generated/qga-qapi-types.o
  CC      qga/qapi-generated/qga-qapi-visit.o
  CC      qga/qapi-generated/qga-qmp-marshal.o
  AR      libqemuutil.a
  AR      libqemustub.a
  CC      qemu-img.o
  CC      ui/console-gl.o
  LINK    ivshmem-client
  LINK    ivshmem-server
  LINK    qemu-nbd
  LINK    qemu-io
  LINK    fsdev/virtfs-proxy-helper
  LINK    qemu-bridge-helper
  GEN     aarch64-softmmu/hmp-commands.h
  GEN     cris-softmmu/hmp-commands.h
  GEN     cris-softmmu/hmp-commands-info.h
  GEN     aarch64-softmmu/hmp-commands-info.h
  GEN     cris-softmmu/config-target.h
  GEN     aarch64-softmmu/config-target.h
  CC      cris-softmmu/exec.o
  GEN     alpha-softmmu/hmp-commands.h
  CC      aarch64-softmmu/exec.o
  GEN     alpha-softmmu/hmp-commands-info.h
  GEN     arm-softmmu/hmp-commands.h
  GEN     alpha-softmmu/config-target.h
  GEN     arm-softmmu/hmp-commands-info.h
  CC      alpha-softmmu/exec.o
  GEN     arm-softmmu/config-target.h
  CC      arm-softmmu/exec.o
  CC      cris-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/tcg/tcg.o
  CC      alpha-softmmu/tcg/tcg.o
  CC      arm-softmmu/tcg/tcg.o
  CC      cris-softmmu/tcg/tcg-op.o
  CC      alpha-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/tcg/tcg-op.o
  CC      cris-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/tcg/optimize.o
  CC      alpha-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/tcg/tcg-common.o
  CC      cris-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/tcg/tcg-runtime.o
  CC      cris-softmmu/tcg/tcg-runtime.o
  CC      alpha-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/tcg/optimize.o
  CC      alpha-softmmu/tcg/tcg-runtime.o
  CC      aarch64-softmmu/fpu/softfloat.o
  CC      cris-softmmu/fpu/softfloat.o
  CC      alpha-softmmu/fpu/softfloat.o
  CC      arm-softmmu/tcg/tcg-common.o
  CC      arm-softmmu/tcg/tcg-runtime.o
  CC      cris-softmmu/disas.o
  CC      arm-softmmu/fpu/softfloat.o
  CC      cris-softmmu/hax-stub.o
  CC      cris-softmmu/arch_init.o
  CC      aarch64-softmmu/disas.o
  CC      alpha-softmmu/disas.o
  CC      cris-softmmu/cpus.o
  GEN     aarch64-softmmu/gdbstub-xml.c
  CC      alpha-softmmu/hax-stub.o
  CC      alpha-softmmu/arch_init.o
  CC      cris-softmmu/monitor.o
  CC      alpha-softmmu/cpus.o
  CC      aarch64-softmmu/hax-stub.o
  CC      aarch64-softmmu/arch_init.o
  CC      alpha-softmmu/monitor.o
  CC      aarch64-softmmu/cpus.o
  CC      cris-softmmu/gdbstub.o
  CC      arm-softmmu/disas.o
  CC      aarch64-softmmu/monitor.o
  GEN     arm-softmmu/gdbstub-xml.c
  CC      cris-softmmu/balloon.o
  CC      cris-softmmu/ioport.o
  CC      arm-softmmu/hax-stub.o
  CC      alpha-softmmu/gdbstub.o
  CC      arm-softmmu/arch_init.o
  CC      cris-softmmu/numa.o
  CC      alpha-softmmu/balloon.o
  CC      arm-softmmu/cpus.o
  CC      alpha-softmmu/ioport.o
  CC      cris-softmmu/qtest.o
  CC      aarch64-softmmu/gdbstub.o
  CC      arm-softmmu/monitor.o
  CC      alpha-softmmu/numa.o
  CC      cris-softmmu/memory.o
  CC      aarch64-softmmu/balloon.o
  CC      alpha-softmmu/qtest.o
  CC      aarch64-softmmu/ioport.o
  CC      alpha-softmmu/memory.o
  CC      arm-softmmu/gdbstub.o
  CC      aarch64-softmmu/numa.o
  CC      cris-softmmu/memory_mapping.o
  CC      cris-softmmu/dump.o
  CC      aarch64-softmmu/qtest.o
  CC      arm-softmmu/balloon.o
  CC      arm-softmmu/ioport.o
  CC      aarch64-softmmu/memory.o
  CC      alpha-softmmu/memory_mapping.o
  CC      cris-softmmu/migration/ram.o
  CC      arm-softmmu/numa.o
  CC      alpha-softmmu/dump.o
  CC      arm-softmmu/qtest.o
  CC      aarch64-softmmu/memory_mapping.o
  CC      cris-softmmu/accel/accel.o
  CC      arm-softmmu/memory.o
  CC      cris-softmmu/accel/stubs/kvm-stub.o
  CC      alpha-softmmu/migration/ram.o
  CC      aarch64-softmmu/dump.o
  CC      cris-softmmu/accel/tcg/tcg-all.o
  CC      cris-softmmu/accel/tcg/cputlb.o
  CC      alpha-softmmu/accel/accel.o
  CC      aarch64-softmmu/migration/ram.o
  CC      arm-softmmu/memory_mapping.o
  CC      alpha-softmmu/accel/stubs/kvm-stub.o
  CC      arm-softmmu/dump.o
  CC      alpha-softmmu/accel/tcg/tcg-all.o
  CC      arm-softmmu/migration/ram.o
  CC      aarch64-softmmu/accel/accel.o
  CC      cris-softmmu/accel/tcg/cpu-exec.o
  CC      alpha-softmmu/accel/tcg/cputlb.o
  CC      aarch64-softmmu/accel/stubs/kvm-stub.o
  CC      cris-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/accel/tcg/tcg-all.o
  CC      cris-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/accel/accel.o
  CC      aarch64-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/accel/stubs/kvm-stub.o
  CC      cris-softmmu/hw/core/generic-loader.o
  CC      cris-softmmu/hw/core/null-machine.o
  CC      alpha-softmmu/accel/tcg/cpu-exec.o
  CC      arm-softmmu/accel/tcg/tcg-all.o
  CC      cris-softmmu/hw/misc/mmio_interface.o
  CC      alpha-softmmu/accel/tcg/cpu-exec-common.o
  CC      arm-softmmu/accel/tcg/cputlb.o
  CC      cris-softmmu/hw/net/etraxfs_eth.o
  CC      alpha-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec.o
  CC      cris-softmmu/hw/net/vhost_net.o
  CC      alpha-softmmu/hw/9pfs/virtio-9p-device.o
  CC      alpha-softmmu/hw/block/virtio-blk.o
  CC      cris-softmmu/hw/net/rocker/qmp-norocker.o
  CC      aarch64-softmmu/accel/tcg/cpu-exec-common.o
  CC      arm-softmmu/accel/tcg/cpu-exec.o
  CC      cris-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/accel/tcg/translate-all.o
  CC      alpha-softmmu/hw/block/dataplane/virtio-blk.o
  CC      alpha-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/accel/tcg/cpu-exec-common.o
  CC      aarch64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      alpha-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/accel/tcg/translate-all.o
  CC      cris-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/adc/stm32f2xx_adc.o
  CC      alpha-softmmu/hw/core/null-machine.o
  CC      cris-softmmu/hw/cris/boot.o
  CC      aarch64-softmmu/hw/block/virtio-blk.o
  CC      alpha-softmmu/hw/display/vga.o
  CC      cris-softmmu/hw/cris/axis_dev88.o
  CC      arm-softmmu/hw/9pfs/virtio-9p-device.o
  CC      arm-softmmu/hw/adc/stm32f2xx_adc.o
  CC      aarch64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      cris-softmmu/target/cris/translate.o
  CC      arm-softmmu/hw/block/virtio-blk.o
  CC      aarch64-softmmu/hw/char/exynos4210_uart.o
  CC      alpha-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/hw/char/omap_uart.o
  CC      arm-softmmu/hw/char/exynos4210_uart.o
  CC      alpha-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/char/digic-uart.o
  CC      arm-softmmu/hw/char/omap_uart.o
  CC      aarch64-softmmu/hw/char/stm32f2xx_usart.o
  CC      alpha-softmmu/hw/display/virtio-gpu-pci.o
  CC      cris-softmmu/target/cris/op_helper.o
  CC      arm-softmmu/hw/char/digic-uart.o
  CC      aarch64-softmmu/hw/char/bcm2835_aux.o
  CC      arm-softmmu/hw/char/stm32f2xx_usart.o
  CC      cris-softmmu/target/cris/helper.o
  CC      alpha-softmmu/hw/misc/ivshmem.o
  CC      arm-softmmu/hw/char/bcm2835_aux.o
  CC      aarch64-softmmu/hw/char/virtio-serial-bus.o
  CC      cris-softmmu/target/cris/cpu.o
  CC      arm-softmmu/hw/char/virtio-serial-bus.o
  CC      alpha-softmmu/hw/misc/mmio_interface.o
  CC      cris-softmmu/target/cris/gdbstub.o
  CC      aarch64-softmmu/hw/core/generic-loader.o
  CC      alpha-softmmu/hw/net/virtio-net.o
  CC      cris-softmmu/target/cris/mmu.o
  CC      arm-softmmu/hw/core/generic-loader.o
  CC      aarch64-softmmu/hw/core/null-machine.o
  CC      cris-softmmu/target/cris/machine.o
  CC      arm-softmmu/hw/core/null-machine.o
  CC      aarch64-softmmu/hw/cpu/arm11mpcore.o
  GEN     trace/generated-helpers.c
  CC      alpha-softmmu/hw/net/vhost_net.o
  CC      cris-softmmu/trace/control-target.o
  CC      aarch64-softmmu/hw/cpu/realview_mpcore.o
  CC      arm-softmmu/hw/cpu/arm11mpcore.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi.o
  CC      cris-softmmu/trace/generated-helpers.o
  CC      arm-softmmu/hw/cpu/realview_mpcore.o
  CC      aarch64-softmmu/hw/cpu/a9mpcore.o
  CC      arm-softmmu/hw/cpu/a9mpcore.o
  LINK    cris-softmmu/qemu-system-cris
  CC      aarch64-softmmu/hw/cpu/a15mpcore.o
  CC      alpha-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      arm-softmmu/hw/cpu/a15mpcore.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi-common.o
  CC      aarch64-softmmu/hw/display/omap_dss.o
  CC      alpha-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/display/omap_dss.o
  CC      aarch64-softmmu/hw/display/omap_lcdc.o
  CC      aarch64-softmmu/hw/display/pxa2xx_lcd.o
  CC      alpha-softmmu/hw/scsi/vhost-user-scsi.o
  CC      alpha-softmmu/hw/timer/mc146818rtc.o
  CC      arm-softmmu/hw/display/omap_lcdc.o
  CC      aarch64-softmmu/hw/display/bcm2835_fb.o
  CC      arm-softmmu/hw/display/pxa2xx_lcd.o
  CC      alpha-softmmu/hw/vfio/common.o
  CC      alpha-softmmu/hw/vfio/pci.o
  CC      aarch64-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/virtio-gpu.o
  CC      alpha-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/display/bcm2835_fb.o
  CC      arm-softmmu/hw/display/vga.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-3d.o
  CC      aarch64-softmmu/hw/display/virtio-gpu-pci.o
  CC      alpha-softmmu/hw/vfio/platform.o
  CC      alpha-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/hw/display/dpcd.o
  CC      aarch64-softmmu/hw/display/xlnx_dp.o
  CC      arm-softmmu/hw/display/virtio-gpu.o
  CC      alpha-softmmu/hw/virtio/virtio.o
  GEN     i386-softmmu/hmp-commands.h
  GEN     i386-softmmu/hmp-commands-info.h
  CC      aarch64-softmmu/hw/dma/xlnx_dpdma.o
  GEN     i386-softmmu/config-target.h
  CC      i386-softmmu/exec.o
  CC      arm-softmmu/hw/display/virtio-gpu-3d.o
  CC      alpha-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/dma/omap_dma.o
  CC      alpha-softmmu/hw/virtio/vhost.o
  CC      arm-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/dma/soc_dma.o
  CC      alpha-softmmu/hw/virtio/vhost-backend.o
  CC      arm-softmmu/hw/dma/omap_dma.o
  CC      aarch64-softmmu/hw/dma/pxa2xx_dma.o
  CC      i386-softmmu/tcg/tcg.o
  CC      alpha-softmmu/hw/virtio/vhost-user.o
  CC      aarch64-softmmu/hw/dma/bcm2835_dma.o
  CC      arm-softmmu/hw/dma/soc_dma.o
  CC      aarch64-softmmu/hw/gpio/omap_gpio.o
  CC      alpha-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/gpio/imx_gpio.o
  CC      arm-softmmu/hw/dma/pxa2xx_dma.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto.o
  CC      arm-softmmu/hw/dma/bcm2835_dma.o
  CC      aarch64-softmmu/hw/gpio/bcm2835_gpio.o
  CC      arm-softmmu/hw/gpio/omap_gpio.o
  CC      aarch64-softmmu/hw/i2c/omap_i2c.o
  CC      alpha-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      i386-softmmu/tcg/tcg-op.o
  CC      arm-softmmu/hw/gpio/imx_gpio.o
  CC      alpha-softmmu/hw/alpha/dp264.o
  CC      aarch64-softmmu/hw/input/pxa2xx_keypad.o
  CC      arm-softmmu/hw/gpio/bcm2835_gpio.o
  CC      aarch64-softmmu/hw/input/tsc210x.o
  CC      alpha-softmmu/hw/alpha/pci.o
  CC      arm-softmmu/hw/i2c/omap_i2c.o
  CC      alpha-softmmu/hw/alpha/typhoon.o
  CC      aarch64-softmmu/hw/intc/armv7m_nvic.o
  CC      arm-softmmu/hw/input/pxa2xx_keypad.o
  CC      alpha-softmmu/target/alpha/machine.o
  CC      arm-softmmu/hw/input/tsc210x.o
  CC      aarch64-softmmu/hw/intc/exynos4210_gic.o
  CC      alpha-softmmu/target/alpha/translate.o
  CC      aarch64-softmmu/hw/intc/exynos4210_combiner.o
  CC      arm-softmmu/hw/intc/armv7m_nvic.o
  CC      i386-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/intc/omap_intc.o
  CC      arm-softmmu/hw/intc/exynos4210_gic.o
  CC      i386-softmmu/tcg/tcg-common.o
  CC      alpha-softmmu/target/alpha/helper.o
  CC      arm-softmmu/hw/intc/exynos4210_combiner.o
  CC      i386-softmmu/tcg/tcg-runtime.o
  CC      aarch64-softmmu/hw/intc/bcm2835_ic.o
  CC      arm-softmmu/hw/intc/omap_intc.o
  CC      alpha-softmmu/target/alpha/cpu.o
  CC      i386-softmmu/fpu/softfloat.o
  CC      alpha-softmmu/target/alpha/int_helper.o
  CC      aarch64-softmmu/hw/intc/bcm2836_control.o
  CC      arm-softmmu/hw/intc/bcm2835_ic.o
  CC      alpha-softmmu/target/alpha/fpu_helper.o
  CC      aarch64-softmmu/hw/intc/allwinner-a10-pic.o
  CC      arm-softmmu/hw/intc/bcm2836_control.o
  CC      alpha-softmmu/target/alpha/vax_helper.o
  CC      aarch64-softmmu/hw/intc/aspeed_vic.o
  CC      arm-softmmu/hw/intc/allwinner-a10-pic.o
  CC      alpha-softmmu/target/alpha/sys_helper.o
  CC      aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      arm-softmmu/hw/intc/aspeed_vic.o
  CC      alpha-softmmu/target/alpha/mem_helper.o
  CC      arm-softmmu/hw/intc/arm_gicv3_cpuif.o
  CC      alpha-softmmu/target/alpha/gdbstub.o
  CC      aarch64-softmmu/hw/misc/ivshmem.o
  GEN     trace/generated-helpers.c
  CC      alpha-softmmu/trace/control-target.o
  CC      i386-softmmu/disas.o
  CC      aarch64-softmmu/hw/misc/arm_sysctl.o
  CC      alpha-softmmu/trace/generated-helpers.o
  CC      arm-softmmu/hw/misc/ivshmem.o
  CC      aarch64-softmmu/hw/misc/cbus.o
  GEN     i386-softmmu/gdbstub-xml.c
  CC      i386-softmmu/hax-stub.o
  LINK    alpha-softmmu/qemu-system-alpha
  CC      i386-softmmu/arch_init.o
  CC      aarch64-softmmu/hw/misc/exynos4210_pmu.o
  CC      arm-softmmu/hw/misc/arm_sysctl.o
  CC      i386-softmmu/cpus.o
  CC      arm-softmmu/hw/misc/cbus.o
  CC      aarch64-softmmu/hw/misc/exynos4210_clk.o
  CC      arm-softmmu/hw/misc/exynos4210_pmu.o
  CC      aarch64-softmmu/hw/misc/exynos4210_rng.o
  CC      arm-softmmu/hw/misc/exynos4210_clk.o
  CC      i386-softmmu/monitor.o
  CC      i386-softmmu/gdbstub.o
  CC      aarch64-softmmu/hw/misc/imx_ccm.o
  CC      arm-softmmu/hw/misc/exynos4210_rng.o
  CC      aarch64-softmmu/hw/misc/imx31_ccm.o
  CC      arm-softmmu/hw/misc/imx_ccm.o
  CC      arm-softmmu/hw/misc/imx31_ccm.o
  CC      aarch64-softmmu/hw/misc/imx25_ccm.o
  CC      i386-softmmu/balloon.o
  CC      aarch64-softmmu/hw/misc/imx6_ccm.o
  CC      arm-softmmu/hw/misc/imx25_ccm.o
  CC      aarch64-softmmu/hw/misc/imx6_src.o
  CC      i386-softmmu/ioport.o
  CC      arm-softmmu/hw/misc/imx6_ccm.o
  GEN     lm32-softmmu/hmp-commands.h
  CC      aarch64-softmmu/hw/misc/mst_fpga.o
  CC      i386-softmmu/numa.o
  CC      arm-softmmu/hw/misc/imx6_src.o
  GEN     lm32-softmmu/hmp-commands-info.h
  GEN     lm32-softmmu/config-target.h
  CC      lm32-softmmu/exec.o
  CC      aarch64-softmmu/hw/misc/omap_clk.o
  CC      arm-softmmu/hw/misc/mst_fpga.o
  CC      i386-softmmu/qtest.o
  CC      arm-softmmu/hw/misc/omap_clk.o
  CC      aarch64-softmmu/hw/misc/omap_gpmc.o
  CC      i386-softmmu/memory.o
  CC      arm-softmmu/hw/misc/omap_gpmc.o
  CC      aarch64-softmmu/hw/misc/omap_l4.o
  CC      aarch64-softmmu/hw/misc/omap_sdrc.o
  CC      arm-softmmu/hw/misc/omap_l4.o
  CC      aarch64-softmmu/hw/misc/omap_tap.o
  CC      lm32-softmmu/tcg/tcg.o
  CC      arm-softmmu/hw/misc/omap_sdrc.o
  CC      i386-softmmu/memory_mapping.o
  CC      aarch64-softmmu/hw/misc/bcm2835_mbox.o
  CC      arm-softmmu/hw/misc/omap_tap.o
  CC      aarch64-softmmu/hw/misc/bcm2835_property.o
  CC      arm-softmmu/hw/misc/bcm2835_mbox.o
  CC      i386-softmmu/dump.o
  CC      arm-softmmu/hw/misc/bcm2835_property.o
  CC      arm-softmmu/hw/misc/bcm2835_rng.o
  CC      aarch64-softmmu/hw/misc/bcm2835_rng.o
  CC      lm32-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/hw/misc/zynq_slcr.o
  CC      arm-softmmu/hw/misc/zynq_slcr.o
  CC      i386-softmmu/migration/ram.o
  CC      arm-softmmu/hw/misc/zynq-xadc.o
  CC      aarch64-softmmu/hw/misc/zynq-xadc.o
  CC      arm-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
  CC      arm-softmmu/hw/misc/mps2-scc.o
  CC      aarch64-softmmu/hw/misc/mps2-scc.o
  CC      i386-softmmu/accel/accel.o
  CC      aarch64-softmmu/hw/misc/auxbus.o
  CC      i386-softmmu/accel/stubs/kvm-stub.o
  CC      arm-softmmu/hw/misc/aspeed_scu.o
  CC      aarch64-softmmu/hw/misc/aspeed_scu.o
  CC      i386-softmmu/accel/tcg/tcg-all.o
  CC      i386-softmmu/accel/tcg/cputlb.o
  CC      arm-softmmu/hw/misc/aspeed_sdmc.o
  CC      aarch64-softmmu/hw/misc/aspeed_sdmc.o
  CC      lm32-softmmu/tcg/optimize.o
  CC      arm-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/hw/net/virtio-net.o
  CC      arm-softmmu/hw/net/virtio-net.o
  CC      lm32-softmmu/tcg/tcg-common.o
  CC      lm32-softmmu/tcg/tcg-runtime.o
  CC      arm-softmmu/hw/net/vhost_net.o
  CC      i386-softmmu/accel/tcg/cpu-exec.o
  CC      lm32-softmmu/fpu/softfloat.o
  CC      arm-softmmu/hw/pcmcia/pxa2xx.o
  CC      aarch64-softmmu/hw/net/vhost_net.o
  CC      i386-softmmu/accel/tcg/cpu-exec-common.o
  CC      arm-softmmu/hw/scsi/virtio-scsi.o
  CC      aarch64-softmmu/hw/pcmcia/pxa2xx.o
  CC      i386-softmmu/accel/tcg/translate-all.o
  CC      arm-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi.o
  CC      i386-softmmu/hw/9pfs/virtio-9p-device.o
  CC      arm-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-softmmu/hw/block/virtio-blk.o
  CC      arm-softmmu/hw/scsi/vhost-scsi.o
  CC      aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      arm-softmmu/hw/scsi/vhost-user-scsi.o
  CC      i386-softmmu/hw/block/dataplane/virtio-blk.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      i386-softmmu/hw/char/virtio-serial-bus.o
  CC      arm-softmmu/hw/sd/omap_mmc.o
  CC      aarch64-softmmu/hw/scsi/vhost-scsi.o
  CC      lm32-softmmu/disas.o
  CC      aarch64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      i386-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/hw/sd/pxa2xx_mmci.o
  CC      aarch64-softmmu/hw/sd/omap_mmc.o
  CC      lm32-softmmu/hax-stub.o
  CC      i386-softmmu/hw/core/null-machine.o
  CC      arm-softmmu/hw/sd/bcm2835_sdhost.o
  CC      lm32-softmmu/arch_init.o
  CC      aarch64-softmmu/hw/sd/pxa2xx_mmci.o
  CC      arm-softmmu/hw/ssi/omap_spi.o
  CC      i386-softmmu/hw/display/vga.o
  CC      lm32-softmmu/cpus.o
  CC      aarch64-softmmu/hw/sd/bcm2835_sdhost.o
  CC      arm-softmmu/hw/ssi/imx_spi.o
  CC      aarch64-softmmu/hw/ssi/omap_spi.o
  CC      lm32-softmmu/monitor.o
  CC      arm-softmmu/hw/timer/exynos4210_mct.o
  CC      aarch64-softmmu/hw/ssi/imx_spi.o
  CC      arm-softmmu/hw/timer/exynos4210_pwm.o
  CC      aarch64-softmmu/hw/timer/exynos4210_mct.o
  CC      i386-softmmu/hw/display/virtio-gpu.o
  CC      arm-softmmu/hw/timer/exynos4210_rtc.o
  CC      aarch64-softmmu/hw/timer/exynos4210_pwm.o
  CC      i386-softmmu/hw/display/virtio-gpu-3d.o
  CC      arm-softmmu/hw/timer/omap_gptimer.o
  CC      aarch64-softmmu/hw/timer/exynos4210_rtc.o
  CC      lm32-softmmu/gdbstub.o
  CC      arm-softmmu/hw/timer/omap_synctimer.o
  CC      i386-softmmu/hw/display/virtio-gpu-pci.o
  CC      aarch64-softmmu/hw/timer/omap_gptimer.o
  CC      arm-softmmu/hw/timer/pxa2xx_timer.o
  CC      aarch64-softmmu/hw/timer/omap_synctimer.o
  CC      i386-softmmu/hw/display/virtio-vga.o
  CC      lm32-softmmu/balloon.o
  CC      aarch64-softmmu/hw/timer/pxa2xx_timer.o
  CC      arm-softmmu/hw/timer/digic-timer.o
  CC      lm32-softmmu/ioport.o
  CC      i386-softmmu/hw/intc/apic.o
  CC      aarch64-softmmu/hw/timer/digic-timer.o
  CC      arm-softmmu/hw/timer/allwinner-a10-pit.o
  CC      lm32-softmmu/numa.o
  CC      aarch64-softmmu/hw/timer/allwinner-a10-pit.o
  CC      i386-softmmu/hw/intc/apic_common.o
  CC      aarch64-softmmu/hw/usb/tusb6010.o
  CC      lm32-softmmu/qtest.o
  CC      arm-softmmu/hw/usb/tusb6010.o
  CC      i386-softmmu/hw/intc/ioapic.o
  CC      aarch64-softmmu/hw/vfio/common.o
  CC      lm32-softmmu/memory.o
  CC      arm-softmmu/hw/vfio/common.o
  CC      i386-softmmu/hw/isa/lpc_ich9.o
  CC      aarch64-softmmu/hw/vfio/pci.o
  CC      i386-softmmu/hw/misc/vmport.o
  CC      arm-softmmu/hw/vfio/pci.o
  CC      i386-softmmu/hw/misc/ivshmem.o
  CC      lm32-softmmu/memory_mapping.o
  CC      i386-softmmu/hw/misc/pvpanic.o
  CC      aarch64-softmmu/hw/vfio/pci-quirks.o
  CC      lm32-softmmu/dump.o
  CC      i386-softmmu/hw/misc/mmio_interface.o
  CC      arm-softmmu/hw/vfio/pci-quirks.o
  CC      lm32-softmmu/migration/ram.o
  CC      i386-softmmu/hw/net/virtio-net.o
  CC      aarch64-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/vfio/calxeda-xgmac.o
  CC      aarch64-softmmu/hw/vfio/calxeda-xgmac.o
  CC      i386-softmmu/hw/net/vhost_net.o
  CC      arm-softmmu/hw/vfio/amd-xgbe.o
  CC      lm32-softmmu/accel/accel.o
  CC      aarch64-softmmu/hw/vfio/amd-xgbe.o
  CC      i386-softmmu/hw/scsi/virtio-scsi.o
  CC      arm-softmmu/hw/vfio/spapr.o
  CC      lm32-softmmu/accel/stubs/kvm-stub.o
  CC      aarch64-softmmu/hw/vfio/spapr.o
  CC      lm32-softmmu/accel/tcg/tcg-all.o
  CC      arm-softmmu/hw/virtio/virtio.o
  CC      i386-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-softmmu/hw/virtio/virtio.o
  CC      lm32-softmmu/accel/tcg/cputlb.o
  CC      i386-softmmu/hw/scsi/vhost-scsi-common.o
  CC      arm-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/virtio/virtio-balloon.o
  CC      i386-softmmu/hw/scsi/vhost-scsi.o
  CC      arm-softmmu/hw/virtio/vhost.o
  CC      i386-softmmu/hw/scsi/vhost-user-scsi.o
  CC      aarch64-softmmu/hw/virtio/vhost.o
  CC      lm32-softmmu/accel/tcg/cpu-exec.o
  CC      i386-softmmu/hw/timer/mc146818rtc.o
  CC      arm-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/virtio/vhost-backend.o
  CC      lm32-softmmu/accel/tcg/cpu-exec-common.o
  CC      lm32-softmmu/accel/tcg/translate-all.o
  CC      aarch64-softmmu/hw/virtio/vhost-user.o
  CC      arm-softmmu/hw/virtio/vhost-user.o
  CC      i386-softmmu/hw/vfio/common.o
  CC      aarch64-softmmu/hw/virtio/vhost-vsock.o
  CC      lm32-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/hw/virtio/vhost-vsock.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto.o
  CC      lm32-softmmu/hw/core/null-machine.o
  CC      i386-softmmu/hw/vfio/pci.o
  CC      arm-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      lm32-softmmu/hw/input/milkymist-softusb.o
  CC      lm32-softmmu/hw/misc/milkymist-hpdmc.o
  CC      arm-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-softmmu/hw/arm/boot.o
  CC      lm32-softmmu/hw/misc/milkymist-pfpu.o
  CC      i386-softmmu/hw/vfio/pci-quirks.o
  CC      arm-softmmu/hw/arm/boot.o
  CC      aarch64-softmmu/hw/arm/collie.o
  CC      lm32-softmmu/hw/misc/mmio_interface.o
  CC      lm32-softmmu/hw/net/milkymist-minimac2.o
  CC      arm-softmmu/hw/arm/collie.o
  CC      i386-softmmu/hw/vfio/platform.o
  CC      aarch64-softmmu/hw/arm/exynos4_boards.o
  CC      arm-softmmu/hw/arm/exynos4_boards.o
  CC      lm32-softmmu/hw/net/vhost_net.o
  CC      aarch64-softmmu/hw/arm/gumstix.o
  CC      aarch64-softmmu/hw/arm/highbank.o
  CC      i386-softmmu/hw/vfio/spapr.o
  CC      arm-softmmu/hw/arm/gumstix.o
  CC      lm32-softmmu/hw/net/rocker/qmp-norocker.o
  CC      aarch64-softmmu/hw/arm/digic_boards.o
  CC      i386-softmmu/hw/virtio/virtio.o
  CC      arm-softmmu/hw/arm/highbank.o
  CC      lm32-softmmu/hw/sd/milkymist-memcard.o
  CC      aarch64-softmmu/hw/arm/integratorcp.o
  CC      lm32-softmmu/hw/vfio/common.o
  CC      arm-softmmu/hw/arm/digic_boards.o
  CC      aarch64-softmmu/hw/arm/mainstone.o
  CC      arm-softmmu/hw/arm/integratorcp.o
  CC      i386-softmmu/hw/virtio/virtio-balloon.o
  CC      aarch64-softmmu/hw/arm/musicpal.o
  CC      lm32-softmmu/hw/vfio/platform.o
  CC      arm-softmmu/hw/arm/mainstone.o
  CC      i386-softmmu/hw/virtio/vhost.o
  CC      aarch64-softmmu/hw/arm/nseries.o
  CC      lm32-softmmu/hw/vfio/spapr.o
  CC      arm-softmmu/hw/arm/musicpal.o
  CC      lm32-softmmu/hw/lm32/lm32_boards.o
  CC      i386-softmmu/hw/virtio/vhost-backend.o
  CC      aarch64-softmmu/hw/arm/omap_sx1.o
  CC      arm-softmmu/hw/arm/nseries.o
  CC      i386-softmmu/hw/virtio/vhost-user.o
  CC      lm32-softmmu/hw/lm32/milkymist.o
  CC      i386-softmmu/hw/virtio/vhost-vsock.o
  CC      lm32-softmmu/target/lm32/translate.o
  CC      aarch64-softmmu/hw/arm/palm.o
  CC      arm-softmmu/hw/arm/omap_sx1.o
  CC      i386-softmmu/hw/virtio/virtio-crypto.o
  CC      aarch64-softmmu/hw/arm/realview.o
  CC      arm-softmmu/hw/arm/palm.o
  CC      lm32-softmmu/target/lm32/op_helper.o
  CC      i386-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      lm32-softmmu/target/lm32/helper.o
  CC      aarch64-softmmu/hw/arm/spitz.o
  CC      i386-softmmu/hw/i386/multiboot.o
  CC      arm-softmmu/hw/arm/realview.o
  CC      lm32-softmmu/target/lm32/cpu.o
  CC      i386-softmmu/hw/i386/pc.o
  CC      aarch64-softmmu/hw/arm/stellaris.o
  CC      arm-softmmu/hw/arm/spitz.o
  CC      lm32-softmmu/target/lm32/gdbstub.o
  CC      aarch64-softmmu/hw/arm/tosa.o
  CC      arm-softmmu/hw/arm/stellaris.o
  CC      lm32-softmmu/target/lm32/lm32-semi.o
  CC      i386-softmmu/hw/i386/pc_piix.o
  CC      aarch64-softmmu/hw/arm/versatilepb.o
  CC      lm32-softmmu/target/lm32/machine.o
  CC      arm-softmmu/hw/arm/tosa.o
  GEN     trace/generated-helpers.c
  CC      lm32-softmmu/trace/control-target.o
  CC      i386-softmmu/hw/i386/pc_q35.o
  CC      aarch64-softmmu/hw/arm/vexpress.o
  CC      arm-softmmu/hw/arm/versatilepb.o
  CC      i386-softmmu/hw/i386/pc_sysfw.o
  CC      lm32-softmmu/trace/generated-helpers.o
  CC      aarch64-softmmu/hw/arm/virt.o
  CC      arm-softmmu/hw/arm/vexpress.o
  LINK    lm32-softmmu/qemu-system-lm32
  CC      i386-softmmu/hw/i386/x86-iommu.o
  CC      arm-softmmu/hw/arm/virt.o
  CC      i386-softmmu/hw/i386/intel_iommu.o
  CC      aarch64-softmmu/hw/arm/xilinx_zynq.o
  CC      aarch64-softmmu/hw/arm/z2.o
  CC      i386-softmmu/hw/i386/amd_iommu.o
  CC      arm-softmmu/hw/arm/xilinx_zynq.o
  CC      aarch64-softmmu/hw/arm/virt-acpi-build.o
  CC      arm-softmmu/hw/arm/z2.o
  CC      i386-softmmu/hw/i386/kvmvapic.o
  CC      i386-softmmu/hw/i386/acpi-build.o
  CC      aarch64-softmmu/hw/arm/netduino2.o
  CC      arm-softmmu/hw/arm/virt-acpi-build.o
  CC      aarch64-softmmu/hw/arm/sysbus-fdt.o
  GEN     m68k-softmmu/hmp-commands.h
  GEN     m68k-softmmu/hmp-commands-info.h
  GEN     m68k-softmmu/config-target.h
  CC      m68k-softmmu/exec.o
  CC      arm-softmmu/hw/arm/netduino2.o
  CC      aarch64-softmmu/hw/arm/armv7m.o
  CC      arm-softmmu/hw/arm/sysbus-fdt.o
  CC      aarch64-softmmu/hw/arm/exynos4210.o
  CC      i386-softmmu/hw/i386/pci-assign-load-rom.o
  CC      arm-softmmu/hw/arm/armv7m.o
  CC      i386-softmmu/target/i386/helper.o
  CC      aarch64-softmmu/hw/arm/pxa2xx.o
  CC      arm-softmmu/hw/arm/exynos4210.o
  CC      i386-softmmu/target/i386/cpu.o
  CC      arm-softmmu/hw/arm/pxa2xx.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_gpio.o
  CC      m68k-softmmu/tcg/tcg.o
  CC      aarch64-softmmu/hw/arm/pxa2xx_pic.o
  CC      i386-softmmu/target/i386/gdbstub.o
  CC      arm-softmmu/hw/arm/pxa2xx_gpio.o
  CC      aarch64-softmmu/hw/arm/digic.o
  CC      i386-softmmu/target/i386/xsave_helper.o
  CC      aarch64-softmmu/hw/arm/omap1.o
  CC      arm-softmmu/hw/arm/pxa2xx_pic.o
  CC      i386-softmmu/target/i386/translate.o
  CC      arm-softmmu/hw/arm/digic.o
  CC      arm-softmmu/hw/arm/omap1.o
  CC      m68k-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/hw/arm/omap2.o
  CC      arm-softmmu/hw/arm/omap2.o
  CC      aarch64-softmmu/hw/arm/strongarm.o
  CC      arm-softmmu/hw/arm/strongarm.o
  CC      aarch64-softmmu/hw/arm/allwinner-a10.o
  CC      arm-softmmu/hw/arm/allwinner-a10.o
  CC      m68k-softmmu/tcg/optimize.o
  CC      aarch64-softmmu/hw/arm/cubieboard.o
  CC      arm-softmmu/hw/arm/cubieboard.o
  CC      aarch64-softmmu/hw/arm/bcm2835_peripherals.o
  CC      arm-softmmu/hw/arm/bcm2835_peripherals.o
  CC      m68k-softmmu/tcg/tcg-common.o
  CC      aarch64-softmmu/hw/arm/bcm2836.o
  CC      m68k-softmmu/tcg/tcg-runtime.o
  CC      arm-softmmu/hw/arm/bcm2836.o
  CC      aarch64-softmmu/hw/arm/raspi.o
  CC      m68k-softmmu/fpu/softfloat.o
  CC      arm-softmmu/hw/arm/raspi.o
  CC      i386-softmmu/target/i386/bpt_helper.o
  CC      aarch64-softmmu/hw/arm/stm32f205_soc.o
  CC      i386-softmmu/target/i386/cc_helper.o
  CC      aarch64-softmmu/hw/arm/xlnx-zynqmp.o
  CC      arm-softmmu/hw/arm/stm32f205_soc.o
  CC      i386-softmmu/target/i386/excp_helper.o
  CC      arm-softmmu/hw/arm/fsl-imx25.o
  CC      aarch64-softmmu/hw/arm/xlnx-ep108.o
  CC      arm-softmmu/hw/arm/imx25_pdk.o
  CC      i386-softmmu/target/i386/fpu_helper.o
  CC      aarch64-softmmu/hw/arm/fsl-imx25.o
  CC      arm-softmmu/hw/arm/fsl-imx31.o
  CC      aarch64-softmmu/hw/arm/imx25_pdk.o
  CC      arm-softmmu/hw/arm/kzm.o
  CC      m68k-softmmu/disas.o
  CC      aarch64-softmmu/hw/arm/fsl-imx31.o
  CC      arm-softmmu/hw/arm/fsl-imx6.o
  CC      aarch64-softmmu/hw/arm/kzm.o
  GEN     m68k-softmmu/gdbstub-xml.c
  CC      arm-softmmu/hw/arm/sabrelite.o
  CC      aarch64-softmmu/hw/arm/fsl-imx6.o
  CC      m68k-softmmu/hax-stub.o
  CC      arm-softmmu/hw/arm/aspeed_soc.o
  CC      m68k-softmmu/arch_init.o
  CC      arm-softmmu/hw/arm/aspeed.o
  CC      aarch64-softmmu/hw/arm/sabrelite.o
  CC      arm-softmmu/hw/arm/mps2.o
  CC      m68k-softmmu/cpus.o
  CC      aarch64-softmmu/hw/arm/aspeed_soc.o
  CC      i386-softmmu/target/i386/int_helper.o
  CC      aarch64-softmmu/hw/arm/aspeed.o
  CC      arm-softmmu/target/arm/arm-semi.o
  CC      i386-softmmu/target/i386/mem_helper.o
  CC      m68k-softmmu/monitor.o
  CC      aarch64-softmmu/hw/arm/mps2.o
  CC      arm-softmmu/target/arm/machine.o
  CC      i386-softmmu/target/i386/misc_helper.o
  CC      arm-softmmu/target/arm/psci.o
  CC      aarch64-softmmu/target/arm/arm-semi.o
  CC      i386-softmmu/target/i386/mpx_helper.o
  CC      arm-softmmu/target/arm/arch_dump.o
  CC      aarch64-softmmu/target/arm/machine.o
  CC      m68k-softmmu/gdbstub.o
  CC      i386-softmmu/target/i386/seg_helper.o
  CC      aarch64-softmmu/target/arm/psci.o
  CC      arm-softmmu/target/arm/monitor.o
  CC      arm-softmmu/target/arm/kvm-stub.o
  CC      aarch64-softmmu/target/arm/arch_dump.o
  CC      m68k-softmmu/balloon.o
  CC      arm-softmmu/target/arm/translate.o
  CC      aarch64-softmmu/target/arm/monitor.o
  CC      m68k-softmmu/ioport.o
  CC      m68k-softmmu/numa.o
  CC      aarch64-softmmu/target/arm/kvm-stub.o
  CC      m68k-softmmu/qtest.o
  CC      aarch64-softmmu/target/arm/translate.o
  CC      m68k-softmmu/memory.o
  CC      i386-softmmu/target/i386/smm_helper.o
  CC      i386-softmmu/target/i386/svm_helper.o
  CC      i386-softmmu/target/i386/machine.o
  CC      m68k-softmmu/memory_mapping.o
  CC      i386-softmmu/target/i386/arch_memory_mapping.o
  CC      m68k-softmmu/dump.o
  CC      i386-softmmu/target/i386/arch_dump.o
  CC      i386-softmmu/target/i386/monitor.o
  CC      m68k-softmmu/migration/ram.o
  CC      i386-softmmu/target/i386/kvm-stub.o
  CC      arm-softmmu/target/arm/op_helper.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/accel/accel.o
  CC      i386-softmmu/trace/control-target.o
  CC      m68k-softmmu/accel/stubs/kvm-stub.o
  CC      i386-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/accel/tcg/tcg-all.o
  CC      i386-softmmu/trace/generated-helpers.o
  CC      arm-softmmu/target/arm/helper.o
  CC      m68k-softmmu/accel/tcg/cputlb.o
  LINK    i386-softmmu/qemu-system-i386
  CC      aarch64-softmmu/target/arm/op_helper.o
  CC      m68k-softmmu/accel/tcg/cpu-exec.o
  CC      aarch64-softmmu/target/arm/helper.o
  CC      m68k-softmmu/accel/tcg/cpu-exec-common.o
  CC      m68k-softmmu/accel/tcg/translate-all.o
  GEN     microblazeel-softmmu/hmp-commands.h
  GEN     microblazeel-softmmu/hmp-commands-info.h
  GEN     microblazeel-softmmu/config-target.h
  CC      microblazeel-softmmu/exec.o
  CC      arm-softmmu/target/arm/cpu.o
  CC      m68k-softmmu/hw/char/mcf_uart.o
  CC      m68k-softmmu/hw/core/generic-loader.o
  CC      arm-softmmu/target/arm/neon_helper.o
  CC      m68k-softmmu/hw/core/null-machine.o
  CC      m68k-softmmu/hw/misc/mmio_interface.o
  CC      aarch64-softmmu/target/arm/cpu.o
  CC      microblazeel-softmmu/tcg/tcg.o
  CC      m68k-softmmu/hw/net/mcf_fec.o
  CC      arm-softmmu/target/arm/iwmmxt_helper.o
  CC      aarch64-softmmu/target/arm/neon_helper.o
  CC      m68k-softmmu/hw/net/vhost_net.o
  CC      m68k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      arm-softmmu/target/arm/gdbstub.o
  CC      m68k-softmmu/hw/vfio/common.o
  CC      arm-softmmu/target/arm/crypto_helper.o
  CC      microblazeel-softmmu/tcg/tcg-op.o
  CC      aarch64-softmmu/target/arm/iwmmxt_helper.o
  CC      arm-softmmu/target/arm/arm-powerctl.o
  CC      m68k-softmmu/hw/vfio/platform.o
  GEN     trace/generated-helpers.c
  CC      arm-softmmu/trace/control-target.o
  CC      aarch64-softmmu/target/arm/gdbstub.o
  CC      m68k-softmmu/hw/vfio/spapr.o
  CC      aarch64-softmmu/target/arm/cpu64.o
  CC      arm-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/hw/m68k/an5206.o
  CC      aarch64-softmmu/target/arm/translate-a64.o
  CC      arm-softmmu/trace/generated-helpers.o
  CC      m68k-softmmu/hw/m68k/mcf5208.o
  LINK    arm-softmmu/qemu-system-arm
  CC      m68k-softmmu/hw/m68k/mcf5206.o
  CC      microblazeel-softmmu/tcg/optimize.o
  CC      m68k-softmmu/hw/m68k/mcf_intc.o
  CC      m68k-softmmu/target/m68k/m68k-semi.o
  CC      microblazeel-softmmu/tcg/tcg-common.o
  CC      m68k-softmmu/target/m68k/translate.o
  CC      microblazeel-softmmu/tcg/tcg-runtime.o
  CC      aarch64-softmmu/target/arm/helper-a64.o
  CC      microblazeel-softmmu/fpu/softfloat.o
  CC      aarch64-softmmu/target/arm/gdbstub64.o
  CC      microblazeel-softmmu/disas.o
  CC      aarch64-softmmu/target/arm/crypto_helper.o
  CC      aarch64-softmmu/target/arm/arm-powerctl.o
  CC      m68k-softmmu/target/m68k/op_helper.o
  CC      m68k-softmmu/target/m68k/helper.o
  GEN     trace/generated-helpers.c
  CC      aarch64-softmmu/trace/control-target.o
  CC      m68k-softmmu/target/m68k/cpu.o
  CC      m68k-softmmu/target/m68k/fpu_helper.o
  CC      aarch64-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/target/m68k/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      m68k-softmmu/trace/control-target.o
  CC      aarch64-softmmu/trace/generated-helpers.o
  CC      microblazeel-softmmu/hax-stub.o
  CC      m68k-softmmu/gdbstub-xml.o
  CC      m68k-softmmu/trace/generated-helpers.o
  CC      microblazeel-softmmu/arch_init.o
  CC      microblazeel-softmmu/cpus.o
  LINK    aarch64-softmmu/qemu-system-aarch64
  CC      microblazeel-softmmu/monitor.o
  LINK    m68k-softmmu/qemu-system-m68k
  CC      microblazeel-softmmu/gdbstub.o
  CC      microblazeel-softmmu/balloon.o
  GEN     microblaze-softmmu/hmp-commands.h
  CC      microblazeel-softmmu/ioport.o
  GEN     microblaze-softmmu/hmp-commands-info.h
  GEN     microblaze-softmmu/config-target.h
  CC      microblazeel-softmmu/numa.o
  CC      microblaze-softmmu/exec.o
  CC      microblazeel-softmmu/qtest.o
  GEN     mips64el-softmmu/hmp-commands.h
  GEN     mips64el-softmmu/hmp-commands-info.h
  GEN     mips64el-softmmu/config-target.h
  CC      mips64el-softmmu/exec.o
  CC      microblaze-softmmu/tcg/tcg.o
  CC      microblazeel-softmmu/memory.o
  CC      microblazeel-softmmu/memory_mapping.o
  CC      microblaze-softmmu/tcg/tcg-op.o
  CC      mips64el-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/tcg/optimize.o
  CC      microblazeel-softmmu/dump.o
  CC      microblazeel-softmmu/migration/ram.o
  CC      microblaze-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/tcg/tcg-op.o
  CC      microblaze-softmmu/tcg/tcg-runtime.o
  CC      microblazeel-softmmu/accel/accel.o
  CC      microblazeel-softmmu/accel/stubs/kvm-stub.o
  CC      microblaze-softmmu/fpu/softfloat.o
  CC      microblaze-softmmu/disas.o
  CC      microblazeel-softmmu/accel/tcg/tcg-all.o
  CC      mips64el-softmmu/tcg/optimize.o
  CC      microblazeel-softmmu/accel/tcg/cputlb.o
  CC      microblaze-softmmu/hax-stub.o
  CC      mips64el-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/tcg/tcg-runtime.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec.o
  CC      mips64el-softmmu/fpu/softfloat.o
  CC      microblaze-softmmu/arch_init.o
  CC      microblazeel-softmmu/accel/tcg/cpu-exec-common.o
  CC      microblaze-softmmu/cpus.o
  GEN     mips64-softmmu/hmp-commands.h
  GEN     mips64-softmmu/hmp-commands-info.h
  GEN     mips64-softmmu/config-target.h
  CC      microblazeel-softmmu/accel/tcg/translate-all.o
  CC      mips64-softmmu/exec.o
  CC      microblaze-softmmu/monitor.o
  CC      microblazeel-softmmu/hw/core/generic-loader.o
  CC      microblazeel-softmmu/hw/core/null-machine.o
  CC      microblazeel-softmmu/hw/misc/mmio_interface.o
  CC      microblaze-softmmu/gdbstub.o
  CC      microblazeel-softmmu/hw/net/xilinx_ethlite.o
  CC      mips64el-softmmu/disas.o
  CC      mips64-softmmu/tcg/tcg.o
  CC      microblazeel-softmmu/hw/net/vhost_net.o
  CC      microblaze-softmmu/balloon.o
  CC      microblazeel-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips64el-softmmu/hax-stub.o
  CC      microblaze-softmmu/ioport.o
  CC      microblazeel-softmmu/hw/vfio/common.o
  CC      mips64el-softmmu/arch_init.o
  CC      microblaze-softmmu/numa.o
  CC      mips64el-softmmu/cpus.o
  CC      microblazeel-softmmu/hw/vfio/platform.o
  CC      microblaze-softmmu/qtest.o
  CC      microblazeel-softmmu/hw/vfio/spapr.o
  CC      mips64el-softmmu/monitor.o
  CC      microblaze-softmmu/memory.o
  CC      mips64-softmmu/tcg/tcg-op.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      microblazeel-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      microblaze-softmmu/memory_mapping.o
  CC      microblazeel-softmmu/hw/microblaze/boot.o
  CC      mips64el-softmmu/gdbstub.o
  CC      microblaze-softmmu/dump.o
  CC      microblazeel-softmmu/target/microblaze/translate.o
  CC      microblaze-softmmu/migration/ram.o
  CC      mips64el-softmmu/balloon.o
  CC      mips64el-softmmu/ioport.o
  CC      mips64-softmmu/tcg/optimize.o
  CC      mips64el-softmmu/numa.o
  CC      microblazeel-softmmu/target/microblaze/op_helper.o
  CC      microblaze-softmmu/accel/accel.o
  CC      mips64el-softmmu/qtest.o
  CC      microblazeel-softmmu/target/microblaze/helper.o
  CC      microblaze-softmmu/accel/stubs/kvm-stub.o
  CC      microblazeel-softmmu/target/microblaze/cpu.o
  CC      microblaze-softmmu/accel/tcg/tcg-all.o
  CC      mips64el-softmmu/memory.o
  CC      mips64-softmmu/tcg/tcg-common.o
  CC      microblaze-softmmu/accel/tcg/cputlb.o
  CC      microblazeel-softmmu/target/microblaze/gdbstub.o
  CC      mips64-softmmu/tcg/tcg-runtime.o
  CC      microblazeel-softmmu/target/microblaze/mmu.o
  CC      mips64-softmmu/fpu/softfloat.o
  GEN     trace/generated-helpers.c
  CC      microblazeel-softmmu/trace/control-target.o
  CC      mips64el-softmmu/memory_mapping.o
  CC      mips64el-softmmu/dump.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec.o
  CC      microblazeel-softmmu/trace/generated-helpers.o
  CC      microblaze-softmmu/accel/tcg/cpu-exec-common.o
  LINK    microblazeel-softmmu/qemu-system-microblazeel
  CC      mips64el-softmmu/migration/ram.o
  CC      microblaze-softmmu/accel/tcg/translate-all.o
  CC      microblaze-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/disas.o
  CC      microblaze-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/accel/accel.o
  CC      mips64-softmmu/hax-stub.o
  CC      microblaze-softmmu/hw/misc/mmio_interface.o
  CC      mips64el-softmmu/accel/stubs/kvm-stub.o
  CC      mips64-softmmu/arch_init.o
  GEN     mipsel-softmmu/hmp-commands.h
  CC      mips64-softmmu/cpus.o
  CC      mips64el-softmmu/accel/tcg/tcg-all.o
  GEN     mipsel-softmmu/hmp-commands-info.h
  GEN     mipsel-softmmu/config-target.h
  CC      microblaze-softmmu/hw/net/xilinx_ethlite.o
  CC      mipsel-softmmu/exec.o
  CC      mips64el-softmmu/accel/tcg/cputlb.o
  CC      microblaze-softmmu/hw/net/vhost_net.o
  CC      microblaze-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips64-softmmu/monitor.o
  CC      microblaze-softmmu/hw/vfio/common.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec.o
  CC      mipsel-softmmu/tcg/tcg.o
  CC      microblaze-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/gdbstub.o
  CC      microblaze-softmmu/hw/vfio/spapr.o
  CC      mips64el-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64el-softmmu/accel/tcg/translate-all.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_s3adsp1800_mmu.o
  CC      mips64-softmmu/balloon.o
  CC      mips64el-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64-softmmu/ioport.o
  CC      microblaze-softmmu/hw/microblaze/petalogix_ml605_mmu.o
  CC      mips64el-softmmu/hw/block/virtio-blk.o
  CC      mips64-softmmu/numa.o
  CC      microblaze-softmmu/hw/microblaze/boot.o
  CC      mipsel-softmmu/tcg/tcg-op.o
  CC      mips64el-softmmu/hw/block/dataplane/virtio-blk.o
  CC      microblaze-softmmu/target/microblaze/translate.o
  CC      mips64-softmmu/qtest.o
  CC      mips64el-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64-softmmu/memory.o
  CC      mips64el-softmmu/hw/core/generic-loader.o
  CC      microblaze-softmmu/target/microblaze/op_helper.o
  CC      mips64el-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hw/display/vga.o
  CC      microblaze-softmmu/target/microblaze/helper.o
  CC      mips64-softmmu/memory_mapping.o
  CC      microblaze-softmmu/target/microblaze/cpu.o
  CC      mips64-softmmu/dump.o
  CC      microblaze-softmmu/target/microblaze/gdbstub.o
  CC      mipsel-softmmu/tcg/optimize.o
  CC      microblaze-softmmu/target/microblaze/mmu.o
  CC      mips64el-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/migration/ram.o
  GEN     trace/generated-helpers.c
  CC      microblaze-softmmu/trace/control-target.o
  CC      mipsel-softmmu/tcg/tcg-common.o
  CC      microblaze-softmmu/trace/generated-helpers.o
  CC      mipsel-softmmu/tcg/tcg-runtime.o
  CC      mips64-softmmu/accel/accel.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-3d.o
  LINK    microblaze-softmmu/qemu-system-microblaze
  CC      mips64-softmmu/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/fpu/softfloat.o
  CC      mips64-softmmu/accel/tcg/tcg-all.o
  CC      mips64el-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64-softmmu/accel/tcg/cputlb.o
  CC      mips64el-softmmu/hw/intc/mips_gic.o
  CC      mips64el-softmmu/hw/misc/ivshmem.o
  CC      mips64el-softmmu/hw/misc/mips_cmgcr.o
  CC      mips64el-softmmu/hw/misc/mips_cpc.o
  GEN     mips-softmmu/hmp-commands.h
  GEN     mips-softmmu/hmp-commands-info.h
  GEN     mips-softmmu/config-target.h
  CC      mips-softmmu/exec.o
  CC      mips64-softmmu/accel/tcg/cpu-exec.o
  CC      mipsel-softmmu/disas.o
  CC      mips64el-softmmu/hw/misc/mips_itu.o
  CC      mips64-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64el-softmmu/hw/misc/mmio_interface.o
  CC      mipsel-softmmu/hax-stub.o
  CC      mips64-softmmu/accel/tcg/translate-all.o
  CC      mips64el-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/arch_init.o
  CC      mipsel-softmmu/cpus.o
  CC      mips64el-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips-softmmu/tcg/tcg.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi.o
  CC      mips64-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/monitor.o
  CC      mips64el-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips64-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/scsi/vhost-scsi.o
  CC      mipsel-softmmu/gdbstub.o
  CC      mips-softmmu/tcg/tcg-op.o
  CC      mips64el-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64-softmmu/hw/core/generic-loader.o
  CC      mips64el-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/balloon.o
  CC      mips64-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hw/timer/mc146818rtc.o
  CC      mips64-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/ioport.o
  CC      mips64el-softmmu/hw/vfio/common.o
  CC      mipsel-softmmu/numa.o
  CC      mipsel-softmmu/qtest.o
  CC      mips64-softmmu/hw/display/virtio-gpu.o
  CC      mipsel-softmmu/memory.o
  CC      mips64el-softmmu/hw/vfio/pci.o
  CC      mips-softmmu/tcg/optimize.o
  CC      mips64-softmmu/hw/display/virtio-gpu-3d.o
  CC      mipsel-softmmu/memory_mapping.o
  CC      mips64el-softmmu/hw/vfio/pci-quirks.o
  CC      mipsel-softmmu/dump.o
  CC      mips64-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips-softmmu/tcg/tcg-common.o
  CC      mips64el-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/hw/intc/mips_gic.o
  CC      mips-softmmu/tcg/tcg-runtime.o
  CC      mipsel-softmmu/migration/ram.o
  CC      mips64el-softmmu/hw/vfio/spapr.o
  CC      mips64-softmmu/hw/misc/ivshmem.o
  CC      mips-softmmu/fpu/softfloat.o
  CC      mips64el-softmmu/hw/virtio/virtio.o
  CC      mips64-softmmu/hw/misc/mips_cmgcr.o
  CC      mipsel-softmmu/accel/accel.o
  CC      mips64-softmmu/hw/misc/mips_cpc.o
  CC      mipsel-softmmu/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/accel/tcg/tcg-all.o
  CC      mips64-softmmu/hw/misc/mips_itu.o
  CC      mips64el-softmmu/hw/virtio/virtio-balloon.o
  CC      mipsel-softmmu/accel/tcg/cputlb.o
  CC      mips64-softmmu/hw/misc/mmio_interface.o
  CC      mips64el-softmmu/hw/virtio/vhost.o
  CC      mips64-softmmu/hw/net/virtio-net.o
  CC      mips64el-softmmu/hw/virtio/vhost-backend.o
  CC      mips-softmmu/disas.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec.o
  CC      mips-softmmu/hax-stub.o
  CC      mips64-softmmu/hw/net/vhost_net.o
  CC      mips64el-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/arch_init.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/accel/tcg/cpu-exec-common.o
  CC      mips64el-softmmu/hw/virtio/vhost-vsock.o
  CC      mipsel-softmmu/accel/tcg/translate-all.o
  CC      mips-softmmu/cpus.o
  CC      mips64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips64el-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips64-softmmu/hw/scsi/vhost-scsi.o
  CC      mips-softmmu/monitor.o
  CC      mipsel-softmmu/hw/block/virtio-blk.o
  CC      mips64el-softmmu/hw/mips/mips_r4k.o
  CC      mips64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64el-softmmu/hw/mips/mips_malta.o
  CC      mipsel-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/hw/char/virtio-serial-bus.o
  CC      mips64el-softmmu/hw/mips/mips_mipssim.o
  CC      mips64-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/gdbstub.o
  CC      mips64el-softmmu/hw/mips/addr.o
  CC      mipsel-softmmu/hw/core/generic-loader.o
  CC      mips64el-softmmu/hw/mips/cputimer.o
  CC      mips64-softmmu/hw/vfio/common.o
  CC      mips-softmmu/balloon.o
  CC      mipsel-softmmu/hw/core/null-machine.o
  CC      mips64el-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/ioport.o
  CC      mipsel-softmmu/hw/display/vga.o
  CC      mips64-softmmu/hw/vfio/pci.o
  CC      mips64el-softmmu/hw/mips/mips_jazz.o
  CC      mips-softmmu/numa.o
  CC      mips-softmmu/qtest.o
  CC      mips64el-softmmu/hw/mips/mips_fulong2e.o
  CC      mipsel-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/hw/vfio/pci-quirks.o
  CC      mips-softmmu/memory.o
  CC      mips64el-softmmu/hw/mips/gt64xxx_pci.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64-softmmu/hw/vfio/platform.o
  CC      mips64el-softmmu/hw/mips/cps.o
  CC      mips64-softmmu/hw/vfio/spapr.o
  CC      mips-softmmu/memory_mapping.o
  CC      mipsel-softmmu/hw/display/virtio-gpu-pci.o
  CC      mips64el-softmmu/hw/mips/boston.o
  CC      mips-softmmu/dump.o
  CC      mips64-softmmu/hw/virtio/virtio.o
  CC      mipsel-softmmu/hw/intc/mips_gic.o
  CC      mips64el-softmmu/target/mips/translate.o
  CC      mipsel-softmmu/hw/misc/ivshmem.o
  CC      mips-softmmu/migration/ram.o
  CC      mips64-softmmu/hw/virtio/virtio-balloon.o
  CC      mipsel-softmmu/hw/misc/mips_cmgcr.o
  CC      mipsel-softmmu/hw/misc/mips_cpc.o
  CC      mips64-softmmu/hw/virtio/vhost.o
  CC      mipsel-softmmu/hw/misc/mips_itu.o
  CC      mips-softmmu/accel/accel.o
  CC      mipsel-softmmu/hw/misc/mmio_interface.o
  CC      mips-softmmu/accel/stubs/kvm-stub.o
  CC      mipsel-softmmu/hw/net/virtio-net.o
  CC      mips-softmmu/accel/tcg/tcg-all.o
  CC      mips64-softmmu/hw/virtio/vhost-backend.o
  CC      mips-softmmu/accel/tcg/cputlb.o
  CC      mips64-softmmu/hw/virtio/vhost-user.o
  CC      mipsel-softmmu/hw/net/vhost_net.o
  CC      mips64-softmmu/hw/virtio/vhost-vsock.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto.o
  CC      mipsel-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mips-softmmu/accel/tcg/cpu-exec.o
  CC      mips64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mips-softmmu/accel/tcg/cpu-exec-common.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips-softmmu/accel/tcg/translate-all.o
  CC      mipsel-softmmu/hw/scsi/vhost-scsi.o
  CC      mips64-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/9pfs/virtio-9p-device.o
  CC      mipsel-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64-softmmu/hw/mips/mips_malta.o
  CC      mipsel-softmmu/hw/timer/mips_gictimer.o
  CC      mips-softmmu/hw/block/virtio-blk.o
  CC      mipsel-softmmu/hw/timer/mc146818rtc.o
  CC      mips64-softmmu/hw/mips/mips_mipssim.o
  CC      mips64el-softmmu/target/mips/dsp_helper.o
  CC      mipsel-softmmu/hw/vfio/common.o
  CC      mips-softmmu/hw/block/dataplane/virtio-blk.o
  CC      mips64-softmmu/hw/mips/addr.o
  CC      mips64-softmmu/hw/mips/cputimer.o
  CC      mips-softmmu/hw/char/virtio-serial-bus.o
  CC      mipsel-softmmu/hw/vfio/pci.o
  CC      mips64-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/hw/core/generic-loader.o
  CC      mips64-softmmu/hw/mips/mips_jazz.o
  CC      mips64el-softmmu/target/mips/op_helper.o
  CC      mips-softmmu/hw/core/null-machine.o
  CC      mipsel-softmmu/hw/vfio/pci-quirks.o
  CC      mips64-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips-softmmu/hw/display/vga.o
  CC      mipsel-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/hw/mips/cps.o
  CC      mipsel-softmmu/hw/vfio/spapr.o
  CC      mips-softmmu/hw/display/virtio-gpu.o
  CC      mips64-softmmu/target/mips/translate.o
  CC      mipsel-softmmu/hw/virtio/virtio.o
  CC      mips-softmmu/hw/display/virtio-gpu-3d.o
  CC      mips64el-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/display/virtio-gpu-pci.o
  CC      mipsel-softmmu/hw/virtio/virtio-balloon.o
  CC      mips64el-softmmu/target/mips/helper.o
  CC      mipsel-softmmu/hw/virtio/vhost.o
  CC      mips-softmmu/hw/intc/mips_gic.o
  CC      mips64el-softmmu/target/mips/cpu.o
  CC      mips-softmmu/hw/misc/ivshmem.o
  CC      mipsel-softmmu/hw/virtio/vhost-backend.o
  CC      mips64el-softmmu/target/mips/gdbstub.o
  CC      mips64el-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/misc/mips_cmgcr.o
  CC      mipsel-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/hw/misc/mips_cpc.o
  CC      mipsel-softmmu/hw/virtio/vhost-vsock.o
  CC      mips-softmmu/hw/misc/mips_itu.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto.o
  CC      mips-softmmu/hw/misc/mmio_interface.o
  CC      mipsel-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      mipsel-softmmu/hw/mips/mips_r4k.o
  CC      mips-softmmu/hw/net/virtio-net.o
  CC      mipsel-softmmu/hw/mips/mips_malta.o
  CC      mips-softmmu/hw/net/vhost_net.o
  CC      mips-softmmu/hw/scsi/virtio-scsi.o
  CC      mipsel-softmmu/hw/mips/mips_mipssim.o
  CC      mipsel-softmmu/hw/mips/addr.o
  CC      mips64-softmmu/target/mips/dsp_helper.o
  CC      mips64el-softmmu/target/mips/mips-semi.o
  CC      mips-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      mipsel-softmmu/hw/mips/cputimer.o
  CC      mips-softmmu/hw/scsi/vhost-scsi-common.o
  CC      mips64el-softmmu/target/mips/machine.o
  CC      mipsel-softmmu/hw/mips/mips_int.o
  CC      mips-softmmu/hw/scsi/vhost-scsi.o
  GEN     trace/generated-helpers.c
  CC      mipsel-softmmu/hw/mips/gt64xxx_pci.o
  CC      mips64el-softmmu/trace/control-target.o
  CC      mips-softmmu/hw/scsi/vhost-user-scsi.o
  CC      mips64el-softmmu/trace/generated-helpers.o
  CC      mips-softmmu/hw/timer/mips_gictimer.o
  CC      mipsel-softmmu/hw/mips/cps.o
  CC      mips64-softmmu/target/mips/op_helper.o
  CC      mipsel-softmmu/target/mips/translate.o
  LINK    mips64el-softmmu/qemu-system-mips64el
  CC      mips-softmmu/hw/timer/mc146818rtc.o
  CC      mips-softmmu/hw/vfio/common.o
  CC      mips64-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/vfio/pci.o
  CC      mips64-softmmu/target/mips/helper.o
  GEN     moxie-softmmu/hmp-commands.h
  GEN     moxie-softmmu/hmp-commands-info.h
  GEN     moxie-softmmu/config-target.h
  CC      moxie-softmmu/exec.o
  CC      mips64-softmmu/target/mips/cpu.o
  CC      mips-softmmu/hw/vfio/pci-quirks.o
  CC      mips64-softmmu/target/mips/gdbstub.o
  CC      mips-softmmu/hw/vfio/platform.o
  CC      mips64-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/vfio/spapr.o
  CC      moxie-softmmu/tcg/tcg.o
  CC      mips-softmmu/hw/virtio/virtio.o
  CC      mipsel-softmmu/target/mips/dsp_helper.o
  CC      mips-softmmu/hw/virtio/virtio-balloon.o
  CC      moxie-softmmu/tcg/tcg-op.o
  CC      mipsel-softmmu/target/mips/op_helper.o
  CC      mips-softmmu/hw/virtio/vhost.o
  CC      mips-softmmu/hw/virtio/vhost-backend.o
  CC      mips64-softmmu/target/mips/mips-semi.o
  CC      mips-softmmu/hw/virtio/vhost-user.o
  CC      mips-softmmu/hw/virtio/vhost-vsock.o
  CC      mips64-softmmu/target/mips/machine.o
  CC      moxie-softmmu/tcg/optimize.o
  GEN     trace/generated-helpers.c
  CC      mips64-softmmu/trace/control-target.o
  CC      mipsel-softmmu/target/mips/lmi_helper.o
  CC      mips-softmmu/hw/virtio/virtio-crypto.o
  CC      mips64-softmmu/trace/generated-helpers.o
  CC      mipsel-softmmu/target/mips/helper.o
  CC      moxie-softmmu/tcg/tcg-common.o
  CC      mips-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      moxie-softmmu/tcg/tcg-runtime.o
  LINK    mips64-softmmu/qemu-system-mips64
  CC      moxie-softmmu/fpu/softfloat.o
  CC      mipsel-softmmu/target/mips/cpu.o
  CC      mips-softmmu/hw/mips/mips_r4k.o
  CC      mipsel-softmmu/target/mips/gdbstub.o
  CC      mips-softmmu/hw/mips/mips_malta.o
  CC      mipsel-softmmu/target/mips/msa_helper.o
  CC      mips-softmmu/hw/mips/mips_mipssim.o
  CC      mips-softmmu/hw/mips/addr.o
  CC      mips-softmmu/hw/mips/cputimer.o
  GEN     nios2-softmmu/hmp-commands.h
  GEN     nios2-softmmu/hmp-commands-info.h
  GEN     nios2-softmmu/config-target.h
  CC      mips-softmmu/hw/mips/mips_int.o
  CC      nios2-softmmu/exec.o
  CC      mips-softmmu/hw/mips/gt64xxx_pci.o
  CC      moxie-softmmu/disas.o
  CC      moxie-softmmu/hax-stub.o
  CC      mips-softmmu/hw/mips/cps.o
  CC      mips-softmmu/target/mips/translate.o
  CC      moxie-softmmu/arch_init.o
  CC      moxie-softmmu/cpus.o
  CC      nios2-softmmu/tcg/tcg.o
  CC      mipsel-softmmu/target/mips/mips-semi.o
  CC      moxie-softmmu/monitor.o
  CC      mipsel-softmmu/target/mips/machine.o
  CC      nios2-softmmu/tcg/tcg-op.o
  GEN     trace/generated-helpers.c
  CC      mipsel-softmmu/trace/control-target.o
  CC      moxie-softmmu/gdbstub.o
  CC      mipsel-softmmu/trace/generated-helpers.o
  CC      moxie-softmmu/balloon.o
  CC      moxie-softmmu/ioport.o
  LINK    mipsel-softmmu/qemu-system-mipsel
  CC      moxie-softmmu/numa.o
  CC      nios2-softmmu/tcg/optimize.o
  CC      moxie-softmmu/qtest.o
  CC      mips-softmmu/target/mips/dsp_helper.o
  CC      moxie-softmmu/memory.o
  CC      nios2-softmmu/tcg/tcg-common.o
  GEN     or1k-softmmu/hmp-commands.h
  CC      mips-softmmu/target/mips/op_helper.o
  GEN     or1k-softmmu/hmp-commands-info.h
  GEN     or1k-softmmu/config-target.h
  CC      nios2-softmmu/tcg/tcg-runtime.o
  CC      or1k-softmmu/exec.o
  CC      nios2-softmmu/fpu/softfloat.o
  CC      moxie-softmmu/memory_mapping.o
  CC      moxie-softmmu/dump.o
  CC      or1k-softmmu/tcg/tcg.o
  CC      moxie-softmmu/migration/ram.o
  CC      mips-softmmu/target/mips/lmi_helper.o
  CC      moxie-softmmu/accel/accel.o
  CC      moxie-softmmu/accel/stubs/kvm-stub.o
  CC      mips-softmmu/target/mips/helper.o
  CC      nios2-softmmu/disas.o
  CC      moxie-softmmu/accel/tcg/tcg-all.o
  CC      or1k-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/hax-stub.o
  CC      moxie-softmmu/accel/tcg/cputlb.o
  CC      nios2-softmmu/arch_init.o
  CC      mips-softmmu/target/mips/cpu.o
  CC      mips-softmmu/target/mips/gdbstub.o
  CC      nios2-softmmu/cpus.o
  CC      mips-softmmu/target/mips/msa_helper.o
  CC      nios2-softmmu/monitor.o
  CC      moxie-softmmu/accel/tcg/cpu-exec.o
  CC      or1k-softmmu/tcg/optimize.o
  CC      moxie-softmmu/accel/tcg/cpu-exec-common.o
  CC      moxie-softmmu/accel/tcg/translate-all.o
  CC      nios2-softmmu/gdbstub.o
  CC      moxie-softmmu/hw/core/generic-loader.o
  CC      or1k-softmmu/tcg/tcg-common.o
  CC      moxie-softmmu/hw/core/null-machine.o
  CC      or1k-softmmu/tcg/tcg-runtime.o
  CC      nios2-softmmu/balloon.o
  CC      nios2-softmmu/ioport.o
  CC      moxie-softmmu/hw/display/vga.o
  CC      or1k-softmmu/fpu/softfloat.o
  CC      nios2-softmmu/numa.o
  CC      moxie-softmmu/hw/misc/mmio_interface.o
  CC      nios2-softmmu/qtest.o
  CC      mips-softmmu/target/mips/mips-semi.o
  CC      moxie-softmmu/hw/net/vhost_net.o
  CC      nios2-softmmu/memory.o
  CC      moxie-softmmu/hw/net/rocker/qmp-norocker.o
  CC      mips-softmmu/target/mips/machine.o
  CC      moxie-softmmu/hw/timer/mc146818rtc.o
  GEN     trace/generated-helpers.c
  CC      mips-softmmu/trace/control-target.o
  CC      nios2-softmmu/memory_mapping.o
  CC      moxie-softmmu/hw/vfio/common.o
  CC      mips-softmmu/trace/generated-helpers.o
  CC      or1k-softmmu/disas.o
  CC      nios2-softmmu/dump.o
  LINK    mips-softmmu/qemu-system-mips
  CC      moxie-softmmu/hw/vfio/platform.o
  CC      or1k-softmmu/hax-stub.o
  CC      moxie-softmmu/hw/vfio/spapr.o
  CC      or1k-softmmu/arch_init.o
  CC      nios2-softmmu/migration/ram.o
  CC      or1k-softmmu/cpus.o
  CC      moxie-softmmu/hw/moxie/moxiesim.o
  CC      nios2-softmmu/accel/accel.o
  CC      or1k-softmmu/monitor.o
  CC      or1k-softmmu/gdbstub.o
  CC      moxie-softmmu/target/moxie/translate.o
  CC      nios2-softmmu/accel/stubs/kvm-stub.o
  CC      nios2-softmmu/accel/tcg/tcg-all.o
  CC      moxie-softmmu/target/moxie/helper.o
  CC      nios2-softmmu/accel/tcg/cputlb.o
  GEN     ppc64-softmmu/hmp-commands.h
  GEN     ppc64-softmmu/hmp-commands-info.h
  GEN     ppc64-softmmu/config-target.h
  CC      moxie-softmmu/target/moxie/machine.o
  CC      or1k-softmmu/balloon.o
  CC      moxie-softmmu/target/moxie/cpu.o
  CC      ppc64-softmmu/exec.o
  CC      or1k-softmmu/ioport.o
  CC      moxie-softmmu/target/moxie/mmu.o
  CC      or1k-softmmu/numa.o
  GEN     trace/generated-helpers.c
  CC      moxie-softmmu/trace/control-target.o
  CC      nios2-softmmu/accel/tcg/cpu-exec.o
  CC      moxie-softmmu/trace/generated-helpers.o
  CC      or1k-softmmu/qtest.o
  CC      nios2-softmmu/accel/tcg/cpu-exec-common.o
  LINK    moxie-softmmu/qemu-system-moxie
  CC      or1k-softmmu/memory.o
  CC      nios2-softmmu/accel/tcg/translate-all.o
  CC      ppc64-softmmu/tcg/tcg.o
  CC      nios2-softmmu/hw/core/generic-loader.o
  CC      or1k-softmmu/memory_mapping.o
  CC      nios2-softmmu/hw/core/null-machine.o
  CC      or1k-softmmu/dump.o
  GEN     ppcemb-softmmu/hmp-commands.h
  CC      nios2-softmmu/hw/intc/nios2_iic.o
  GEN     ppcemb-softmmu/hmp-commands-info.h
  GEN     ppcemb-softmmu/config-target.h
  CC      ppcemb-softmmu/exec.o
  CC      or1k-softmmu/migration/ram.o
  CC      nios2-softmmu/hw/misc/mmio_interface.o
  CC      ppc64-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/hw/net/vhost_net.o
  CC      or1k-softmmu/accel/accel.o
  CC      nios2-softmmu/hw/net/rocker/qmp-norocker.o
  CC      or1k-softmmu/accel/stubs/kvm-stub.o
  CC      nios2-softmmu/hw/timer/altera_timer.o
  CC      ppcemb-softmmu/tcg/tcg.o
  CC      nios2-softmmu/hw/vfio/common.o
  CC      or1k-softmmu/accel/tcg/tcg-all.o
  CC      or1k-softmmu/accel/tcg/cputlb.o
  CC      nios2-softmmu/hw/vfio/platform.o
  CC      ppc64-softmmu/tcg/optimize.o
  CC      nios2-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/tcg/tcg-op.o
  CC      nios2-softmmu/hw/nios2/boot.o
  CC      or1k-softmmu/accel/tcg/cpu-exec.o
  CC      nios2-softmmu/hw/nios2/cpu_pic.o
  CC      ppc64-softmmu/tcg/tcg-common.o
  CC      or1k-softmmu/accel/tcg/cpu-exec-common.o
  CC      nios2-softmmu/hw/nios2/10m50_devboard.o
  CC      ppc64-softmmu/tcg/tcg-runtime.o
  CC      ppc64-softmmu/fpu/softfloat.o
  CC      or1k-softmmu/accel/tcg/translate-all.o
  CC      nios2-softmmu/target/nios2/translate.o
  CC      or1k-softmmu/hw/core/generic-loader.o
  CC      nios2-softmmu/target/nios2/op_helper.o
  CC      or1k-softmmu/hw/core/null-machine.o
  CC      ppcemb-softmmu/tcg/optimize.o
  CC      nios2-softmmu/target/nios2/helper.o
  CC      or1k-softmmu/hw/misc/mmio_interface.o
  CC      nios2-softmmu/target/nios2/cpu.o
  CC      or1k-softmmu/hw/net/vhost_net.o
  CC      or1k-softmmu/hw/net/rocker/qmp-norocker.o
  CC      nios2-softmmu/target/nios2/mmu.o
  CC      ppc64-softmmu/disas.o
  CC      or1k-softmmu/hw/vfio/common.o
  CC      nios2-softmmu/target/nios2/monitor.o
  CC      ppcemb-softmmu/tcg/tcg-common.o
  GEN     ppc64-softmmu/gdbstub-xml.c
  CC      ppcemb-softmmu/tcg/tcg-runtime.o
  GEN     trace/generated-helpers.c
  CC      nios2-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/fpu/softfloat.o
  CC      nios2-softmmu/trace/generated-helpers.o
  CC      or1k-softmmu/hw/vfio/platform.o
  LINK    nios2-softmmu/qemu-system-nios2
  CC      or1k-softmmu/hw/vfio/spapr.o
  CC      ppc64-softmmu/hax-stub.o
  CC      or1k-softmmu/hw/openrisc/pic_cpu.o
  CC      ppc64-softmmu/libdecnumber/decContext.o
  CC      or1k-softmmu/hw/openrisc/cputimer.o
  CC      or1k-softmmu/hw/openrisc/openrisc_sim.o
  CC      ppc64-softmmu/libdecnumber/decNumber.o
  CC      ppcemb-softmmu/disas.o
  CC      or1k-softmmu/target/openrisc/machine.o
  CC      or1k-softmmu/target/openrisc/cpu.o
  GEN     ppcemb-softmmu/gdbstub-xml.c
  CC      or1k-softmmu/target/openrisc/exception.o
  CC      ppcemb-softmmu/hax-stub.o
  CC      or1k-softmmu/target/openrisc/interrupt.o
  CC      ppcemb-softmmu/libdecnumber/decContext.o
  CC      or1k-softmmu/target/openrisc/mmu.o
  CC      or1k-softmmu/target/openrisc/translate.o
  CC      ppcemb-softmmu/libdecnumber/decNumber.o
  GEN     ppc-softmmu/hmp-commands.h
  GEN     ppc-softmmu/hmp-commands-info.h
  CC      ppc64-softmmu/libdecnumber/dpd/decimal32.o
  GEN     ppc-softmmu/config-target.h
  CC      ppc-softmmu/exec.o
  CC      ppc64-softmmu/libdecnumber/dpd/decimal64.o
  CC      or1k-softmmu/target/openrisc/exception_helper.o
  CC      ppc64-softmmu/libdecnumber/dpd/decimal128.o
  CC      or1k-softmmu/target/openrisc/fpu_helper.o
  CC      ppc64-softmmu/arch_init.o
  CC      ppc64-softmmu/cpus.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal32.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal64.o
  CC      or1k-softmmu/target/openrisc/interrupt_helper.o
  CC      or1k-softmmu/target/openrisc/mmu_helper.o
  CC      ppcemb-softmmu/libdecnumber/dpd/decimal128.o
  CC      ppc-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/monitor.o
  CC      or1k-softmmu/target/openrisc/sys_helper.o
  CC      ppcemb-softmmu/arch_init.o
  CC      ppcemb-softmmu/cpus.o
  CC      or1k-softmmu/target/openrisc/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      or1k-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/monitor.o
  CC      ppc64-softmmu/gdbstub.o
  CC      or1k-softmmu/trace/generated-helpers.o
  CC      ppc-softmmu/tcg/tcg-op.o
  CC      ppc64-softmmu/balloon.o
  LINK    or1k-softmmu/qemu-system-or1k
  CC      ppc64-softmmu/ioport.o
  CC      ppcemb-softmmu/gdbstub.o
  CC      ppc64-softmmu/numa.o
  CC      ppcemb-softmmu/balloon.o
  CC      ppc64-softmmu/qtest.o
  CC      ppcemb-softmmu/ioport.o
  GEN     s390x-softmmu/hmp-commands.h
  GEN     s390x-softmmu/hmp-commands-info.h
  CC      s390x-softmmu/gen-features
  CC      ppc64-softmmu/memory.o
  CC      ppcemb-softmmu/numa.o
  GEN     s390x-softmmu/config-target.h
  GEN     s390x-softmmu/gen-features.h
  CC      s390x-softmmu/exec.o
  CC      ppcemb-softmmu/qtest.o
  CC      ppc-softmmu/tcg/optimize.o
  CC      ppcemb-softmmu/memory.o
  CC      ppc-softmmu/tcg/tcg-common.o
  CC      ppc64-softmmu/memory_mapping.o
  CC      s390x-softmmu/tcg/tcg.o
  CC      ppc-softmmu/tcg/tcg-runtime.o
  CC      ppc64-softmmu/dump.o
  CC      ppc-softmmu/fpu/softfloat.o
  CC      ppcemb-softmmu/memory_mapping.o
  CC      ppc64-softmmu/migration/ram.o
  CC      s390x-softmmu/tcg/tcg-op.o
  CC      ppcemb-softmmu/dump.o
  CC      ppc64-softmmu/accel/accel.o
  CC      ppc64-softmmu/accel/stubs/kvm-stub.o
  CC      ppcemb-softmmu/migration/ram.o
  CC      ppc64-softmmu/accel/tcg/tcg-all.o
  CC      ppc-softmmu/disas.o
  CC      ppc64-softmmu/accel/tcg/cputlb.o
  GEN     ppc-softmmu/gdbstub-xml.c
  CC      ppcemb-softmmu/accel/accel.o
  CC      ppcemb-softmmu/accel/stubs/kvm-stub.o
  CC      ppc-softmmu/hax-stub.o
  CC      ppc-softmmu/libdecnumber/decContext.o
  CC      s390x-softmmu/tcg/optimize.o
  CC      ppcemb-softmmu/accel/tcg/tcg-all.o
  CC      ppc-softmmu/libdecnumber/decNumber.o
  CC      ppcemb-softmmu/accel/tcg/cputlb.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec.o
  CC      s390x-softmmu/tcg/tcg-common.o
  CC      s390x-softmmu/tcg/tcg-runtime.o
  CC      ppc64-softmmu/accel/tcg/cpu-exec-common.o
  CC      s390x-softmmu/fpu/softfloat.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal32.o
  CC      ppc64-softmmu/accel/tcg/translate-all.o
  CC      ppcemb-softmmu/accel/tcg/cpu-exec.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal64.o
  CC      ppc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc-softmmu/libdecnumber/dpd/decimal128.o
  CC      ppcemb-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc-softmmu/arch_init.o
  CC      ppc64-softmmu/hw/block/virtio-blk.o
  CC      ppcemb-softmmu/accel/tcg/translate-all.o
  CC      ppc-softmmu/cpus.o
  CC      ppcemb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc-softmmu/monitor.o
  CC      ppcemb-softmmu/hw/block/virtio-blk.o
  CC      ppc64-softmmu/hw/char/spapr_vty.o
  CC      s390x-softmmu/disas.o
  CC      ppc64-softmmu/hw/char/virtio-serial-bus.o
  CC      ppcemb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppcemb-softmmu/hw/char/virtio-serial-bus.o
  GEN     s390x-softmmu/gdbstub-xml.c
  CC      ppc-softmmu/gdbstub.o
  CC      ppc64-softmmu/hw/core/generic-loader.o
  CC      ppcemb-softmmu/hw/core/generic-loader.o
  CC      ppc64-softmmu/hw/core/null-machine.o
  CC      ppcemb-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/hw/display/sm501.o
  CC      ppc-softmmu/balloon.o
  CC      ppcemb-softmmu/hw/display/sm501.o
  CC      s390x-softmmu/hax-stub.o
  CC      s390x-softmmu/arch_init.o
  CC      ppc-softmmu/ioport.o
  CC      ppc-softmmu/numa.o
  CC      ppc64-softmmu/hw/display/vga.o
  CC      s390x-softmmu/cpus.o
  CC      ppcemb-softmmu/hw/display/vga.o
  CC      ppc-softmmu/qtest.o
  CC      s390x-softmmu/monitor.o
  CC      ppc64-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/memory.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      s390x-softmmu/gdbstub.o
  CC      ppc-softmmu/memory_mapping.o
  CC      ppcemb-softmmu/hw/display/virtio-gpu-pci.o
  CC      s390x-softmmu/balloon.o
  CC      ppc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/dump.o
  CC      ppcemb-softmmu/hw/misc/ivshmem.o
  CC      s390x-softmmu/ioport.o
  CC      ppcemb-softmmu/hw/misc/mmio_interface.o
  CC      ppc64-softmmu/hw/display/virtio-vga.o
  CC      s390x-softmmu/numa.o
  CC      ppc-softmmu/migration/ram.o
  CC      ppcemb-softmmu/hw/net/xilinx_ethlite.o
  CC      ppc64-softmmu/hw/intc/xics.o
  CC      s390x-softmmu/qtest.o
  CC      ppcemb-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/intc/xics_spapr.o
  CC      ppc-softmmu/accel/accel.o
  CC      s390x-softmmu/memory.o
  CC      ppc-softmmu/accel/stubs/kvm-stub.o
  CC      ppcemb-softmmu/hw/net/vhost_net.o
  CC      ppc64-softmmu/hw/intc/xics_pnv.o
  CC      ppc-softmmu/accel/tcg/tcg-all.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/accel/tcg/cputlb.o
  CC      ppc64-softmmu/hw/misc/ivshmem.o
  CC      ppc64-softmmu/hw/misc/mmio_interface.o
  CC      s390x-softmmu/memory_mapping.o
  CC      ppcemb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc64-softmmu/hw/net/spapr_llan.o
  CC      s390x-softmmu/dump.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc-softmmu/accel/tcg/cpu-exec.o
  CC      s390x-softmmu/migration/ram.o
  CC      ppc64-softmmu/hw/net/xilinx_ethlite.o
  CC      ppcemb-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc64-softmmu/hw/net/virtio-net.o
  CC      ppcemb-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppc-softmmu/accel/tcg/translate-all.o
  CC      s390x-softmmu/accel/accel.o
  CC      ppcemb-softmmu/hw/vfio/common.o
  CC      ppc-softmmu/hw/9pfs/virtio-9p-device.o
  CC      s390x-softmmu/accel/kvm/kvm-all.o
  CC      ppc-softmmu/hw/block/virtio-blk.o
  CC      ppc64-softmmu/hw/net/vhost_net.o
  CC      ppcemb-softmmu/hw/vfio/pci.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/etsec.o
  CC      ppc-softmmu/hw/block/dataplane/virtio-blk.o
  CC      s390x-softmmu/accel/tcg/tcg-all.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/registers.o
  CC      s390x-softmmu/accel/tcg/cputlb.o
  CC      ppc-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppcemb-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/net/fsl_etsec/miim.o
  CC      ppc-softmmu/hw/core/generic-loader.o
  CC      ppc64-softmmu/hw/nvram/spapr_nvram.o
  CC      ppc-softmmu/hw/core/null-machine.o
  CC      ppc64-softmmu/hw/scsi/spapr_vscsi.o
  CC      ppcemb-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/accel/tcg/cpu-exec.o
  CC      ppc-softmmu/hw/display/sm501.o
  CC      ppcemb-softmmu/hw/vfio/spapr.o
  CC      s390x-softmmu/accel/tcg/cpu-exec-common.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/display/vga.o
  CC      ppcemb-softmmu/hw/virtio/virtio.o
  CC      s390x-softmmu/accel/tcg/translate-all.o
  CC      ppc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      s390x-softmmu/hw/9pfs/virtio-9p-device.o
  CC      ppcemb-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppc-softmmu/hw/display/virtio-gpu.o
  CC      s390x-softmmu/hw/block/virtio-blk.o
  CC      ppc64-softmmu/hw/scsi/vhost-scsi.o
  CC      ppcemb-softmmu/hw/virtio/vhost.o
  CC      ppc64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      s390x-softmmu/hw/block/dataplane/virtio-blk.o
  CC      ppc-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc64-softmmu/hw/timer/mc146818rtc.o
  CC      ppcemb-softmmu/hw/virtio/vhost-backend.o
  CC      s390x-softmmu/hw/char/virtio-serial-bus.o
  CC      ppc-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppcemb-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/vfio/common.o
  CC      ppcemb-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/char/terminal3270.o
  CC      ppc-softmmu/hw/misc/ivshmem.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto.o
  CC      s390x-softmmu/hw/core/generic-loader.o
  CC      ppc64-softmmu/hw/vfio/pci.o
  CC      s390x-softmmu/hw/core/null-machine.o
  CC      ppc-softmmu/hw/misc/mmio_interface.o
  CC      ppcemb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      s390x-softmmu/hw/display/virtio-gpu.o
  CC      ppc-softmmu/hw/net/xilinx_ethlite.o
  CC      ppcemb-softmmu/hw/ppc/ppc.o
  CC      ppc-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/vfio/pci-quirks.o
  CC      ppcemb-softmmu/hw/ppc/ppc_booke.o
  CC      s390x-softmmu/hw/display/virtio-gpu-3d.o
  CC      ppc-softmmu/hw/net/vhost_net.o
  CC      ppcemb-softmmu/hw/ppc/fdt.o
  CC      ppc64-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/hw/display/virtio-gpu-pci.o
  CC      ppc-softmmu/hw/net/fsl_etsec/etsec.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_boards.o
  CC      ppc-softmmu/hw/net/fsl_etsec/registers.o
  CC      ppc64-softmmu/hw/vfio/spapr.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_devs.o
  CC      s390x-softmmu/hw/intc/s390_flic.o
  CC      ppc-softmmu/hw/net/fsl_etsec/rings.o
  CC      ppc64-softmmu/hw/virtio/virtio.o
  CC      ppcemb-softmmu/hw/ppc/ppc405_uc.o
  CC      s390x-softmmu/hw/intc/s390_flic_kvm.o
  CC      ppc-softmmu/hw/net/fsl_etsec/miim.o
  CC      s390x-softmmu/hw/misc/mmio_interface.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi.o
  CC      ppcemb-softmmu/hw/ppc/ppc440_bamboo.o
  CC      s390x-softmmu/hw/net/virtio-net.o
  CC      ppc64-softmmu/hw/virtio/virtio-balloon.o
  CC      ppcemb-softmmu/hw/ppc/ppc4xx_pci.o
  CC      ppc-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppcemb-softmmu/hw/ppc/virtex_ml507.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi-common.o
  CC      s390x-softmmu/hw/net/vhost_net.o
  CC      ppc64-softmmu/hw/virtio/vhost.o
  CC      ppc-softmmu/hw/scsi/vhost-scsi.o
  CC      s390x-softmmu/hw/net/rocker/qmp-norocker.o
  CC      ppcemb-softmmu/target/ppc/cpu-models.o
  CC      ppc-softmmu/hw/scsi/vhost-user-scsi.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi.o
  CC      ppc-softmmu/hw/timer/mc146818rtc.o
  CC      ppc64-softmmu/hw/virtio/vhost-backend.o
  CC      s390x-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      ppc-softmmu/hw/vfio/common.o
  CC      ppc64-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi-common.o
  CC      ppcemb-softmmu/target/ppc/cpu.o
  CC      ppcemb-softmmu/target/ppc/translate.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/vfio/pci.o
  CC      s390x-softmmu/hw/scsi/vhost-scsi.o
  CC      ppc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      s390x-softmmu/hw/scsi/vhost-user-scsi.o
  CC      ppc64-softmmu/hw/ppc/ppc.o
  CC      ppc-softmmu/hw/vfio/pci-quirks.o
  CC      s390x-softmmu/hw/vfio/common.o
  CC      ppc64-softmmu/hw/ppc/ppc_booke.o
  CC      ppc-softmmu/hw/vfio/platform.o
  CC      s390x-softmmu/hw/vfio/pci.o
  CC      ppc64-softmmu/hw/ppc/fdt.o
  CC      ppc64-softmmu/hw/ppc/spapr.o
  CC      ppc-softmmu/hw/vfio/spapr.o
  CC      ppc-softmmu/hw/virtio/virtio.o
  CC      s390x-softmmu/hw/vfio/pci-quirks.o
  CC      ppc64-softmmu/hw/ppc/spapr_vio.o
  CC      ppc-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc-softmmu/hw/virtio/vhost.o
  CC      ppc64-softmmu/hw/ppc/spapr_events.o
  CC      s390x-softmmu/hw/vfio/ccw.o
  CC      ppc64-softmmu/hw/ppc/spapr_hcall.o
  CC      s390x-softmmu/hw/vfio/platform.o
  CC      ppc-softmmu/hw/virtio/vhost-backend.o
  CC      ppc64-softmmu/hw/ppc/spapr_iommu.o
  CC      ppc-softmmu/hw/virtio/vhost-user.o
  CC      s390x-softmmu/hw/vfio/spapr.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas.o
  CC      ppc-softmmu/hw/virtio/vhost-vsock.o
  CC      s390x-softmmu/hw/virtio/virtio.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto.o
  CC      s390x-softmmu/hw/virtio/virtio-balloon.o
  CC      ppc-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtc.o
  CC      s390x-softmmu/hw/virtio/vhost.o
  CC      ppc-softmmu/hw/ppc/ppc.o
  CC      ppc64-softmmu/hw/ppc/spapr_drc.o
  CC      s390x-softmmu/hw/virtio/vhost-backend.o
  CC      ppc-softmmu/hw/ppc/ppc_booke.o
  CC      ppc-softmmu/hw/ppc/fdt.o
  CC      ppc64-softmmu/hw/ppc/spapr_rng.o
  CC      s390x-softmmu/hw/virtio/vhost-user.o
  CC      ppc64-softmmu/hw/ppc/spapr_cpu_core.o
  CC      ppc-softmmu/hw/ppc/ppc405_boards.o
  CC      ppc64-softmmu/hw/ppc/spapr_ovec.o
  CC      s390x-softmmu/hw/virtio/vhost-vsock.o
  CC      ppc64-softmmu/hw/ppc/pnv.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_devs.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto.o
  CC      ppc-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc64-softmmu/hw/ppc/pnv_xscom.o
  CC      s390x-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      ppc64-softmmu/hw/ppc/pnv_core.o
  CC      ppc-softmmu/hw/ppc/ppc440_bamboo.o
  CC      s390x-softmmu/hw/s390x/s390-virtio.o
  CC      ppc64-softmmu/hw/ppc/pnv_lpc.o
  CC      ppc-softmmu/hw/ppc/ppc4xx_pci.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-hcall.o
  CC      ppc64-softmmu/hw/ppc/pnv_psi.o
  CC      ppc-softmmu/hw/ppc/prep.o
  CC      ppc64-softmmu/hw/ppc/pnv_occ.o
  CC      s390x-softmmu/hw/s390x/sclp.o
  CC      ppcemb-softmmu/target/ppc/machine.o
  CC      ppc64-softmmu/hw/ppc/pnv_bmc.o
  CC      ppc-softmmu/hw/ppc/prep_systemio.o
  CC      ppcemb-softmmu/target/ppc/mmu_helper.o
  CC      s390x-softmmu/hw/s390x/event-facility.o
  CC      ppc64-softmmu/hw/ppc/spapr_pci_vfio.o
  CC      ppc-softmmu/hw/ppc/rs6000_mc.o
  CC      s390x-softmmu/hw/s390x/sclpquiesce.o
  CC      ppc-softmmu/hw/ppc/mac_oldworld.o
  CC      ppc64-softmmu/hw/ppc/spapr_rtas_ddw.o
  CC      s390x-softmmu/hw/s390x/sclpcpu.o
  CC      ppc-softmmu/hw/ppc/mac_newworld.o
  CC      ppcemb-softmmu/target/ppc/mmu-hash32.o
  CC      s390x-softmmu/hw/s390x/ipl.o
  CC      ppc64-softmmu/hw/ppc/ppc405_boards.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_devs.o
  CC      ppcemb-softmmu/target/ppc/monitor.o
  CC      ppc-softmmu/hw/ppc/e500.o
  CC      s390x-softmmu/hw/s390x/css.o
  CC      ppcemb-softmmu/target/ppc/arch_dump.o
  CC      ppc64-softmmu/hw/ppc/ppc405_uc.o
  CC      ppc-softmmu/hw/ppc/mpc8544ds.o
  CC      ppcemb-softmmu/target/ppc/kvm-stub.o
  CC      ppc64-softmmu/hw/ppc/ppc440_bamboo.o
  CC      s390x-softmmu/hw/s390x/s390-virtio-ccw.o
  CC      ppc-softmmu/hw/ppc/e500plat.o
  CC      ppcemb-softmmu/target/ppc/dfp_helper.o
  CC      ppc64-softmmu/hw/ppc/ppc4xx_pci.o
  CC      ppc-softmmu/hw/ppc/mpc8544_guts.o
  CC      s390x-softmmu/hw/s390x/3270-ccw.o
  CC      ppc-softmmu/hw/ppc/ppce500_spin.o
  CC      ppc64-softmmu/hw/ppc/prep.o
  CC      ppcemb-softmmu/target/ppc/excp_helper.o
  CC      s390x-softmmu/hw/s390x/virtio-ccw.o
  CC      ppc-softmmu/hw/ppc/virtex_ml507.o
  CC      ppc64-softmmu/hw/ppc/prep_systemio.o
  CC      ppcemb-softmmu/target/ppc/fpu_helper.o
  CC      ppc-softmmu/target/ppc/cpu-models.o
  CC      ppc64-softmmu/hw/ppc/rs6000_mc.o
  CC      s390x-softmmu/hw/s390x/css-bridge.o
  CC      ppc64-softmmu/hw/ppc/mac_oldworld.o
  CC      s390x-softmmu/hw/s390x/ccw-device.o
  CC      ppc64-softmmu/hw/ppc/mac_newworld.o
  CC      s390x-softmmu/hw/s390x/s390-pci-bus.o
  CC      ppc64-softmmu/hw/ppc/e500.o
  CC      ppc-softmmu/target/ppc/cpu.o
  CC      s390x-softmmu/hw/s390x/s390-pci-inst.o
  CC      ppc-softmmu/target/ppc/translate.o
  CC      s390x-softmmu/hw/s390x/s390-skeys.o
  CC      ppc64-softmmu/hw/ppc/mpc8544ds.o
  CC      ppc64-softmmu/hw/ppc/e500plat.o
  CC      s390x-softmmu/hw/s390x/s390-stattrib.o
  CC      ppc64-softmmu/hw/ppc/mpc8544_guts.o
  CC      s390x-softmmu/hw/s390x/s390-skeys-kvm.o
  CC      ppc64-softmmu/hw/ppc/ppce500_spin.o
  CC      s390x-softmmu/hw/s390x/s390-stattrib-kvm.o
  CC      ppc64-softmmu/hw/ppc/virtex_ml507.o
  CC      ppcemb-softmmu/target/ppc/int_helper.o
  CC      s390x-softmmu/hw/s390x/s390-ccw.o
  CC      ppc64-softmmu/target/ppc/cpu-models.o
  CC      s390x-softmmu/target/s390x/cpu.o
  CC      s390x-softmmu/target/s390x/cpu_models.o
  CC      s390x-softmmu/target/s390x/cpu_features.o
  CC      ppcemb-softmmu/target/ppc/timebase_helper.o
  CC      ppc64-softmmu/target/ppc/cpu.o
  CC      s390x-softmmu/target/s390x/gdbstub.o
  CC      ppcemb-softmmu/target/ppc/misc_helper.o
  CC      ppc64-softmmu/target/ppc/translate.o
  CC      s390x-softmmu/target/s390x/interrupt.o
  CC      ppcemb-softmmu/target/ppc/mem_helper.o
  CC      s390x-softmmu/target/s390x/helper.o
  CC      s390x-softmmu/target/s390x/translate.o
  CC      ppcemb-softmmu/target/ppc/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      ppcemb-softmmu/trace/control-target.o
  CC      ppcemb-softmmu/gdbstub-xml.o
  CC      ppcemb-softmmu/trace/generated-helpers.o
  LINK    ppcemb-softmmu/qemu-system-ppcemb
  CC      s390x-softmmu/target/s390x/cc_helper.o
  CC      s390x-softmmu/target/s390x/excp_helper.o
  CC      s390x-softmmu/target/s390x/fpu_helper.o
  CC      s390x-softmmu/target/s390x/int_helper.o
  CC      s390x-softmmu/target/s390x/mem_helper.o
  GEN     sh4eb-softmmu/hmp-commands.h
  GEN     sh4eb-softmmu/hmp-commands-info.h
  GEN     sh4eb-softmmu/config-target.h
  CC      sh4eb-softmmu/exec.o
  CC      ppc-softmmu/target/ppc/machine.o
  CC      s390x-softmmu/target/s390x/misc_helper.o
  CC      ppc-softmmu/target/ppc/mmu_helper.o
  CC      s390x-softmmu/target/s390x/machine.o
  CC      sh4eb-softmmu/tcg/tcg.o
  CC      s390x-softmmu/target/s390x/ioinst.o
  CC      ppc-softmmu/target/ppc/mmu-hash32.o
  CC      s390x-softmmu/target/s390x/arch_dump.o
  CC      ppc-softmmu/target/ppc/monitor.o
  CC      ppc-softmmu/target/ppc/arch_dump.o
  CC      s390x-softmmu/target/s390x/mmu_helper.o
  CC      sh4eb-softmmu/tcg/tcg-op.o
  CC      ppc-softmmu/target/ppc/kvm-stub.o
  CC      s390x-softmmu/target/s390x/diag.o
  CC      ppc-softmmu/target/ppc/dfp_helper.o
  CC      s390x-softmmu/target/s390x/kvm.o
  CC      ppc-softmmu/target/ppc/excp_helper.o
  GEN     trace/generated-helpers.c
  CC      ppc-softmmu/target/ppc/fpu_helper.o
  CC      s390x-softmmu/trace/control-target.o
  CC      ppc64-softmmu/target/ppc/machine.o
  CC      s390x-softmmu/gdbstub-xml.o
  CC      sh4eb-softmmu/tcg/optimize.o
  CC      s390x-softmmu/trace/generated-helpers.o
  CC      ppc64-softmmu/target/ppc/mmu_helper.o
  LINK    s390x-softmmu/qemu-system-s390x
  CC      sh4eb-softmmu/tcg/tcg-common.o
  CC      sh4eb-softmmu/tcg/tcg-runtime.o
  CC      ppc64-softmmu/target/ppc/mmu-hash32.o
  CC      ppc64-softmmu/target/ppc/monitor.o
  CC      ppc-softmmu/target/ppc/int_helper.o
  CC      ppc64-softmmu/target/ppc/arch_dump.o
  CC      sh4eb-softmmu/fpu/softfloat.o
  CC      ppc64-softmmu/target/ppc/mmu-hash64.o
  CC      ppc64-softmmu/target/ppc/mmu-book3s-v3.o
  CC      ppc64-softmmu/target/ppc/compat.o
  CC      ppc-softmmu/target/ppc/timebase_helper.o
  CC      ppc64-softmmu/target/ppc/mmu-radix64.o
  CC      ppc-softmmu/target/ppc/misc_helper.o
  GEN     sh4-softmmu/hmp-commands.h
  GEN     sh4-softmmu/hmp-commands-info.h
  CC      ppc-softmmu/target/ppc/mem_helper.o
  GEN     sh4-softmmu/config-target.h
  CC      sh4-softmmu/exec.o
  CC      ppc64-softmmu/target/ppc/kvm-stub.o
  CC      ppc64-softmmu/target/ppc/dfp_helper.o
  CC      ppc-softmmu/target/ppc/gdbstub.o
  CC      sh4eb-softmmu/disas.o
  GEN     trace/generated-helpers.c
  CC      ppc-softmmu/trace/control-target.o
  CC      ppc64-softmmu/target/ppc/excp_helper.o
  CC      sh4eb-softmmu/hax-stub.o
  CC      sh4eb-softmmu/arch_init.o
  CC      ppc-softmmu/gdbstub-xml.o
  CC      sh4eb-softmmu/cpus.o
  CC      ppc-softmmu/trace/generated-helpers.o
  CC      sh4-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/target/ppc/fpu_helper.o
  LINK    ppc-softmmu/qemu-system-ppc
  CC      sh4eb-softmmu/monitor.o
  CC      sh4eb-softmmu/gdbstub.o
  CC      sh4-softmmu/tcg/tcg-op.o
  CC      sh4eb-softmmu/balloon.o
  CC      sh4eb-softmmu/ioport.o
  GEN     sparc64-softmmu/hmp-commands.h
  GEN     sparc64-softmmu/hmp-commands-info.h
  GEN     sparc64-softmmu/config-target.h
  CC      sh4eb-softmmu/numa.o
  CC      ppc64-softmmu/target/ppc/int_helper.o
  CC      sparc64-softmmu/exec.o
  CC      sh4eb-softmmu/qtest.o
  CC      sh4eb-softmmu/memory.o
  CC      sh4-softmmu/tcg/optimize.o
  CC      ppc64-softmmu/target/ppc/timebase_helper.o
  CC      sparc64-softmmu/tcg/tcg.o
  CC      ppc64-softmmu/target/ppc/misc_helper.o
  CC      sh4-softmmu/tcg/tcg-common.o
  CC      sh4eb-softmmu/memory_mapping.o
  CC      sh4-softmmu/tcg/tcg-runtime.o
  CC      sh4eb-softmmu/dump.o
  CC      ppc64-softmmu/target/ppc/mem_helper.o
  CC      sh4-softmmu/fpu/softfloat.o
  CC      sh4eb-softmmu/migration/ram.o
  CC      ppc64-softmmu/target/ppc/gdbstub.o
  CC      sparc64-softmmu/tcg/tcg-op.o
  GEN     trace/generated-helpers.c
  CC      ppc64-softmmu/trace/control-target.o
  CC      ppc64-softmmu/gdbstub-xml.o
  CC      sh4eb-softmmu/accel/accel.o
  CC      ppc64-softmmu/trace/generated-helpers.o
  CC      sh4eb-softmmu/accel/stubs/kvm-stub.o
  LINK    ppc64-softmmu/qemu-system-ppc64
  CC      sh4-softmmu/disas.o
  CC      sh4eb-softmmu/accel/tcg/tcg-all.o
  CC      sh4-softmmu/hax-stub.o
  CC      sh4eb-softmmu/accel/tcg/cputlb.o
  CC      sh4-softmmu/arch_init.o
  CC      sparc64-softmmu/tcg/optimize.o
  CC      sh4-softmmu/cpus.o
  CC      sparc64-softmmu/tcg/tcg-common.o
  CC      sh4-softmmu/monitor.o
  CC      sh4eb-softmmu/accel/tcg/cpu-exec.o
  CC      sparc64-softmmu/tcg/tcg-runtime.o
  CC      sparc64-softmmu/fpu/softfloat.o
  CC      sh4eb-softmmu/accel/tcg/cpu-exec-common.o
  GEN     sparc-softmmu/hmp-commands.h
  CC      sh4eb-softmmu/accel/tcg/translate-all.o
  GEN     sparc-softmmu/hmp-commands-info.h
  GEN     sparc-softmmu/config-target.h
  CC      sparc-softmmu/exec.o
  CC      sh4eb-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sh4-softmmu/gdbstub.o
  CC      sh4eb-softmmu/hw/block/tc58128.o
  CC      sh4-softmmu/balloon.o
  CC      sh4eb-softmmu/hw/block/virtio-blk.o
  CC      sh4-softmmu/ioport.o
  CC      sh4eb-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sparc64-softmmu/disas.o
  CC      sh4-softmmu/numa.o
  CC      sparc-softmmu/tcg/tcg.o
  CC      sh4eb-softmmu/hw/char/sh_serial.o
  CC      sparc64-softmmu/hax-stub.o
  CC      sh4-softmmu/qtest.o
  CC      sparc64-softmmu/arch_init.o
  CC      sh4eb-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4-softmmu/memory.o
  CC      sparc64-softmmu/cpus.o
  CC      sh4eb-softmmu/hw/core/generic-loader.o
  CC      sparc64-softmmu/monitor.o
  CC      sh4eb-softmmu/hw/core/null-machine.o
  CC      sparc-softmmu/tcg/tcg-op.o
  CC      sh4eb-softmmu/hw/display/sm501.o
  CC      sh4-softmmu/memory_mapping.o
  CC      sh4-softmmu/dump.o
  CC      sh4eb-softmmu/hw/display/vga.o
  CC      sparc64-softmmu/gdbstub.o
  CC      sh4-softmmu/migration/ram.o
  CC      sparc64-softmmu/balloon.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu.o
  CC      sparc-softmmu/tcg/optimize.o
  CC      sparc64-softmmu/ioport.o
  CC      sparc64-softmmu/numa.o
  CC      sh4-softmmu/accel/accel.o
  CC      sparc-softmmu/tcg/tcg-common.o
  CC      sh4-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/qtest.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-3d.o
  CC      sh4-softmmu/accel/tcg/tcg-all.o
  CC      sparc-softmmu/tcg/tcg-runtime.o
  CC      sparc-softmmu/fpu/softfloat.o
  CC      sparc64-softmmu/memory.o
  CC      sh4-softmmu/accel/tcg/cputlb.o
  CC      sh4eb-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4eb-softmmu/hw/intc/sh_intc.o
  CC      sparc64-softmmu/memory_mapping.o
  CC      sh4eb-softmmu/hw/misc/ivshmem.o
  CC      sparc64-softmmu/dump.o
  CC      sh4-softmmu/accel/tcg/cpu-exec.o
  CC      sh4eb-softmmu/hw/misc/mmio_interface.o
  CC      sh4-softmmu/accel/tcg/cpu-exec-common.o
  CC      sparc64-softmmu/migration/ram.o
  CC      sh4-softmmu/accel/tcg/translate-all.o
  CC      sh4eb-softmmu/hw/net/virtio-net.o
  CC      sparc-softmmu/disas.o
  CC      sh4-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sparc-softmmu/hax-stub.o
  CC      sh4eb-softmmu/hw/net/vhost_net.o
  CC      sparc64-softmmu/accel/accel.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi.o
  CC      sparc-softmmu/arch_init.o
  CC      sh4-softmmu/hw/block/tc58128.o
  CC      sparc64-softmmu/accel/stubs/kvm-stub.o
  CC      sparc-softmmu/cpus.o
  CC      sh4-softmmu/hw/block/virtio-blk.o
  CC      sparc64-softmmu/accel/tcg/tcg-all.o
  CC      sh4eb-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sparc64-softmmu/accel/tcg/cputlb.o
  CC      sparc-softmmu/monitor.o
  CC      sh4-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sh4eb-softmmu/hw/scsi/vhost-scsi-common.o
  CC      sh4eb-softmmu/hw/scsi/vhost-scsi.o
  CC      sh4-softmmu/hw/char/sh_serial.o
  CC      sh4eb-softmmu/hw/scsi/vhost-user-scsi.o
  CC      sparc64-softmmu/accel/tcg/cpu-exec.o
  CC      sh4-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4eb-softmmu/hw/timer/sh_timer.o
  CC      sparc-softmmu/gdbstub.o
  CC      sparc64-softmmu/accel/tcg/cpu-exec-common.o
  CC      sh4-softmmu/hw/core/generic-loader.o
  CC      sh4eb-softmmu/hw/timer/mc146818rtc.o
  CC      sparc64-softmmu/accel/tcg/translate-all.o
  CC      sparc-softmmu/balloon.o
  CC      sh4-softmmu/hw/core/null-machine.o
  CC      sh4eb-softmmu/hw/vfio/common.o
  CC      sparc-softmmu/ioport.o
  CC      sparc64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      sh4-softmmu/hw/display/sm501.o
  CC      sparc-softmmu/numa.o
  CC      sparc64-softmmu/hw/block/virtio-blk.o
  CC      sh4eb-softmmu/hw/vfio/pci.o
  CC      sh4-softmmu/hw/display/vga.o
  CC      sparc64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      sparc-softmmu/qtest.o
  CC      sparc-softmmu/memory.o
  CC      sparc64-softmmu/hw/char/virtio-serial-bus.o
  CC      sh4eb-softmmu/hw/vfio/pci-quirks.o
  CC      sh4-softmmu/hw/display/virtio-gpu.o
  CC      sh4eb-softmmu/hw/vfio/platform.o
  CC      sparc64-softmmu/hw/core/generic-loader.o
  CC      sparc64-softmmu/hw/core/null-machine.o
  CC      sparc-softmmu/memory_mapping.o
  CC      sh4eb-softmmu/hw/vfio/spapr.o
  CC      sh4-softmmu/hw/display/virtio-gpu-3d.o
  CC      sparc-softmmu/dump.o
  CC      sh4eb-softmmu/hw/virtio/virtio.o
  CC      sparc64-softmmu/hw/display/vga.o
  CC      sparc-softmmu/migration/ram.o
  CC      sh4-softmmu/hw/display/virtio-gpu-pci.o
  CC      sh4eb-softmmu/hw/virtio/virtio-balloon.o
  CC      sparc64-softmmu/hw/display/virtio-gpu.o
  CC      sh4-softmmu/hw/intc/sh_intc.o
  CC      sh4-softmmu/hw/misc/ivshmem.o
  CC      sh4eb-softmmu/hw/virtio/vhost.o
  CC      sparc-softmmu/accel/accel.o
  CC      sparc-softmmu/accel/stubs/kvm-stub.o
  CC      sparc64-softmmu/hw/display/virtio-gpu-3d.o
  CC      sh4-softmmu/hw/misc/mmio_interface.o
  CC      sh4eb-softmmu/hw/virtio/vhost-backend.o
  CC      sh4-softmmu/hw/net/virtio-net.o
  CC      sparc-softmmu/accel/tcg/tcg-all.o
  CC      sh4eb-softmmu/hw/virtio/vhost-user.o
  CC      sparc64-softmmu/hw/display/virtio-gpu-pci.o
  CC      sparc-softmmu/accel/tcg/cputlb.o
  CC      sh4-softmmu/hw/net/vhost_net.o
  CC      sh4eb-softmmu/hw/virtio/vhost-vsock.o
  CC      sparc64-softmmu/hw/misc/ivshmem.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto.o
  CC      sparc64-softmmu/hw/misc/mmio_interface.o
  CC      sh4eb-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sh4-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sparc64-softmmu/hw/net/virtio-net.o
  CC      sparc-softmmu/accel/tcg/cpu-exec.o
  CC      sh4-softmmu/hw/scsi/vhost-scsi-common.o
  CC      sh4eb-softmmu/hw/sh4/shix.o
  CC      sh4-softmmu/hw/scsi/vhost-scsi.o
  CC      sparc-softmmu/accel/tcg/cpu-exec-common.o
  CC      sh4-softmmu/hw/scsi/vhost-user-scsi.o
  CC      sh4eb-softmmu/hw/sh4/r2d.o
  CC      sh4-softmmu/hw/timer/sh_timer.o
  CC      sparc64-softmmu/hw/net/vhost_net.o
  CC      sparc-softmmu/accel/tcg/translate-all.o
  CC      sh4eb-softmmu/hw/sh4/sh7750.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi.o
  CC      sh4-softmmu/hw/timer/mc146818rtc.o
  CC      sh4eb-softmmu/hw/sh4/sh7750_regnames.o
  CC      sparc-softmmu/hw/core/generic-loader.o
  CC      sh4-softmmu/hw/vfio/common.o
  CC      sparc64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      sh4eb-softmmu/hw/sh4/sh_pci.o
  CC      sparc-softmmu/hw/core/null-machine.o
  CC      sparc64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      sh4eb-softmmu/target/sh4/translate.o
  CC      sparc-softmmu/hw/display/tcx.o
  CC      sh4-softmmu/hw/vfio/pci.o
  CC      sparc64-softmmu/hw/scsi/vhost-scsi.o
  CC      sparc-softmmu/hw/display/cg3.o
  CC      sparc64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      sparc64-softmmu/hw/timer/mc146818rtc.o
  CC      sh4-softmmu/hw/vfio/pci-quirks.o
  CC      sparc-softmmu/hw/intc/grlib_irqmp.o
  CC      sh4eb-softmmu/target/sh4/op_helper.o
  CC      sparc64-softmmu/hw/vfio/common.o
  CC      sh4-softmmu/hw/vfio/platform.o
  CC      sparc-softmmu/hw/misc/eccmemctl.o
  CC      sh4eb-softmmu/target/sh4/helper.o
  CC      sparc-softmmu/hw/misc/slavio_misc.o
  CC      sh4-softmmu/hw/vfio/spapr.o
  CC      sparc64-softmmu/hw/vfio/pci.o
  CC      sh4eb-softmmu/target/sh4/cpu.o
  CC      sh4-softmmu/hw/virtio/virtio.o
  CC      sparc-softmmu/hw/misc/mmio_interface.o
  CC      sh4eb-softmmu/target/sh4/monitor.o
  CC      sparc-softmmu/hw/net/vhost_net.o
  CC      sparc-softmmu/hw/net/rocker/qmp-norocker.o
  CC      sh4eb-softmmu/target/sh4/gdbstub.o
  CC      sh4-softmmu/hw/virtio/virtio-balloon.o
  CC      sparc64-softmmu/hw/vfio/pci-quirks.o
  CC      sparc-softmmu/hw/vfio/common.o
  GEN     trace/generated-helpers.c
  CC      sh4eb-softmmu/trace/control-target.o
  CC      sh4-softmmu/hw/virtio/vhost.o
  CC      sparc64-softmmu/hw/vfio/platform.o
  CC      sparc-softmmu/hw/vfio/platform.o
  CC      sh4eb-softmmu/trace/generated-helpers.o
  CC      sparc64-softmmu/hw/vfio/spapr.o
  CC      sh4-softmmu/hw/virtio/vhost-backend.o
  LINK    sh4eb-softmmu/qemu-system-sh4eb
  CC      sparc-softmmu/hw/vfio/spapr.o
  CC      sh4-softmmu/hw/virtio/vhost-user.o
  CC      sparc64-softmmu/hw/virtio/virtio.o
  CC      sparc-softmmu/hw/sparc/sun4m.o
  CC      sh4-softmmu/hw/virtio/vhost-vsock.o
  CC      sh4-softmmu/hw/virtio/virtio-crypto.o
  CC      sparc-softmmu/hw/sparc/leon3.o
  CC      sparc64-softmmu/hw/virtio/virtio-balloon.o
  CC      sparc64-softmmu/hw/virtio/vhost.o
  CC      sh4-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sparc-softmmu/target/sparc/machine.o
  CC      sparc-softmmu/target/sparc/monitor.o
  CC      sh4-softmmu/hw/sh4/shix.o
  CC      sparc64-softmmu/hw/virtio/vhost-backend.o
  GEN     tricore-softmmu/hmp-commands.h
  CC      sparc-softmmu/target/sparc/translate.o
  GEN     tricore-softmmu/hmp-commands-info.h
  GEN     tricore-softmmu/config-target.h
  CC      sh4-softmmu/hw/sh4/r2d.o
  CC      tricore-softmmu/exec.o
  CC      sparc64-softmmu/hw/virtio/vhost-user.o
  CC      sh4-softmmu/hw/sh4/sh7750.o
  CC      sparc64-softmmu/hw/virtio/vhost-vsock.o
  CC      sh4-softmmu/hw/sh4/sh7750_regnames.o
  CC      sparc-softmmu/target/sparc/helper.o
  CC      sh4-softmmu/hw/sh4/sh_pci.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto.o
  CC      sparc-softmmu/target/sparc/cpu.o
  CC      sh4-softmmu/target/sh4/translate.o
  CC      tricore-softmmu/tcg/tcg.o
  CC      sparc64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      sparc-softmmu/target/sparc/fop_helper.o
  CC      sparc-softmmu/target/sparc/cc_helper.o
  CC      sparc64-softmmu/hw/sparc64/sparc64.o
  CC      sparc-softmmu/target/sparc/win_helper.o
  CC      sh4-softmmu/target/sh4/op_helper.o
  CC      sparc64-softmmu/hw/sparc64/sun4u.o
  CC      sparc-softmmu/target/sparc/mmu_helper.o
  CC      sh4-softmmu/target/sh4/helper.o
  CC      sparc-softmmu/target/sparc/ldst_helper.o
  CC      tricore-softmmu/tcg/tcg-op.o
  CC      sparc64-softmmu/hw/sparc64/niagara.o
  CC      sparc-softmmu/target/sparc/int32_helper.o
  CC      sh4-softmmu/target/sh4/cpu.o
  CC      sparc64-softmmu/target/sparc/machine.o
  CC      sparc-softmmu/target/sparc/gdbstub.o
  CC      sh4-softmmu/target/sh4/monitor.o
  CC      sparc64-softmmu/target/sparc/monitor.o
  GEN     trace/generated-helpers.c
  CC      sparc-softmmu/trace/control-target.o
  CC      sh4-softmmu/target/sh4/gdbstub.o
  CC      sparc-softmmu/trace/generated-helpers.o
  CC      sparc64-softmmu/target/sparc/translate.o
  GEN     trace/generated-helpers.c
  CC      sh4-softmmu/trace/control-target.o
  LINK    sparc-softmmu/qemu-system-sparc
  CC      sh4-softmmu/trace/generated-helpers.o
  CC      tricore-softmmu/tcg/optimize.o
  LINK    sh4-softmmu/qemu-system-sh4
  CC      tricore-softmmu/tcg/tcg-common.o
  CC      sparc64-softmmu/target/sparc/helper.o
  CC      tricore-softmmu/tcg/tcg-runtime.o
  CC      tricore-softmmu/fpu/softfloat.o
  CC      tricore-softmmu/disas.o
  CC      sparc64-softmmu/target/sparc/cpu.o
  CC      tricore-softmmu/hax-stub.o
  CC      sparc64-softmmu/target/sparc/fop_helper.o
  GEN     unicore32-softmmu/hmp-commands.h
  GEN     unicore32-softmmu/hmp-commands-info.h
  GEN     unicore32-softmmu/config-target.h
  CC      unicore32-softmmu/exec.o
  CC      sparc64-softmmu/target/sparc/cc_helper.o
  GEN     x86_64-softmmu/hmp-commands.h
  GEN     x86_64-softmmu/hmp-commands-info.h
  GEN     x86_64-softmmu/config-target.h
  CC      sparc64-softmmu/target/sparc/win_helper.o
  CC      x86_64-softmmu/exec.o
  CC      sparc64-softmmu/target/sparc/mmu_helper.o
  CC      sparc64-softmmu/target/sparc/ldst_helper.o
  CC      tricore-softmmu/arch_init.o
  CC      unicore32-softmmu/tcg/tcg.o
  CC      sparc64-softmmu/target/sparc/int64_helper.o
  CC      tricore-softmmu/cpus.o
  CC      sparc64-softmmu/target/sparc/vis_helper.o
  CC      x86_64-softmmu/tcg/tcg.o
  CC      tricore-softmmu/monitor.o
  CC      sparc64-softmmu/target/sparc/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      sparc64-softmmu/trace/control-target.o
  CC      unicore32-softmmu/tcg/tcg-op.o
  CC      sparc64-softmmu/trace/generated-helpers.o
  LINK    sparc64-softmmu/qemu-system-sparc64
  CC      tricore-softmmu/gdbstub.o
  CC      x86_64-softmmu/tcg/tcg-op.o
  CC      tricore-softmmu/balloon.o
  CC      tricore-softmmu/ioport.o
  CC      unicore32-softmmu/tcg/optimize.o
  CC      tricore-softmmu/numa.o
  GEN     xtensaeb-softmmu/hmp-commands.h
  GEN     xtensaeb-softmmu/hmp-commands-info.h
  GEN     xtensaeb-softmmu/config-target.h
  CC      xtensaeb-softmmu/exec.o
  CC      tricore-softmmu/qtest.o
  CC      unicore32-softmmu/tcg/tcg-common.o
  CC      unicore32-softmmu/tcg/tcg-runtime.o
  CC      tricore-softmmu/memory.o
  CC      x86_64-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/fpu/softfloat.o
  CC      xtensaeb-softmmu/tcg/tcg.o
  CC      tricore-softmmu/memory_mapping.o
  CC      x86_64-softmmu/tcg/tcg-common.o
  CC      tricore-softmmu/dump.o
  CC      x86_64-softmmu/tcg/tcg-runtime.o
  CC      tricore-softmmu/migration/ram.o
  CC      x86_64-softmmu/fpu/softfloat.o
  CC      xtensaeb-softmmu/tcg/tcg-op.o
  CC      unicore32-softmmu/disas.o
  CC      tricore-softmmu/accel/accel.o
  CC      unicore32-softmmu/hax-stub.o
  CC      tricore-softmmu/accel/stubs/kvm-stub.o
  CC      unicore32-softmmu/arch_init.o
  CC      tricore-softmmu/accel/tcg/tcg-all.o
  CC      tricore-softmmu/accel/tcg/cputlb.o
  CC      unicore32-softmmu/cpus.o
  CC      x86_64-softmmu/disas.o
  CC      xtensaeb-softmmu/tcg/optimize.o
  CC      unicore32-softmmu/monitor.o
  GEN     x86_64-softmmu/gdbstub-xml.c
  CC      tricore-softmmu/accel/tcg/cpu-exec.o
  CC      xtensaeb-softmmu/tcg/tcg-common.o
  CC      x86_64-softmmu/hax-stub.o
  CC      tricore-softmmu/accel/tcg/cpu-exec-common.o
  CC      xtensaeb-softmmu/tcg/tcg-runtime.o
  CC      x86_64-softmmu/arch_init.o
  CC      tricore-softmmu/accel/tcg/translate-all.o
  CC      xtensaeb-softmmu/fpu/softfloat.o
  CC      x86_64-softmmu/cpus.o
  CC      unicore32-softmmu/gdbstub.o
  CC      tricore-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/balloon.o
  CC      x86_64-softmmu/monitor.o
  CC      tricore-softmmu/hw/core/null-machine.o
  CC      unicore32-softmmu/ioport.o
  CC      tricore-softmmu/hw/misc/mmio_interface.o
  CC      tricore-softmmu/hw/net/vhost_net.o
  CC      unicore32-softmmu/numa.o
  CC      tricore-softmmu/hw/net/rocker/qmp-norocker.o
  CC      x86_64-softmmu/gdbstub.o
  CC      unicore32-softmmu/qtest.o
  CC      tricore-softmmu/hw/vfio/common.o
  CC      xtensaeb-softmmu/disas.o
  CC      x86_64-softmmu/balloon.o
  CC      unicore32-softmmu/memory.o
  CC      xtensaeb-softmmu/hax-stub.o
  CC      x86_64-softmmu/ioport.o
  CC      tricore-softmmu/hw/vfio/platform.o
  CC      xtensaeb-softmmu/arch_init.o
  CC      x86_64-softmmu/numa.o
  CC      tricore-softmmu/hw/vfio/spapr.o
  CC      xtensaeb-softmmu/cpus.o
  CC      tricore-softmmu/hw/tricore/tricore_testboard.o
  CC      x86_64-softmmu/qtest.o
  CC      unicore32-softmmu/memory_mapping.o
  CC      tricore-softmmu/target/tricore/translate.o
  CC      xtensaeb-softmmu/monitor.o
  CC      unicore32-softmmu/dump.o
  CC      x86_64-softmmu/memory.o
  CC      unicore32-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/gdbstub.o
  CC      x86_64-softmmu/memory_mapping.o
  CC      unicore32-softmmu/accel/accel.o
  CC      x86_64-softmmu/dump.o
  CC      xtensaeb-softmmu/balloon.o
  CC      unicore32-softmmu/accel/stubs/kvm-stub.o
  CC      unicore32-softmmu/accel/tcg/tcg-all.o
  CC      xtensaeb-softmmu/ioport.o
  CC      unicore32-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/migration/ram.o
  CC      xtensaeb-softmmu/numa.o
  CC      xtensaeb-softmmu/qtest.o
  CC      tricore-softmmu/target/tricore/helper.o
  CC      x86_64-softmmu/accel/accel.o
  CC      tricore-softmmu/target/tricore/cpu.o
  CC      unicore32-softmmu/accel/tcg/cpu-exec.o
  CC      xtensaeb-softmmu/memory.o
  CC      x86_64-softmmu/accel/stubs/kvm-stub.o
  CC      x86_64-softmmu/accel/tcg/tcg-all.o
  CC      unicore32-softmmu/accel/tcg/cpu-exec-common.o
  CC      tricore-softmmu/target/tricore/op_helper.o
  CC      x86_64-softmmu/accel/tcg/cputlb.o
  CC      unicore32-softmmu/accel/tcg/translate-all.o
  CC      xtensaeb-softmmu/memory_mapping.o
  CC      unicore32-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/hw/core/null-machine.o
  CC      xtensaeb-softmmu/dump.o
  CC      unicore32-softmmu/hw/misc/mmio_interface.o
  CC      tricore-softmmu/target/tricore/fpu_helper.o
  CC      unicore32-softmmu/hw/net/vhost_net.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec.o
  CC      unicore32-softmmu/hw/net/rocker/qmp-norocker.o
  GEN     trace/generated-helpers.c
  CC      tricore-softmmu/trace/control-target.o
  CC      unicore32-softmmu/hw/vfio/common.o
  CC      x86_64-softmmu/accel/tcg/cpu-exec-common.o
  CC      xtensaeb-softmmu/migration/ram.o
  CC      x86_64-softmmu/accel/tcg/translate-all.o
  CC      tricore-softmmu/trace/generated-helpers.o
  CC      unicore32-softmmu/hw/vfio/platform.o
  CC      x86_64-softmmu/hw/9pfs/virtio-9p-device.o
  CC      xtensaeb-softmmu/accel/accel.o
  LINK    tricore-softmmu/qemu-system-tricore
  CC      x86_64-softmmu/hw/block/virtio-blk.o
  CC      unicore32-softmmu/hw/vfio/spapr.o
  CC      xtensaeb-softmmu/accel/stubs/kvm-stub.o
  CC      unicore32-softmmu/hw/unicore32/puv3.o
  CC      x86_64-softmmu/hw/block/dataplane/virtio-blk.o
  CC      xtensaeb-softmmu/accel/tcg/tcg-all.o
  CC      xtensaeb-softmmu/accel/tcg/cputlb.o
  CC      x86_64-softmmu/hw/char/virtio-serial-bus.o
  CC      unicore32-softmmu/target/unicore32/translate.o
  GEN     xtensa-softmmu/hmp-commands.h
  CC      x86_64-softmmu/hw/core/generic-loader.o
  GEN     xtensa-softmmu/hmp-commands-info.h
  GEN     xtensa-softmmu/config-target.h
  CC      x86_64-softmmu/hw/core/null-machine.o
  CC      xtensa-softmmu/exec.o
  CC      x86_64-softmmu/hw/display/vga.o
  CC      xtensaeb-softmmu/accel/tcg/cpu-exec.o
  CC      unicore32-softmmu/target/unicore32/op_helper.o
  CC      unicore32-softmmu/target/unicore32/helper.o
  CC      xtensaeb-softmmu/accel/tcg/cpu-exec-common.o
  CC      unicore32-softmmu/target/unicore32/cpu.o
  CC      x86_64-softmmu/hw/display/virtio-gpu.o
  CC      xtensaeb-softmmu/accel/tcg/translate-all.o
  CC      unicore32-softmmu/target/unicore32/ucf64_helper.o
  CC      xtensa-softmmu/tcg/tcg.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-3d.o
  CC      xtensaeb-softmmu/hw/core/generic-loader.o
  CC      unicore32-softmmu/target/unicore32/softmmu.o
  CC      xtensaeb-softmmu/hw/core/null-machine.o
  GEN     trace/generated-helpers.c
  CC      unicore32-softmmu/trace/control-target.o
  CC      x86_64-softmmu/hw/display/virtio-gpu-pci.o
  CC      xtensaeb-softmmu/hw/misc/mmio_interface.o
  CC      unicore32-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/hw/display/virtio-vga.o
  CC      xtensaeb-softmmu/hw/net/vhost_net.o
  CC      xtensaeb-softmmu/hw/net/rocker/qmp-norocker.o
  LINK    unicore32-softmmu/qemu-system-unicore32
  CC      xtensaeb-softmmu/hw/vfio/common.o
  CC      xtensa-softmmu/tcg/tcg-op.o
  CC      x86_64-softmmu/hw/intc/apic.o
  CC      xtensaeb-softmmu/hw/vfio/platform.o
  CC      xtensaeb-softmmu/hw/vfio/spapr.o
  CC      x86_64-softmmu/hw/intc/apic_common.o
  CC      x86_64-softmmu/hw/intc/ioapic.o
  CC      x86_64-softmmu/hw/isa/lpc_ich9.o
  CC      xtensaeb-softmmu/hw/xtensa/pic_cpu.o
  CC      xtensa-softmmu/tcg/optimize.o
  CC      x86_64-softmmu/hw/misc/vmport.o
  CC      xtensa-softmmu/tcg/tcg-common.o
  CC      xtensaeb-softmmu/hw/xtensa/sim.o
  CC      x86_64-softmmu/hw/misc/ivshmem.o
  CC      xtensaeb-softmmu/hw/xtensa/xtfpga.o
  CC      xtensa-softmmu/tcg/tcg-runtime.o
  GEN     aarch64-linux-user/config-target.h
  CC      x86_64-softmmu/hw/misc/pvpanic.o
  CC      xtensaeb-softmmu/target/xtensa/xtensa-semi.o
  CC      aarch64-linux-user/exec.o
  CC      xtensa-softmmu/fpu/softfloat.o
  CC      x86_64-softmmu/hw/misc/mmio_interface.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc232b.o
  CC      x86_64-softmmu/hw/net/virtio-net.o
  CC      aarch64-linux-user/tcg/tcg.o
  CC      xtensaeb-softmmu/target/xtensa/core-dc233c.o
  CC      x86_64-softmmu/hw/net/vhost_net.o
  CC      xtensaeb-softmmu/target/xtensa/core-fsf.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi.o
  CC      xtensaeb-softmmu/target/xtensa/monitor.o
  CC      x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
  CC      aarch64-linux-user/tcg/tcg-op.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi-common.o
  CC      xtensaeb-softmmu/target/xtensa/translate.o
  CC      xtensa-softmmu/disas.o
  CC      x86_64-softmmu/hw/scsi/vhost-scsi.o
  CC      xtensa-softmmu/hax-stub.o
  CC      xtensa-softmmu/arch_init.o
  CC      x86_64-softmmu/hw/scsi/vhost-user-scsi.o
  CC      x86_64-softmmu/hw/timer/mc146818rtc.o
  CC      xtensa-softmmu/cpus.o
  CC      x86_64-softmmu/hw/vfio/common.o
  CC      xtensa-softmmu/monitor.o
  CC      xtensaeb-softmmu/target/xtensa/op_helper.o
  CC      aarch64-linux-user/tcg/optimize.o
  CC      x86_64-softmmu/hw/vfio/pci.o
  CC      xtensaeb-softmmu/target/xtensa/helper.o
  CC      xtensa-softmmu/gdbstub.o
  CC      aarch64-linux-user/tcg/tcg-common.o
  CC      xtensaeb-softmmu/target/xtensa/cpu.o
  CC      aarch64-linux-user/tcg/tcg-runtime.o
  CC      x86_64-softmmu/hw/vfio/pci-quirks.o
  CC      xtensa-softmmu/balloon.o
  CC      xtensaeb-softmmu/target/xtensa/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      xtensa-softmmu/ioport.o
  CC      xtensaeb-softmmu/trace/control-target.o
  CC      x86_64-softmmu/hw/vfio/platform.o
  CC      aarch64-linux-user/fpu/softfloat.o
  CC      xtensaeb-softmmu/trace/generated-helpers.o
  CC      xtensa-softmmu/numa.o
  CC      x86_64-softmmu/hw/vfio/spapr.o
  LINK    xtensaeb-softmmu/qemu-system-xtensaeb
  CC      xtensa-softmmu/qtest.o
  CC      x86_64-softmmu/hw/virtio/virtio.o
  CC      xtensa-softmmu/memory.o
  CC      aarch64-linux-user/disas.o
  CC      x86_64-softmmu/hw/virtio/virtio-balloon.o
  CC      x86_64-softmmu/hw/virtio/vhost.o
  GEN     aarch64-linux-user/gdbstub-xml.c
  CC      aarch64-linux-user/hax-stub.o
  CC      x86_64-softmmu/hw/virtio/vhost-backend.o
  CC      xtensa-softmmu/memory_mapping.o
  CC      aarch64-linux-user/gdbstub.o
  CC      x86_64-softmmu/hw/virtio/vhost-user.o
  CC      xtensa-softmmu/dump.o
  CC      x86_64-softmmu/hw/virtio/vhost-vsock.o
  GEN     alpha-linux-user/config-target.h
  CC      alpha-linux-user/exec.o
  CC      aarch64-linux-user/thunk.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto.o
  CC      xtensa-softmmu/migration/ram.o
  CC      alpha-linux-user/tcg/tcg.o
  CC      aarch64-linux-user/user-exec.o
  CC      x86_64-softmmu/hw/virtio/virtio-crypto-pci.o
  CC      aarch64-linux-user/user-exec-stub.o
  CC      xtensa-softmmu/accel/accel.o
  CC      x86_64-softmmu/hw/i386/multiboot.o
  CC      aarch64-linux-user/accel/stubs/kvm-stub.o
  CC      xtensa-softmmu/accel/stubs/kvm-stub.o
  CC      x86_64-softmmu/hw/i386/pc.o
  CC      aarch64-linux-user/accel/tcg/cpu-exec.o
  CC      xtensa-softmmu/accel/tcg/tcg-all.o
  CC      alpha-linux-user/tcg/tcg-op.o
  CC      xtensa-softmmu/accel/tcg/cputlb.o
  CC      aarch64-linux-user/accel/tcg/cpu-exec-common.o
  CC      x86_64-softmmu/hw/i386/pc_piix.o
  CC      aarch64-linux-user/accel/tcg/translate-all.o
  CC      x86_64-softmmu/hw/i386/pc_q35.o
  CC      aarch64-linux-user/linux-user/main.o
  CC      x86_64-softmmu/hw/i386/pc_sysfw.o
  CC      xtensa-softmmu/accel/tcg/cpu-exec.o
  CC      x86_64-softmmu/hw/i386/x86-iommu.o
  CC      aarch64-linux-user/linux-user/syscall.o
  CC      alpha-linux-user/tcg/optimize.o
  CC      x86_64-softmmu/hw/i386/intel_iommu.o
  CC      xtensa-softmmu/accel/tcg/cpu-exec-common.o
  CC      xtensa-softmmu/accel/tcg/translate-all.o
  CC      alpha-linux-user/tcg/tcg-common.o
  CC      x86_64-softmmu/hw/i386/amd_iommu.o
  CC      alpha-linux-user/tcg/tcg-runtime.o
  CC      xtensa-softmmu/hw/core/generic-loader.o
  CC      xtensa-softmmu/hw/core/null-machine.o
  CC      x86_64-softmmu/hw/i386/kvmvapic.o
  CC      alpha-linux-user/fpu/softfloat.o
  CC      xtensa-softmmu/hw/misc/mmio_interface.o
  CC      x86_64-softmmu/hw/i386/acpi-build.o
  CC      xtensa-softmmu/hw/net/vhost_net.o
  CC      xtensa-softmmu/hw/net/rocker/qmp-norocker.o
  CC      aarch64-linux-user/linux-user/strace.o
  CC      x86_64-softmmu/hw/i386/pci-assign-load-rom.o
  CC      xtensa-softmmu/hw/vfio/common.o
  CC      x86_64-softmmu/target/i386/helper.o
  CC      aarch64-linux-user/linux-user/mmap.o
  CC      aarch64-linux-user/linux-user/signal.o
  CC      xtensa-softmmu/hw/vfio/platform.o
  CC      x86_64-softmmu/target/i386/cpu.o
  CC      alpha-linux-user/disas.o
  CC      aarch64-linux-user/linux-user/elfload.o
  CC      xtensa-softmmu/hw/vfio/spapr.o
  CC      alpha-linux-user/hax-stub.o
  CC      x86_64-softmmu/target/i386/gdbstub.o
  CC      xtensa-softmmu/hw/xtensa/pic_cpu.o
  CC      alpha-linux-user/gdbstub.o
  CC      xtensa-softmmu/hw/xtensa/sim.o
  CC      x86_64-softmmu/target/i386/xsave_helper.o
  CC      aarch64-linux-user/linux-user/linuxload.o
  CC      xtensa-softmmu/hw/xtensa/xtfpga.o
  CC      alpha-linux-user/thunk.o
  CC      x86_64-softmmu/target/i386/translate.o
  CC      aarch64-linux-user/linux-user/uaccess.o
  CC      xtensa-softmmu/target/xtensa/xtensa-semi.o
  CC      alpha-linux-user/user-exec.o
  CC      aarch64-linux-user/linux-user/uname.o
  CC      xtensa-softmmu/target/xtensa/core-dc232b.o
  CC      alpha-linux-user/user-exec-stub.o
  CCAS    aarch64-linux-user/linux-user/safe-syscall.o
  CC      xtensa-softmmu/target/xtensa/core-dc233c.o
  CC      aarch64-linux-user/linux-user/flatload.o
  CC      alpha-linux-user/accel/stubs/kvm-stub.o
  CC      xtensa-softmmu/target/xtensa/core-fsf.o
  CC      alpha-linux-user/accel/tcg/cpu-exec.o
  CC      xtensa-softmmu/target/xtensa/monitor.o
  CC      aarch64-linux-user/target/arm/arm-semi.o
  CC      alpha-linux-user/accel/tcg/cpu-exec-common.o
  CC      xtensa-softmmu/target/xtensa/translate.o
  CC      alpha-linux-user/accel/tcg/translate-all.o
  CC      aarch64-linux-user/target/arm/kvm-stub.o
  CC      aarch64-linux-user/target/arm/translate.o
  CC      alpha-linux-user/linux-user/main.o
  CC      alpha-linux-user/linux-user/syscall.o
  CC      xtensa-softmmu/target/xtensa/op_helper.o
  CC      xtensa-softmmu/target/xtensa/helper.o
  CC      xtensa-softmmu/target/xtensa/cpu.o
  CC      x86_64-softmmu/target/i386/bpt_helper.o
  CC      xtensa-softmmu/target/xtensa/gdbstub.o
  CC      x86_64-softmmu/target/i386/cc_helper.o
  GEN     trace/generated-helpers.c
  CC      xtensa-softmmu/trace/control-target.o
  CC      x86_64-softmmu/target/i386/excp_helper.o
  CC      alpha-linux-user/linux-user/strace.o
  CC      xtensa-softmmu/trace/generated-helpers.o
  CC      x86_64-softmmu/target/i386/fpu_helper.o
  LINK    xtensa-softmmu/qemu-system-xtensa
  CC      alpha-linux-user/linux-user/mmap.o
  CC      aarch64-linux-user/target/arm/op_helper.o
  CC      alpha-linux-user/linux-user/signal.o
  CC      alpha-linux-user/linux-user/elfload.o
  CC      aarch64-linux-user/target/arm/helper.o
  CC      alpha-linux-user/linux-user/linuxload.o
  CC      alpha-linux-user/linux-user/uaccess.o
  GEN     armeb-linux-user/config-target.h
  CC      alpha-linux-user/linux-user/uname.o
  CC      armeb-linux-user/exec.o
  CC      x86_64-softmmu/target/i386/int_helper.o
  CCAS    alpha-linux-user/linux-user/safe-syscall.o
  CC      alpha-linux-user/target/alpha/translate.o
  CC      armeb-linux-user/tcg/tcg.o
  CC      x86_64-softmmu/target/i386/mem_helper.o
  CC      aarch64-linux-user/target/arm/cpu.o
  CC      aarch64-linux-user/target/arm/neon_helper.o
  CC      x86_64-softmmu/target/i386/misc_helper.o
  CC      alpha-linux-user/target/alpha/helper.o
  CC      alpha-linux-user/target/alpha/cpu.o
  CC      x86_64-softmmu/target/i386/mpx_helper.o
  CC      alpha-linux-user/target/alpha/int_helper.o
  CC      armeb-linux-user/tcg/tcg-op.o
  CC      aarch64-linux-user/target/arm/iwmmxt_helper.o
  CC      alpha-linux-user/target/alpha/fpu_helper.o
  CC      x86_64-softmmu/target/i386/seg_helper.o
  CC      alpha-linux-user/target/alpha/vax_helper.o
  CC      aarch64-linux-user/target/arm/gdbstub.o
  CC      alpha-linux-user/target/alpha/sys_helper.o
  CC      aarch64-linux-user/target/arm/cpu64.o
  CC      alpha-linux-user/target/alpha/mem_helper.o
  CC      aarch64-linux-user/target/arm/translate-a64.o
  CC      alpha-linux-user/target/alpha/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      alpha-linux-user/trace/control-target.o
  CC      x86_64-softmmu/target/i386/smm_helper.o
  CC      armeb-linux-user/tcg/optimize.o
  CC      alpha-linux-user/trace/generated-helpers.o
  CC      x86_64-softmmu/target/i386/svm_helper.o
  LINK    alpha-linux-user/qemu-alpha
  CC      x86_64-softmmu/target/i386/machine.o
  CC      armeb-linux-user/tcg/tcg-common.o
  CC      armeb-linux-user/tcg/tcg-runtime.o
  CC      x86_64-softmmu/target/i386/arch_memory_mapping.o
  GEN     arm-linux-user/config-target.h
  CC      arm-linux-user/exec.o
  CC      x86_64-softmmu/target/i386/arch_dump.o
  CC      armeb-linux-user/fpu/softfloat.o
  CC      arm-linux-user/tcg/tcg.o
  CC      x86_64-softmmu/target/i386/monitor.o
  CC      x86_64-softmmu/target/i386/kvm-stub.o
  CC      aarch64-linux-user/target/arm/helper-a64.o
  GEN     trace/generated-helpers.c
  CC      x86_64-softmmu/trace/control-target.o
  CC      aarch64-linux-user/target/arm/gdbstub64.o
  CC      x86_64-softmmu/gdbstub-xml.o
  CC      arm-linux-user/tcg/tcg-op.o
  CC      aarch64-linux-user/target/arm/crypto_helper.o
  CC      x86_64-softmmu/trace/generated-helpers.o
  GEN     trace/generated-helpers.c
  CC      aarch64-linux-user/trace/control-target.o
  CC      armeb-linux-user/disas.o
  CC      aarch64-linux-user/gdbstub-xml.o
  LINK    x86_64-softmmu/qemu-system-x86_64
  GEN     armeb-linux-user/gdbstub-xml.c
  CC      aarch64-linux-user/trace/generated-helpers.o
  CC      armeb-linux-user/hax-stub.o
  CC      armeb-linux-user/gdbstub.o
  LINK    aarch64-linux-user/qemu-aarch64
  CC      armeb-linux-user/thunk.o
  CC      arm-linux-user/tcg/optimize.o
  CC      armeb-linux-user/user-exec.o
  CC      armeb-linux-user/user-exec-stub.o
  CC      arm-linux-user/tcg/tcg-common.o
  CC      armeb-linux-user/accel/stubs/kvm-stub.o
  GEN     hppa-linux-user/config-target.h
  GEN     cris-linux-user/config-target.h
  CC      hppa-linux-user/exec.o
  CC      cris-linux-user/exec.o
  CC      arm-linux-user/tcg/tcg-runtime.o
  CC      armeb-linux-user/accel/tcg/cpu-exec.o
  CC      hppa-linux-user/tcg/tcg.o
  CC      cris-linux-user/tcg/tcg.o
  CC      armeb-linux-user/accel/tcg/cpu-exec-common.o
  CC      arm-linux-user/fpu/softfloat.o
  CC      armeb-linux-user/accel/tcg/translate-all.o
  CC      armeb-linux-user/linux-user/main.o
  CC      hppa-linux-user/tcg/tcg-op.o
  CC      cris-linux-user/tcg/tcg-op.o
  CC      armeb-linux-user/linux-user/syscall.o
  CC      arm-linux-user/disas.o
  CC      hppa-linux-user/tcg/optimize.o
  GEN     arm-linux-user/gdbstub-xml.c
  CC      cris-linux-user/tcg/optimize.o
  CC      arm-linux-user/hax-stub.o
  CC      hppa-linux-user/tcg/tcg-common.o
  CC      hppa-linux-user/tcg/tcg-runtime.o
  CC      arm-linux-user/gdbstub.o
  CC      cris-linux-user/tcg/tcg-common.o
  CC      hppa-linux-user/fpu/softfloat.o
  CC      cris-linux-user/tcg/tcg-runtime.o
  CC      arm-linux-user/thunk.o
  CC      cris-linux-user/fpu/softfloat.o
  CC      arm-linux-user/user-exec.o
  CC      armeb-linux-user/linux-user/strace.o
  CC      arm-linux-user/user-exec-stub.o
  CC      arm-linux-user/accel/stubs/kvm-stub.o
  CC      armeb-linux-user/linux-user/mmap.o
  CC      arm-linux-user/accel/tcg/cpu-exec.o
  CC      hppa-linux-user/disas.o
  CC      armeb-linux-user/linux-user/signal.o
  CC      arm-linux-user/accel/tcg/cpu-exec-common.o
  CC      hppa-linux-user/hax-stub.o
  CC      hppa-linux-user/gdbstub.o
  CC      cris-linux-user/disas.o
  CC      armeb-linux-user/linux-user/elfload.o
  CC      cris-linux-user/hax-stub.o
  CC      arm-linux-user/accel/tcg/translate-all.o
  CC      cris-linux-user/gdbstub.o
  CC      hppa-linux-user/thunk.o
  CC      armeb-linux-user/linux-user/linuxload.o
  CC      hppa-linux-user/user-exec.o
  CC      arm-linux-user/linux-user/main.o
  CC      cris-linux-user/thunk.o
  CC      armeb-linux-user/linux-user/uaccess.o
  CC      hppa-linux-user/user-exec-stub.o
  CC      cris-linux-user/user-exec.o
  CC      arm-linux-user/linux-user/syscall.o
  CC      armeb-linux-user/linux-user/uname.o
  CCAS    armeb-linux-user/linux-user/safe-syscall.o
  CC      hppa-linux-user/accel/stubs/kvm-stub.o
  CC      cris-linux-user/user-exec-stub.o
  CC      armeb-linux-user/linux-user/flatload.o
  CC      cris-linux-user/accel/stubs/kvm-stub.o
  CC      hppa-linux-user/accel/tcg/cpu-exec.o
  CC      cris-linux-user/accel/tcg/cpu-exec.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      hppa-linux-user/accel/tcg/cpu-exec-common.o
  CC      cris-linux-user/accel/tcg/cpu-exec-common.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  CC      cris-linux-user/accel/tcg/translate-all.o
  CC      hppa-linux-user/accel/tcg/translate-all.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      cris-linux-user/linux-user/main.o
  CC      hppa-linux-user/linux-user/main.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      cris-linux-user/linux-user/syscall.o
  CC      hppa-linux-user/linux-user/syscall.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      arm-linux-user/linux-user/strace.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      armeb-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      arm-linux-user/linux-user/mmap.o
  CC      armeb-linux-user/target/arm/arm-semi.o
  CC      arm-linux-user/linux-user/signal.o
  CC      armeb-linux-user/target/arm/kvm-stub.o
  CC      hppa-linux-user/linux-user/strace.o
  CC      armeb-linux-user/target/arm/translate.o
  CC      arm-linux-user/linux-user/elfload.o
  CC      cris-linux-user/linux-user/strace.o
  CC      hppa-linux-user/linux-user/mmap.o
  CC      arm-linux-user/linux-user/linuxload.o
  CC      hppa-linux-user/linux-user/signal.o
  CC      cris-linux-user/linux-user/mmap.o
  CC      arm-linux-user/linux-user/uaccess.o
  CC      hppa-linux-user/linux-user/elfload.o
  CC      arm-linux-user/linux-user/uname.o
  CC      cris-linux-user/linux-user/signal.o
  CCAS    arm-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/linux-user/flatload.o
  CC      hppa-linux-user/linux-user/linuxload.o
  CC      cris-linux-user/linux-user/elfload.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11.o
  CC      hppa-linux-user/linux-user/uaccess.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdo.o
  CC      cris-linux-user/linux-user/linuxload.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cpdt.o
  CC      hppa-linux-user/linux-user/uname.o
  CC      cris-linux-user/linux-user/uaccess.o
  CCAS    hppa-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpa11_cprt.o
  CC      hppa-linux-user/target/hppa/translate.o
  CC      arm-linux-user/linux-user/arm/nwfpe/fpopcode.o
  CC      cris-linux-user/linux-user/uname.o
  CCAS    cris-linux-user/linux-user/safe-syscall.o
  CC      arm-linux-user/linux-user/arm/nwfpe/single_cpdo.o
  CC      cris-linux-user/target/cris/translate.o
  CC      arm-linux-user/linux-user/arm/nwfpe/double_cpdo.o
  CC      arm-linux-user/linux-user/arm/nwfpe/extended_cpdo.o
  CC      hppa-linux-user/target/hppa/helper.o
  CC      armeb-linux-user/target/arm/op_helper.o
  CC      hppa-linux-user/target/hppa/cpu.o
  CC      arm-linux-user/target/arm/arm-semi.o
  CC      arm-linux-user/target/arm/kvm-stub.o
  CC      hppa-linux-user/target/hppa/op_helper.o
  CC      armeb-linux-user/target/arm/helper.o
  CC      arm-linux-user/target/arm/translate.o
  CC      cris-linux-user/target/cris/op_helper.o
  CC      hppa-linux-user/target/hppa/gdbstub.o
  GEN     trace/generated-helpers.c
  CC      cris-linux-user/target/cris/helper.o
  CC      hppa-linux-user/trace/control-target.o
  CC      cris-linux-user/target/cris/cpu.o
  CC      hppa-linux-user/trace/generated-helpers.o
  LINK    hppa-linux-user/qemu-hppa
  CC      cris-linux-user/target/cris/gdbstub.o
  CC      armeb-linux-user/target/arm/cpu.o
  GEN     trace/generated-helpers.c
  CC      cris-linux-user/trace/control-target.o
  CC      cris-linux-user/trace/generated-helpers.o
  CC      armeb-linux-user/target/arm/neon_helper.o
  GEN     i386-linux-user/config-target.h
  CC      i386-linux-user/exec.o
  LINK    cris-linux-user/qemu-cris
  CC      i386-linux-user/tcg/tcg.o
  CC      armeb-linux-user/target/arm/iwmmxt_helper.o
  GEN     m68k-linux-user/config-target.h
  CC      m68k-linux-user/exec.o
  CC      armeb-linux-user/target/arm/gdbstub.o
  CC      m68k-linux-user/tcg/tcg.o
  CC      i386-linux-user/tcg/tcg-op.o
  CC      armeb-linux-user/target/arm/crypto_helper.o
  GEN     trace/generated-helpers.c
  CC      armeb-linux-user/trace/control-target.o
  CC      armeb-linux-user/gdbstub-xml.o
  CC      arm-linux-user/target/arm/op_helper.o
  CC      armeb-linux-user/trace/generated-helpers.o
  CC      m68k-linux-user/tcg/tcg-op.o
  CC      arm-linux-user/target/arm/helper.o
  LINK    armeb-linux-user/qemu-armeb
  CC      arm-linux-user/target/arm/cpu.o
  CC      i386-linux-user/tcg/optimize.o
  GEN     microblazeel-linux-user/config-target.h
  CC      arm-linux-user/target/arm/neon_helper.o
  CC      microblazeel-linux-user/exec.o
  CC      m68k-linux-user/tcg/optimize.o
  CC      i386-linux-user/tcg/tcg-common.o
  CC      microblazeel-linux-user/tcg/tcg.o
  CC      i386-linux-user/tcg/tcg-runtime.o
  CC      m68k-linux-user/tcg/tcg-common.o
  CC      arm-linux-user/target/arm/iwmmxt_helper.o
  CC      m68k-linux-user/tcg/tcg-runtime.o
  CC      i386-linux-user/fpu/softfloat.o
  CC      m68k-linux-user/fpu/softfloat.o
  CC      arm-linux-user/target/arm/gdbstub.o
  CC      microblazeel-linux-user/tcg/tcg-op.o
  CC      arm-linux-user/target/arm/crypto_helper.o
  GEN     trace/generated-helpers.c
  CC      arm-linux-user/trace/control-target.o
  CC      arm-linux-user/gdbstub-xml.o
  CC      i386-linux-user/disas.o
  GEN     i386-linux-user/gdbstub-xml.c
  CC      arm-linux-user/trace/generated-helpers.o
  CC      microblazeel-linux-user/tcg/optimize.o
  CC      m68k-linux-user/disas.o
  LINK    arm-linux-user/qemu-arm
  GEN     m68k-linux-user/gdbstub-xml.c
  CC      i386-linux-user/hax-stub.o
  CC      i386-linux-user/gdbstub.o
  CC      m68k-linux-user/hax-stub.o
  CC      m68k-linux-user/gdbstub.o
  CC      m68k-linux-user/thunk.o
  CC      microblazeel-linux-user/tcg/tcg-common.o
  CC      microblazeel-linux-user/tcg/tcg-runtime.o
  CC      i386-linux-user/thunk.o
  CC      microblazeel-linux-user/fpu/softfloat.o
  CC      m68k-linux-user/user-exec.o
  CC      i386-linux-user/user-exec.o
  CC      m68k-linux-user/user-exec-stub.o
  CC      m68k-linux-user/accel/stubs/kvm-stub.o
  CC      i386-linux-user/accel/stubs/kvm-stub.o
  CC      i386-linux-user/user-exec-stub.o
  CC      m68k-linux-user/accel/tcg/cpu-exec.o
  CC      microblazeel-linux-user/disas.o
  CC      i386-linux-user/accel/tcg/cpu-exec.o
  CC      m68k-linux-user/accel/tcg/cpu-exec-common.o
  CC      microblazeel-linux-user/hax-stub.o
  CC      i386-linux-user/accel/tcg/cpu-exec-common.o
  CC      i386-linux-user/accel/tcg/translate-all.o
  CC      m68k-linux-user/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/gdbstub.o
  CC      i386-linux-user/linux-user/main.o
  CC      m68k-linux-user/linux-user/main.o
  CC      i386-linux-user/linux-user/syscall.o
  CC      m68k-linux-user/linux-user/syscall.o
  CC      microblazeel-linux-user/thunk.o
  CC      m68k-linux-user/linux-user/strace.o
  CC      microblazeel-linux-user/user-exec.o
  CC      microblazeel-linux-user/user-exec-stub.o
  CC      i386-linux-user/linux-user/strace.o
  CC      microblazeel-linux-user/accel/stubs/kvm-stub.o
  CC      microblazeel-linux-user/accel/tcg/cpu-exec.o
  CC      microblazeel-linux-user/accel/tcg/cpu-exec-common.o
  CC      i386-linux-user/linux-user/mmap.o
  CC      microblazeel-linux-user/accel/tcg/translate-all.o
  CC      microblazeel-linux-user/linux-user/main.o
  CC      microblazeel-linux-user/linux-user/syscall.o
  GEN     microblaze-linux-user/config-target.h
  CC      i386-linux-user/linux-user/signal.o
  CC      microblaze-linux-user/exec.o
  CC      m68k-linux-user/linux-user/mmap.o
  CC      microblaze-linux-user/tcg/tcg.o
  CC      i386-linux-user/linux-user/elfload.o
  CC      m68k-linux-user/linux-user/signal.o
  CC      i386-linux-user/linux-user/linuxload.o
  CC      m68k-linux-user/linux-user/elfload.o
  CC      i386-linux-user/linux-user/uaccess.o
  CC      microblaze-linux-user/tcg/tcg-op.o
  CC      m68k-linux-user/linux-user/linuxload.o
  CC      i386-linux-user/linux-user/uname.o
  CC      m68k-linux-user/linux-user/uaccess.o
  CCAS    i386-linux-user/linux-user/safe-syscall.o
  CC      m68k-linux-user/linux-user/uname.o
  CC      i386-linux-user/linux-user/vm86.o
  CCAS    m68k-linux-user/linux-user/safe-syscall.o
  CC      microblazeel-linux-user/linux-user/strace.o
  CC      m68k-linux-user/linux-user/flatload.o
  CC      i386-linux-user/target/i386/helper.o
  CC      m68k-linux-user/linux-user/m68k-sim.o
  CC      i386-linux-user/target/i386/cpu.o
  CC      microblaze-linux-user/tcg/optimize.o
  CC      m68k-linux-user/target/m68k/m68k-semi.o
  CC      microblazeel-linux-user/linux-user/mmap.o
  CC      i386-linux-user/target/i386/gdbstub.o
  CC      m68k-linux-user/target/m68k/translate.o
  CC      i386-linux-user/target/i386/xsave_helper.o
  CC      microblaze-linux-user/tcg/tcg-common.o
  CC      microblazeel-linux-user/linux-user/signal.o
  CC      i386-linux-user/target/i386/translate.o
  CC      microblaze-linux-user/tcg/tcg-runtime.o
  CC      microblazeel-linux-user/linux-user/elfload.o
  CC      microblaze-linux-user/fpu/softfloat.o
  CC      microblazeel-linux-user/linux-user/linuxload.o
  CC      m68k-linux-user/target/m68k/op_helper.o
  CC      microblazeel-linux-user/linux-user/uaccess.o
  CC      microblazeel-linux-user/linux-user/uname.o
  CC      m68k-linux-user/target/m68k/helper.o
  CCAS    microblazeel-linux-user/linux-user/safe-syscall.o
  CC      microblazeel-linux-user/linux-user/flatload.o
  CC      m68k-linux-user/target/m68k/cpu.o
  CC      microblazeel-linux-user/target/microblaze/translate.o
  CC      m68k-linux-user/target/m68k/fpu_helper.o
  CC      microblaze-linux-user/disas.o
  CC      m68k-linux-user/target/m68k/gdbstub.o
  CC      microblaze-linux-user/hax-stub.o
  CC      microblazeel-linux-user/target/microblaze/op_helper.o
  GEN     trace/generated-helpers.c
  CC      m68k-linux-user/trace/control-target.o
  CC      microblaze-linux-user/gdbstub.o
  CC      i386-linux-user/target/i386/bpt_helper.o
  CC      microblazeel-linux-user/target/microblaze/helper.o
  CC      m68k-linux-user/gdbstub-xml.o
  CC      i386-linux-user/target/i386/cc_helper.o
  CC      microblazeel-linux-user/target/microblaze/cpu.o
  CC      microblaze-linux-user/thunk.o
  CC      m68k-linux-user/trace/generated-helpers.o
  CC      microblazeel-linux-user/target/microblaze/gdbstub.o
  CC      i386-linux-user/target/i386/excp_helper.o
  LINK    m68k-linux-user/qemu-m68k
  CC      microblaze-linux-user/user-exec.o
  GEN     trace/generated-helpers.c
  CC      i386-linux-user/target/i386/fpu_helper.o
  CC      microblazeel-linux-user/trace/control-target.o
  CC      microblaze-linux-user/user-exec-stub.o
  CC      microblazeel-linux-user/trace/generated-helpers.o
  CC      microblaze-linux-user/accel/stubs/kvm-stub.o
  GEN     mips64el-linux-user/config-target.h
  CC      mips64el-linux-user/exec.o
  LINK    microblazeel-linux-user/qemu-microblazeel
  CC      microblaze-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/tcg/tcg.o
  CC      microblaze-linux-user/accel/tcg/cpu-exec-common.o
  CC      i386-linux-user/target/i386/int_helper.o
  CC      microblaze-linux-user/accel/tcg/translate-all.o
  CC      microblaze-linux-user/linux-user/main.o
  CC      i386-linux-user/target/i386/mem_helper.o
  CC      microblaze-linux-user/linux-user/syscall.o
  CC      microblaze-linux-user/linux-user/strace.o
  CC      i386-linux-user/target/i386/misc_helper.o
  CC      i386-linux-user/target/i386/mpx_helper.o
  CC      mips64el-linux-user/tcg/tcg-op.o
  CC      mips64el-linux-user/tcg/optimize.o
  CC      i386-linux-user/target/i386/seg_helper.o
  CC      i386-linux-user/target/i386/smm_helper.o
  CC      mips64el-linux-user/tcg/tcg-common.o
  CC      i386-linux-user/target/i386/svm_helper.o
  CC      mips64el-linux-user/tcg/tcg-runtime.o
  GEN     mips64-linux-user/config-target.h
  CC      mips64-linux-user/exec.o
  CC      i386-linux-user/target/i386/kvm-stub.o
  CC      mips64-linux-user/tcg/tcg.o
  CC      mips64el-linux-user/fpu/softfloat.o
  GEN     trace/generated-helpers.c
  CC      i386-linux-user/trace/control-target.o
  CC      microblaze-linux-user/linux-user/mmap.o
  CC      i386-linux-user/gdbstub-xml.o
  CC      microblaze-linux-user/linux-user/signal.o
  CC      microblaze-linux-user/linux-user/elfload.o
  CC      i386-linux-user/trace/generated-helpers.o
  CC      mips64-linux-user/tcg/tcg-op.o
  LINK    i386-linux-user/qemu-i386
  CC      microblaze-linux-user/linux-user/linuxload.o
  GEN     mipsel-linux-user/config-target.h
  CC      microblaze-linux-user/linux-user/uaccess.o
  CC      mipsel-linux-user/exec.o
  CC      mips64el-linux-user/disas.o
  CC      microblaze-linux-user/linux-user/uname.o
  CC      mips64el-linux-user/hax-stub.o
  CCAS    microblaze-linux-user/linux-user/safe-syscall.o
  CC      mipsel-linux-user/tcg/tcg.o
  CC      microblaze-linux-user/linux-user/flatload.o
  CC      mips64el-linux-user/gdbstub.o
  CC      microblaze-linux-user/target/microblaze/translate.o
  CC      mips64el-linux-user/thunk.o
  CC      mips64-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/user-exec.o
  CC      mipsel-linux-user/tcg/tcg-op.o
  CC      microblaze-linux-user/target/microblaze/op_helper.o
  CC      mips64el-linux-user/user-exec-stub.o
  CC      microblaze-linux-user/target/microblaze/helper.o
  CC      mips64el-linux-user/accel/stubs/kvm-stub.o
  CC      microblaze-linux-user/target/microblaze/cpu.o
  CC      mips64-linux-user/tcg/tcg-common.o
  CC      mips64el-linux-user/accel/tcg/cpu-exec.o
  CC      mips64-linux-user/tcg/tcg-runtime.o
  CC      microblaze-linux-user/target/microblaze/gdbstub.o
  CC      mips64el-linux-user/accel/tcg/cpu-exec-common.o
  GEN     trace/generated-helpers.c
  CC      microblaze-linux-user/trace/control-target.o
  CC      mips64-linux-user/fpu/softfloat.o
  CC      mips64el-linux-user/accel/tcg/translate-all.o
  CC      microblaze-linux-user/trace/generated-helpers.o
  CC      mipsel-linux-user/tcg/optimize.o
  CC      mips64el-linux-user/linux-user/main.o
  LINK    microblaze-linux-user/qemu-microblaze
  CC      mips64el-linux-user/linux-user/syscall.o
  CC      mipsel-linux-user/tcg/tcg-common.o
  CC      mipsel-linux-user/tcg/tcg-runtime.o
  GEN     mips-linux-user/config-target.h
  CC      mips-linux-user/exec.o
  CC      mipsel-linux-user/fpu/softfloat.o
  CC      mips64-linux-user/disas.o
  CC      mips-linux-user/tcg/tcg.o
  CC      mips64-linux-user/hax-stub.o
  CC      mips64-linux-user/gdbstub.o
  CC      mips64-linux-user/thunk.o
  CC      mips64el-linux-user/linux-user/strace.o
  CC      mips-linux-user/tcg/tcg-op.o
  CC      mips64-linux-user/user-exec.o
  CC      mipsel-linux-user/disas.o
  CC      mips64el-linux-user/linux-user/mmap.o
  CC      mipsel-linux-user/hax-stub.o
  CC      mips64-linux-user/user-exec-stub.o
  CC      mips64-linux-user/accel/stubs/kvm-stub.o
  CC      mipsel-linux-user/gdbstub.o
  CC      mips64el-linux-user/linux-user/signal.o
  CC      mips64-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/linux-user/elfload.o
  CC      mipsel-linux-user/thunk.o
  CC      mips64-linux-user/accel/tcg/cpu-exec-common.o
  CC      mipsel-linux-user/user-exec.o
  CC      mips64-linux-user/accel/tcg/translate-all.o
  CC      mipsel-linux-user/user-exec-stub.o
  CC      mips64el-linux-user/linux-user/linuxload.o
  CC      mips-linux-user/tcg/optimize.o
  CC      mipsel-linux-user/accel/stubs/kvm-stub.o
  CC      mips64el-linux-user/linux-user/uaccess.o
  CC      mips64-linux-user/linux-user/main.o
  CC      mipsel-linux-user/accel/tcg/cpu-exec.o
  CC      mips64el-linux-user/linux-user/uname.o
  CC      mipsel-linux-user/accel/tcg/cpu-exec-common.o
  CCAS    mips64el-linux-user/linux-user/safe-syscall.o
  CC      mips64el-linux-user/target/mips/translate.o
  CC      mips64-linux-user/linux-user/syscall.o
  CC      mips-linux-user/tcg/tcg-common.o
  CC      mipsel-linux-user/accel/tcg/translate-all.o
  CC      mips-linux-user/tcg/tcg-runtime.o
  CC      mipsel-linux-user/linux-user/main.o
  CC      mipsel-linux-user/linux-user/syscall.o
  CC      mips-linux-user/fpu/softfloat.o
  CC      mips64-linux-user/linux-user/strace.o
  CC      mips64-linux-user/linux-user/mmap.o
  CC      mips-linux-user/disas.o
  CC      mips64-linux-user/linux-user/signal.o
  CC      mips-linux-user/hax-stub.o
  CC      mips-linux-user/gdbstub.o
  CC      mips64-linux-user/linux-user/elfload.o
  CC      mipsel-linux-user/linux-user/strace.o
  CC      mips64el-linux-user/target/mips/dsp_helper.o
  CC      mips-linux-user/thunk.o
  CC      mips64-linux-user/linux-user/linuxload.o
  CC      mipsel-linux-user/linux-user/mmap.o
  CC      mips-linux-user/user-exec.o
  CC      mips64-linux-user/linux-user/uaccess.o
  CC      mipsel-linux-user/linux-user/signal.o
  CC      mips-linux-user/user-exec-stub.o
  CC      mips-linux-user/accel/stubs/kvm-stub.o
  CC      mips64-linux-user/linux-user/uname.o
  CC      mips64el-linux-user/target/mips/op_helper.o
  CC      mips-linux-user/accel/tcg/cpu-exec.o
  CC      mipsel-linux-user/linux-user/elfload.o
  CCAS    mips64-linux-user/linux-user/safe-syscall.o
  CC      mips64-linux-user/target/mips/translate.o
  CC      mips-linux-user/accel/tcg/cpu-exec-common.o
  CC      mipsel-linux-user/linux-user/linuxload.o
  CC      mips-linux-user/accel/tcg/translate-all.o
  CC      mipsel-linux-user/linux-user/uaccess.o
  CC      mipsel-linux-user/linux-user/uname.o
  CC      mips-linux-user/linux-user/main.o
  CCAS    mipsel-linux-user/linux-user/safe-syscall.o
  CC      mipsel-linux-user/target/mips/translate.o
  CC      mips64el-linux-user/target/mips/lmi_helper.o
  CC      mips-linux-user/linux-user/syscall.o
  CC      mips64el-linux-user/target/mips/helper.o
  CC      mips64el-linux-user/target/mips/cpu.o
  CC      mips64el-linux-user/target/mips/gdbstub.o
  CC      mips64el-linux-user/target/mips/msa_helper.o
  CC      mips64-linux-user/target/mips/dsp_helper.o
  CC      mips-linux-user/linux-user/strace.o
  CC      mipsel-linux-user/target/mips/dsp_helper.o
  CC      mips64-linux-user/target/mips/op_helper.o
  CC      mips-linux-user/linux-user/mmap.o
  CC      mipsel-linux-user/target/mips/op_helper.o
  CC      mips-linux-user/linux-user/signal.o
  CC      mips64el-linux-user/target/mips/mips-semi.o
  CC      mips-linux-user/linux-user/elfload.o
  GEN     trace/generated-helpers.c
  CC      mips64el-linux-user/trace/control-target.o
  CC      mips-linux-user/linux-user/linuxload.o
  CC      mips64-linux-user/target/mips/lmi_helper.o
  CC      mipsel-linux-user/target/mips/lmi_helper.o
  CC      mips-linux-user/linux-user/uaccess.o
  CC      mips64el-linux-user/trace/generated-helpers.o
  CC      mips-linux-user/linux-user/uname.o
  CC      mips64-linux-user/target/mips/helper.o
  LINK    mips64el-linux-user/qemu-mips64el
  CCAS    mips-linux-user/linux-user/safe-syscall.o
  CC      mipsel-linux-user/target/mips/helper.o
  CC      mips-linux-user/target/mips/translate.o
  CC      mips64-linux-user/target/mips/cpu.o
  CC      mips64-linux-user/target/mips/gdbstub.o
  CC      mipsel-linux-user/target/mips/cpu.o
  CC      mips64-linux-user/target/mips/msa_helper.o
  CC      mips-linux-user/target/mips/dsp_helper.o
  CC      mipsel-linux-user/target/mips/gdbstub.o
  CC      mipsel-linux-user/target/mips/msa_helper.o
  CC      mips64-linux-user/target/mips/mips-semi.o
  CC      mips-linux-user/target/mips/op_helper.o
  GEN     trace/generated-helpers.c
  CC      mips64-linux-user/trace/control-target.o
  CC      mips64-linux-user/trace/generated-helpers.o
  CC      mipsel-linux-user/target/mips/mips-semi.o
  CC      mips-linux-user/target/mips/lmi_helper.o
  GEN     mipsn32el-linux-user/config-target.h
  CC      mipsn32el-linux-user/exec.o
  LINK    mips64-linux-user/qemu-mips64
  GEN     trace/generated-helpers.c
  CC      mipsel-linux-user/trace/control-target.o
  CC      mips-linux-user/target/mips/helper.o
  CC      mipsel-linux-user/trace/generated-helpers.o
  CC      mipsn32el-linux-user/tcg/tcg.o
  CC      mips-linux-user/target/mips/cpu.o
  LINK    mipsel-linux-user/qemu-mipsel
  GEN     mipsn32-linux-user/config-target.h
  CC      mips-linux-user/target/mips/gdbstub.o
  CC      mipsn32-linux-user/exec.o
  CC      mips-linux-user/target/mips/msa_helper.o
  GEN     nios2-linux-user/config-target.h
  CC      mipsn32-linux-user/tcg/tcg.o
  CC      nios2-linux-user/exec.o
  CC      nios2-linux-user/tcg/tcg.o
  CC      mipsn32el-linux-user/tcg/tcg-op.o
  CC      mipsn32-linux-user/tcg/tcg-op.o
/var/tmp/patchew-tester-tmp-s55iq6fb/src/rules.mak:66: recipe for target 'tcg/tcg.o' failed
make[1]: *** [tcg/tcg.o] Error 1
Makefile:328: recipe for target 'subdir-nios2-linux-user' failed
make: *** [subdir-nios2-linux-user] Error 2
make: *** Waiting for unfinished jobs....
  CC      mipsn32-linux-user/tcg/optimize.o
/var/tmp/patchew-tester-tmp-s55iq6fb/src/rules.mak:66: recipe for target 'target/mips/msa_helper.o' failed
make[1]: *** [target/mips/msa_helper.o] Error 1
Makefile:328: recipe for target 'subdir-mips-linux-user' failed
make: *** [subdir-mips-linux-user] Error 2
  CC      mipsn32el-linux-user/tcg/optimize.o
/var/tmp/patchew-tester-tmp-s55iq6fb/src/tcg/tcg-op.c:3056:1: fatal error: error writing to /tmp/ccDtCZ8T.s: No space left on device
 GEN_ATOMIC_HELPER(xchg, mov2, 0)
 ^~~~~~~~~~~~~~~~~
compilation terminated.
/var/tmp/patchew-tester-tmp-s55iq6fb/src/rules.mak:66: recipe for target 'tcg/tcg-op.o' failed
make[1]: *** [tcg/tcg-op.o] Error 1
make[1]: *** Waiting for unfinished jobs....
  CC      mipsn32-linux-user/tcg/tcg-common.o
  CC      mipsn32-linux-user/tcg/tcg-runtime.o
  CC      mipsn32-linux-user/fpu/softfloat.o
/var/tmp/patchew-tester-tmp-s55iq6fb/src/rules.mak:66: recipe for target 'tcg/tcg-op.o' failed
make[1]: *** [tcg/tcg-op.o] Error 1
make[1]: *** Waiting for unfinished jobs....
Makefile:328: recipe for target 'subdir-mipsn32el-linux-user' failed
make: *** [subdir-mipsn32el-linux-user] Error 2
/var/tmp/patchew-tester-tmp-s55iq6fb/src/fpu/softfloat.c:7917:1: fatal error: error writing to /tmp/cc8dsTpA.s: No space left on device
 }
 ^
compilation terminated.
/var/tmp/patchew-tester-tmp-s55iq6fb/src/rules.mak:66: recipe for target 'fpu/softfloat.o' failed
make[1]: *** [fpu/softfloat.o] Error 1
Makefile:328: recipe for target 'subdir-mipsn32-linux-user' failed
make: *** [subdir-mipsn32-linux-user] Error 2
=== OUTPUT END ===

Test command exited with code: 2


---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04  1:54 ` [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() no-reply
@ 2017-08-04 11:50   ` Eric Blake
  2017-08-04 12:10     ` Fam Zheng
  2017-08-07  8:09   ` Fam Zheng
  1 sibling, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-04 11:50 UTC (permalink / raw)
  To: qemu-devel; +Cc: famz, armbru

[-- Attachment #1: Type: text/plain, Size: 893 bytes --]

On 08/03/2017 08:54 PM, no-reply@patchew.org wrote:
> Hi,
> 
> This series failed automatic build test. Please find the testing commands and
> their output below. If you have docker installed, you can probably reproduce it
> locally.

When will patchew have a syntax for stating dependencies? (Of course, I
should actually mention those dependencies in my cover letter, not after
the fact).

> /tmp/qemu-test/src/tests/test-qga.c: In function ‘test_qga_set_time’:
> /tmp/qemu-test/src/tests/test-qga.c:652: warning: implicit declaration of function ‘qmp_fd’

This patch series depends on my earlier cleanup:
https://lists.gnu.org/archive/html/qemu-devel/2017-08/msg00385.html
[PATCH] test-qga: Kill broken and dead QGA_TEST_SIDE_EFFECT

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04 11:50   ` Eric Blake
@ 2017-08-04 12:10     ` Fam Zheng
  2017-08-07  6:43       ` Fam Zheng
  0 siblings, 1 reply; 66+ messages in thread
From: Fam Zheng @ 2017-08-04 12:10 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, armbru

On Fri, 08/04 06:50, Eric Blake wrote:
> On 08/03/2017 08:54 PM, no-reply@patchew.org wrote:
> > Hi,
> > 
> > This series failed automatic build test. Please find the testing commands and
> > their output below. If you have docker installed, you can probably reproduce it
> > locally.
> 
> When will patchew have a syntax for stating dependencies? (Of course, I
> should actually mention those dependencies in my cover letter, not after
> the fact).

I can give it a try this weekend, if it works, it will be announced on this
list.

Fam

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04 12:10     ` Fam Zheng
@ 2017-08-07  6:43       ` Fam Zheng
  2017-08-07  7:33         ` Fam Zheng
  0 siblings, 1 reply; 66+ messages in thread
From: Fam Zheng @ 2017-08-07  6:43 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

On Fri, 08/04 20:10, Fam Zheng wrote:
> On Fri, 08/04 06:50, Eric Blake wrote:
> > On 08/03/2017 08:54 PM, no-reply@patchew.org wrote:
> > > Hi,
> > > 
> > > This series failed automatic build test. Please find the testing commands and
> > > their output below. If you have docker installed, you can probably reproduce it
> > > locally.
> > 
> > When will patchew have a syntax for stating dependencies? (Of course, I
> > should actually mention those dependencies in my cover letter, not after
> > the fact).
> 
> I can give it a try this weekend, if it works, it will be announced on this
> list.

Hijack! As an experiment of the newly pushed "base" tag handling on the server:

Based-on: 20170802201900.11890-1-eblake@redhat.com

(Eric, the syntax is simple and strict for now: "Based-on: $MESSAGE_ID", if you
find something serious lacking (e.g. human readability), please let me know).

Fam

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-07  6:43       ` Fam Zheng
@ 2017-08-07  7:33         ` Fam Zheng
  2017-08-07 14:08           ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 66+ messages in thread
From: Fam Zheng @ 2017-08-07  7:33 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

On Mon, 08/07 14:43, Fam Zheng wrote:
> On Fri, 08/04 20:10, Fam Zheng wrote:
> > On Fri, 08/04 06:50, Eric Blake wrote:
> > > On 08/03/2017 08:54 PM, no-reply@patchew.org wrote:
> > > > Hi,
> > > > 
> > > > This series failed automatic build test. Please find the testing commands and
> > > > their output below. If you have docker installed, you can probably reproduce it
> > > > locally.
> > > 
> > > When will patchew have a syntax for stating dependencies? (Of course, I
> > > should actually mention those dependencies in my cover letter, not after
> > > the fact).
> > 
> > I can give it a try this weekend, if it works, it will be announced on this
> > list.
> 
> Hijack! As an experiment of the newly pushed "base" tag handling on the server:
> 
> Based-on: 20170802201900.11890-1-eblake@redhat.com

It worked. Now, restarted the tests with the "rebased" branch:

https://github.com/patchew-project/qemu/commits/patchew/20170804012551.2714-1-eblake%40redhat.com

Fam

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-04  1:54 ` [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() no-reply
  2017-08-04 11:50   ` Eric Blake
@ 2017-08-07  8:09   ` Fam Zheng
  1 sibling, 0 replies; 66+ messages in thread
From: Fam Zheng @ 2017-08-07  8:09 UTC (permalink / raw)
  To: qemu-devel; +Cc: eblake, armbru

On Thu, 08/03 18:54, no-reply@patchew.org wrote:
> Hi,
> 
> This series failed automatic build test. Please find the testing commands and
> their output below. If you have docker installed, you can probably reproduce it
> locally.

As said in the sub-thread of this message, this is a false positive because
patchew didn't know the dependency. With that fixed, this test and the other
falsely failed one both pass. Thanks.

Fam

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp()
  2017-08-07  7:33         ` Fam Zheng
@ 2017-08-07 14:08           ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 66+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-08-07 14:08 UTC (permalink / raw)
  To: Fam Zheng; +Cc: Eric Blake, qemu-devel@nongnu.org Developers

On Mon, Aug 7, 2017 at 4:33 AM, Fam Zheng <famz@redhat.com> wrote:
> On Mon, 08/07 14:43, Fam Zheng wrote:
>> On Fri, 08/04 20:10, Fam Zheng wrote:
>> > On Fri, 08/04 06:50, Eric Blake wrote:
>> > > On 08/03/2017 08:54 PM, no-reply@patchew.org wrote:
>> > > > Hi,
>> > > >
>> > > > This series failed automatic build test. Please find the testing commands and
>> > > > their output below. If you have docker installed, you can probably reproduce it
>> > > > locally.
>> > >
>> > > When will patchew have a syntax for stating dependencies? (Of course, I
>> > > should actually mention those dependencies in my cover letter, not after
>> > > the fact).
>> >
>> > I can give it a try this weekend, if it works, it will be announced on this
>> > list.
>>
>> Hijack! As an experiment of the newly pushed "base" tag handling on the server:
>>
>> Based-on: 20170802201900.11890-1-eblake@redhat.com

:)

>
> It worked. Now, restarted the tests with the "rebased" branch:
>
> https://github.com/patchew-project/qemu/commits/patchew/20170804012551.2714-1-eblake%40redhat.com
>
> Fam
>

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("")
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("") Eric Blake
@ 2017-08-09  7:13   ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09  7:13 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> Now that the previous patches have fixed all callers to avoid an
> empty message, we can tweak qmp_fd_sendv() to assert that we
> don't introduce new callers, and reindent accordingly.  The
> additional assertions will also help verify that later refactoring
> is not breaking anything.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.c | 38 ++++++++++++++++++--------------------
>  1 file changed, 18 insertions(+), 20 deletions(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 7e5425d704..99a07c246f 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -450,6 +450,9 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>  {
>      va_list ap_copy;
>      QObject *qobj;
> +    int log = getenv("QTEST_LOG") != NULL;

Use the opportunity to make this bool?

> +    QString *qstr;
> +    const char *str;
>
>      /* qobject_from_jsonv() silently eats leading 0xff as invalid
>       * JSON, but we want to test sending them over the wire to force
> @@ -458,6 +461,7 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>          socket_send(fd, fmt, 1);
>          fmt++;
>      }
> +    assert(*fmt);

I prefer assertions on arguments going first, for extra visibility.

>      /* Going through qobject ensures we escape strings properly.
>       * This seemingly unnecessary copy is required in case va_list
> @@ -466,29 +470,23 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      va_copy(ap_copy, ap);
>      qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
>      va_end(ap_copy);
> +    qstr = qobject_to_json(qobj);
>
> -    /* No need to send anything for an empty QObject.  */
> -    if (qobj) {
> -        int log = getenv("QTEST_LOG") != NULL;
> -        QString *qstr = qobject_to_json(qobj);
> -        const char *str;
> +    /*
> +     * BUG: QMP doesn't react to input until it sees a newline, an
> +     * object, or an array.  Work-around: give it a newline.
> +     */
> +    qstring_append_chr(qstr, '\n');
> +    str = qstring_get_str(qstr);
>
> -        /*
> -         * BUG: QMP doesn't react to input until it sees a newline, an
> -         * object, or an array.  Work-around: give it a newline.
> -         */
> -        qstring_append_chr(qstr, '\n');
> -        str = qstring_get_str(qstr);
> -
> -        if (log) {
> -            fprintf(stderr, "%s", str);
> -        }
> -        /* Send QMP request */
> -        socket_send(fd, str, qstring_get_length(qstr));
> -
> -        QDECREF(qstr);
> -        qobject_decref(qobj);
> +    if (log) {
> +        fprintf(stderr, "%s", str);
>      }
> +    /* Send QMP request */
> +    socket_send(fd, str, qstring_get_length(qstr));
> +
> +    QDECREF(qstr);
> +    qobject_decref(qobj);
>  }
>
>  void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)

Preferably with the assertion moved:
Reviewed-by: Markus Armbruster <armbru@redhat.com>

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv() Eric Blake
@ 2017-08-09  7:59   ` Markus Armbruster
  2017-08-09 13:14     ` Eric Blake
  2017-09-11 21:52   ` Eric Blake
  1 sibling, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09  7:59 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, Michael Roth

Eric Blake <eblake@redhat.com> writes:

> qobject_from_jsonv() was unusual in that it took a va_list*, instead
> of the more typical va_list; this was so that callers could pass
> NULL to avoid % interpolation.  While this works under the hood, it
> is awkward for callers, so move the magic into qjson.c rather than
> in the public interface, and finally improve the documentation of
> qobject_from_jsonf().
>
> test-qobject-input-visitor.c's visitor_input_test_init_internal()
> was the only caller passing NULL, fix it to instead use a QObject
> created by the various callers, who now use the appropriate form
> of qobject_from_json*() according to whether % interpolation is
> desired.
>
> Once that is done, all remaining callers to qobject_from_jsonv() are
> passing &error_abort; drop this parameter to match the counterpart
> qobject_from_jsonf() which assert()s success instead.  Besides, all
> current callers that need interpolation live in the testsuite, where
> enforcing well-defined input by asserts can help catch typos, and
> where we should not be operating on dynamic untrusted arbitrary
> input in the first place.
>
> Asserting success has another nice benefit: if we pass more than one
> %p, but could return failure, we would have to worry about whether
> all arguments in the va_list had consistent refcount treatment (it
> should be an all-or-none decision on whether each QObject in the
> va_list had its reference count altered - but whichever way we
> prefer, it's a lot of overhead to ensure we do it for everything
> in the va_list even if we failed halfway through).  But now that we
> promise success, we can now easily promise that all %p arguments will
> now be cleaned up when freeing the returned object.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  include/qapi/qmp/qjson.h           |  2 +-
>  tests/libqtest.c                   | 10 ++------
>  qobject/qjson.c                    | 49 +++++++++++++++++++++++++++++++++++---
>  tests/test-qobject-input-visitor.c | 18 ++++++++------
>  4 files changed, 60 insertions(+), 19 deletions(-)
>
> diff --git a/include/qapi/qmp/qjson.h b/include/qapi/qmp/qjson.h
> index 6e84082d5f..9aacb1ccf6 100644
> --- a/include/qapi/qmp/qjson.h
> +++ b/include/qapi/qmp/qjson.h
> @@ -19,7 +19,7 @@
>
>  QObject *qobject_from_json(const char *string, Error **errp);
>  QObject *qobject_from_jsonf(const char *string, ...) GCC_FMT_ATTR(1, 2);
> -QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
> +QObject *qobject_from_jsonv(const char *string, va_list ap)
>      GCC_FMT_ATTR(1, 0);
>
>  QString *qobject_to_json(const QObject *obj);
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 99a07c246f..cde737ec5a 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -448,7 +448,6 @@ QDict *qtest_qmp_receive(QTestState *s)
>   */
>  void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>  {
> -    va_list ap_copy;
>      QObject *qobj;
>      int log = getenv("QTEST_LOG") != NULL;
>      QString *qstr;
> @@ -463,13 +462,8 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      }
>      assert(*fmt);
>
> -    /* Going through qobject ensures we escape strings properly.
> -     * This seemingly unnecessary copy is required in case va_list
> -     * is an array type.
> -     */
> -    va_copy(ap_copy, ap);
> -    qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
> -    va_end(ap_copy);
> +    /* Going through qobject ensures we escape strings properly. */
> +    qobj = qobject_from_jsonv(fmt, ap);
>      qstr = qobject_to_json(qobj);
>
>      /*

Wait!  Oh, the va_copy() moves iinto qobject_from_jsonv().  Okay, I
guess.

> diff --git a/qobject/qjson.c b/qobject/qjson.c
> index 2e0930884e..210c290aa9 100644
> --- a/qobject/qjson.c
> +++ b/qobject/qjson.c
> @@ -35,7 +35,8 @@ static void parse_json(JSONMessageParser *parser, GQueue *tokens)
>      s->result = json_parser_parse_err(tokens, s->ap, &s->err);
>  }
>
> -QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
> +static QObject *qobject_from_json_internal(const char *string, va_list *ap,
> +                                           Error **errp)
>  {
>      JSONParsingState state = {};
>
> @@ -50,12 +51,31 @@ QObject *qobject_from_jsonv(const char *string, va_list *ap, Error **errp)
>      return state.result;
>  }
>
> +/*
> + * Parses JSON input without interpolation.

Imperative mood, please.  Same elsewhere.

Suggest "without interpolation of % sequences".

> + *
> + * Returns a QObject matching the input on success, or NULL with
> + * an error set if the input is not valid JSON.
> + */
>  QObject *qobject_from_json(const char *string, Error **errp)
>  {
> -    return qobject_from_jsonv(string, NULL, errp);
> +    return qobject_from_json_internal(string, NULL, errp);
>  }
>
>  /*
> + * Parses JSON input with interpolation of % sequences.
> + *
> + * The set of sequences recognized is compatible with gcc's -Wformat
> + * warnings, although not all printf sequences are valid.  All use of
> + * % must occur outside JSON strings.
> + *
> + * %i - treat corresponding integer value as JSON bool
> + * %[l[l]]d, %PRId64 - treat sized integer value as signed JSON number
> + * %[l[l]]u, %PRIu64 - treat sized integer value as unsigned JSON number
> + * %f - treat double as JSON number (undefined for inf, NaN)
> + * %s - convert char * into JSON string (adds escapes, outer quotes)
> + * %p - embed QObject, transferring the reference to the returned object
> + *
>   * IMPORTANT: This function aborts on error, thus it must not
>   * be used with untrusted arguments.
>   */

Use the opportunity to stop shouting IMPORTANT?

> @@ -65,13 +85,36 @@ QObject *qobject_from_jsonf(const char *string, ...)
>      va_list ap;
>
>      va_start(ap, string);
> -    obj = qobject_from_jsonv(string, &ap, &error_abort);
> +    obj = qobject_from_json_internal(string, &ap, &error_abort);
>      va_end(ap);
>
>      assert(obj != NULL);
>      return obj;
>  }
>
> +/*
> + * va_list form of qobject_from_jsonf().
> + *
> + * IMPORTANT: This function aborts on error, thus it must not
> + * be used with untrusted arguments.
> + */
> +QObject *qobject_from_jsonv(const char *string, va_list ap)
> +{
> +    QObject *obj;
> +    va_list ap_copy;
> +
> +    /*
> +     * This seemingly unnecessary copy is required in case va_list
> +     * is an array type.
> +     */

--verbose?

> +    va_copy(ap_copy, ap);
> +    obj = qobject_from_json_internal(string, &ap_copy, &error_abort);
> +    va_end(ap_copy);
> +
> +    assert(obj != NULL);
> +    return obj;
> +}
> +
>  typedef struct ToJsonIterState
>  {
>      int indent;
> diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c
> index bcf02617dc..a9addd9f98 100644
> --- a/tests/test-qobject-input-visitor.c
> +++ b/tests/test-qobject-input-visitor.c
> @@ -45,13 +45,11 @@ static void visitor_input_teardown(TestInputVisitorData *data,
>     function so that the JSON string used by the tests are kept in the test
>     functions (and not in main()). */
>  static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
> -                                                 bool keyval,
> -                                                 const char *json_string,
> -                                                 va_list *ap)
> +                                                 bool keyval, QObject *obj)
>  {
>      visitor_input_teardown(data, NULL);
>
> -    data->obj = qobject_from_jsonv(json_string, ap, &error_abort);
> +    data->obj = obj;
>      g_assert(data->obj);
>
>      if (keyval) {
> @@ -69,10 +67,12 @@ Visitor *visitor_input_test_init_full(TestInputVisitorData *data,
>                                        const char *json_string, ...)
>  {
>      Visitor *v;
> +    QObject *obj;
>      va_list ap;
>
>      va_start(ap, json_string);
> -    v = visitor_input_test_init_internal(data, keyval, json_string, &ap);
> +    obj = qobject_from_jsonv(json_string, ap);
> +    v = visitor_input_test_init_internal(data, keyval, obj);
>      va_end(ap);
>      return v;
>  }
> @@ -82,10 +82,12 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
>                                   const char *json_string, ...)
>  {
>      Visitor *v;
> +    QObject *obj;
>      va_list ap;
>
>      va_start(ap, json_string);
> -    v = visitor_input_test_init_internal(data, false, json_string, &ap);
> +    obj = qobject_from_jsonv(json_string, ap);
> +    v = visitor_input_test_init_internal(data, false, obj);
>      va_end(ap);
>      return v;
>  }
> @@ -100,7 +102,9 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
>  static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
>                                              const char *json_string)
>  {
> -    return visitor_input_test_init_internal(data, false, json_string, NULL);
> +    QObject *obj = qobject_from_json(json_string, &error_abort);
> +
> +    return visitor_input_test_init_internal(data, false, obj);
>  }
>
>  static void test_visitor_in_int(TestInputVisitorData *data,

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf() Eric Blake
@ 2017-08-09  9:06   ` Markus Armbruster
  2017-08-09 13:21     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09  9:06 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> We want -Wformat to catch blatant programming errors in format
> strings that we pass to qobject_from_jsonf().  But if someone
> were to pass a JSON string "'%s'" as the format string, gcc would
> insist that it be paired with a char* argument, even though our
> lexer does not recognize % sequences inside a JSON string.  You can
> bypass -Wformat checking by passing the Unicode escape \u0025 for
> %, but who wants to remember to type that?  So the solution is that
> anywhere we are relying on -Wformat checking, the caller should
> pass the usual printf %% escape sequence where a literal % is
> wanted on output.
>
> Note that since % can only appear in JSON inside a string, we don't
> have to teach the lexer how to parse any new % sequences, but instead
> only have to add code to the parser.  Likewise, the parser is still
> where we reject any attempt at mid-string % interpolation other than
> %% (this is only a runtime failure, rather than compile-time), but
> since we already document that qobject_from_jsonf() asserts on invalid
> usage, presumably anyone that is adding a new usage will have tested
> that their usage doesn't always fail.
>
> Simplify qstring_from_escaped_str() while touching it, by using
> bool, a more compact conditional, and qstring_append_chr().
> Likewise, improve the error message when parse_escape() is reached
> without interpolation (for example, if a client sends garbage
> rather than JSON over a QMP connection).
>
> The testsuite additions pass under valgrind, proving that we are
> indeed passing the reference of anything given through %p to the
> returned containing object, even when more than one object is
> interpolated.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  qobject/json-lexer.c  |  6 ++++--
>  qobject/json-parser.c | 49 ++++++++++++++++++++++++-------------------------
>  qobject/qjson.c       |  4 ++--
>  tests/check-qjson.c   | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 80 insertions(+), 29 deletions(-)
>
> diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
> index b846d2852d..599b7446b7 100644
> --- a/qobject/json-lexer.c
> +++ b/qobject/json-lexer.c
> @@ -32,9 +32,11 @@
>   * Extension for vararg handling in JSON construction, when using
>   * qobject_from_jsonf() instead of qobject_from_json() (this lexer
>   * actually accepts multiple forms of PRId64, but parse_escape() later
> - * filters to only parse the current platform's spelling):
> + * filters to only parse the current platform's spelling; meanwhile,
> + * JSON only allows % inside strings, where the parser handles %%, so
> + * we do not need to lex it here):

The parenthesis is becoming unwieldy.  Turn it into a note...

>   *
> - * %(PRI[du]64|(l|ll)?[ud]|[ipsf])
> + * %(PRI[du]64|(l|ll)?[ud]|[ipsf%])
>   *

... here?

>   */
>
> diff --git a/qobject/json-parser.c b/qobject/json-parser.c
> index 388aa7a386..daafe77a0c 100644
> --- a/qobject/json-parser.c
> +++ b/qobject/json-parser.c
> @@ -120,25 +120,21 @@ static int hex2decimal(char ch)
>   *      \n
>   *      \r
>   *      \t
> - *      \u four-hex-digits 
> + *      \u four-hex-digits
> + *
> + * Additionally, if @percent is true, all % in @token must be doubled,
> + * replaced by a single % will be in the result; this allows -Wformat
> + * processing of qobject_from_jsonf().
>   */
>  static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
> -                                         JSONToken *token)
> +                                         JSONToken *token, bool percent)
>  {
>      const char *ptr = token->str;
>      QString *str;
> -    int double_quote = 1;
> -
> -    if (*ptr == '"') {
> -        double_quote = 1;
> -    } else {
> -        double_quote = 0;
> -    }
> -    ptr++;
> +    bool double_quote = *ptr++ == '"';
>
>      str = qstring_new();
> -    while (*ptr && 
> -           ((double_quote && *ptr != '"') || (!double_quote && *ptr != '\''))) {
> +    while (*ptr && *ptr != "'\""[double_quote]) {

Simpler:

       bool quote = *ptr++;

and then

       while (*ptr && *ptr != quote) {

Have you considered splitting the patch into one to simplify, and one to
implement %%?

>          if (*ptr == '\\') {
>              ptr++;
>
> @@ -205,12 +201,13 @@ static QString *qstring_from_escaped_str(JSONParserContext *ctxt,
>                  goto out;
>              }
>          } else {
> -            char dummy[2];
> -
> -            dummy[0] = *ptr++;
> -            dummy[1] = 0;
> -
> -            qstring_append(str, dummy);
> +            if (*ptr == '%' && percent) {
> +                if (*++ptr != '%') {
> +                    parse_error(ctxt, token, "invalid %% sequence in string");
> +                    goto out;
> +                }
> +            }
> +            qstring_append_chr(str, *ptr++);
>          }
>      }
>
> @@ -455,13 +452,15 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
>  {
>      JSONToken *token;
>
> -    if (ap == NULL) {
> -        return NULL;
> -    }
> -
>      token = parser_context_pop_token(ctxt);
>      assert(token && token->type == JSON_ESCAPE);
>
> +    if (ap == NULL) {
> +        parse_error(ctxt, token, "escape parsing for '%s' not requested",
> +                    token->str);
> +        return NULL;
> +    }
> +

When I manage to fat-finger a '%' into my QMP input, I now get this
error message instead of "Invalid JSON syntax".  Makes me go "what is
escape parsing, and how do I request it?"  Not an improvement, I'm
afraid.

>      if (!strcmp(token->str, "%p")) {
>          return va_arg(*ap, QObject *);
>      } else if (!strcmp(token->str, "%i")) {
> @@ -490,7 +489,7 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
>      return NULL;
>  }
>
> -static QObject *parse_literal(JSONParserContext *ctxt)
> +static QObject *parse_literal(JSONParserContext *ctxt, bool percent)

Let's make it take va_list *ap instead, for symmetry with the other
parse_FOO().

>  {
>      JSONToken *token;
>
> @@ -499,7 +498,7 @@ static QObject *parse_literal(JSONParserContext *ctxt)
>
>      switch (token->type) {
>      case JSON_STRING:
> -        return QOBJECT(qstring_from_escaped_str(ctxt, token));
> +        return QOBJECT(qstring_from_escaped_str(ctxt, token, percent));
>      case JSON_INTEGER: {
>          /*
>           * Represent JSON_INTEGER as QNUM_I64 if possible, else as
> @@ -562,7 +561,7 @@ static QObject *parse_value(JSONParserContext *ctxt, va_list *ap)
>      case JSON_INTEGER:
>      case JSON_FLOAT:
>      case JSON_STRING:
> -        return parse_literal(ctxt);
> +        return parse_literal(ctxt, ap);
>      case JSON_KEYWORD:
>          return parse_keyword(ctxt);
>      default:
> diff --git a/qobject/qjson.c b/qobject/qjson.c
> index 210c290aa9..2244292d1a 100644
> --- a/qobject/qjson.c
> +++ b/qobject/qjson.c
> @@ -66,8 +66,7 @@ QObject *qobject_from_json(const char *string, Error **errp)
>   * Parses JSON input with interpolation of % sequences.
>   *
>   * The set of sequences recognized is compatible with gcc's -Wformat
> - * warnings, although not all printf sequences are valid.  All use of
> - * % must occur outside JSON strings.
> + * warnings, although not all printf sequences are valid.

Keep the "All use of %" sentence, but add ", except %% must occcur only
within JSON strings".

>   *
>   * %i - treat corresponding integer value as JSON bool
>   * %[l[l]]d, %PRId64 - treat sized integer value as signed JSON number
> @@ -75,6 +74,7 @@ QObject *qobject_from_json(const char *string, Error **errp)
>   * %f - treat double as JSON number (undefined for inf, NaN)
>   * %s - convert char * into JSON string (adds escapes, outer quotes)
>   * %p - embed QObject, transferring the reference to the returned object
> + * %% - literal %, usable only within JSON string

No need to repeat "only within JSON strings" then.

>   *
>   * IMPORTANT: This function aborts on error, thus it must not
>   * be used with untrusted arguments.
> diff --git a/tests/check-qjson.c b/tests/check-qjson.c
> index 1ad1f41a52..31815b2d04 100644
> --- a/tests/check-qjson.c
> +++ b/tests/check-qjson.c
> @@ -1408,6 +1408,55 @@ static void empty_input(void)
>      g_assert(obj == NULL);
>  }
>
> +static void percent_and_vararg(void)
> +{
> +    QObject *obj;
> +    QString *str;
> +    QList *list;
> +    Error *err = NULL;
> +
> +    /* Use of % escapes requires vararg form */
> +    obj = qobject_from_json("%d", &err);

Since %d is not recognized, this is a lexical error.  Okay.

> +    error_free_or_abort(&err);
> +    g_assert(!obj);
> +
> +    /* In normal form, % in strings is literal */
> +    obj = qobject_from_json("'%% %s \\u0025d'", &error_abort);
> +    str = qobject_to_qstring(obj);
> +    g_assert_cmpstr(qstring_get_str(str), ==, "%% %s %d");
> +    qobject_decref(obj);
> +
> +    /*
> +     * In vararg form, % in strings must be escaped (via the normal
> +     * printf-escaping, or via a \u escape).  The returned value now
> +     * owns references to any %p counterpart.
> +     */
> +    obj = qobject_from_jsonf("[ %p, '%% \\u0025s', %p ]",
> +                             qstring_from_str("one"),
> +                             qstring_from_str("three"));
> +    list = qobject_to_qlist(obj);
> +    str = qobject_to_qstring(qlist_pop(list));
> +    g_assert_cmpstr(qstring_get_str(str), ==, "one");
> +    QDECREF(str);
> +    str = qobject_to_qstring(qlist_pop(list));
> +    g_assert_cmpstr(qstring_get_str(str), ==, "% %s");
> +    QDECREF(str);
> +    str = qobject_to_qstring(qlist_pop(list));
> +    g_assert_cmpstr(qstring_get_str(str), ==, "three");
> +    QDECREF(str);
> +    g_assert(qlist_empty(list));
> +    qobject_decref(obj);

I get what you mean by "vararg form" and "normal form", but I'm afraid
it's less than obvious for the uninitiated.  What about

       /*
        * Check qobject_from_json() does not interpolate %
        */

       /* outside JSON string */
       obj = qobject_from_json("%d", &err);
       error_free_or_abort(&err);
       g_assert(!obj);

       /* within JSON string */
       obj = qobject_from_json("'%% %s \\u0025d'", &error_abort);
       str = qobject_to_qstring(obj);
       g_assert_cmpstr(qstring_get_str(str), ==, "%% %s %d");
       qobject_decref(obj);

       /*
        * Check how qobject_from_jsonf() interpolates %
        */

       obj = qobject_from_jsonf("[ %p, '%% \\u0025s', %p ]",
                                qstring_from_str("one"),
                                qstring_from_str("three"));

> +
> +    /* The following intentionally cause assertion failures */
> +
> +    /* In vararg form, %% must occur in strings */
> +    /* qobject_from_jsonf("%%"); */
> +    /* qobject_from_jsonf("{%%}"); */
> +
> +    /* In vararg form, strings must not use % except for %% */
> +    /* qobject_from_jsonf("'%s'", "unpaired"); */

Could use g_test_trap_subprocess().  Not sure it's worth the bother.

I hate code in comments.  Better:

       /* The following intentionally cause assertion failures */
   #if 0
       /* In vararg form, %% must occur in strings */
       qobject_from_jsonf("%%");
       qobject_from_jsonf("{%%}");

       /* In vararg form, strings must not use % except for %% */
       qobject_from_jsonf("'%s'", "unpaired");
   #endif

> +}
> +
>  static void unterminated_string(void)
>  {
>      Error *err = NULL;
> @@ -1540,6 +1589,7 @@ int main(int argc, char **argv)
>      g_test_add_func("/varargs/simple_varargs", simple_varargs);
>
>      g_test_add_func("/errors/empty_input", empty_input);
> +    g_test_add_func("/errors/percent_and_vararg", percent_and_vararg);
>      g_test_add_func("/errors/unterminated/string", unterminated_string);
>      g_test_add_func("/errors/unterminated/escape", unterminated_escape);
>      g_test_add_func("/errors/unterminated/sq_string", unterminated_sq_string);

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp() Eric Blake
@ 2017-08-09  9:07   ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09  9:07 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> Don't open-code something that has a convenient helper available.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>

Reviewed-by: Markus Armbruster <armbru@redhat.com>

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject Eric Blake
@ 2017-08-09 10:10   ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 10:10 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> When we don't have to do any % interpolation in qmp() and friends,
> there is no point wasting time allocating a QObject from the format
> string only to then format it back into the string we send over
> the wire.

True, but there's also no point in complicating things for efficiency
here.

> This is a temporary measure: it becomes important in the next
> patch, where test-qga will be refactored to do interpolation in
> place, and where we must not re-interpolate the string; but will
> go away when further refactoring makes it easier to directly
> output a string without going through qmp_fd_sendv().

Okay, let's see how that works out.

> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index cde737ec5a..0cb439eefa 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -448,7 +448,7 @@ QDict *qtest_qmp_receive(QTestState *s)
>   */
>  void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>  {
> -    QObject *qobj;
> +    QObject *qobj = NULL;
>      int log = getenv("QTEST_LOG") != NULL;
>      QString *qstr;
>      const char *str;
> @@ -462,9 +462,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      }
>      assert(*fmt);
>
> -    /* Going through qobject ensures we escape strings properly. */
> -    qobj = qobject_from_jsonv(fmt, ap);
> -    qstr = qobject_to_json(qobj);
> +    /*
> +     * A round trip through QObject is only needed if % interpolation
> +     * is used.  We interpolate through QObject rather than sprintf in
> +     * order to escape strings properly.
> +     */
> +    if (strchr(fmt, '%')) {
> +        qobj = qobject_from_jsonv(fmt, ap);
> +        qstr = qobject_to_json(qobj);
> +    } else {

qobj = NULL here would be clearer than the initializer.

> +        qstr = qstring_from_str(fmt);
> +    }
>
>      /*
>       * BUG: QMP doesn't react to input until it sees a newline, an

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction Eric Blake
@ 2017-08-09 11:40   ` Markus Armbruster
  2017-08-09 13:29     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 11:40 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> When you build qga input manually like this:
>
>     cmd = g_strdup_printf("{'execute': 'guest-file-write',"
>                           " 'arguments': {'handle': %" PRId64 ","
>                           " 'buf-b64': '%s' } }", id, enc);
>     ret = qmp_fd(fixture->fd, cmd);
>     g_free(cmd);
>
> you're responsible for escaping the interpolated values for JSON.
> Not done here, and therefore works only because the base64 encoding
> does not include % or '.
>
> Leaving interpolation into JSON via qobject_from_jsonf() is more
> robust; we can also reduce the boilerplate by factoring out the
> common 'execute':%s and 'arguments':%p code into new qga() and
> qga_args() helpers:
>
>     ret = qga_args(fixture, "guest-file-write",
>                    "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);
>
> Note that this reverts part of commit 1792d7d0; but that is because
> we just recently guaranteed support of PRId64 in qobject_from_jsonf().
>
> Also note that the simple form qga() sends "arguments":{} over the
> wire rather than the previous approach of omitting it entirely;
> test_qga_ping() is updated to use a long-hand form to ensure that
> "arguments" is truly optional.
>
> As a bonus, this eliminates the last external caller using varargs
> for qmp_fd_send(); the next patch will simplify that interface to

I'm blind... where?

> take just the string being sent over the wire rather than performing
> a string->QObject->string round trip (there's already a hint
> of that in the simplification of passing '\xff' separately from
> the command, where this patch had to tweak things to avoid an
> assertion).  Also, this is a step towards getting rid of non-literal
> format strings; our new helpers can already use GCC_ATTR_FMT() just
> like qobject_from_jsonf().
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.c |   3 +-
>  tests/test-qga.c | 222 +++++++++++++++++++++++++++----------------------------
>  2 files changed, 111 insertions(+), 114 deletions(-)
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 0cb439eefa..ba09c949dc 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -458,7 +458,8 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>       * resyncs */
>      if (*fmt == '\377') {
>          socket_send(fd, fmt, 1);
> -        fmt++;
> +        assert(!fmt[1]);
> +        return;
>      }
>      assert(*fmt);
>
> diff --git a/tests/test-qga.c b/tests/test-qga.c
> index fd6bc7690f..839481e49b 100644
> --- a/tests/test-qga.c
> +++ b/tests/test-qga.c
> @@ -5,6 +5,7 @@
>  #include <sys/un.h>
>
>  #include "libqtest.h"
> +#include "qapi/qmp/qjson.h"
>
>  typedef struct {
>      char *test_dir;
> @@ -111,6 +112,55 @@ fixture_tear_down(TestFixture *fixture, gconstpointer data)
>      g_free(fixture->test_dir);
>  }
>
> +static void GCC_FMT_ATTR(3, 0) qga_sendv(const TestFixture *fixture,
> +                                         const char *cmd,
> +                                         const char *fmt, va_list ap)
> +{
> +    QObject *args = qobject_from_jsonv(fmt, ap);
> +    QObject *obj = qobject_from_jsonf("{'execute':%s, 'arguments':%p}",
> +                                      cmd, args);
> +    QString *qstr = qobject_to_json(obj);
> +    const char *str;
> +
> +    qstring_append_chr(qstr, '\n');
> +    str = qstring_get_str(qstr);
> +    assert(!strchr(str, '%'));

I figure you assert here because you can't rely on the compiler to catch
mistakes, and the technique you'd use with genuine printf, namely
passing "%s", str, isn't applicable.  Not entirely obvious.  Hmm, it
goes away in the next patch.  Okay then.

> +    qmp_fd_send(fixture->fd, str);
> +    QDECREF(qstr);
> +    qobject_decref(obj);
> +}
> +
> +static void GCC_FMT_ATTR(3, 4) qga_send_args(const TestFixture *fixture,
> +                                             const char *cmd,
> +                                             const char *fmt, ...)
> +{
> +    va_list ap;
> +
> +    va_start(ap, fmt);
> +    qga_sendv(fixture, cmd, fmt, ap);
> +    va_end(ap);
> +}
> +
> +
> +static QDict * GCC_FMT_ATTR(3, 4) qga_args(const TestFixture *fixture,
> +                                           const char *cmd,
> +                                           const char *fmt, ...)
> +{
> +    va_list ap;
> +
> +    va_start(ap, fmt);
> +    qga_sendv(fixture, cmd, fmt, ap);
> +    va_end(ap);
> +    return qmp_fd_receive(fixture->fd);
> +}
> +
> +static QDict *qga(const TestFixture *fixture, const char *cmd)
> +{
> +    qga_send_args(fixture, cmd, "{}");
> +    return qmp_fd_receive(fixture->fd);
> +}
> +
> +
>  static void qmp_assertion_message_error(const char     *domain,
>                                          const char     *file,
>                                          int             line,
> @@ -144,12 +194,9 @@ static void test_qga_sync_delimited(gconstpointer fix)
>      guint32 v, r = g_random_int();
>      unsigned char c;
>      QDict *ret;
> -    gchar *cmd;
>
> -    cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
> -                          " 'arguments': {'id': %u } }", r);
> -    qmp_fd_send(fixture->fd, cmd);
> -    g_free(cmd);
> +    qmp_fd_send(fixture->fd, "\xff");

I was starting to type "opportunity to switch to the \377 used in
libqtest.c", but then I noticed that one will go away in the next
patch.  Nevermind then.

> +    qga_send_args(fixture, "guest-sync-delimited", "{'id': %u}", r);
>
>      /*
>       * Read and ignore garbage until resynchronized.
> @@ -186,7 +233,6 @@ static void test_qga_sync(gconstpointer fix)
>      const TestFixture *fixture = fix;
>      guint32 v, r = g_random_int();
>      QDict *ret;
> -    gchar *cmd;
>
>      /*
>       * TODO guest-sync is inherently limited: we cannot distinguish
> @@ -199,10 +245,7 @@ static void test_qga_sync(gconstpointer fix)
>       * invalid JSON. Testing of '\xff' handling is done in
>       * guest-sync-delimited instead.
>       */
> -    cmd = g_strdup_printf("{'execute': 'guest-sync',"
> -                          " 'arguments': {'id': %u } }", r);
> -    ret = qmp_fd(fixture->fd, cmd);
> -    g_free(cmd);
> +    ret = qga_args(fixture, "guest-sync", "{'id': %u}", r);
>
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
> @@ -218,10 +261,17 @@ static void test_qga_ping(gconstpointer fix)
>      const TestFixture *fixture = fix;
>      QDict *ret;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping'}");
> +    /* qga() adds an "arguments":{} over the wire... */
> +    ret = qga(fixture, "guest-ping");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
> +    QDECREF(ret);
>
> +    /* ...so also test in long-hand that "arguments" can be omitted. */
> +    qmp_fd_send(fixture->fd, "{'execute':'guest-ping'}");
> +    ret = qmp_fd_receive(fixture->fd);
> +    g_assert_nonnull(ret);
> +    qmp_assert_no_error(ret);
>      QDECREF(ret);
>  }
>
> @@ -231,8 +281,7 @@ static void test_qga_invalid_args(gconstpointer fix)
>      QDict *ret, *error;
>      const gchar *class, *desc;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-ping', "
> -                 "'arguments': {'foo': 42 }}");
> +    ret = qga_args(fixture, "guest-ping", "{'foo': 42 }");
>      g_assert_nonnull(ret);
>
>      error = qdict_get_qdict(ret, "error");
> @@ -251,7 +300,7 @@ static void test_qga_invalid_cmd(gconstpointer fix)
>      QDict *ret, *error;
>      const gchar *class, *desc;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-invalid-cmd'}");
> +    ret = qga(fixture, "guest-invalid-cmd");
>      g_assert_nonnull(ret);
>
>      error = qdict_get_qdict(ret, "error");
> @@ -270,7 +319,7 @@ static void test_qga_info(gconstpointer fix)
>      QDict *ret, *val;
>      const gchar *version;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-info'}");
> +    ret = qga(fixture, "guest-info");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -288,7 +337,7 @@ static void test_qga_get_vcpus(gconstpointer fix)
>      QList *list;
>      const QListEntry *entry;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-vcpus'}");
> +    ret = qga(fixture, "guest-get-vcpus");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -308,7 +357,7 @@ static void test_qga_get_fsinfo(gconstpointer fix)
>      QList *list;
>      const QListEntry *entry;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-fsinfo'}");
> +    ret = qga(fixture, "guest-get-fsinfo");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -331,7 +380,7 @@ static void test_qga_get_memory_block_info(gconstpointer fix)
>      QDict *ret, *val;
>      int64_t size;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-block-info'}");
> +    ret = qga(fixture, "guest-get-memory-block-info");
>      g_assert_nonnull(ret);
>
>      /* some systems might not expose memory block info in sysfs */
> @@ -352,7 +401,7 @@ static void test_qga_get_memory_blocks(gconstpointer fix)
>      QList *list;
>      const QListEntry *entry;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-memory-blocks'}");
> +    ret = qga(fixture, "guest-get-memory-blocks");
>      g_assert_nonnull(ret);
>
>      /* some systems might not expose memory block info in sysfs */
> @@ -376,7 +425,7 @@ static void test_qga_network_get_interfaces(gconstpointer fix)
>      QList *list;
>      const QListEntry *entry;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-network-get-interfaces'}");
> +    ret = qga(fixture, "guest-network-get-interfaces");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -393,7 +442,7 @@ static void test_qga_file_ops(gconstpointer fix)
>      const TestFixture *fixture = fix;
>      const unsigned char helloworld[] = "Hello World!\n";
>      const char *b64;
> -    gchar *cmd, *path, *enc;
> +    gchar *path, *enc;
>      unsigned char *dec;
>      QDict *ret, *val;
>      int64_t id, eof;
> @@ -402,8 +451,8 @@ static void test_qga_file_ops(gconstpointer fix)
>      char tmp[100];
>
>      /* open */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> -                 " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
> +    ret = qga_args(fixture, "guest-file-open",
> +                   "{ 'path': 'foo', 'mode': 'w+' }");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>      id = qdict_get_int(ret, "return");
> @@ -411,10 +460,8 @@ static void test_qga_file_ops(gconstpointer fix)
>
>      enc = g_base64_encode(helloworld, sizeof(helloworld));
>      /* write */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-write',"
> -                          " 'arguments': { 'handle': %" PRId64 ","
> -                          " 'buf-b64': '%s' } }", id, enc);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-write",
> +                   "{ 'handle': %" PRId64 ", 'buf-b64': %s }", id, enc);
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -424,23 +471,14 @@ static void test_qga_file_ops(gconstpointer fix)
>      g_assert_cmpint(count, ==, sizeof(helloworld));
>      g_assert_cmpint(eof, ==, 0);
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* flush */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-flush',"
> -                          " 'arguments': {'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-flush", "{'handle': %" PRId64 "}", id);

I'd break the line after the second argument.

>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* close */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> -                          " 'arguments': {'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);

Likewise.

>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* check content */
>      path = g_build_filename(fixture->test_dir, "foo", NULL);
> @@ -454,18 +492,15 @@ static void test_qga_file_ops(gconstpointer fix)
>      fclose(f);
>
>      /* open */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> -                 " 'arguments': { 'path': 'foo', 'mode': 'r' } }");
> +    ret = qga_args(fixture, "guest-file-open",
> +                   "{ 'path': 'foo', 'mode': 'r' }");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>      id = qdict_get_int(ret, "return");
>      QDECREF(ret);
>
>      /* read */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> -                          " 'arguments': { 'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);

Likewise.

>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "count");
>      eof = qdict_get_bool(val, "eof");
> @@ -475,14 +510,10 @@ static void test_qga_file_ops(gconstpointer fix)
>      g_assert_cmpstr(b64, ==, enc);
>
>      QDECREF(ret);
> -    g_free(cmd);
>      g_free(enc);
>
>      /* read eof */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> -                          " 'arguments': { 'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);

Likewise.

>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "count");
>      eof = qdict_get_bool(val, "eof");
> @@ -491,14 +522,11 @@ static void test_qga_file_ops(gconstpointer fix)
>      g_assert(eof);
>      g_assert_cmpstr(b64, ==, "");
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* seek */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
> -                          " 'arguments': { 'handle': %" PRId64 ", "
> -                          " 'offset': %d, 'whence': '%s' } }",
> -                          id, 6, "set");
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-seek",
> +                   "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
> +                   id, 6, "set");
>      qmp_assert_no_error(ret);
>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "position");
> @@ -506,13 +534,9 @@ static void test_qga_file_ops(gconstpointer fix)
>      g_assert_cmpint(count, ==, 6);
>      g_assert(!eof);
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* partial read */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> -                          " 'arguments': { 'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);

Likewise.

>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "count");
>      eof = qdict_get_bool(val, "eof");
> @@ -525,15 +549,10 @@ static void test_qga_file_ops(gconstpointer fix)
>      g_free(dec);
>
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* close */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> -                          " 'arguments': {'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);

Likewise.

>      QDECREF(ret);
> -    g_free(cmd);
>  }
>
>  static void test_qga_file_write_read(gconstpointer fix)
> @@ -541,14 +560,14 @@ static void test_qga_file_write_read(gconstpointer fix)
>      const TestFixture *fixture = fix;
>      const unsigned char helloworld[] = "Hello World!\n";
>      const char *b64;
> -    gchar *cmd, *enc;
> +    gchar *enc;
>      QDict *ret, *val;
>      int64_t id, eof;
>      gsize count;
>
>      /* open */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-file-open',"
> -                 " 'arguments': { 'path': 'foo', 'mode': 'w+' } }");
> +    ret = qga_args(fixture, "guest-file-open",
> +                   "{ 'path': 'foo', 'mode': 'w+' }");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>      id = qdict_get_int(ret, "return");
> @@ -556,10 +575,8 @@ static void test_qga_file_write_read(gconstpointer fix)
>
>      enc = g_base64_encode(helloworld, sizeof(helloworld));
>      /* write */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-write',"
> -                          " 'arguments': { 'handle': %" PRId64 ","
> -                          " 'buf-b64': '%s' } }", id, enc);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-write",
> +                   "{'handle': %" PRId64 ", 'buf-b64': %s}", id, enc);
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -569,13 +586,9 @@ static void test_qga_file_write_read(gconstpointer fix)
>      g_assert_cmpint(count, ==, sizeof(helloworld));
>      g_assert_cmpint(eof, ==, 0);
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* read (check implicit flush) */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> -                          " 'arguments': { 'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);

Likewise.

>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "count");
>      eof = qdict_get_bool(val, "eof");
> @@ -584,14 +597,11 @@ static void test_qga_file_write_read(gconstpointer fix)
>      g_assert(eof);
>      g_assert_cmpstr(b64, ==, "");
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* seek to 0 */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-seek',"
> -                          " 'arguments': { 'handle': %" PRId64 ", "
> -                          " 'offset': %d, 'whence': '%s' } }",
> -                          id, 0, "set");
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-seek",
> +                   "{'handle': %" PRId64 ", 'offset': %d, 'whence': %s}",
> +                   id, 0, "set");
>      qmp_assert_no_error(ret);
>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "position");
> @@ -599,13 +609,9 @@ static void test_qga_file_write_read(gconstpointer fix)
>      g_assert_cmpint(count, ==, 0);
>      g_assert(!eof);
>      QDECREF(ret);
> -    g_free(cmd);
>
>      /* read */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-read',"
> -                          " 'arguments': { 'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-read", "{'handle': %" PRId64 "}", id);

Likewise.

>      val = qdict_get_qdict(ret, "return");
>      count = qdict_get_int(val, "count");
>      eof = qdict_get_bool(val, "eof");
> @@ -614,16 +620,11 @@ static void test_qga_file_write_read(gconstpointer fix)
>      g_assert(eof);
>      g_assert_cmpstr(b64, ==, enc);
>      QDECREF(ret);
> -    g_free(cmd);
>      g_free(enc);
>
>      /* close */
> -    cmd = g_strdup_printf("{'execute': 'guest-file-close',"
> -                          " 'arguments': {'handle': %" PRId64 "} }",
> -                          id);
> -    ret = qmp_fd(fixture->fd, cmd);
> +    ret = qga_args(fixture, "guest-file-close", "{'handle': %" PRId64 "}", id);

Likewise.

>      QDECREF(ret);
> -    g_free(cmd);
>  }
>
>  static void test_qga_get_time(gconstpointer fix)
> @@ -632,7 +633,7 @@ static void test_qga_get_time(gconstpointer fix)
>      QDict *ret;
>      int64_t time;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-get-time'}");
> +    ret = qga(fixture, "guest-get-time");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -651,7 +652,7 @@ static void test_qga_blacklist(gconstpointer data)
>      fixture_setup(&fix, "-b guest-ping,guest-get-time", NULL);
>
>      /* check blacklist */
> -    ret = qmp_fd(fix.fd, "{'execute': 'guest-ping'}");
> +    ret = qga(&fix, "guest-ping");
>      g_assert_nonnull(ret);
>      error = qdict_get_qdict(ret, "error");
>      class = qdict_get_try_str(error, "class");
> @@ -660,7 +661,7 @@ static void test_qga_blacklist(gconstpointer data)
>      g_assert_nonnull(g_strstr_len(desc, -1, "has been disabled"));
>      QDECREF(ret);
>
> -    ret = qmp_fd(fix.fd, "{'execute': 'guest-get-time'}");
> +    ret = qga(&fix, "guest-get-time");
>      g_assert_nonnull(ret);
>      error = qdict_get_qdict(ret, "error");
>      class = qdict_get_try_str(error, "class");
> @@ -670,7 +671,7 @@ static void test_qga_blacklist(gconstpointer data)
>      QDECREF(ret);
>
>      /* check something work */
> -    ret = qmp_fd(fix.fd, "{'execute': 'guest-get-fsinfo'}");
> +    ret = qga(&fix, "guest-get-fsinfo");
>      qmp_assert_no_error(ret);
>      QDECREF(ret);
>
> @@ -762,7 +763,7 @@ static void test_qga_fsfreeze_status(gconstpointer fix)
>      QDict *ret;
>      const gchar *status;
>
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-fsfreeze-status'}");
> +    ret = qga(fixture, "guest-fsfreeze-status");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>
> @@ -781,12 +782,11 @@ static void test_qga_guest_exec(gconstpointer fix)
>      int64_t pid, now, exitcode;
>      gsize len;
>      bool exited;
> -    char *cmd;
>
>      /* exec 'echo foo bar' */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
> -                 " 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
> -                 " 'capture-output': true } }");
> +    ret = qga_args(fixture, "guest-exec",
> +                 "{ 'path': '/bin/echo', 'arg': [ '-n', '\" test_str \"' ],"
> +                 " 'capture-output': true }");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);
>      val = qdict_get_qdict(ret, "return");
> @@ -796,10 +796,9 @@ static void test_qga_guest_exec(gconstpointer fix)
>
>      /* wait for completion */
>      now = g_get_monotonic_time();
> -    cmd = g_strdup_printf("{'execute': 'guest-exec-status',"
> -                          " 'arguments': { 'pid': %" PRId64 " } }", pid);
>      do {
> -        ret = qmp_fd(fixture->fd, cmd);
> +        ret = qga_args(fixture, "guest-exec-status", "{'pid': %" PRId64 "}",
> +                       pid);
>          g_assert_nonnull(ret);
>          val = qdict_get_qdict(ret, "return");
>          exited = qdict_get_bool(val, "exited");
> @@ -809,7 +808,6 @@ static void test_qga_guest_exec(gconstpointer fix)
>      } while (!exited &&
>               g_get_monotonic_time() < now + 5 * G_TIME_SPAN_SECOND);
>      g_assert(exited);
> -    g_free(cmd);
>
>      /* check stdout */
>      exitcode = qdict_get_int(val, "exitcode");
> @@ -829,8 +827,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
>      const gchar *class, *desc;
>
>      /* invalid command */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec', 'arguments': {"
> -                 " 'path': '/bin/invalid-cmd42' } }");
> +    ret = qga_args(fixture, "guest-exec", "{ 'path': '/bin/invalid-cmd42' }");
>      g_assert_nonnull(ret);
>      error = qdict_get_qdict(ret, "error");
>      g_assert_nonnull(error);
> @@ -841,8 +838,7 @@ static void test_qga_guest_exec_invalid(gconstpointer fix)
>      QDECREF(ret);
>
>      /* invalid pid */
> -    ret = qmp_fd(fixture->fd, "{'execute': 'guest-exec-status',"
> -                 " 'arguments': { 'pid': 0 } }");
> +    ret = qga_args(fixture, "guest-exec-status", "{ 'pid': 0 }");

Likewise.

>      g_assert_nonnull(ret);
>      error = qdict_get_qdict(ret, "error");
>      g_assert_nonnull(error);
> @@ -868,7 +864,7 @@ static void test_qga_guest_get_osinfo(gconstpointer data)
>      g_free(cwd);
>      fixture_setup(&fixture, NULL, env);
>
> -    ret = qmp_fd(fixture.fd, "{'execute': 'guest-get-osinfo'}");
> +    ret = qga(&fixture, "guest-get-osinfo");
>      g_assert_nonnull(ret);
>      qmp_assert_no_error(ret);

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-08-09  7:59   ` Markus Armbruster
@ 2017-08-09 13:14     ` Eric Blake
  2017-10-02  5:46       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 13:14 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 2246 bytes --]

On 08/09/2017 02:59 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> qobject_from_jsonv() was unusual in that it took a va_list*, instead
>> of the more typical va_list; this was so that callers could pass
>> NULL to avoid % interpolation.  While this works under the hood, it
>> is awkward for callers, so move the magic into qjson.c rather than
>> in the public interface, and finally improve the documentation of
>> qobject_from_jsonf().
>>

>> -    /* Going through qobject ensures we escape strings properly.
>> -     * This seemingly unnecessary copy is required in case va_list
>> -     * is an array type.
>> -     */
>> -    va_copy(ap_copy, ap);
>> -    qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
>> -    va_end(ap_copy);
>> +    /* Going through qobject ensures we escape strings properly. */
>> +    qobj = qobject_from_jsonv(fmt, ap);
>>      qstr = qobject_to_json(qobj);
>>
>>      /*
> 
> Wait!  Oh, the va_copy() moves iinto qobject_from_jsonv().  Okay, I
> guess.


>> +
>> +    /*
>> +     * This seemingly unnecessary copy is required in case va_list
>> +     * is an array type.
>> +     */
> 
> --verbose?

Code motion. But if the comment needs to be more verbose in the
destination than it was on the source, the rationale is that C99/POSIX
allows 'typedef something va_list[]' (that is, where va_list is an array
of some other type), although I don't know of any modern OS that
actually defines it like that.  Based on C pointer-decay rules, '&ap'
has a different type based on whether va_list was a struct/pointer or an
array type, when 'va_list ap' was passed as a parameter; so we can't
portably use qobject_from_json_internal(string, &ap, &error_abort).  The
va_copy() is what lets us guarantee that &ap_list is a pointer to a
va_list regardless of the type of va_list (because va_copy was declared
locally, rather than in a parameter list, and is therefore not subject
to pointer decay), and NOT an accidental pointer to first element of the
va_list array on platforms where va_list is an array.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs Eric Blake
@ 2017-08-09 13:18   ` Markus Armbruster
  2017-08-09 13:44     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 13:18 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> With the previous commit, no external clients are using qmp_fd()
> or qmp_fd_sendv().  Making qmp_fd_sendv() static lets us refactor
> the public qmp_fd_send() to be the common point where we send a
> fixed string over the wire as well as log that string, while
> qmp_fd_sendv() worries about converting varargs into the final
> string.  Note that the refactoring changes roles: previously,
> qmp_fd_send() deferred to qmp_fd_sendv(); now the call chain is
> in the opposite direction.  Likewise, now that we take a fixed
> string, we no longer have to special case '\xff'.

I'm fine with the reversal of roles.  The name qmp_fd_send() becomes
slightly problematic, though: it's *not* the ... variant of
qmp_fd_sendv(), as is the case for similar pairs of function names.

I wish libqtest's naming would follow libc conventions more closely.
libc: printf() and vprintf(), sprintf() and vsprintf().  libqtest:
qmp_fd_send() and qmp_sendv(), qtest_hmp() and qtest_hmpv(), ...
Exceptions (sort of): socket_send() and socket_sendf(), qtest_sendf().
Not sure this is worth cleaning up now.

If we decice it is, then the name qmp_fd_send() would be fine, because
its va_list buddy would be qmp_fd_vsendf(), and its ... buddy would be
qmp_fd_sendf().

> Add documentation while in the area.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h | 20 ++++++++++++----
>  tests/libqtest.c | 73 +++++++++++++++++---------------------------------------
>  tests/test-qga.c |  2 --
>  3 files changed, 38 insertions(+), 57 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 38148af66b..33af3ae8ff 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -923,11 +923,23 @@ static inline int64_t clock_set(int64_t val)
>      return qtest_clock_set(global_qtest, val);
>  }
>
> +/**
> + * qmp_fd_receive:
> + * @fd: Socket to read from.
> + *
> + * Read from input until a complete JSON object has been parsed,
> + * returning NULL on errors.
> + */
>  QDict *qmp_fd_receive(int fd);
> -void qmp_fd_sendv(int fd, const char *fmt, va_list ap);
> -void qmp_fd_send(int fd, const char *fmt, ...);
> -QDict *qmp_fdv(int fd, const char *fmt, va_list ap);
> -QDict *qmp_fd(int fd, const char *fmt, ...);
> +
> +/**
> + * qmp_fd_send:
> + * @fd: Socket to write to.
> + * @msg: Fixed string to send.
> + *
> + * Send a message to the destination, without waiting for a reply.
> + */
> +void qmp_fd_send(int fd, const char *msg);
>
>  /**
>   * qtest_cb_for_every_machine:
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index ba09c949dc..0fa32928c8 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -441,26 +441,16 @@ QDict *qtest_qmp_receive(QTestState *s)
>      return qmp_fd_receive(s->qmp_fd);
>  }
>
> -/**
> - * Allow users to send a message without waiting for the reply,
> - * in the case that they choose to discard all replies up until
> - * a particular EVENT is received.
> +/*
> + * Internal code that converts from interpolated JSON into a message
> + * to send over the wire, without waiting for a reply.
>   */

"Internal code that ..." is awkward.  It's static, so of course it's
internal, and of course it's code :)

"Convert from X into Y" sounds odd to my (non-native!) ears.  "Convert
from X to Y" and "convert X into Y" don't.

"Without waiting for a reply" is kind of implied by "send", isn't it?

What about

  /*
   * Send a QMP message with %-interpolation like qobject_from_jsonv().
   */

Add parameter description to taste.  Uglify to conform to GLib
documentation style if you want.

> -void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
> +static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>  {
>      QObject *qobj = NULL;
> -    int log = getenv("QTEST_LOG") != NULL;
>      QString *qstr;
>      const char *str;
>
> -    /* qobject_from_jsonv() silently eats leading 0xff as invalid
> -     * JSON, but we want to test sending them over the wire to force
> -     * resyncs */
> -    if (*fmt == '\377') {
> -        socket_send(fd, fmt, 1);
> -        assert(!fmt[1]);
> -        return;
> -    }
>      assert(*fmt);

Is this assertion (still) useful?  Why can't we leave the job to
qobject_from_jsonv()?

>
>      /*
> @@ -468,25 +458,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>       * is used.  We interpolate through QObject rather than sprintf in
>       * order to escape strings properly.
>       */
> -    if (strchr(fmt, '%')) {
> -        qobj = qobject_from_jsonv(fmt, ap);
> -        qstr = qobject_to_json(qobj);
> -    } else {
> -        qstr = qstring_from_str(fmt);
> +    if (!strchr(fmt, '%')) {
> +        qmp_fd_send(fd, fmt);
> +        return;
>      }
>
> -    /*
> -     * BUG: QMP doesn't react to input until it sees a newline, an
> -     * object, or an array.  Work-around: give it a newline.
> -     */
> -    qstring_append_chr(qstr, '\n');
> +    qobj = qobject_from_jsonv(fmt, ap);
> +    qstr = qobject_to_json(qobj);
>      str = qstring_get_str(qstr);
>
> -    if (log) {
> -        fprintf(stderr, "%s", str);
> -    }
>      /* Send QMP request */
> -    socket_send(fd, str, qstring_get_length(qstr));
> +    qmp_fd_send(fd, str);
>
>      QDECREF(qstr);
>      qobject_decref(qobj);
> @@ -497,13 +479,6 @@ void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
>      qmp_fd_sendv(s->qmp_fd, fmt, ap);
>  }
>
> -QDict *qmp_fdv(int fd, const char *fmt, va_list ap)
> -{
> -    qmp_fd_sendv(fd, fmt, ap);
> -
> -    return qmp_fd_receive(fd);
> -}
> -
>  QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
>  {
>      qtest_async_qmpv(s, fmt, ap);
> @@ -512,24 +487,20 @@ QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
>      return qtest_qmp_receive(s);
>  }
>
> -QDict *qmp_fd(int fd, const char *fmt, ...)
> +void qmp_fd_send(int fd, const char *msg)
>  {
> -    va_list ap;
> -    QDict *response;
> +    int log = getenv("QTEST_LOG") != NULL;
>
> -    va_start(ap, fmt);
> -    response = qmp_fdv(fd, fmt, ap);
> -    va_end(ap);
> -    return response;
> -}
> -
> -void qmp_fd_send(int fd, const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    qmp_fd_sendv(fd, fmt, ap);
> -    va_end(ap);
> +    if (log) {
> +        fprintf(stderr, "%s\n", msg);
> +    }
> +    /* Send QMP request */
> +    socket_send(fd, msg, strlen(msg));
> +    /*
> +     * BUG: QMP doesn't react to input until it sees a newline, an
> +     * object, or an array.  Work-around: give it a newline.
> +     */
> +    socket_send(fd, "\n", 1);

Hmm.

Before this series, qmp_fd_sendv() first parses @fmt with
%-interpolation from @ap, then converts the result back to JSON text.
Any newlines are lost, so we have to append one.

PATCH 10 adds a shortcut when @fmt doesn't contain '%'.  Newlines are
not lost in that case.  We add one anyway.  Ugh.

This patch drops the non-shortcut case.

I think qmp_fd_send() should send exactly @msg, and the newline
appending should move to qmp_fd_sendv(), where the newline loss now
happens.

>  }
>
>  QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
> diff --git a/tests/test-qga.c b/tests/test-qga.c
> index 839481e49b..ae0da6c9ac 100644
> --- a/tests/test-qga.c
> +++ b/tests/test-qga.c
> @@ -122,9 +122,7 @@ static void GCC_FMT_ATTR(3, 0) qga_sendv(const TestFixture *fixture,
>      QString *qstr = qobject_to_json(obj);
>      const char *str;
>
> -    qstring_append_chr(qstr, '\n');

Was appending a newline necessary before this patch?

It will be if you change qmp_fd_send() as I proposed.

>      str = qstring_get_str(qstr);
> -    assert(!strchr(str, '%'));
>      qmp_fd_send(fixture->fd, str);
>      QDECREF(qstr);
>      qobject_decref(obj);

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf()
  2017-08-09  9:06   ` Markus Armbruster
@ 2017-08-09 13:21     ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-09 13:21 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 3747 bytes --]

On 08/09/2017 04:06 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> We want -Wformat to catch blatant programming errors in format
>> strings that we pass to qobject_from_jsonf().  But if someone
>> were to pass a JSON string "'%s'" as the format string, gcc would
>> insist that it be paired with a char* argument, even though our
>> lexer does not recognize % sequences inside a JSON string.  You can
>> bypass -Wformat checking by passing the Unicode escape \u0025 for
>> %, but who wants to remember to type that?  So the solution is that
>> anywhere we are relying on -Wformat checking, the caller should
>> pass the usual printf %% escape sequence where a literal % is
>> wanted on output.
>>

>> +    bool double_quote = *ptr++ == '"';
>>
>>      str = qstring_new();
>> -    while (*ptr && 
>> -           ((double_quote && *ptr != '"') || (!double_quote && *ptr != '\''))) {
>> +    while (*ptr && *ptr != "'\""[double_quote]) {
> 
> Simpler:
> 
>        bool quote = *ptr++;
> 
> and then
> 
>        while (*ptr && *ptr != quote) {

Well, 'char quote' rather than 'bool quote', but yes, I like it.

> 
> Have you considered splitting the patch into one to simplify, and one to
> implement %%?

Will split.

>> @@ -455,13 +452,15 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
>>  {
>>      JSONToken *token;
>>
>> -    if (ap == NULL) {
>> -        return NULL;
>> -    }
>> -
>>      token = parser_context_pop_token(ctxt);
>>      assert(token && token->type == JSON_ESCAPE);
>>
>> +    if (ap == NULL) {
>> +        parse_error(ctxt, token, "escape parsing for '%s' not requested",
>> +                    token->str);
>> +        return NULL;
>> +    }
>> +
> 
> When I manage to fat-finger a '%' into my QMP input, I now get this
> error message instead of "Invalid JSON syntax".  Makes me go "what is
> escape parsing, and how do I request it?"  Not an improvement, I'm
> afraid.

Pre-patch, I see:

$ qemu-kvm -nodefaults -nographic -qmp stdio
{"QMP": {"version": {"qemu": {"micro": 91, "minor": 9, "major": 2},
"package": "(qemu-2.10.0-0.1.rc1.fc26)"}, "capabilities": []}}
{'execute':%s}
{"error": {"class": "GenericError", "desc": "JSON parse error, Missing
value in dict"}}
{'execute':%%}
{"error": {"class": "GenericError", "desc": "Invalid JSON syntax"}}
{"error": {"class": "GenericError", "desc": "JSON parse error, expecting
value"}}

I find it odd that NOT calling parse_error() but still returning NULL
changes the behavior on what error message eventually gets emitted; but
I also agree that the QMP case should drive what error message (if any)
is needed in parse_escape().  I'll play with it some more (the parser's
error handling is weird).


>> +    /* In vararg form, %% must occur in strings */
>> +    /* qobject_from_jsonf("%%"); */
>> +    /* qobject_from_jsonf("{%%}"); */
>> +
>> +    /* In vararg form, strings must not use % except for %% */
>> +    /* qobject_from_jsonf("'%s'", "unpaired"); */
> 
> Could use g_test_trap_subprocess().  Not sure it's worth the bother.

I don't know - this is one case where proving we abort on invalid usage
might actually be a good validation of the contract.

> 
> I hate code in comments.  Better:
> 
>        /* The following intentionally cause assertion failures */
>    #if 0
>        /* In vararg form, %% must occur in strings */
>        qobject_from_jsonf("%%");

If I don't use the g_test_trap_subprocess() trick, then I can override
checkpatch's complaints about #if 0.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction
  2017-08-09 11:40   ` Markus Armbruster
@ 2017-08-09 13:29     ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-09 13:29 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1990 bytes --]

On 08/09/2017 06:40 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> When you build qga input manually like this:
>>
>>     cmd = g_strdup_printf("{'execute': 'guest-file-write',"
>>                           " 'arguments': {'handle': %" PRId64 ","
>>                           " 'buf-b64': '%s' } }", id, enc);
>>     ret = qmp_fd(fixture->fd, cmd);
>>     g_free(cmd);
>>
>> you're responsible for escaping the interpolated values for JSON.
>> Not done here, and therefore works only because the base64 encoding
>> does not include % or '.
>>
>> As a bonus, this eliminates the last external caller using varargs
>> for qmp_fd_send(); the next patch will simplify that interface to
> 
> I'm blind... where?
> 

>> -    cmd = g_strdup_printf("\xff{'execute': 'guest-sync-delimited',"
>> -                          " 'arguments': {'id': %u } }", r);
>> -    qmp_fd_send(fixture->fd, cmd);
>> -    g_free(cmd);
>> +    qmp_fd_send(fixture->fd, "\xff");

Oh, the only old caller wasn't using varargs either. So none of the
public callers were passing a format string containing %, making the ...
in the public signature pointless (the next patch gets rid of it).  I'll
see what I can do to tweak the commit message.

> 
> I was starting to type "opportunity to switch to the \377 used in
> libqtest.c", but then I noticed that one will go away in the next
> patch.  Nevermind then.

Really, I moved the special handling of \377 out of libqtest.c into a
direct string passed to qmp_fd_send(), across the combination of
11+12/22.  We used to have to special case it in libqtest.c, because all
of our input was unconditionally taking the round trip of input string
-> QObject -> output string; but once we can output a string directly
without the round trip, we don't need the special casing.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs
  2017-08-09 13:18   ` Markus Armbruster
@ 2017-08-09 13:44     ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-09 13:44 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 4283 bytes --]

On 08/09/2017 08:18 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> With the previous commit, no external clients are using qmp_fd()
>> or qmp_fd_sendv().  Making qmp_fd_sendv() static lets us refactor
>> the public qmp_fd_send() to be the common point where we send a
>> fixed string over the wire as well as log that string, while
>> qmp_fd_sendv() worries about converting varargs into the final
>> string.  Note that the refactoring changes roles: previously,
>> qmp_fd_send() deferred to qmp_fd_sendv(); now the call chain is
>> in the opposite direction.  Likewise, now that we take a fixed
>> string, we no longer have to special case '\xff'.
> 
> I'm fine with the reversal of roles.  The name qmp_fd_send() becomes
> slightly problematic, though: it's *not* the ... variant of
> qmp_fd_sendv(), as is the case for similar pairs of function names.

I later rename qmp_fd_sendv() into qtest_qmp_sendv(), in 15/22, along
with another update to its signature.  Alluding to that here won't hurt.

> 
> I wish libqtest's naming would follow libc conventions more closely.
> libc: printf() and vprintf(), sprintf() and vsprintf().  libqtest:
> qmp_fd_send() and qmp_sendv(), qtest_hmp() and qtest_hmpv(), ...
> Exceptions (sort of): socket_send() and socket_sendf(), qtest_sendf().
> Not sure this is worth cleaning up now.

This would be the series to do it, though, if we have a preferred
alternative name.

> 
> If we decice it is, then the name qmp_fd_send() would be fine, because
> its va_list buddy would be qmp_fd_vsendf(), and its ... buddy would be
> qmp_fd_sendf().

At the end of the series, qmp_fd_send() has no varargs buddy.
qtest_qmp_sendv() and qtest_qmp_sendf() would be the buddies.

>> -void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>> +static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>>  {
>>      QObject *qobj = NULL;
>> -    int log = getenv("QTEST_LOG") != NULL;
>>      QString *qstr;
>>      const char *str;
>>
>> -    /* qobject_from_jsonv() silently eats leading 0xff as invalid
>> -     * JSON, but we want to test sending them over the wire to force
>> -     * resyncs */
>> -    if (*fmt == '\377') {
>> -        socket_send(fd, fmt, 1);
>> -        assert(!fmt[1]);
>> -        return;
>> -    }
>>      assert(*fmt);
> 
> Is this assertion (still) useful?  Why can't we leave the job to
> qobject_from_jsonv()?

It is still useful if...

> 
>>
>>      /*
>> @@ -468,25 +458,17 @@ void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>>       * is used.  We interpolate through QObject rather than sprintf in
>>       * order to escape strings properly.
>>       */
>> -    if (strchr(fmt, '%')) {
>> -        qobj = qobject_from_jsonv(fmt, ap);
>> -        qstr = qobject_to_json(qobj);
>> -    } else {
>> -        qstr = qstring_from_str(fmt);
>> +    if (!strchr(fmt, '%')) {
>> +        qmp_fd_send(fd, fmt);
>> +        return;

...we take this shortcut. But later in the series, the shortcut no
longer fires (and at that time, I delete the assert).


>> +    /* Send QMP request */
>> +    socket_send(fd, msg, strlen(msg));
>> +    /*
>> +     * BUG: QMP doesn't react to input until it sees a newline, an
>> +     * object, or an array.  Work-around: give it a newline.
>> +     */
>> +    socket_send(fd, "\n", 1);
> 
> Hmm.
> 
> Before this series, qmp_fd_sendv() first parses @fmt with
> %-interpolation from @ap, then converts the result back to JSON text.
> Any newlines are lost, so we have to append one.
> 
> PATCH 10 adds a shortcut when @fmt doesn't contain '%'.  Newlines are
> not lost in that case.  We add one anyway.  Ugh.
> 
> This patch drops the non-shortcut case.
> 
> I think qmp_fd_send() should send exactly @msg, and the newline
> appending should move to qmp_fd_sendv(), where the newline loss now
> happens.

In fact, I got rid of the \n hack here in 13/22.  But for one patch
longer, I could keep the workaround in qmp_fd_sendv(), rather than the
churn of moving it to qmp_fd_send() just to delete it in the next patch.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw() Eric Blake
@ 2017-08-09 14:54   ` Markus Armbruster
  2017-08-09 15:18     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 14:54 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> The majority of calls into libqtest's qmp() and friends are passing
> a JSON object that includes a command name; we can prove this by
> adding an assertion.  The only outlier is qmp-test, which is testing
> appropriate error responses to protocol violations and id support,
> by sending raw strings, where those raw strings don't need
> interpolation anyways.
>
> Adding a new entry-point makes a clean separation of which input
> needs interpolation, so that upcoming patches can refactor qmp()
> to be more like the recent additions to test-qga in taking the
> command name separately from the arguments for an overall
> reduction in testsuite boilerplate.
>
> This change also lets us move the workaround for the QMP parser
> limitation of not ending a parse until } or newline: all calls
> through qmp() are passing an object ending in }, so only the
> few callers of qmp_raw() have to worry about a trailing newline.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h |  8 ++++++++
>  tests/libqtest.c | 13 +++++++------
>  tests/qmp-test.c | 19 ++++++++++++-------
>  3 files changed, 27 insertions(+), 13 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 33af3ae8ff..917ec5cf92 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -550,6 +550,14 @@ static inline void qtest_end(void)
>  QDict *qmp(const char *fmt, ...);
>
>  /**
> + * qmp_raw:
> + * @msg: Raw QMP message to send to qemu.
> + *
> + * Sends a QMP message to QEMU and returns the response.
> + */
> +QDict *qmp_raw(const char *msg);
> +
> +/**
>   * qmp_async:
>   * @fmt...: QMP message to send to qemu; formats arguments through
>   * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 0fa32928c8..3071be2efb 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -451,7 +451,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      QString *qstr;
>      const char *str;
>
> -    assert(*fmt);
> +    assert(strstr(fmt, "execute"));

I doubt this assertion is worthwhile.

One , qmp_fd_sendv() works just fine whether you include an 'execute' or
not.  Two, there are zillions of other ways to send nonsense with
qmp_fd_sendv().  If you do, your test doesn't work, so you fix it.

Rejecting nonsensical QMP input is QEMU's job, not libqtest's.

>
>      /*
>       * A round trip through QObject is only needed if % interpolation
> @@ -496,11 +496,6 @@ void qmp_fd_send(int fd, const char *msg)
>      }
>      /* Send QMP request */
>      socket_send(fd, msg, strlen(msg));
> -    /*
> -     * BUG: QMP doesn't react to input until it sees a newline, an
> -     * object, or an array.  Work-around: give it a newline.
> -     */
> -    socket_send(fd, "\n", 1);
>  }
>
>  QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
> @@ -899,6 +894,12 @@ QDict *qmp(const char *fmt, ...)
>      return response;
>  }
>
> +QDict *qmp_raw(const char *msg)
> +{
> +    qmp_fd_send(global_qtest->qmp_fd, msg);
> +    return qtest_qmp_receive(global_qtest);
> +}
> +
>  void qmp_async(const char *fmt, ...)
>  {
>      va_list ap;
> diff --git a/tests/qmp-test.c b/tests/qmp-test.c
> index 5d0260b2be..905fb4b3e5 100644
> --- a/tests/qmp-test.c
> +++ b/tests/qmp-test.c
> @@ -44,28 +44,33 @@ static void test_malformed(void)
>  {
>      QDict *resp;
>
> +    /*
> +     * BUG: QMP doesn't react to input until it sees a newline, an
> +     * object, or an array.  Work-around: give it a newline.
> +     */
> +
>      /* Not even a dictionary */
> -    resp = qmp("null");
> +    resp = qmp_raw("null\n");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      QDECREF(resp);
>
>      /* No "execute" key */
> -    resp = qmp("{}");
> +    resp = qmp_raw("{}");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      QDECREF(resp);
>
>      /* "execute" isn't a string */
> -    resp = qmp("{ 'execute': true }");
> +    resp = qmp_raw("{ 'execute': true }");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      QDECREF(resp);
>
>      /* "arguments" isn't a dictionary */
> -    resp = qmp("{ 'execute': 'no-such-cmd', 'arguments': [] }");
> +    resp = qmp_raw("{ 'execute': 'no-such-cmd', 'arguments': [] }");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      QDECREF(resp);
>
>      /* extra key */
> -    resp = qmp("{ 'execute': 'no-such-cmd', 'extra': true }");
> +    resp = qmp_raw("{ 'execute': 'no-such-cmd', 'extra': true }");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      QDECREF(resp);
>  }
> @@ -114,14 +119,14 @@ static void test_qmp_protocol(void)
>      test_malformed();
>
>      /* Test 'id' */
> -    resp = qmp("{ 'execute': 'query-name', 'id': 'cookie#1' }");
> +    resp = qmp_raw("{ 'execute': 'query-name', 'id': 'cookie#1' }");
>      ret = qdict_get_qdict(resp, "return");
>      g_assert(ret);
>      g_assert_cmpstr(qdict_get_try_str(resp, "id"), ==, "cookie#1");
>      QDECREF(resp);
>
>      /* Test command failure with 'id' */
> -    resp = qmp("{ 'execute': 'human-monitor-command', 'id': 2 }");
> +    resp = qmp_raw("{ 'execute': 'human-monitor-command', 'id': 2 }");
>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>      g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
>      QDECREF(resp);

I'm afraid I don't like this patch.  All the extra function buys us is
an assertion that isn't even tight, and the lifting of a newline out of
a place where it shouldn't be.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command Eric Blake
@ 2017-08-09 15:15   ` Markus Armbruster
  2017-08-09 15:32     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 15:15 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, open list:IDE, John Snow, Stefan Hajnoczi

Eric Blake <eblake@redhat.com> writes:

> Upcoming patches will be adding new convenience methods for
> constructing QMP commands.  But making every variation of sending
> support every variation of response handling becomes unwieldy;
> it's easier to specify that discarding a JSON response is
> unassociated with sending the command, where qmp_async() already
> fits the bill for sending a command without tying up a reference
> to the response.
>
> Doing this renders qtest_qmp[v]_discard_response() unused.
>
> Bonus: gets rid of a non-literal format string, which is a step
> towards compile-time format string checking without triggering
> -Wformat-nonliteral.

Where?  (I'm feeling lazy today)

>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h               | 27 ++-------------------------
>  tests/libqtest.c               | 30 ++++++------------------------
>  tests/ahci-test.c              | 20 ++++++++++----------
>  tests/boot-order-test.c        |  2 +-
>  tests/drive_del-test.c         |  5 +++--
>  tests/fdc-test.c               | 11 ++++++-----
>  tests/ide-test.c               |  5 ++---
>  tests/postcopy-test.c          |  3 ++-
>  tests/test-filter-mirror.c     |  3 ++-
>  tests/test-filter-redirector.c |  6 ++++--
>  tests/virtio-blk-test.c        | 21 ++++++++++++---------
>  11 files changed, 50 insertions(+), 83 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 917ec5cf92..6bae0223aa 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -48,16 +48,6 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
>  void qtest_quit(QTestState *s);
>
>  /**
> - * qtest_qmp_discard_response:
> - * @s: #QTestState instance to operate on.
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - *
> - * Sends a QMP message to QEMU and consumes the response.
> - */
> -void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...);
> -
> -/**
>   * qtest_qmp:
>   * @s: #QTestState instance to operate on.
>   * @fmt...: QMP message to send to qemu; formats arguments through
> @@ -78,17 +68,6 @@ QDict *qtest_qmp(QTestState *s, const char *fmt, ...);
>  void qtest_async_qmp(QTestState *s, const char *fmt, ...);
>
>  /**
> - * qtest_qmpv_discard_response:
> - * @s: #QTestState instance to operate on.
> - * @fmt: QMP message to send to QEMU; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - * @ap: QMP message arguments
> - *
> - * Sends a QMP message to QEMU and consumes the response.
> - */
> -void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap);
> -
> -/**
>   * qtest_qmpv:
>   * @s: #QTestState instance to operate on.
>   * @fmt: QMP message to send to QEMU; formats arguments through
> @@ -568,12 +547,10 @@ void qmp_async(const char *fmt, ...);
>
>  /**
>   * qmp_discard_response:
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
>   *
> - * Sends a QMP message to QEMU and consumes the response.
> + * Read and discard a QMP response, typically after qmp_async().
>   */
> -void qmp_discard_response(const char *fmt, ...);
> +void qmp_discard_response(void);
>
>  /**
>   * qmp_receive:
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 3071be2efb..f9781d67f5 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -235,7 +235,8 @@ QTestState *qtest_init(const char *extra_args)
>      /* Read the QMP greeting and then do the handshake */
>      greeting = qtest_qmp_receive(s);
>      QDECREF(greeting);
> -    qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
> +    greeting = qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
> +    QDECREF(greeting);

Here, you replace

       qtest_qmp_discard_response(ARGS...);

effectively by

       QDECREF(qtest_qmp(ARGS...));

which is how qtest_qmp_discard_response() does its job before this
patch.  Okay.

>
>      return s;
>  }
> @@ -518,23 +519,6 @@ void qtest_async_qmp(QTestState *s, const char *fmt, ...)
>      va_end(ap);
>  }
>
> -void qtest_qmpv_discard_response(QTestState *s, const char *fmt, va_list ap)
> -{
> -    QDict *response = qtest_qmpv(s, fmt, ap);
> -    QDECREF(response);
> -}
> -
> -void qtest_qmp_discard_response(QTestState *s, const char *fmt, ...)
> -{
> -    va_list ap;
> -    QDict *response;
> -
> -    va_start(ap, fmt);
> -    response = qtest_qmpv(s, fmt, ap);
> -    va_end(ap);
> -    QDECREF(response);
> -}
> -
>  QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
>  {
>      QDict *response;
> @@ -909,14 +893,12 @@ void qmp_async(const char *fmt, ...)
>      va_end(ap);
>  }
>
> -void qmp_discard_response(const char *fmt, ...)
> +void qmp_discard_response(void)
>  {
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    qtest_qmpv_discard_response(global_qtest, fmt, ap);
> -    va_end(ap);
> +    QDict *response = qtest_qmp_receive(global_qtest);
> +    QDECREF(response);
>  }
> +
>  char *hmp(const char *fmt, ...)
>  {
>      va_list ap;
> diff --git a/tests/ahci-test.c b/tests/ahci-test.c
> index 999121bb7c..9460843a9f 100644
> --- a/tests/ahci-test.c
> +++ b/tests/ahci-test.c
> @@ -1596,8 +1596,9 @@ static void test_atapi_tray(void)
>      rsp = qmp_receive();
>      QDECREF(rsp);
>
> -    qmp_discard_response("{'execute': 'x-blockdev-remove-medium', "
> -                         "'arguments': {'device': 'drive0'}}");
> +    qmp_async("{'execute': 'x-blockdev-remove-medium', "
> +              "'arguments': {'device': 'drive0'}}");
> +    qmp_discard_response();

Here, you replace the same pattern (less the QTestState argument) by

       qmp_async(F, ...);
       qmp_discard_response();

Also okay.  But why two ways to do the same things?

Apropos QTestState argument: do we have a test with more than one state,
or is having two versions of every function just "avoiding global state
is virtuous" self-flagellation?

>
>      /* Test the tray without a medium */
>      ahci_atapi_load(ahci, port);
[...]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw()
  2017-08-09 14:54   ` Markus Armbruster
@ 2017-08-09 15:18     ` Eric Blake
  2017-08-10  7:29       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 15:18 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 2931 bytes --]

On 08/09/2017 09:54 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> The majority of calls into libqtest's qmp() and friends are passing
>> a JSON object that includes a command name; we can prove this by
>> adding an assertion.  The only outlier is qmp-test, which is testing
>> appropriate error responses to protocol violations and id support,
>> by sending raw strings, where those raw strings don't need
>> interpolation anyways.
>>
>> Adding a new entry-point makes a clean separation of which input
>> needs interpolation, so that upcoming patches can refactor qmp()
>> to be more like the recent additions to test-qga in taking the
>> command name separately from the arguments for an overall
>> reduction in testsuite boilerplate.
>>
>> This change also lets us move the workaround for the QMP parser
>> limitation of not ending a parse until } or newline: all calls
>> through qmp() are passing an object ending in }, so only the
>> few callers of qmp_raw() have to worry about a trailing newline.
>> +++ b/tests/libqtest.c
>> @@ -451,7 +451,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>>      QString *qstr;
>>      const char *str;
>>
>> -    assert(*fmt);
>> +    assert(strstr(fmt, "execute"));
> 
> I doubt this assertion is worthwhile.

Indeed, and it disappears later in the series.  But it was useful in the
interim, to prove that ALL callers through this function are passing a
command name (and therefore my later patches to rewrite qmp() to take a
command name aren't overlooking any callers).

> 
> One , qmp_fd_sendv() works just fine whether you include an 'execute' or
> not.  Two, there are zillions of other ways to send nonsense with
> qmp_fd_sendv().  If you do, your test doesn't work, so you fix it.
> 
> Rejecting nonsensical QMP input is QEMU's job, not libqtest's.

I'm fine omitting the assertions in the next spin, even if they proved
useful in this revision for making sure I converted everything.


>>
>>      /* Test command failure with 'id' */
>> -    resp = qmp("{ 'execute': 'human-monitor-command', 'id': 2 }");
>> +    resp = qmp_raw("{ 'execute': 'human-monitor-command', 'id': 2 }");
>>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>>      g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
>>      QDECREF(resp);
> 
> I'm afraid I don't like this patch.  All the extra function buys us is
> an assertion that isn't even tight, and the lifting of a newline out of
> a place where it shouldn't be.

Maybe you'll change your mind by the end of the series, once you see the
changes to make qmp() shorter (and where those changes necessitate a
qmp_raw() as the backdoor for anything that is not a normal
command+arguments).

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command
  2017-08-09 15:15   ` Markus Armbruster
@ 2017-08-09 15:32     ` Eric Blake
  2017-08-10  7:40       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 15:32 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, open list:IDE, John Snow, Stefan Hajnoczi

[-- Attachment #1: Type: text/plain, Size: 3842 bytes --]

On 08/09/2017 10:15 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> Upcoming patches will be adding new convenience methods for
>> constructing QMP commands.  But making every variation of sending
>> support every variation of response handling becomes unwieldy;
>> it's easier to specify that discarding a JSON response is
>> unassociated with sending the command, where qmp_async() already
>> fits the bill for sending a command without tying up a reference
>> to the response.
>>
>> Doing this renders qtest_qmp[v]_discard_response() unused.
>>
>> Bonus: gets rid of a non-literal format string, which is a step
>> towards compile-time format string checking without triggering
>> -Wformat-nonliteral.
> 
> Where?  (I'm feeling lazy today)
> 

Sure:

> 
> +++ b/tests/ide-test.c
> @@ -624,7 +624,6 @@ static void test_retry_flush(const char *machine)
>      QPCIDevice *dev;
>      QPCIBar bmdma_bar, ide_bar;
>      uint8_t data;
> -    const char *s;
> 
>      prepare_blkdebug_script(debug_path, "flush_to_disk");
> 
> @@ -652,8 +651,8 @@ static void test_retry_flush(const char *machine)
>      qmp_eventwait("STOP");
> 
>      /* Complete the command */
> -    s = "{'execute':'cont' }";
> -    qmp_discard_response(s);
> +    qmp_async("{'execute':'cont' }");
> +    qmp_discard_response();

Yes, I can update the commit message to focus in on it more precisely.

>> +++ b/tests/libqtest.c
>> @@ -235,7 +235,8 @@ QTestState *qtest_init(const char *extra_args)
>>      /* Read the QMP greeting and then do the handshake */
>>      greeting = qtest_qmp_receive(s);
>>      QDECREF(greeting);
>> -    qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
>> +    greeting = qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
>> +    QDECREF(greeting);
> 
> Here, you replace
> 
>        qtest_qmp_discard_response(ARGS...);
> 
> effectively by
> 
>        QDECREF(qtest_qmp(ARGS...));
> 
> which is how qtest_qmp_discard_response() does its job before this
> patch.  Okay.

I deleted qtest_qmp_discard_response().  If I had kept it around (but
made it static instead), I could have written this one as:

/* Read the QMP greeting and then do the handshake */
qtest_qmp_discard_response(s);
qtest_qmp_async(s, "{'execute': 'qmp_capabilities'}");
qtest_qmp_discard_response(s);

But as the only place that needed to pass 's' on through, I was just as
comfortable open-coding the QDECREF after the fact.

>> +++ b/tests/ahci-test.c
>> @@ -1596,8 +1596,9 @@ static void test_atapi_tray(void)
>>      rsp = qmp_receive();
>>      QDECREF(rsp);

Hmm - this code already was manually using QDECREF()...

>>
>> -    qmp_discard_response("{'execute': 'x-blockdev-remove-medium', "
>> -                         "'arguments': {'device': 'drive0'}}");
>> +    qmp_async("{'execute': 'x-blockdev-remove-medium', "
>> +              "'arguments': {'device': 'drive0'}}");
>> +    qmp_discard_response();

which means this could have reused rsp = qmp(...); QDECREF(rsp); as well.

> 
> Here, you replace the same pattern (less the QTestState argument) by
> 
>        qmp_async(F, ...);
>        qmp_discard_response();
> 
> Also okay.  But why two ways to do the same things?
> 
> Apropos QTestState argument: do we have a test with more than one state,
> or is having two versions of every function just "avoiding global state
> is virtuous" self-flagellation?

We DO have tests that use more than one state - AND those tests prefer
calling the qmp() version (rather than the qtest_qmp() version) with
manipulation of the global_qtest as needed.  See my cleanup in 15/22.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers Eric Blake
@ 2017-08-09 15:34   ` Markus Armbruster
  2017-08-09 16:35     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 15:34 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> None of our tests were directly using qtest_qmp() and friends;
> even tests like postcopy-test.c that manage multiple connections
> get along just fine changing global_qtest as needed (other than
> one callsite where it forgot to use the inlined form).  It's
> also annoying that we have qmp_async() but qtest_async_qmp(),
> with inconsistent naming for tracing through the wrappers.
>
> As future patches are about to add some convenience functions
> for easier generation of QMP commands, it's easier if we don't
> have to percolate the changes through as many layers of the stack,
> by getting rid of the layer that no one uses, and just documenting
> that callers have to massage the global variable as needed. (Yes,
> this is backwards from good design that says all state should be
> passed as parameters rather than via a global variable - but such
> is life in maintaining a testsuite, where it is easier to write
> concise tests than it is to retrofit all existing tests to pass
> the extra parameter everywhere.)
>
> Internally, we rename qmp_fd_sendv() to qtest_qmp_sendv(), as
> well as give it a ... counterpart qmp_fd_send(), but the overall
> reduction in code makes this file a bit less repetitive.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>

Ah!  I see you're as fed up with this nonsense as I am :)

What about all the other functions taking a QTestState?  Aren't they
just as silly?

Having two of every function is tiresome, but consistent.

Having just one is easier to maintain, so if it serves our needs,
possibly with the occasional state switch, I like it.

What I don't like is a mix of the two.

> ---
>  tests/libqtest.h      | 75 +++++----------------------------------------------
>  tests/libqtest.c      | 71 +++++++++++++-----------------------------------
>  tests/postcopy-test.c |  2 +-
>  3 files changed, 25 insertions(+), 123 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 6bae0223aa..684cfb3507 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -21,6 +21,11 @@
>
>  typedef struct QTestState QTestState;
>
> +/*
> + * The various qmp_*() commands operate on global_qtest.  Tests can
> + * alternate between two parallel connections by switching which state
> + * is current before issuing commands.
> + */
>  extern QTestState *global_qtest;
>
>  /**
> @@ -48,49 +53,7 @@ QTestState *qtest_init_without_qmp_handshake(const char *extra_args);
>  void qtest_quit(QTestState *s);
>
>  /**
> - * qtest_qmp:
> - * @s: #QTestState instance to operate on.
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - *
> - * Sends a QMP message to QEMU and returns the response.
> - */
> -QDict *qtest_qmp(QTestState *s, const char *fmt, ...);
> -
> -/**
> - * qtest_async_qmp:
> - * @s: #QTestState instance to operate on.
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - *
> - * Sends a QMP message to QEMU and leaves the response in the stream.
> - */
> -void qtest_async_qmp(QTestState *s, const char *fmt, ...);
> -
> -/**
> - * qtest_qmpv:
> - * @s: #QTestState instance to operate on.
> - * @fmt: QMP message to send to QEMU; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - * @ap: QMP message arguments
> - *
> - * Sends a QMP message to QEMU and returns the response.
> - */
> -QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap);
> -
> -/**
> - * qtest_async_qmpv:
> - * @s: #QTestState instance to operate on.
> - * @fmt: QMP message to send to QEMU; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - * @ap: QMP message arguments
> - *
> - * Sends a QMP message to QEMU and leaves the response in the stream.
> - */
> -void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap);
> -
> -/**
> - * qtest_receive:
> + * qtest_qmp_receive:
>   * @s: #QTestState instance to operate on.
>   *
>   * Reads a QMP message from QEMU and returns the response.
> @@ -117,32 +80,6 @@ void qtest_qmp_eventwait(QTestState *s, const char *event);
>  QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);
>
>  /**
> - * qtest_hmp:
> - * @s: #QTestState instance to operate on.
> - * @fmt...: HMP command to send to QEMU, formats arguments like sprintf().
> - *
> - * Send HMP command to QEMU via QMP's human-monitor-command.
> - * QMP events are discarded.
> - *
> - * Returns: the command's output.  The caller should g_free() it.
> - */
> -char *qtest_hmp(QTestState *s, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
> -
> -/**
> - * qtest_hmpv:
> - * @s: #QTestState instance to operate on.
> - * @fmt: HMP command to send to QEMU, formats arguments like vsprintf().
> - * @ap: HMP command arguments
> - *
> - * Send HMP command to QEMU via QMP's human-monitor-command.
> - * QMP events are discarded.
> - *
> - * Returns: the command's output.  The caller should g_free() it.
> - */
> -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
> -    GCC_FMT_ATTR(2, 0);
> -
> -/**
>   * qtest_get_irq:
>   * @s: #QTestState instance to operate on.
>   * @num: Interrupt to observe.
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index f9781d67f5..2df01682c0 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -233,9 +233,10 @@ QTestState *qtest_init(const char *extra_args)
>      QDict *greeting;
>
>      /* Read the QMP greeting and then do the handshake */
> -    greeting = qtest_qmp_receive(s);
> +    greeting = qmp_fd_receive(s->qmp_fd);

Why doesn't this become qmp_receive()?

>      QDECREF(greeting);
> -    greeting = qtest_qmp(s, "{ 'execute': 'qmp_capabilities' }");
> +    qmp_fd_send(s->qmp_fd, "{ 'execute': 'qmp_capabilities' }");
> +    greeting = qmp_fd_receive(s->qmp_fd);
>      QDECREF(greeting);
>
>      return s;
> @@ -446,7 +447,7 @@ QDict *qtest_qmp_receive(QTestState *s)
>   * Internal code that converts from interpolated JSON into a message
>   * to send over the wire, without waiting for a reply.
>   */
> -static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
> +static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)

Why this move in the other direction?

>  {
>      QObject *qobj = NULL;
>      QString *qstr;
> @@ -460,7 +461,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>       * order to escape strings properly.
>       */
>      if (!strchr(fmt, '%')) {
> -        qmp_fd_send(fd, fmt);
> +        qmp_fd_send(s->qmp_fd, fmt);
>          return;
>      }
>
> @@ -469,23 +470,19 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>      str = qstring_get_str(qstr);
>
>      /* Send QMP request */
> -    qmp_fd_send(fd, str);
> +    qmp_fd_send(s->qmp_fd, str);
>
>      QDECREF(qstr);
>      qobject_decref(qobj);
>  }
>
> -void qtest_async_qmpv(QTestState *s, const char *fmt, va_list ap)
> +static void qtest_qmp_send(QTestState *s, const char *fmt, ...)
>  {
> -    qmp_fd_sendv(s->qmp_fd, fmt, ap);
> -}
> +    va_list ap;
>
> -QDict *qtest_qmpv(QTestState *s, const char *fmt, va_list ap)
> -{
> -    qtest_async_qmpv(s, fmt, ap);
> -
> -    /* Receive reply */
> -    return qtest_qmp_receive(s);
> +    va_start(ap, fmt);
> +    qtest_qmp_sendv(s, fmt, ap);
> +    va_end(ap);
>  }
>
>  void qmp_fd_send(int fd, const char *msg)
> @@ -499,26 +496,6 @@ void qmp_fd_send(int fd, const char *msg)
>      socket_send(fd, msg, strlen(msg));
>  }
>
> -QDict *qtest_qmp(QTestState *s, const char *fmt, ...)
> -{
> -    va_list ap;
> -    QDict *response;
> -
> -    va_start(ap, fmt);
> -    response = qtest_qmpv(s, fmt, ap);
> -    va_end(ap);
> -    return response;
> -}
> -
> -void qtest_async_qmp(QTestState *s, const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    qtest_async_qmpv(s, fmt, ap);
> -    va_end(ap);
> -}
> -
>  QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event)
>  {
>      QDict *response;
> @@ -541,16 +518,16 @@ void qtest_qmp_eventwait(QTestState *s, const char *event)
>      QDECREF(response);
>  }
>
> -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
> +static char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>  {
>      char *cmd;
>      QDict *resp;
>      char *ret;
>
>      cmd = g_strdup_vprintf(fmt, ap);
> -    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
> -                     " 'arguments': {'command-line': %s}}",
> -                     cmd);
> +    qtest_qmp_send(s, "{'execute': 'human-monitor-command',"
> +                   " 'arguments': {'command-line': %s}}", cmd);
> +    resp = qtest_qmp_receive(s);
>      ret = g_strdup(qdict_get_try_str(resp, "return"));
>      while (ret == NULL && qdict_get_try_str(resp, "event")) {
>          /* Ignore asynchronous QMP events */
> @@ -564,17 +541,6 @@ char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>      return ret;
>  }
>
> -char *qtest_hmp(QTestState *s, const char *fmt, ...)
> -{
> -    va_list ap;
> -    char *ret;
> -
> -    va_start(ap, fmt);
> -    ret = qtest_hmpv(s, fmt, ap);
> -    va_end(ap);
> -    return ret;
> -}
> -
>  const char *qtest_get_arch(void)
>  {
>      const char *qemu = getenv("QTEST_QEMU_BINARY");
> @@ -870,12 +836,11 @@ void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
>  QDict *qmp(const char *fmt, ...)
>  {
>      va_list ap;
> -    QDict *response;
>
>      va_start(ap, fmt);
> -    response = qtest_qmpv(global_qtest, fmt, ap);
> +    qtest_qmp_sendv(global_qtest, fmt, ap);
>      va_end(ap);
> -    return response;
> +    return qtest_qmp_receive(global_qtest);
>  }
>
>  QDict *qmp_raw(const char *msg)
> @@ -889,7 +854,7 @@ void qmp_async(const char *fmt, ...)
>      va_list ap;
>
>      va_start(ap, fmt);
> -    qtest_async_qmpv(global_qtest, fmt, ap);
> +    qtest_qmp_sendv(global_qtest, fmt, ap);
>      va_end(ap);
>  }

Hmm.  Before this patch, qmp_async() is the ... buddy of va_list
qmp_fd_sendv().  If we keep qmp_fd_sendv(), they should be named
accordingly.

>
> diff --git a/tests/postcopy-test.c b/tests/postcopy-test.c
> index ceaed823eb..61f4b4180a 100644
> --- a/tests/postcopy-test.c
> +++ b/tests/postcopy-test.c
> @@ -236,7 +236,7 @@ static QDict *return_or_event(QDict *response)
>          got_stop = true;
>      }
>      QDECREF(response);
> -    return return_or_event(qtest_qmp_receive(global_qtest));
> +    return return_or_event(qmp_receive());
>  }

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper Eric Blake
@ 2017-08-09 15:40   ` Markus Armbruster
  2017-08-09 16:39     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 15:40 UTC (permalink / raw)
  To: Eric Blake
  Cc: qemu-devel, Ben Warren, open list:IDE, Jason Wang, John Snow,
	Andreas Färber

Eric Blake <eblake@redhat.com> writes:

> Now that we've asserted that all of our interpolated QMP commands
> include 'execute', we can reduce some of the caller boilerplate
> by providing a helpr function to wrap commands with no arguments

helper

I don't get the dependency on asserting "contains 'execute'".

> (later patches will cover commands with arguments).
>
> Adjust all callers that can use the new helpers; in the process,
> fixing a couple of places where we would have failed
> -Wformat-nonliteral.  Likewise, libqos.c no longer needs
> qmp_execute(), which in turn fixes the fact that it is better
> to interpolate JSON strings through qobject_from_json() than
> through sprintf().
>
> The current name is long, but temporary: later patches will
> remove all other uses of qmp(), and then make the mass rename
> of qmp_cmd() down to qmp().
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h               | 16 ++++++++++++++++
>  tests/libqtest.c               | 13 ++++++++++++-
>  tests/ahci-test.c              |  4 +---
>  tests/boot-order-test.c        |  2 +-
>  tests/ide-test.c               |  2 +-
>  tests/libqos/ahci.c            |  4 ++--
>  tests/libqos/libqos.c          | 16 ++--------------
>  tests/numa-test.c              |  2 +-
>  tests/postcopy-test.c          |  8 ++++----
>  tests/q35-test.c               |  2 +-
>  tests/qmp-test.c               |  8 ++++----
>  tests/qom-test.c               |  2 +-
>  tests/test-filter-mirror.c     |  2 +-
>  tests/test-filter-redirector.c |  4 ++--
>  tests/test-x86-cpuid-compat.c  |  2 +-
>  tests/virtio-net-test.c        | 13 ++++++-------
>  tests/vmgenid-test.c           |  2 +-
>  tests/wdt_ib700-test.c         |  2 +-
>  18 files changed, 58 insertions(+), 46 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 684cfb3507..e0d87d035a 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -483,6 +483,22 @@ QDict *qmp_raw(const char *msg);
>  void qmp_async(const char *fmt, ...);
>
>  /**
> + * qmp_cmd:
> + * @cmd: QMP command, with no arguments.
> + *
> + * Sends a QMP message to QEMU and returns the response.
> + */
> +QDict *qmp_cmd(const char *cmd);
> +
> +/**
> + * qmp_cmd_async:
> + * @cmd: QMP command, with no arguments.
> + *
> + * Sends a QMP message to QEMU and leaves the response in the stream.
> + */
> +void qmp_cmd_async(const char *cmd);
> +
> +/**
>   * qmp_discard_response:
>   *
>   * Read and discard a QMP response, typically after qmp_async().
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 2df01682c0..3926a4d481 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -858,6 +858,17 @@ void qmp_async(const char *fmt, ...)
>      va_end(ap);
>  }
>
> +QDict *qmp_cmd(const char *cmd)
> +{
> +    qmp_cmd_async(cmd);
> +    return qtest_qmp_receive(global_qtest);
> +}
> +
> +void qmp_cmd_async(const char *cmd)
> +{
> +    qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
> +}
> +

Hmm.  A possibly saner naming scheme:

    FOO_send(): send a command
    FOO_receive(): receive a reply
    FOO: both

>  void qmp_discard_response(void)
>  {
>      QDict *response = qtest_qmp_receive(global_qtest);
[...]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper Eric Blake
@ 2017-08-09 15:57   ` Markus Armbruster
  2017-08-09 21:57     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 15:57 UTC (permalink / raw)
  To: Eric Blake
  Cc: qemu-devel, open list:IDE, Amit Shah, Gerd Hoffmann,
	Stefan Hajnoczi, Paolo Bonzini, John Snow, Andreas Färber

Eric Blake <eblake@redhat.com> writes:

> Similar to the previous helper, we can reduce the boilerplate
> of most callers by passing the command name separately from
> the interpolated arguments.  Adjust the majority of the callers
> that can use the new helpers; in the process, fixing a few
> places where we would have failed -Wformat-nonliteral.  The
> new helper function already uses GCC_FMT_ATTR to match the
> underlying use of qobject_from_jsonv().
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h               |  20 ++++++
>  tests/libqtest.c               |  29 +++++++++
>  tests/ahci-test.c              |  19 +++---
>  tests/device-introspect-test.c |   4 +-
>  tests/drive_del-test.c         |  10 +--
>  tests/fdc-test.c               |   8 +--
>  tests/libqos/libqos.c          |   7 +--
>  tests/libqos/pci-pc.c          |   8 +--
>  tests/pc-cpu-test.c            |   8 +--
>  tests/postcopy-test.c          |  30 +++------
>  tests/qom-test.c               |   9 +--
>  tests/test-netfilter.c         | 139 ++++++++++++++++-------------------------
>  tests/test-x86-cpuid-compat.c  |   6 +-
>  tests/tmp105-test.c            |   9 +--
>  tests/usb-hcd-uhci-test.c      |  14 ++---
>  tests/usb-hcd-xhci-test.c      |  25 ++------
>  tests/vhost-user-test.c        |  12 +---
>  tests/virtio-blk-test.c        |  12 +---
>  tests/virtio-scsi-test.c       |  13 +---
>  tests/virtio-serial-test.c     |  12 +---
>  20 files changed, 167 insertions(+), 227 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index e0d87d035a..86ca7fa581 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -499,6 +499,26 @@ QDict *qmp_cmd(const char *cmd);
>  void qmp_cmd_async(const char *cmd);
>
>  /**
> + * qmp_args:
> + * @cmd: QMP command to send to QEMU.
> + * @fmt...: Arguments for the command; formats arguments through
> + * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> + *
> + * Sends a QMP message to QEMU and returns the response.
> + */
> +QDict *qmp_args(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
> +
> +/**
> + * qmp_args_async:
> + * @cmd: QMP command to send to QEMU.
> + * @fmt...: Arguments for the command; formats arguments through
> + * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> + *
> + * Sends a QMP message to QEMU and leaves the response in the stream.
> + */
> +void qmp_args_async(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
> +
> +/**
>   * qmp_discard_response:
>   *
>   * Read and discard a QMP response, typically after qmp_async().
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 3926a4d481..49786cf2d7 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -869,6 +869,35 @@ void qmp_cmd_async(const char *cmd)
>      qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
>  }
>
> +static void qmp_args_dict_async(const char *cmd, QDict *args)
> +{
> +    assert(args);
> +    qtest_qmp_send(global_qtest, "{'execute':%s, 'arguments':%p}", cmd, args);
> +}
> +
> +QDict *qmp_args(const char *cmd, const char *fmt, ...)
> +{
> +    va_list ap;
> +    QObject *obj;
> +
> +    va_start(ap, fmt);
> +    obj = qobject_from_jsonv(fmt, ap);
> +    va_end(ap);
> +    qmp_args_dict_async(cmd, qobject_to_qdict(obj));
> +    return qtest_qmp_receive(global_qtest);
> +}
> +
> +void qmp_args_async(const char *cmd, const char *fmt, ...)
> +{
> +    va_list ap;
> +    QObject *obj;
> +
> +    va_start(ap, fmt);
> +    obj = qobject_from_jsonv(fmt, ap);
> +    va_end(ap);
> +    qmp_args_dict_async(cmd, qobject_to_qdict(obj));
> +}
> +

I don't like the qmp_args name.  It's not about arguments, it's about
sending a command with arguments.

I'm afraid I'm getting pretty thorougly confused by the evolving
interface.  So I stop and think how it should look like when done.

We need send and receive.  Convenience functions to do both, and to
receive and throw away are nice to have.

We need qmp_raw().  We haven't found a need for a raw receive function.

Convenience functions to build commands and send are nice to have.  They
come in pairs, without arguments, to avoid -Wno-format-zero-length
(aside: that's one of the sillier warnings).

We used to have almost everything with and without QTestState, but we're
refusing to continue that self-flagellation.

For every function taking ..., we want one taking va_list.

Makes sense?

Can we derive a sensible set of function names from this?

[...]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper Eric Blake
@ 2017-08-09 15:59   ` Markus Armbruster
  2017-08-09 16:41     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 15:59 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> Leaving interpolation into JSON to qobject_from_jsonf() is more
> robust than building QMP input manually; however, we have a few
> places where code is already creating a QDict to interpolate
> individual arguments, which cannot be reproduced with the
> qobject_from_jsonf() parser.  Expose a public wrapper
> qmp_args_dict() for the internal helper qmp_args_dict_async()
> that we needed earlier for qmp_args(), and fix a test to use
> the new helper.
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h               | 9 +++++++++
>  tests/libqtest.c               | 6 ++++++
>  tests/device-introspect-test.c | 3 +--
>  3 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 86ca7fa581..193adf1eb9 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -499,6 +499,15 @@ QDict *qmp_cmd(const char *cmd);
>  void qmp_cmd_async(const char *cmd);
>
>  /**
> + * qmp_args_dict:
> + * @cmd: QMP command to send to QEMU.
> + * @args: Arguments for the command; will have reference count reduced.
> + *
> + * Sends a QMP message to QEMU and returns the response.
> + */
> +QDict *qmp_args_dict(const char *cmd, QDict *args);
> +
> +/**
>   * qmp_args:
>   * @cmd: QMP command to send to QEMU.
>   * @fmt...: Arguments for the command; formats arguments through
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 49786cf2d7..5012ecf929 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -875,6 +875,12 @@ static void qmp_args_dict_async(const char *cmd, QDict *args)
>      qtest_qmp_send(global_qtest, "{'execute':%s, 'arguments':%p}", cmd, args);
>  }
>
> +QDict *qmp_args_dict(const char *cmd, QDict *args)
> +{
> +    qmp_args_dict_async(cmd, args);
> +    return qtest_qmp_receive(global_qtest);
> +}
> +
>  QDict *qmp_args(const char *cmd, const char *fmt, ...)
>  {
>      va_list ap;
> diff --git a/tests/device-introspect-test.c b/tests/device-introspect-test.c
> index e1fcd3b6c6..d2de4a5fc0 100644
> --- a/tests/device-introspect-test.c
> +++ b/tests/device-introspect-test.c
> @@ -36,8 +36,7 @@ static QList *qom_list_types(const char *implements, bool abstract)
>      if (implements) {
>          qdict_put_str(args, "implements", implements);
>      }
> -    resp = qmp("{'execute': 'qom-list-types',"
> -               " 'arguments': %p }", args);
> +    resp = qmp_args_dict("qom-list-types", args);
>      g_assert(qdict_haskey(resp, "return"));
>      ret = qdict_get_qlist(resp, "return");
>      QINCREF(ret);

If we had five of these, the helper would be worth its keep.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp() Eric Blake
@ 2017-08-09 16:01   ` Markus Armbruster
  2017-08-09 16:43     ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-08-09 16:01 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> All callers have been converted to a form of qmp_cmd() or
> qmp_args() that takes the command name with less boilerplate.
> Therefore, we also know that all commands are using
> interpolation, and can remove an assertion.
>
> This also means that we have fixed the testsuite to comply with
> -Wformat checking on the strings being interpolated for qmp()
> (similar to what we previously did for strings used in hmp(), and
> matching the checking present on qobject_from_jsonf()).
>
> Signed-off-by: Eric Blake <eblake@redhat.com>
> ---
>  tests/libqtest.h | 20 +-------------------
>  tests/libqtest.c | 32 ++++----------------------------
>  2 files changed, 5 insertions(+), 47 deletions(-)
>
> diff --git a/tests/libqtest.h b/tests/libqtest.h
> index 193adf1eb9..04b36a7b11 100644
> --- a/tests/libqtest.h
> +++ b/tests/libqtest.h
> @@ -457,15 +457,6 @@ static inline void qtest_end(void)
>  }
>
>  /**
> - * qmp:
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - *
> - * Sends a QMP message to QEMU and returns the response.
> - */
> -QDict *qmp(const char *fmt, ...);
> -
> -/**
>   * qmp_raw:
>   * @msg: Raw QMP message to send to qemu.
>   *
> @@ -474,15 +465,6 @@ QDict *qmp(const char *fmt, ...);
>  QDict *qmp_raw(const char *msg);
>
>  /**
> - * qmp_async:
> - * @fmt...: QMP message to send to qemu; formats arguments through
> - * json-lexer.c (only understands '%(PRI[ud]64|(l|ll)?[du]|[ipsf%])').
> - *
> - * Sends a QMP message to QEMU and leaves the response in the stream.
> - */
> -void qmp_async(const char *fmt, ...);
> -
> -/**
>   * qmp_cmd:
>   * @cmd: QMP command, with no arguments.
>   *
> @@ -530,7 +512,7 @@ void qmp_args_async(const char *cmd, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
>  /**
>   * qmp_discard_response:
>   *
> - * Read and discard a QMP response, typically after qmp_async().
> + * Read and discard a QMP response, typically after qmp_cmd_async().
>   */
>  void qmp_discard_response(void);
>
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 5012ecf929..4597d4ac66 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -453,17 +453,12 @@ static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)
>      QString *qstr;
>      const char *str;
>
> -    assert(strstr(fmt, "execute"));
> -
>      /*
> -     * A round trip through QObject is only needed if % interpolation
> -     * is used.  We interpolate through QObject rather than sprintf in
> -     * order to escape strings properly.
> +     * A round trip through QObject (and not sprintf) is needed
> +     * because % interpolation is used, and we must escape strings
> +     * properly.
>       */
> -    if (!strchr(fmt, '%')) {
> -        qmp_fd_send(s->qmp_fd, fmt);
> -        return;
> -    }
> +    assert(strchr(fmt, '%'));

What exactly is wrong with a @fmt that doesn't contain '%'?

>
>      qobj = qobject_from_jsonv(fmt, ap);
>      qstr = qobject_to_json(qobj);
> @@ -833,31 +828,12 @@ void qtest_memset(QTestState *s, uint64_t addr, uint8_t pattern, size_t size)
>      qtest_rsp(s, 0);
>  }
>
> -QDict *qmp(const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    qtest_qmp_sendv(global_qtest, fmt, ap);
> -    va_end(ap);
> -    return qtest_qmp_receive(global_qtest);
> -}
> -
>  QDict *qmp_raw(const char *msg)
>  {
>      qmp_fd_send(global_qtest->qmp_fd, msg);
>      return qtest_qmp_receive(global_qtest);
>  }
>
> -void qmp_async(const char *fmt, ...)
> -{
> -    va_list ap;
> -
> -    va_start(ap, fmt);
> -    qtest_qmp_sendv(global_qtest, fmt, ap);
> -    va_end(ap);
> -}
> -
>  QDict *qmp_cmd(const char *cmd)
>  {
>      qmp_cmd_async(cmd);

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers
  2017-08-09 15:34   ` Markus Armbruster
@ 2017-08-09 16:35     ` Eric Blake
  2017-08-10  7:47       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 16:35 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 4228 bytes --]

On 08/09/2017 10:34 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> None of our tests were directly using qtest_qmp() and friends;
>> even tests like postcopy-test.c that manage multiple connections
>> get along just fine changing global_qtest as needed (other than
>> one callsite where it forgot to use the inlined form).  It's
>> also annoying that we have qmp_async() but qtest_async_qmp(),
>> with inconsistent naming for tracing through the wrappers.
>>

> What about all the other functions taking a QTestState?  Aren't they
> just as silly?

What's left after this patch:

- qtest_init()
  qtest_init_without_qmp_handshake()
  qtest_quit()
necessary for setting up parallel state.

and then a lot of functions that have static inline wrappers (for
example, qmp_receive(), inb(), ...).

So yes, I could additionally get rid of more wrappers and have even more
functions implicitly depend on global_qtest.

> 
> Having two of every function is tiresome, but consistent.
> 
> Having just one is easier to maintain, so if it serves our needs,
> possibly with the occasional state switch, I like it.
> 
> What I don't like is a mix of the two.

Okay, I'll prune even harder in the next revision.  Deleting cruft is fun!

>> +++ b/tests/libqtest.c
>> @@ -233,9 +233,10 @@ QTestState *qtest_init(const char *extra_args)
>>      QDict *greeting;
>>
>>      /* Read the QMP greeting and then do the handshake */
>> -    greeting = qtest_qmp_receive(s);
>> +    greeting = qmp_fd_receive(s->qmp_fd);
> 
> Why doesn't this become qmp_receive()?

Because in THIS version of the patch, qmp_receive() is still a static
inline wrapper that calls qtest_qmp_receive(global_qtest) - but
global_qtest is not set here.  (If I delete qtest_qmp_receive() and have
qmp_receive() not be static inline, then we STILL want to operate
directly on the just-created s->qmp_fd rather than assuming that
global_qtest == s, when in the body of qtest_init).

>> @@ -446,7 +447,7 @@ QDict *qtest_qmp_receive(QTestState *s)
>>   * Internal code that converts from interpolated JSON into a message
>>   * to send over the wire, without waiting for a reply.
>>   */
>> -static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>> +static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)
> 
> Why this move in the other direction?

Because it fixes the disparity you pointed out in 12/22 about
qmp_fd_sendv() no longer being a sane pairing to qmp_fd_send(), AND
because I needed the .../va_list pairing to work in order for...

>> -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>> +static char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>>  {
>>      char *cmd;
>>      QDict *resp;
>>      char *ret;
>>
>>      cmd = g_strdup_vprintf(fmt, ap);
>> -    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
>> -                     " 'arguments': {'command-line': %s}}",
>> -                     cmd);
>> +    qtest_qmp_send(s, "{'execute': 'human-monitor-command',"
>> +                   " 'arguments': {'command-line': %s}}", cmd);
>> +    resp = qtest_qmp_receive(s);

...this to work.  So now my sane pairing is
qtest_qmp_send()/qtest_qmp_sendv() - although your argument that
qtest_qmp_sendf() might have been a nicer name for the ... form may
still have merit - at least any time the sendv() form is in a public
header.  Then again, by the end of the series, I managed to get rid of
all va_list in libqtest.h, needing it only in libqtest.c.

>> @@ -889,7 +854,7 @@ void qmp_async(const char *fmt, ...)
>>      va_list ap;
>>
>>      va_start(ap, fmt);
>> -    qtest_async_qmpv(global_qtest, fmt, ap);
>> +    qtest_qmp_sendv(global_qtest, fmt, ap);
>>      va_end(ap);
>>  }
> 
> Hmm.  Before this patch, qmp_async() is the ... buddy of va_list
> qmp_fd_sendv().  If we keep qmp_fd_sendv(), they should be named
> accordingly.

What name to use, though?  By the end of the series, we have
qmp_async(...) but no public va_list form.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper
  2017-08-09 15:40   ` Markus Armbruster
@ 2017-08-09 16:39     ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-09 16:39 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, Ben Warren, open list:IDE, Jason Wang, John Snow,
	Andreas Färber

[-- Attachment #1: Type: text/plain, Size: 1312 bytes --]

On 08/09/2017 10:40 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> Now that we've asserted that all of our interpolated QMP commands
>> include 'execute', we can reduce some of the caller boilerplate
>> by providing a helpr function to wrap commands with no arguments
> 
> helper
> 
> I don't get the dependency on asserting "contains 'execute'".

As mentioned elsewhere, the assertions helped me make sure I converted
all qmp() callers, but I'm fine not having it (and therefore adjusting
this commit message) in the next spin.

>> +void qmp_cmd_async(const char *cmd)
>> +{
>> +    qtest_qmp_send(global_qtest, "{'execute':%s}", cmd);
>> +}
>> +
> 
> Hmm.  A possibly saner naming scheme:
> 
>     FOO_send(): send a command
>     FOO_receive(): receive a reply
>     FOO: both

Yes, I like it.  That means s/FOO_async/FOO_send/.  And to some extent,
I already did that - as the name qmp_cmd() was temporary until I could
get rid of all older qmp() semantics, and then end with s/qmp_cmd/qmp/
in 22/22.  And since I'm already touching pretty much every client, it's
no worse churn to do a sane rename in the process.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper
  2017-08-09 15:59   ` Markus Armbruster
@ 2017-08-09 16:41     ` Eric Blake
  2017-08-10  8:19       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 16:41 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1515 bytes --]

On 08/09/2017 10:59 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> Leaving interpolation into JSON to qobject_from_jsonf() is more
>> robust than building QMP input manually; however, we have a few
>> places where code is already creating a QDict to interpolate
>> individual arguments, which cannot be reproduced with the
>> qobject_from_jsonf() parser.  Expose a public wrapper
>> qmp_args_dict() for the internal helper qmp_args_dict_async()
>> that we needed earlier for qmp_args(), and fix a test to use
>> the new helper.
>>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>> ---

>> +++ b/tests/device-introspect-test.c
>> @@ -36,8 +36,7 @@ static QList *qom_list_types(const char *implements, bool abstract)
>>      if (implements) {
>>          qdict_put_str(args, "implements", implements);
>>      }
>> -    resp = qmp("{'execute': 'qom-list-types',"
>> -               " 'arguments': %p }", args);
>> +    resp = qmp_args_dict("qom-list-types", args);
>>      g_assert(qdict_haskey(resp, "return"));
>>      ret = qdict_get_qlist(resp, "return");
>>      QINCREF(ret);
> 
> If we had five of these, the helper would be worth its keep.

This patch only  has one client, but 20/22 adds another.  Is having 2
clients sufficient to keep it (not quite the 5 that makes it obvious,
but still a good reuse of code)?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp()
  2017-08-09 16:01   ` Markus Armbruster
@ 2017-08-09 16:43     ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2017-08-09 16:43 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1551 bytes --]

On 08/09/2017 11:01 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> All callers have been converted to a form of qmp_cmd() or
>> qmp_args() that takes the command name with less boilerplate.
>> Therefore, we also know that all commands are using
>> interpolation, and can remove an assertion.
>>
>> This also means that we have fixed the testsuite to comply with
>> -Wformat checking on the strings being interpolated for qmp()
>> (similar to what we previously did for strings used in hmp(), and
>> matching the checking present on qobject_from_jsonf()).
>>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>> ---

>> -     * A round trip through QObject is only needed if % interpolation
>> -     * is used.  We interpolate through QObject rather than sprintf in
>> -     * order to escape strings properly.
>> +     * A round trip through QObject (and not sprintf) is needed
>> +     * because % interpolation is used, and we must escape strings
>> +     * properly.
>>       */
>> -    if (!strchr(fmt, '%')) {
>> -        qmp_fd_send(s->qmp_fd, fmt);
>> -        return;
>> -    }
>> +    assert(strchr(fmt, '%'));
> 
> What exactly is wrong with a @fmt that doesn't contain '%'?

Nothing, so much as proving to myself that I indeed converted all the
qmp() calls.  As before, the assertion is not vital to the series, and
can be omitted on the respin.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper
  2017-08-09 15:57   ` Markus Armbruster
@ 2017-08-09 21:57     ` Eric Blake
  2017-08-10  8:17       ` Markus Armbruster
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-08-09 21:57 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: qemu-devel, open list:IDE, Amit Shah, Gerd Hoffmann,
	Stefan Hajnoczi, Paolo Bonzini, John Snow, Andreas Färber

[-- Attachment #1: Type: text/plain, Size: 5397 bytes --]

On 08/09/2017 10:57 AM, Markus Armbruster wrote:

> I don't like the qmp_args name.  It's not about arguments, it's about
> sending a command with arguments.
> 
> I'm afraid I'm getting pretty thorougly confused by the evolving
> interface.  So I stop and think how it should look like when done.

At a bare minimum, I like your idea that we want:

FOO_send()     # sends a message, does not wait for a reply
FOO_receive()  # reads one JSON object, returns QObject counterpart
FOO() # combo of FOO_send() and FOO_receive()

Then FOO_discard() is a convenient shorthand for QDECREF(FOO_receive()).

Which FOO do we need? Right now, we have 'qmp' for anything using the
global_qtest, 'qtest_qmp' for anything using an explicit QTestState (but
we're arguing that is overkill), and 'qmp_fd' for anything using a raw
fd (test-qga.c - and where I added 'qga' in 11/22, although that
addition was local rather than in libqtest.h).

I also just had an insight: it is possible to write a macro
qmp_send(...) that will expand to qmp_send_cmd(name) if there is only
one argument, but to qmp_send_cmdf(name, fmt, ...) if there is more than
one argument (and later expose a public qmp_send_cmdv(name, fmt,
va_list) as pair if it is needed, although right now it is not).
Perhaps we can even make the one-arg form expand to qmp_send_cmdf(name,
" "), if that's enough to silence gcc's -Wformat-zero-length, and if our
underlying routines are smart enough to recognize a single-space
argument as not being worthy of calling qobject_from_jsonf() (since
qobject_from_jsonf() aborts rather than returning NULL when presented
just whitespace).

In fact, having a macro qmp_send(cmd, ...) expand to
qmp_send_internal(cmd, " " __VA_ARGS__) might even do the trick without
preprocessor magic of checking whether __VA_ARGS__ contains a comma
(although it has the subtle limitation that if present, a format
argument MUST be a string literal because we now rely on string
concatenation with " " - although given gcc's -Wformat-nonliteral, we
are probably okay with that limitation).

So, with a nice macro, the bulk of the testsuite would just write in
this style:

qmp_send("foo");
qmp_send("foo", "{literal_args...}");
qmp_send("foo", "{'name':%s}", value);

for send without waiting, or:

obj = qmp("foo");
obj = qmp(foo", "{literal_args...}");
obj = qmp("foo", "{'name':%s}", value);

where the result matters.  And the names we choose for internal
implementation are no longer quite as important (although still helpful
to get right).

> 
> We need send and receive.  Convenience functions to do both, and to
> receive and throw away are nice to have.

Do we want both a convenience function to throw away a single read, AND
a function to send a command + throw away a read? Prior to this series,
we have qmp_discard_response() which is send + discard, but nothing that
does plain discard; although plain discard is a better building block
(precisely because then we don't have to duplicate all the different
send forms) - the convenience of send+receive in one call should be
limited to the most common case.

Also, the qmp_eventwait() is a nice convenience function for wait in a
loop until the received object matches a given name; whether we also
need the convenience of qmp_eventwait_ref() is a bit more debatable
(perhaps we could just as easily have qmp_event_wait() always return an
object, and require the caller to QDECREF() it, for one less function to
maintain).

> 
> We need qmp_raw().  We haven't found a need for a raw receive function.

Yes, qmp_raw() (or maybe it should be named qmp_send_raw(), depending on
whether the receive is coupled with it?) is our backdoor for sending
JSON that does not match the normal {'execute':'name','arguments':{}}
paradigm (and pretty much qmp-test.c, or maybe also test-qga.c, would be
the only clients).

[Side node - why can't we pick a consistent naming of our tests?  The
name 'FOO-test' is a bit nicer than 'test-FOO' when it comes to writing
.gitignore entries. Should we do a bulk cleanup rename to get all the
tests into one consistent naming style?]

> 
> Convenience functions to build commands and send are nice to have.  They
> come in pairs, without arguments, to avoid -Wno-format-zero-length
> (aside: that's one of the sillier warnings).

It's possible to alter CFLAGS to shut gcc up on that one while still
getting the rest of -Wformat, if we don't think it adds value to qemu.
My idea above is that you can use a macro to hide the worst of the
paired nature, so that the bulk of the testsuite can supply or omit an
arguments format string as desired.

> 
> We used to have almost everything with and without QTestState, but we're
> refusing to continue that self-flagellation.

And for v5, I think I'll reorder my series to get rid of QTestState
sooner, rather than later.

> 
> For every function taking ..., we want one taking va_list.

Under the hood, probably.  Whether the va_list form has to be exported
is a different question (we might be able to get by with just the ... form).

> 
> Makes sense?
> 
> Can we derive a sensible set of function names from this?
> 

I gave it a shot.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw()
  2017-08-09 15:18     ` Eric Blake
@ 2017-08-10  7:29       ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-10  7:29 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 09:54 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> The majority of calls into libqtest's qmp() and friends are passing
>>> a JSON object that includes a command name; we can prove this by
>>> adding an assertion.  The only outlier is qmp-test, which is testing
>>> appropriate error responses to protocol violations and id support,
>>> by sending raw strings, where those raw strings don't need
>>> interpolation anyways.
>>>
>>> Adding a new entry-point makes a clean separation of which input
>>> needs interpolation, so that upcoming patches can refactor qmp()
>>> to be more like the recent additions to test-qga in taking the
>>> command name separately from the arguments for an overall
>>> reduction in testsuite boilerplate.
>>>
>>> This change also lets us move the workaround for the QMP parser
>>> limitation of not ending a parse until } or newline: all calls
>>> through qmp() are passing an object ending in }, so only the
>>> few callers of qmp_raw() have to worry about a trailing newline.
>>> +++ b/tests/libqtest.c
>>> @@ -451,7 +451,7 @@ static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>>>      QString *qstr;
>>>      const char *str;
>>>
>>> -    assert(*fmt);
>>> +    assert(strstr(fmt, "execute"));
>> 
>> I doubt this assertion is worthwhile.
>
> Indeed, and it disappears later in the series.  But it was useful in the
> interim, to prove that ALL callers through this function are passing a
> command name (and therefore my later patches to rewrite qmp() to take a
> command name aren't overlooking any callers).
>
>> 
>> One , qmp_fd_sendv() works just fine whether you include an 'execute' or
>> not.  Two, there are zillions of other ways to send nonsense with
>> qmp_fd_sendv().  If you do, your test doesn't work, so you fix it.
>> 
>> Rejecting nonsensical QMP input is QEMU's job, not libqtest's.
>
> I'm fine omitting the assertions in the next spin, even if they proved
> useful in this revision for making sure I converted everything.

Omitting them is fine.

Keeping them temporarily with a comment why would also be fine, but more
work.

>>>
>>>      /* Test command failure with 'id' */
>>> -    resp = qmp("{ 'execute': 'human-monitor-command', 'id': 2 }");
>>> +    resp = qmp_raw("{ 'execute': 'human-monitor-command', 'id': 2 }");
>>>      g_assert_cmpstr(get_error_class(resp), ==, "GenericError");
>>>      g_assert_cmpint(qdict_get_int(resp, "id"), ==, 2);
>>>      QDECREF(resp);
>> 
>> I'm afraid I don't like this patch.  All the extra function buys us is
>> an assertion that isn't even tight, and the lifting of a newline out of
>> a place where it shouldn't be.
>
> Maybe you'll change your mind by the end of the series, once you see the
> changes to make qmp() shorter (and where those changes necessitate a
> qmp_raw() as the backdoor for anything that is not a normal
> command+arguments).

It's a big series.  I may not see the forest for the trees right now.  A
v2 taking care of the uncontroversial improvements should improve my
view some.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command
  2017-08-09 15:32     ` Eric Blake
@ 2017-08-10  7:40       ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-10  7:40 UTC (permalink / raw)
  To: Eric Blake; +Cc: Stefan Hajnoczi, John Snow, qemu-devel, open list:IDE

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 10:15 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> Upcoming patches will be adding new convenience methods for
>>> constructing QMP commands.  But making every variation of sending
>>> support every variation of response handling becomes unwieldy;
>>> it's easier to specify that discarding a JSON response is
>>> unassociated with sending the command, where qmp_async() already
>>> fits the bill for sending a command without tying up a reference
>>> to the response.
>>>
>>> Doing this renders qtest_qmp[v]_discard_response() unused.
>>>
>>> Bonus: gets rid of a non-literal format string, which is a step
>>> towards compile-time format string checking without triggering
>>> -Wformat-nonliteral.
>> 
>> Where?  (I'm feeling lazy today)
>> 
>
> Sure:
>
>> 
>> +++ b/tests/ide-test.c
>> @@ -624,7 +624,6 @@ static void test_retry_flush(const char *machine)
>>      QPCIDevice *dev;
>>      QPCIBar bmdma_bar, ide_bar;
>>      uint8_t data;
>> -    const char *s;
>> 
>>      prepare_blkdebug_script(debug_path, "flush_to_disk");
>> 
>> @@ -652,8 +651,8 @@ static void test_retry_flush(const char *machine)
>>      qmp_eventwait("STOP");
>> 
>>      /* Complete the command */
>> -    s = "{'execute':'cont' }";
>> -    qmp_discard_response(s);
>> +    qmp_async("{'execute':'cont' }");
>> +    qmp_discard_response();
>
> Yes, I can update the commit message to focus in on it more precisely.

Not enabled by this patch, just cleanup while there.  Recommend to make
that clearer in the commit message.

Aside: I wonder what goes through a developer's head when he writes such
code.  "Too terse, let me splice in a variable" seems unlikely.

[...]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers
  2017-08-09 16:35     ` Eric Blake
@ 2017-08-10  7:47       ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-10  7:47 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 10:34 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> None of our tests were directly using qtest_qmp() and friends;
>>> even tests like postcopy-test.c that manage multiple connections
>>> get along just fine changing global_qtest as needed (other than
>>> one callsite where it forgot to use the inlined form).  It's
>>> also annoying that we have qmp_async() but qtest_async_qmp(),
>>> with inconsistent naming for tracing through the wrappers.
>>>
>
>> What about all the other functions taking a QTestState?  Aren't they
>> just as silly?
>
> What's left after this patch:
>
> - qtest_init()
>   qtest_init_without_qmp_handshake()
>   qtest_quit()
> necessary for setting up parallel state.

"Necessary" is too strong, as you could use qtest_start(); save
global_qtest; qtest_start(); ... qtest_end(); restore global_qtest;
qtest_end().  But I could buy convenient.

> and then a lot of functions that have static inline wrappers (for
> example, qmp_receive(), inb(), ...).
>
> So yes, I could additionally get rid of more wrappers and have even more
> functions implicitly depend on global_qtest.
>
>> Having two of every function is tiresome, but consistent.
>> 
>> Having just one is easier to maintain, so if it serves our needs,
>> possibly with the occasional state switch, I like it.
>> 
>> What I don't like is a mix of the two.
>
> Okay, I'll prune even harder in the next revision.  Deleting cruft is fun!

Yes, please!

>>> +++ b/tests/libqtest.c
>>> @@ -233,9 +233,10 @@ QTestState *qtest_init(const char *extra_args)
>>>      QDict *greeting;
>>>
>>>      /* Read the QMP greeting and then do the handshake */
>>> -    greeting = qtest_qmp_receive(s);
>>> +    greeting = qmp_fd_receive(s->qmp_fd);
>> 
>> Why doesn't this become qmp_receive()?
>
> Because in THIS version of the patch, qmp_receive() is still a static
> inline wrapper that calls qtest_qmp_receive(global_qtest) - but
> global_qtest is not set here.  (If I delete qtest_qmp_receive() and have
> qmp_receive() not be static inline, then we STILL want to operate
> directly on the just-created s->qmp_fd rather than assuming that
> global_qtest == s, when in the body of qtest_init).
>
>>> @@ -446,7 +447,7 @@ QDict *qtest_qmp_receive(QTestState *s)
>>>   * Internal code that converts from interpolated JSON into a message
>>>   * to send over the wire, without waiting for a reply.
>>>   */
>>> -static void qmp_fd_sendv(int fd, const char *fmt, va_list ap)
>>> +static void qtest_qmp_sendv(QTestState *s, const char *fmt, va_list ap)
>> 
>> Why this move in the other direction?
>
> Because it fixes the disparity you pointed out in 12/22 about
> qmp_fd_sendv() no longer being a sane pairing to qmp_fd_send(), AND
> because I needed the .../va_list pairing to work in order for...
>
>>> -char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>>> +static char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
>>>  {
>>>      char *cmd;
>>>      QDict *resp;
>>>      char *ret;
>>>
>>>      cmd = g_strdup_vprintf(fmt, ap);
>>> -    resp = qtest_qmp(s, "{'execute': 'human-monitor-command',"
>>> -                     " 'arguments': {'command-line': %s}}",
>>> -                     cmd);
>>> +    qtest_qmp_send(s, "{'execute': 'human-monitor-command',"
>>> +                   " 'arguments': {'command-line': %s}}", cmd);
>>> +    resp = qtest_qmp_receive(s);
>
> ...this to work.  So now my sane pairing is
> qtest_qmp_send()/qtest_qmp_sendv() - although your argument that
> qtest_qmp_sendf() might have been a nicer name for the ... form may
> still have merit - at least any time the sendv() form is in a public
> header.  Then again, by the end of the series, I managed to get rid of
> all va_list in libqtest.h, needing it only in libqtest.c.

This is all quite confusing to me right now.  I trust I'll do better
with v2.

>>> @@ -889,7 +854,7 @@ void qmp_async(const char *fmt, ...)
>>>      va_list ap;
>>>
>>>      va_start(ap, fmt);
>>> -    qtest_async_qmpv(global_qtest, fmt, ap);
>>> +    qtest_qmp_sendv(global_qtest, fmt, ap);
>>>      va_end(ap);
>>>  }
>> 
>> Hmm.  Before this patch, qmp_async() is the ... buddy of va_list
>> qmp_fd_sendv().  If we keep qmp_fd_sendv(), they should be named
>> accordingly.
>
> What name to use, though?  By the end of the series, we have
> qmp_async(...) but no public va_list form.

Discussed later in the thread.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper
  2017-08-09 21:57     ` Eric Blake
@ 2017-08-10  8:17       ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-10  8:17 UTC (permalink / raw)
  To: Eric Blake
  Cc: open list:IDE, Amit Shah, qemu-devel, Gerd Hoffmann,
	Stefan Hajnoczi, Paolo Bonzini, John Snow, Andreas Färber

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 10:57 AM, Markus Armbruster wrote:
>
>> I don't like the qmp_args name.  It's not about arguments, it's about
>> sending a command with arguments.
>> 
>> I'm afraid I'm getting pretty thorougly confused by the evolving
>> interface.  So I stop and think how it should look like when done.
>
> At a bare minimum, I like your idea that we want:
>
> FOO_send()     # sends a message, does not wait for a reply
> FOO_receive()  # reads one JSON object, returns QObject counterpart
> FOO() # combo of FOO_send() and FOO_receive()
>
> Then FOO_discard() is a convenient shorthand for QDECREF(FOO_receive()).

Yes.

Obvious names for the variations of FOO_send():

FOO_send()    send a string exactly as is
FOO_sendf()   build a string from a template, interpolating from ...
FOO_vsendf()  ditto, interpolating from va_list

Since "send string exactly as is" is uncommon, using a longer name for
it would be okay.  Say FOO_send_string() or FOO_send_raw().

> Which FOO do we need? Right now, we have 'qmp' for anything using the
> global_qtest, 'qtest_qmp' for anything using an explicit QTestState (but
> we're arguing that is overkill), and 'qmp_fd' for anything using a raw
> fd (test-qga.c - and where I added 'qga' in 11/22, although that
> addition was local rather than in libqtest.h).

'qmp', 'qtest_qmp' and 'qmp_fd' sounds good.  I hope we can get rid of
'qtest_qmp'.

> I also just had an insight: it is possible to write a macro
> qmp_send(...) that will expand to qmp_send_cmd(name) if there is only
> one argument, but to qmp_send_cmdf(name, fmt, ...) if there is more than
> one argument (and later expose a public qmp_send_cmdv(name, fmt,
> va_list) as pair if it is needed, although right now it is not).
> Perhaps we can even make the one-arg form expand to qmp_send_cmdf(name,
> " "), if that's enough to silence gcc's -Wformat-zero-length, and if our
> underlying routines are smart enough to recognize a single-space
> argument as not being worthy of calling qobject_from_jsonf() (since
> qobject_from_jsonf() aborts rather than returning NULL when presented
> just whitespace).
>
> In fact, having a macro qmp_send(cmd, ...) expand to
> qmp_send_internal(cmd, " " __VA_ARGS__) might even do the trick without
> preprocessor magic of checking whether __VA_ARGS__ contains a comma
> (although it has the subtle limitation that if present, a format
> argument MUST be a string literal because we now rely on string
> concatenation with " " - although given gcc's -Wformat-nonliteral, we
> are probably okay with that limitation).
>
> So, with a nice macro, the bulk of the testsuite would just write in
> this style:
>
> qmp_send("foo");
> qmp_send("foo", "{literal_args...}");
> qmp_send("foo", "{'name':%s}", value);
>
> for send without waiting, or:
>
> obj = qmp("foo");
> obj = qmp(foo", "{literal_args...}");
> obj = qmp("foo", "{'name':%s}", value);
>
> where the result matters.  And the names we choose for internal
> implementation are no longer quite as important (although still helpful
> to get right).

Play with it, and we'll see how it turns out.

>> We need send and receive.  Convenience functions to do both, and to
>> receive and throw away are nice to have.
>
> Do we want both a convenience function to throw away a single read, AND
> a function to send a command + throw away a read? Prior to this series,
> we have qmp_discard_response() which is send + discard, but nothing that
> does plain discard; although plain discard is a better building block
> (precisely because then we don't have to duplicate all the different
> send forms) - the convenience of send+receive in one call should be
> limited to the most common case.

The interface should provide the basic building blocks.

Convenience functions are welcome when they help the interface' users
write clearer code.  Less code is often clearer code.

> Also, the qmp_eventwait() is a nice convenience function for wait in a
> loop until the received object matches a given name; whether we also
> need the convenience of qmp_eventwait_ref() is a bit more debatable
> (perhaps we could just as easily have qmp_event_wait() always return an
> object, and require the caller to QDECREF() it, for one less function to
> maintain).

See previous paragraph :)

>> We need qmp_raw().  We haven't found a need for a raw receive function.
>
> Yes, qmp_raw() (or maybe it should be named qmp_send_raw(), depending on
> whether the receive is coupled with it?) is our backdoor for sending
> JSON that does not match the normal {'execute':'name','arguments':{}}
> paradigm (and pretty much qmp-test.c, or maybe also test-qga.c, would be
> the only clients).

A "send raw and receive cooked" function feels slightly weird.  Since
it's used only rarely, we might want to avoid the weirdness and use a
pair of calls there.

Apropos raw vs. cooked: the "send cooked" functions convert single
quotes in the template to double quotes.  The "send raw" functions
don't.  Doesn't matter when we send *to* QEMU.  Would be wrong for the
other direction, though.

> [Side node - why can't we pick a consistent naming of our tests?  The
> name 'FOO-test' is a bit nicer than 'test-FOO' when it comes to writing
> .gitignore entries. Should we do a bulk cleanup rename to get all the
> tests into one consistent naming style?]

If you look closely, you'll find that unit tests are generally named
test-FOO.c or (less commonly) check-FOO.c, and libqtest tests
FOO-test.c.  There are exceptions, probably because people don't get
this implicit (and arbitrary!) convention.

>> Convenience functions to build commands and send are nice to have.  They
>> come in pairs, without arguments, to avoid -Wno-format-zero-length
>> (aside: that's one of the sillier warnings).
>
> It's possible to alter CFLAGS to shut gcc up on that one while still
> getting the rest of -Wformat, if we don't think it adds value to qemu.
> My idea above is that you can use a macro to hide the worst of the
> paired nature, so that the bulk of the testsuite can supply or omit an
> arguments format string as desired.
>
>> 
>> We used to have almost everything with and without QTestState, but we're
>> refusing to continue that self-flagellation.
>
> And for v5, I think I'll reorder my series to get rid of QTestState
> sooner, rather than later.

Makes sense.

>> For every function taking ..., we want one taking va_list.
>
> Under the hood, probably.  Whether the va_list form has to be exported
> is a different question (we might be able to get by with just the ... form).

We can omit functions that aren't actually used.  However, when we omit
a va_list buddy, we should keep its name available, in case we need it
later.

>> Makes sense?
>> 
>> Can we derive a sensible set of function names from this?
>> 
>
> I gave it a shot.

Thanks!

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper
  2017-08-09 16:41     ` Eric Blake
@ 2017-08-10  8:19       ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-08-10  8:19 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 10:59 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> Leaving interpolation into JSON to qobject_from_jsonf() is more
>>> robust than building QMP input manually; however, we have a few
>>> places where code is already creating a QDict to interpolate
>>> individual arguments, which cannot be reproduced with the
>>> qobject_from_jsonf() parser.  Expose a public wrapper
>>> qmp_args_dict() for the internal helper qmp_args_dict_async()
>>> that we needed earlier for qmp_args(), and fix a test to use
>>> the new helper.
>>>
>>> Signed-off-by: Eric Blake <eblake@redhat.com>
>>> ---
>
>>> +++ b/tests/device-introspect-test.c
>>> @@ -36,8 +36,7 @@ static QList *qom_list_types(const char *implements, bool abstract)
>>>      if (implements) {
>>>          qdict_put_str(args, "implements", implements);
>>>      }
>>> -    resp = qmp("{'execute': 'qom-list-types',"
>>> -               " 'arguments': %p }", args);
>>> +    resp = qmp_args_dict("qom-list-types", args);
>>>      g_assert(qdict_haskey(resp, "return"));
>>>      ret = qdict_get_qlist(resp, "return");
>>>      QINCREF(ret);
>> 
>> If we had five of these, the helper would be worth its keep.
>
> This patch only  has one client, but 20/22 adds another.  Is having 2
> clients sufficient to keep it (not quite the 5 that makes it obvious,
> but still a good reuse of code)?

Your idea to use macros might make this a moot question.  Let's revisit
it in v2.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv() Eric Blake
  2017-08-09  7:59   ` Markus Armbruster
@ 2017-09-11 21:52   ` Eric Blake
  2017-10-02  7:15     ` Markus Armbruster
  1 sibling, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-09-11 21:52 UTC (permalink / raw)
  To: qemu-devel; +Cc: armbru, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 1117 bytes --]

On 08/03/2017 08:25 PM, Eric Blake wrote:
> qobject_from_jsonv() was unusual in that it took a va_list*, instead
> of the more typical va_list; this was so that callers could pass
> NULL to avoid % interpolation.  While this works under the hood, it
> is awkward for callers, so move the magic into qjson.c rather than
> in the public interface, and finally improve the documentation of
> qobject_from_jsonf().
> 

> +/*
> + * va_list form of qobject_from_jsonf().
> + *
> + * IMPORTANT: This function aborts on error, thus it must not
> + * be used with untrusted arguments.
> + */
> +QObject *qobject_from_jsonv(const char *string, va_list ap)
> +{

Given your comments on vararg naming elsewhere in the series, I'm also
thinking this is a good chance to fix this to be named
qobject_from_vjsonf() (making it obvious it is the va_list form of
formatted json, and similar to printf/vprintf or my
qtest_startf/qtest_vstartf in my v7 preliminary cleanup series).

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-08-09 13:14     ` Eric Blake
@ 2017-10-02  5:46       ` Markus Armbruster
  2017-10-02 14:30         ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Markus Armbruster @ 2017-10-02  5:46 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, Michael Roth

Eric Blake <eblake@redhat.com> writes:

> On 08/09/2017 02:59 AM, Markus Armbruster wrote:
>> Eric Blake <eblake@redhat.com> writes:
>> 
>>> qobject_from_jsonv() was unusual in that it took a va_list*, instead
>>> of the more typical va_list; this was so that callers could pass
>>> NULL to avoid % interpolation.  While this works under the hood, it
>>> is awkward for callers, so move the magic into qjson.c rather than
>>> in the public interface, and finally improve the documentation of
>>> qobject_from_jsonf().
>>>
>
>>> -    /* Going through qobject ensures we escape strings properly.
>>> -     * This seemingly unnecessary copy is required in case va_list
>>> -     * is an array type.
>>> -     */
>>> -    va_copy(ap_copy, ap);
>>> -    qobj = qobject_from_jsonv(fmt, &ap_copy, &error_abort);
>>> -    va_end(ap_copy);
>>> +    /* Going through qobject ensures we escape strings properly. */
>>> +    qobj = qobject_from_jsonv(fmt, ap);
>>>      qstr = qobject_to_json(qobj);
>>>
>>>      /*
>> 
>> Wait!  Oh, the va_copy() moves iinto qobject_from_jsonv().  Okay, I
>> guess.
[...]
>>> +
>>> +    /*
>>> +     * This seemingly unnecessary copy is required in case va_list
>>> +     * is an array type.
>>> +     */
>> 
>> --verbose?
>>
>>> +    va_copy(ap_copy, ap);
>>> +    obj = qobject_from_json_internal(string, &ap_copy, &error_abort);
>>> +    va_end(ap_copy);
>
> Code motion. But if the comment needs to be more verbose in the
> destination than it was on the source, the rationale is that C99/POSIX
> allows 'typedef something va_list[]' (that is, where va_list is an array
> of some other type), although I don't know of any modern OS that
> actually defines it like that.  Based on C pointer-decay rules, '&ap'
> has a different type based on whether va_list was a struct/pointer or an
> array type, when 'va_list ap' was passed as a parameter; so we can't
> portably use qobject_from_json_internal(string, &ap, &error_abort).  The
> va_copy() is what lets us guarantee that &ap_list is a pointer to a
> va_list regardless of the type of va_list (because va_copy was declared
> locally, rather than in a parameter list, and is therefore not subject
> to pointer decay), and NOT an accidental pointer to first element of the
> va_list array on platforms where va_list is an array.

I'm dense this Monday morning --- I still can't see where exactly
passing &ap directly goes wrong.

Two cases:

1. va_list is a typedef name for a non-array type T.

2. va_list is a typedef name for an array type E[].

What are the types of actual argument &ap and formal parameter va_list
*ap in either case?

How exactly does case 2 break?

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-09-11 21:52   ` Eric Blake
@ 2017-10-02  7:15     ` Markus Armbruster
  0 siblings, 0 replies; 66+ messages in thread
From: Markus Armbruster @ 2017-10-02  7:15 UTC (permalink / raw)
  To: Eric Blake; +Cc: qemu-devel, Michael Roth

Eric Blake <eblake@redhat.com> writes:

> On 08/03/2017 08:25 PM, Eric Blake wrote:
>> qobject_from_jsonv() was unusual in that it took a va_list*, instead
>> of the more typical va_list; this was so that callers could pass
>> NULL to avoid % interpolation.  While this works under the hood, it
>> is awkward for callers, so move the magic into qjson.c rather than
>> in the public interface, and finally improve the documentation of
>> qobject_from_jsonf().
>> 
>
>> +/*
>> + * va_list form of qobject_from_jsonf().
>> + *
>> + * IMPORTANT: This function aborts on error, thus it must not
>> + * be used with untrusted arguments.
>> + */
>> +QObject *qobject_from_jsonv(const char *string, va_list ap)
>> +{
>
> Given your comments on vararg naming elsewhere in the series, I'm also
> thinking this is a good chance to fix this to be named
> qobject_from_vjsonf() (making it obvious it is the va_list form of
> formatted json, and similar to printf/vprintf or my
> qtest_startf/qtest_vstartf in my v7 preliminary cleanup series).

Yes, please.

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-10-02  5:46       ` Markus Armbruster
@ 2017-10-02 14:30         ` Eric Blake
  2018-01-08 16:46           ` Eric Blake
  0 siblings, 1 reply; 66+ messages in thread
From: Eric Blake @ 2017-10-02 14:30 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 3582 bytes --]

On 10/02/2017 12:46 AM, Markus Armbruster wrote:

>>>> +    /*
>>>> +     * This seemingly unnecessary copy is required in case va_list
>>>> +     * is an array type.
>>>> +     */
>>>
>>> --verbose?
>>>
>>>> +    va_copy(ap_copy, ap);
>>>> +    obj = qobject_from_json_internal(string, &ap_copy, &error_abort);
>>>> +    va_end(ap_copy);
>>
>> Code motion. But if the comment needs to be more verbose in the
>> destination than it was on the source, the rationale is that C99/POSIX
>> allows 'typedef something va_list[]' (that is, where va_list is an array
>> of some other type), although I don't know of any modern OS that
>> actually defines it like that.  Based on C pointer-decay rules, '&ap'
>> has a different type based on whether va_list was a struct/pointer or an
>> array type, when 'va_list ap' was passed as a parameter; so we can't
>> portably use qobject_from_json_internal(string, &ap, &error_abort).  The
>> va_copy() is what lets us guarantee that &ap_list is a pointer to a
>> va_list regardless of the type of va_list (because va_copy was declared
>> locally, rather than in a parameter list, and is therefore not subject
>> to pointer decay), and NOT an accidental pointer to first element of the
>> va_list array on platforms where va_list is an array.
> 
> I'm dense this Monday morning --- I still can't see where exactly
> passing &ap directly goes wrong.
> 
> Two cases:
> 
> 1. va_list is a typedef name for a non-array type T.
> 
> 2. va_list is a typedef name for an array type E[].
> 
> What are the types of actual argument &ap and formal parameter va_list
> *ap in either case?
> 
> How exactly does case 2 break?

An example program is probably the best to visualize the problem:

$ cat typefun.c
#include <stdio.h>

typedef struct T {
    int i[5];
} T;
typedef struct E {
    int i;
} E;

typedef T list1;
typedef E list2[5];

void bar(const char *prefix, list1 *l1, list2 *l2) {
    printf ("%s: %zu %zu\n", prefix, sizeof(&l1), sizeof(&l2));
}

void foo(list1 l1, list2 l2) {
    printf ("parameter sizes: %zu %zu\n", sizeof(l1), sizeof(l2));
    bar("called with address of parameter", &l1, &l2);
}

int main(void) {
    list1 l1;
    list2 l2;
    printf ("local variable sizes: %zu %zu\n", sizeof(l1), sizeof(l2));
    bar("called with address of local variable", &l1, &l2);
    foo(l1, l2);
    return 0;
}

$ gcc -o typefun -Wall typefun.c
typefun.c: In function ‘foo’:
typefun.c:18:61: warning: ‘sizeof’ on array function parameter ‘l2’ will
return size of ‘E * {aka struct E *}’ [-Wsizeof-array-argument]
     printf ("parameter sizes: %zu %zu\n", sizeof(l1), sizeof(l2));
                                                             ^
typefun.c:17:26: note: declared here
 void foo(list1 l1, list2 l2) {
                          ^~
typefun.c:19:50: warning: passing argument 3 of ‘bar’ from incompatible
pointer type [-Wincompatible-pointer-types]
     bar("called with address of parameter", &l1, &l2);
                                                  ^
typefun.c:13:6: note: expected ‘E (*)[5] {aka struct E (*)[5]}’ but
argument is of type ‘E ** {aka struct E **}’
 void bar(const char *prefix, list1 *l1, list2 *l2) {
      ^~~

$ ./typefun
local variable sizes: 20 20
called with address of local variable: 8 8
parameter sizes: 20 8
called with address of parameter: 8 8

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

* Re: [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv()
  2017-10-02 14:30         ` Eric Blake
@ 2018-01-08 16:46           ` Eric Blake
  0 siblings, 0 replies; 66+ messages in thread
From: Eric Blake @ 2018-01-08 16:46 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael Roth

[-- Attachment #1: Type: text/plain, Size: 1948 bytes --]

On 10/02/2017 09:30 AM, Eric Blake wrote:
> On 10/02/2017 12:46 AM, Markus Armbruster wrote:
> 
>>>>> +    /*
>>>>> +     * This seemingly unnecessary copy is required in case va_list
>>>>> +     * is an array type.
>>>>> +     */
>>>>
>>>> --verbose?
>>>>
>>>>> +    va_copy(ap_copy, ap);
>>>>> +    obj = qobject_from_json_internal(string, &ap_copy, &error_abort);
>>>>> +    va_end(ap_copy);
>>>
>>> Code motion. But if the comment needs to be more verbose in the
>>> destination than it was on the source, the rationale is that C99/POSIX
>>> allows 'typedef something va_list[]' (that is, where va_list is an array
>>> of some other type), although I don't know of any modern OS that
>>> actually defines it like that.  Based on C pointer-decay rules, '&ap'
>>> has a different type based on whether va_list was a struct/pointer or an
>>> array type, when 'va_list ap' was passed as a parameter; so we can't
>>> portably use qobject_from_json_internal(string, &ap, &error_abort).  The
>>> va_copy() is what lets us guarantee that &ap_list is a pointer to a
>>> va_list regardless of the type of va_list (because va_copy was declared
>>> locally, rather than in a parameter list, and is therefore not subject
>>> to pointer decay), and NOT an accidental pointer to first element of the
>>> va_list array on platforms where va_list is an array.

When I first wrote that, I didn't know where it mattered in practice;
now I do.  Here's a gcc non-bug:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=14557

that documents a workaround of using a macro va_ptr() because there ARE
existing modern platforms that use an array type for va_list:
https://sourceware.org/ml/newlib/2017/msg01302.html

I don't know if va_ptr() is any more elegant than the va_copy() used in
my code motion.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 619 bytes --]

^ permalink raw reply	[flat|nested] 66+ messages in thread

end of thread, other threads:[~2018-01-08 16:46 UTC | newest]

Thread overview: 66+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-04  1:25 [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 01/22] qobject: Accept "%"PRId64 in qobject_from_jsonf() Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 02/22] tests: Clean up wait for event Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 03/22] tests/libqtest: Clean up how we read the QMP greeting Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 04/22] tests: Add assertion for no qmp("") Eric Blake
2017-08-09  7:13   ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 05/22] qobject: Simplify qobject_from_jsonv() Eric Blake
2017-08-09  7:59   ` Markus Armbruster
2017-08-09 13:14     ` Eric Blake
2017-10-02  5:46       ` Markus Armbruster
2017-10-02 14:30         ` Eric Blake
2018-01-08 16:46           ` Eric Blake
2017-09-11 21:52   ` Eric Blake
2017-10-02  7:15     ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 06/22] qobject: Perform %% interpolation in qobject_from_jsonf() Eric Blake
2017-08-09  9:06   ` Markus Armbruster
2017-08-09 13:21     ` Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 07/22] numa-test: Use hmp() Eric Blake
2017-08-09  9:07   ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 08/22] qtest: Avoid passing raw strings through hmp() Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 09/22] qtest: Document calling conventions Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 10/22] libqtest: Skip round-trip through QObject Eric Blake
2017-08-09 10:10   ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 11/22] test-qga: Simplify command construction Eric Blake
2017-08-09 11:40   ` Markus Armbruster
2017-08-09 13:29     ` Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 12/22] libqtest: Change qmp_fd_send() to drop varargs Eric Blake
2017-08-09 13:18   ` Markus Armbruster
2017-08-09 13:44     ` Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 13/22] libqtest: Add qmp_raw() Eric Blake
2017-08-09 14:54   ` Markus Armbruster
2017-08-09 15:18     ` Eric Blake
2017-08-10  7:29       ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 14/22] libqtest: Separate qmp_discard_response() from command Eric Blake
2017-08-09 15:15   ` Markus Armbruster
2017-08-09 15:32     ` Eric Blake
2017-08-10  7:40       ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 15/22] libqtest: Delete qtest_qmp() wrappers Eric Blake
2017-08-09 15:34   ` Markus Armbruster
2017-08-09 16:35     ` Eric Blake
2017-08-10  7:47       ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 16/22] libqtest: Add qmp_cmd() helper Eric Blake
2017-08-09 15:40   ` Markus Armbruster
2017-08-09 16:39     ` Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 17/22] libqtest: Add qmp_args() helper Eric Blake
2017-08-09 15:57   ` Markus Armbruster
2017-08-09 21:57     ` Eric Blake
2017-08-10  8:17       ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 18/22] tests/libqos/usb: Clean up string interpolation into QMP input Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 19/22] libqtest: Add qmp_args_dict() helper Eric Blake
2017-08-09 15:59   ` Markus Armbruster
2017-08-09 16:41     ` Eric Blake
2017-08-10  8:19       ` Markus Armbruster
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 20/22] tests/libqos/pci: Clean up string interpolation into QMP input Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 21/22] libqtest: Drop now-unused qmp() Eric Blake
2017-08-09 16:01   ` Markus Armbruster
2017-08-09 16:43     ` Eric Blake
2017-08-04  1:25 ` [Qemu-devel] [PATCH v4 22/22] libqtest: Rename qmp_cmd() to qmp() Eric Blake
2017-08-04  1:54 ` [Qemu-devel] [PATCH v4 00/22] Clean up around qmp() and hmp() no-reply
2017-08-04 11:50   ` Eric Blake
2017-08-04 12:10     ` Fam Zheng
2017-08-07  6:43       ` Fam Zheng
2017-08-07  7:33         ` Fam Zheng
2017-08-07 14:08           ` Philippe Mathieu-Daudé
2017-08-07  8:09   ` Fam Zheng
2017-08-04  2:02 ` no-reply

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.