get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/808938/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 808938,
    "url": "http://patchwork.ozlabs.org/api/patches/808938/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901180340.30009-29-eblake@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20170901180340.30009-29-eblake@redhat.com>",
    "list_archive_url": null,
    "date": "2017-09-01T18:03:39",
    "name": "[v6,28/29] libqtest: Remove qtest_start() and qtest_end() shortcuts",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "ccdd833d6a1028d6b9d8c5540a7cff156e4c819c",
    "submitter": {
        "id": 6591,
        "url": "http://patchwork.ozlabs.org/api/people/6591/?format=api",
        "name": "Eric Blake",
        "email": "eblake@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20170901180340.30009-29-eblake@redhat.com/mbox/",
    "series": [
        {
            "id": 1089,
            "url": "http://patchwork.ozlabs.org/api/series/1089/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1089",
            "date": "2017-09-01T18:03:12",
            "name": "Preliminary libqtest cleanups",
            "version": 6,
            "mbox": "http://patchwork.ozlabs.org/series/1089/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/808938/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/808938/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx05.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=eblake@redhat.com"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xkSNt2WFDz9sPk\n\tfor <incoming@patchwork.ozlabs.org>;\n\tSat,  2 Sep 2017 04:26:06 +1000 (AEST)",
            "from localhost ([::1]:53519 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dnqdo-00034Y-21\n\tfor incoming@patchwork.ozlabs.org; Fri, 01 Sep 2017 14:26:04 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:56784)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dnqJO-00081a-BN\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 14:05:09 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <eblake@redhat.com>) id 1dnqJH-0002NF-QE\n\tfor qemu-devel@nongnu.org; Fri, 01 Sep 2017 14:04:58 -0400",
            "from mx1.redhat.com ([209.132.183.28]:44074)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <eblake@redhat.com>)\n\tid 1dnqJ3-0002CM-Ug; Fri, 01 Sep 2017 14:04:38 -0400",
            "from smtp.corp.redhat.com\n\t(int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id EB86B15552;\n\tFri,  1 Sep 2017 18:04:36 +0000 (UTC)",
            "from red.redhat.com (ovpn-121-149.rdu2.redhat.com [10.10.121.149])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 26D5162929;\n\tFri,  1 Sep 2017 18:04:28 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com EB86B15552",
        "From": "Eric Blake <eblake@redhat.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Fri,  1 Sep 2017 13:03:39 -0500",
        "Message-Id": "<20170901180340.30009-29-eblake@redhat.com>",
        "In-Reply-To": "<20170901180340.30009-1-eblake@redhat.com>",
        "References": "<20170901180340.30009-1-eblake@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.15",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.29]);\n\tFri, 01 Sep 2017 18:04:37 +0000 (UTC)",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "209.132.183.28",
        "Subject": "[Qemu-devel] [PATCH v6 28/29] libqtest: Remove qtest_start() and\n\tqtest_end() shortcuts",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "Thomas Huth <thuth@redhat.com>,\n\t\"open list:Floppy\" <qemu-block@nongnu.org>, Ben Warren\n\t<ben@skyportsystems.com>, \"Michael S. Tsirkin\" <mst@redhat.com>, \n\tJason Wang <jasowang@redhat.com>, Amit Shah <amit@kernel.org>, \n\tarmbru@redhat.com, Alexander Graf <agraf@suse.de>, \n\tKeith Busch <keith.busch@intel.com>, \"open list:sPAPR\"\n\t<qemu-ppc@nongnu.org>, Gerd Hoffmann <kraxel@redhat.com>, Stefan\n\tHajnoczi <stefanha@redhat.com>, pbonzini@redhat.com, John Snow\n\t<jsnow@redhat.com>, =?utf-8?q?Andreas_F=C3=A4rber?= <afaerber@suse.de>,\n\t\"Dr. David Alan Gilbert\" <dgilbert@redhat.com>, David Gibson\n\t<david@gibson.dropbear.id.au>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "Remove the trivial wrappers qtest_start() and qtest_end(), to make\nit obvious in the rest of the testsuite where we are still relying on\nglobal_qtest.  Doing this makes it easier to see what remaining\ncleanups will be needed if we don't want an implicit dependency\non global state.  Many tests can also take advantage of qtest_init()\ndoing formatting of args, avoiding a temporary local variable.\n\nSigned-off-by: Eric Blake <eblake@redhat.com>\n---\n tests/libqtest.h               | 26 ------------------\n tests/libqtest.c               |  4 +--\n tests/ac97-test.c              |  4 +--\n tests/boot-order-test.c        | 11 +++-----\n tests/boot-serial-test.c       | 12 +++------\n tests/device-introspect-test.c | 24 ++++++++---------\n tests/display-vga-test.c       | 18 +++++--------\n tests/drive_del-test.c         | 17 ++++++------\n tests/ds1338-test.c            |  2 +-\n tests/e1000-test.c             | 10 ++-----\n tests/e1000e-test.c            | 14 +++-------\n tests/eepro100-test.c          | 11 ++------\n tests/endianness-test.c        | 33 +++++++++--------------\n tests/es1370-test.c            |  4 +--\n tests/fdc-test.c               |  4 +--\n tests/hd-geo-test.c            | 16 +++++------\n tests/i440fx-test.c            | 16 +++++------\n tests/i82801b11-test.c         |  5 ++--\n tests/ide-test.c               |  4 +--\n tests/intel-hda-test.c         | 11 ++++----\n tests/ioh3420-test.c           |  7 ++---\n tests/ipmi-bt-test.c           | 11 +++-----\n tests/ipmi-kcs-test.c          |  5 +---\n tests/ipoctal232-test.c        |  5 ++--\n tests/ivshmem-test.c           |  4 +--\n tests/libqos/libqos.c          |  2 +-\n tests/m25p80-test.c            |  9 +++----\n tests/m48t59-test.c            |  2 +-\n tests/ne2000-test.c            |  4 +--\n tests/numa-test.c              | 28 ++++++++++----------\n tests/nvme-test.c              |  7 ++---\n tests/pc-cpu-test.c            | 26 +++++++-----------\n tests/pcnet-test.c             |  4 +--\n tests/pnv-xscom-test.c         | 14 ++--------\n tests/prom-env-test.c          | 13 ++++-----\n tests/pvpanic-test.c           |  4 +--\n tests/pxe-test.c               | 14 ++++------\n tests/q35-test.c               |  8 +++---\n tests/qom-test.c               |  7 ++---\n tests/rtc-test.c               |  2 +-\n tests/rtl8139-test.c           |  4 +--\n tests/spapr-phb-test.c         |  5 ++--\n tests/tco-test.c               | 12 ++++-----\n tests/test-arm-mptimer.c       |  4 +--\n tests/test-filter-mirror.c     | 16 +++++------\n tests/test-filter-redirector.c | 60 ++++++++++++++++++++----------------------\n tests/test-hmp.c               |  7 ++---\n tests/test-netfilter.c         |  9 +++----\n tests/test-x86-cpuid-compat.c  | 13 ++++-----\n tests/tmp105-test.c            |  2 +-\n tests/tpci200-test.c           |  4 +--\n tests/usb-hcd-ehci-test.c      | 25 +++++++++---------\n tests/usb-hcd-ohci-test.c      |  4 +--\n tests/usb-hcd-xhci-test.c      |  4 +--\n tests/virtio-balloon-test.c    |  4 +--\n tests/virtio-blk-test.c        | 13 ++++-----\n tests/virtio-console-test.c    |  8 +++---\n tests/virtio-net-test.c        |  4 +--\n tests/virtio-rng-test.c        |  4 +--\n tests/virtio-serial-test.c     |  4 +--\n tests/vmgenid-test.c           | 29 ++++++--------------\n tests/vmxnet3-test.c           |  4 +--\n 62 files changed, 267 insertions(+), 394 deletions(-)",
    "diff": "diff --git a/tests/libqtest.h b/tests/libqtest.h\nindex d338de3e22..0459526187 100644\n--- a/tests/libqtest.h\n+++ b/tests/libqtest.h\n@@ -509,32 +509,6 @@ void qtest_add_data_func_full(const char *str, void *data,\n void qtest_add_abrt_handler(GHookFunc fn, const void *data);\n\n /**\n- * qtest_start:\n- * @args: other arguments to pass to QEMU\n- *\n- * Start QEMU and assign the resulting #QTestState to a global variable.\n- * The global variable is used by \"shortcut\" functions documented below.\n- *\n- * Returns: #QTestState instance.\n- */\n-static inline QTestState *qtest_start(const char *args)\n-{\n-    global_qtest = qtest_init(\"%s\", args);\n-    return global_qtest;\n-}\n-\n-/**\n- * qtest_end:\n- *\n- * Shut down the QEMU process started by qtest_start().\n- */\n-static inline void qtest_end(void)\n-{\n-    qtest_quit(global_qtest);\n-    global_qtest = NULL;\n-}\n-\n-/**\n  * qmp:\n  * @fmt...: QMP message to send to qemu\n  *\ndiff --git a/tests/libqtest.c b/tests/libqtest.c\nindex 18facbf130..fa4e47c137 100644\n--- a/tests/libqtest.c\n+++ b/tests/libqtest.c\n@@ -970,7 +970,7 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine))\n     QString *qstr;\n     const char *mname;\n\n-    qtest_start(\"-machine none\");\n+    global_qtest = qtest_init(\"-machine none\");\n     response = qmp(\"{ 'execute': 'query-machines' }\");\n     g_assert(response);\n     list = qdict_get_qlist(response, \"return\");\n@@ -987,6 +987,6 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine))\n         cb(mname);\n     }\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     QDECREF(response);\n }\ndiff --git a/tests/ac97-test.c b/tests/ac97-test.c\nindex e0d177bd9c..6a1edaa85a 100644\n--- a/tests/ac97-test.c\n+++ b/tests/ac97-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/ac97/nop\", nop);\n\n-    qtest_start(\"-device AC97\");\n+    global_qtest = qtest_init(\"-device AC97\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/boot-order-test.c b/tests/boot-order-test.c\nindex 5fc2ca8e9e..e6efea6852 100644\n--- a/tests/boot-order-test.c\n+++ b/tests/boot-order-test.c\n@@ -28,14 +28,12 @@ static void test_a_boot_order(const char *machine,\n                               uint64_t expected_boot,\n                               uint64_t expected_reboot)\n {\n-    char *args;\n     uint64_t actual;\n\n-    args = g_strdup_printf(\"-nodefaults%s%s %s\",\n-                           machine ? \" -M \" : \"\",\n-                           machine ?: \"\",\n-                           test_args);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-nodefaults%s%s %s\",\n+                              machine ? \" -M \" : \"\",\n+                              machine ?: \"\",\n+                              test_args);\n     actual = read_boot_order();\n     g_assert_cmphex(actual, ==, expected_boot);\n     qmp_discard_response(\"{ 'execute': 'system_reset' }\");\n@@ -47,7 +45,6 @@ static void test_a_boot_order(const char *machine,\n     actual = read_boot_order();\n     g_assert_cmphex(actual, ==, expected_reboot);\n     qtest_quit(global_qtest);\n-    g_free(args);\n }\n\n static void test_boot_orders(const char *machine,\ndiff --git a/tests/boot-serial-test.c b/tests/boot-serial-test.c\nindex b95c5e74ea..d7c0c320d7 100644\n--- a/tests/boot-serial-test.c\n+++ b/tests/boot-serial-test.c\n@@ -71,7 +71,6 @@ done:\n static void test_machine(const void *data)\n {\n     const testdef_t *test = data;\n-    char *args;\n     char tmpname[] = \"/tmp/qtest-boot-serial-XXXXXX\";\n     int fd;\n\n@@ -82,18 +81,15 @@ static void test_machine(const void *data)\n      * Make sure that this test uses tcg if available: It is used as a\n      * fast-enough smoketest for that.\n      */\n-    args = g_strdup_printf(\"-M %s,accel=tcg:kvm \"\n-                           \"-chardev file,id=serial0,path=%s \"\n-                           \"-no-shutdown -serial chardev:serial0 %s\",\n-                           test->machine, tmpname, test->extra);\n-\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M %s,accel=tcg:kvm \"\n+                              \"-chardev file,id=serial0,path=%s \"\n+                              \"-no-shutdown -serial chardev:serial0 %s\",\n+                              test->machine, tmpname, test->extra);\n     unlink(tmpname);\n\n     check_guest_output(test, fd);\n     qtest_quit(global_qtest);\n\n-    g_free(args);\n     close(fd);\n }\n\ndiff --git a/tests/device-introspect-test.c b/tests/device-introspect-test.c\nindex f7162c023f..1c23b71038 100644\n--- a/tests/device-introspect-test.c\n+++ b/tests/device-introspect-test.c\n@@ -126,7 +126,7 @@ static void test_device_intro_list(void)\n     QList *types;\n     char *help;\n\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n\n     types = device_type_list(true);\n     QDECREF(types);\n@@ -134,7 +134,7 @@ static void test_device_intro_list(void)\n     help = hmp(\"device_add help\");\n     g_free(help);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n /*\n@@ -167,7 +167,7 @@ static void test_qom_list_fields(void)\n     QList *non_abstract;\n     QListEntry *e;\n\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n\n     all_types = qom_list_types(NULL, true);\n     non_abstract = qom_list_types(NULL, false);\n@@ -189,21 +189,21 @@ static void test_qom_list_fields(void)\n\n     QDECREF(all_types);\n     QDECREF(non_abstract);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_device_intro_none(void)\n {\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n     test_one_device(\"nonexistent\");\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_device_intro_abstract(void)\n {\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n     test_one_device(\"device\");\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_device_intro_concrete(void)\n@@ -212,7 +212,7 @@ static void test_device_intro_concrete(void)\n     QListEntry *entry;\n     const char *type;\n\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n     types = device_type_list(false);\n\n     QLIST_FOREACH_ENTRY(types, entry) {\n@@ -223,7 +223,7 @@ static void test_device_intro_concrete(void)\n     }\n\n     QDECREF(types);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_abstract_interfaces(void)\n@@ -232,7 +232,7 @@ static void test_abstract_interfaces(void)\n     QListEntry *e;\n     QDict *index;\n\n-    qtest_start(common_args);\n+    global_qtest = qtest_init(\"%s\", common_args);\n\n     all_types = qom_list_types(\"interface\", true);\n     index = qom_type_index(all_types);\n@@ -257,7 +257,7 @@ static void test_abstract_interfaces(void)\n\n     QDECREF(all_types);\n     QDECREF(index);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/display-vga-test.c b/tests/display-vga-test.c\nindex 2d7d24eee0..51c6feaaf1 100644\n--- a/tests/display-vga-test.c\n+++ b/tests/display-vga-test.c\n@@ -12,39 +12,33 @@\n\n static void pci_cirrus(void)\n {\n-    qtest_start(\"-vga none -device cirrus-vga\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device cirrus-vga\"));\n }\n\n static void pci_stdvga(void)\n {\n-    qtest_start(\"-vga none -device VGA\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device VGA\"));\n }\n\n static void pci_secondary(void)\n {\n-    qtest_start(\"-vga none -device secondary-vga\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device secondary-vga\"));\n }\n\n static void pci_multihead(void)\n {\n-    qtest_start(\"-vga none -device VGA -device secondary-vga\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device VGA -device secondary-vga\"));\n }\n\n static void pci_virtio_gpu(void)\n {\n-    qtest_start(\"-vga none -device virtio-gpu-pci\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device virtio-gpu-pci\"));\n }\n\n #ifdef CONFIG_VIRTIO_VGA\n static void pci_virtio_vga(void)\n {\n-    qtest_start(\"-vga none -device virtio-vga\");\n-    qtest_end();\n+    qtest_quit(qtest_init(\"-vga none -device virtio-vga\"));\n }\n #endif\n\ndiff --git a/tests/drive_del-test.c b/tests/drive_del-test.c\nindex 2175139abb..602ab062b4 100644\n--- a/tests/drive_del-test.c\n+++ b/tests/drive_del-test.c\n@@ -45,7 +45,7 @@ static void device_del(void)\n static void test_drive_without_dev(void)\n {\n     /* Start with an empty drive */\n-    qtest_start(\"-drive if=none,id=drive0\");\n+    global_qtest = qtest_init(\"-drive if=none,id=drive0\");\n\n     /* Delete the drive */\n     drive_del();\n@@ -55,7 +55,7 @@ static void test_drive_without_dev(void)\n      */\n     drive_add();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_after_failed_device_add(void)\n@@ -63,7 +63,7 @@ static void test_after_failed_device_add(void)\n     QDict *response;\n     QDict *error;\n\n-    qtest_start(\"-drive if=none,id=drive0\");\n+    global_qtest = qtest_init(\"-drive if=none,id=drive0\");\n\n     /* Make device_add fail.  If this leaks the virtio-blk-pci device then a\n      * reference to drive0 will also be held (via qdev properties).\n@@ -86,15 +86,16 @@ static void test_after_failed_device_add(void)\n      */\n     drive_add();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_drive_del_device_del(void)\n {\n     /* Start with a drive used by a device that unplugs instantaneously */\n-    qtest_start(\"-drive if=none,id=drive0,file=null-co://,format=raw\"\n-                \" -device virtio-scsi-pci\"\n-                \" -device scsi-hd,drive=drive0,id=dev0\");\n+    global_qtest = qtest_init(\n+        \"-drive if=none,id=drive0,file=null-co://,format=raw\"\n+        \" -device virtio-scsi-pci\"\n+        \" -device scsi-hd,drive=drive0,id=dev0\");\n\n     /*\n      * Delete the drive, and then the device\n@@ -103,7 +104,7 @@ static void test_drive_del_device_del(void)\n     drive_del();\n     device_del();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/ds1338-test.c b/tests/ds1338-test.c\nindex 26968bc82a..da5b852351 100644\n--- a/tests/ds1338-test.c\n+++ b/tests/ds1338-test.c\n@@ -60,7 +60,7 @@ int main(int argc, char **argv)\n\n     g_test_init(&argc, &argv, NULL);\n\n-    s = qtest_start(\"-display none -machine imx25-pdk\");\n+    s = global_qtest = qtest_init(\"-display none -machine imx25-pdk\");\n     i2c = imx_i2c_create(IMX25_I2C_0_BASE);\n     addr = DS1338_ADDR;\n\ndiff --git a/tests/e1000-test.c b/tests/e1000-test.c\nindex 0c5fcdcc44..59bd8b781f 100644\n--- a/tests/e1000-test.c\n+++ b/tests/e1000-test.c\n@@ -15,15 +15,9 @@ static void test_device(gconstpointer data)\n {\n     const char *model = data;\n     QTestState *s;\n-    char *args;\n\n-    args = g_strdup_printf(\"-device %s\", model);\n-    s = qtest_start(args);\n-\n-    if (s) {\n-        qtest_quit(s);\n-    }\n-    g_free(args);\n+    s = qtest_init(\"-device %s\", model);\n+    qtest_quit(s);\n }\n\n static const char *models[] = {\ndiff --git a/tests/e1000e-test.c b/tests/e1000e-test.c\nindex 32aa738b72..6ef240dc8f 100644\n--- a/tests/e1000e-test.c\n+++ b/tests/e1000e-test.c\n@@ -380,17 +380,11 @@ static void e1000e_device_clear(QPCIBus *bus, e1000e_device *d)\n\n static void data_test_init(e1000e_device *d)\n {\n-    char *cmdline;\n-\n     int ret = socketpair(PF_UNIX, SOCK_STREAM, 0, test_sockets);\n     g_assert_cmpint(ret, != , -1);\n\n-    cmdline = g_strdup_printf(\"-netdev socket,fd=%d,id=hs0 \"\n+    global_qtest = qtest_init(\"-netdev socket,fd=%d,id=hs0 \"\n                               \"-device e1000e,netdev=hs0\", test_sockets[1]);\n-    g_assert_nonnull(cmdline);\n-\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n\n     test_alloc = pc_alloc_init(global_qtest);\n     g_assert_nonnull(test_alloc);\n@@ -408,7 +402,7 @@ static void data_test_clear(e1000e_device *d)\n     pc_alloc_uninit(test_alloc);\n     g_free(d->pci_dev);\n     qpci_free_pc(test_bus);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_e1000e_init(gconstpointer data)\n@@ -458,12 +452,12 @@ static void test_e1000e_hotplug(gconstpointer data)\n {\n     static const uint8_t slot = 0x06;\n\n-    qtest_start(\"-device e1000e\");\n+    global_qtest = qtest_init(\"-device e1000e\");\n\n     qpci_plug_device_test(\"e1000e\", \"e1000e_net\", slot, NULL);\n     qpci_unplug_acpi_device_test(\"e1000e_net\", slot);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/eepro100-test.c b/tests/eepro100-test.c\nindex bdc8a67d57..6f49ac2656 100644\n--- a/tests/eepro100-test.c\n+++ b/tests/eepro100-test.c\n@@ -14,17 +14,10 @@ static void test_device(gconstpointer data)\n {\n     const char *model = data;\n     QTestState *s;\n-    char *args;\n-\n-    args = g_strdup_printf(\"-device %s\", model);\n-    s = qtest_start(args);\n\n     /* Tests only initialization so far. TODO: Implement functional tests */\n-\n-    if (s) {\n-        qtest_quit(s);\n-    }\n-    g_free(args);\n+    s = qtest_init(\"-device %s\", model);\n+    qtest_quit(s);\n }\n\n static const char *models[] = {\ndiff --git a/tests/endianness-test.c b/tests/endianness-test.c\nindex ed0bf52019..68d5dbcd14 100644\n--- a/tests/endianness-test.c\n+++ b/tests/endianness-test.c\n@@ -114,13 +114,11 @@ static void isa_outl(const TestCase *test, uint16_t addr, uint32_t value)\n static void test_endianness(gconstpointer data)\n {\n     const TestCase *test = data;\n-    char *args;\n\n-    args = g_strdup_printf(\"-M %s%s%s -device pc-testdev\",\n-                           test->machine,\n-                           test->superio ? \" -device \" : \"\",\n-                           test->superio ?: \"\");\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M %s%s%s -device pc-testdev\",\n+                              test->machine,\n+                              test->superio ? \" -device \" : \"\",\n+                              test->superio ?: \"\");\n     isa_outl(test, 0xe0, 0x87654321);\n     g_assert_cmphex(isa_inl(test, 0xe0), ==, 0x87654321);\n     g_assert_cmphex(isa_inw(test, 0xe2), ==, 0x8765);\n@@ -183,19 +181,16 @@ static void test_endianness(gconstpointer data)\n     g_assert_cmphex(isa_inb(test, 0xe1), ==, 0x43);\n     g_assert_cmphex(isa_inb(test, 0xe0), ==, 0x21);\n     qtest_quit(global_qtest);\n-    g_free(args);\n }\n\n static void test_endianness_split(gconstpointer data)\n {\n     const TestCase *test = data;\n-    char *args;\n\n-    args = g_strdup_printf(\"-M %s%s%s -device pc-testdev\",\n-                           test->machine,\n-                           test->superio ? \" -device \" : \"\",\n-                           test->superio ?: \"\");\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M %s%s%s -device pc-testdev\",\n+                              test->machine,\n+                              test->superio ? \" -device \" : \"\",\n+                              test->superio ?: \"\");\n     isa_outl(test, 0xe8, 0x87654321);\n     g_assert_cmphex(isa_inl(test, 0xe0), ==, 0x87654321);\n     g_assert_cmphex(isa_inw(test, 0xe2), ==, 0x8765);\n@@ -230,19 +225,16 @@ static void test_endianness_split(gconstpointer data)\n     g_assert_cmphex(isa_inw(test, 0xe2), ==, 0x8765);\n     g_assert_cmphex(isa_inw(test, 0xe0), ==, 0x4321);\n     qtest_quit(global_qtest);\n-    g_free(args);\n }\n\n static void test_endianness_combine(gconstpointer data)\n {\n     const TestCase *test = data;\n-    char *args;\n\n-    args = g_strdup_printf(\"-M %s%s%s -device pc-testdev\",\n-                           test->machine,\n-                           test->superio ? \" -device \" : \"\",\n-                           test->superio ?: \"\");\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M %s%s%s -device pc-testdev\",\n+                              test->machine,\n+                              test->superio ? \" -device \" : \"\",\n+                              test->superio ?: \"\");\n     isa_outl(test, 0xe0, 0x87654321);\n     g_assert_cmphex(isa_inl(test, 0xe8), ==, 0x87654321);\n     g_assert_cmphex(isa_inw(test, 0xea), ==, 0x8765);\n@@ -277,7 +269,6 @@ static void test_endianness_combine(gconstpointer data)\n     g_assert_cmphex(isa_inw(test, 0xea), ==, 0x8765);\n     g_assert_cmphex(isa_inw(test, 0xe8), ==, 0x4321);\n     qtest_quit(global_qtest);\n-    g_free(args);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/es1370-test.c b/tests/es1370-test.c\nindex 199fe193ce..edeea13ae7 100644\n--- a/tests/es1370-test.c\n+++ b/tests/es1370-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/es1370/nop\", nop);\n\n-    qtest_start(\"-device ES1370\");\n+    global_qtest = qtest_init(\"-device ES1370\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/fdc-test.c b/tests/fdc-test.c\nindex 325712e0f2..893097f5a3 100644\n--- a/tests/fdc-test.c\n+++ b/tests/fdc-test.c\n@@ -564,7 +564,7 @@ int main(int argc, char **argv)\n     /* Run the tests */\n     g_test_init(&argc, &argv, NULL);\n\n-    qtest_start(\"-device floppy,id=floppy0\");\n+    global_qtest = qtest_init(\"-device floppy,id=floppy0\");\n     qtest_irq_intercept_in(global_qtest, \"ioapic\");\n     qtest_add_func(\"/fdc/cmos\", test_cmos);\n     qtest_add_func(\"/fdc/no_media_on_start\", test_no_media_on_start);\n@@ -583,7 +583,7 @@ int main(int argc, char **argv)\n     ret = g_test_run();\n\n     /* Cleanup */\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     unlink(test_image);\n\n     return ret;\ndiff --git a/tests/hd-geo-test.c b/tests/hd-geo-test.c\nindex 24870b38f4..e0b19cdf17 100644\n--- a/tests/hd-geo-test.c\n+++ b/tests/hd-geo-test.c\n@@ -241,11 +241,11 @@ static void test_ide_none(void)\n\n     setup_common(argv, ARGV_SIZE);\n     args = g_strjoinv(\" \", argv);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"%s\", args);\n     g_strfreev(argv);\n     g_free(args);\n     test_cmos();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_ide_mbr(bool use_device, MBRcontents mbr)\n@@ -263,11 +263,11 @@ static void test_ide_mbr(bool use_device, MBRcontents mbr)\n         argc = setup_ide(argc, argv, ARGV_SIZE, i, dev, i, mbr, \"\");\n     }\n     args = g_strjoinv(\" \", argv);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"%s\", args);\n     g_strfreev(argv);\n     g_free(args);\n     test_cmos();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n /*\n@@ -339,11 +339,11 @@ static void test_ide_drive_user(const char *dev, bool trans)\n                      dev ? \"\" : opts);\n     g_free(opts);\n     args = g_strjoinv(\" \", argv);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"%s\", args);\n     g_strfreev(argv);\n     g_free(args);\n     test_cmos();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n /*\n@@ -396,11 +396,11 @@ static void test_ide_drive_cd_0(void)\n                          ide_idx, NULL, i, mbr_blank, \"\");\n     }\n     args = g_strjoinv(\" \", argv);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"%s\", args);\n     g_strfreev(argv);\n     g_free(args);\n     test_cmos();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/i440fx-test.c b/tests/i440fx-test.c\nindex 4390e5591e..bfedd5d953 100644\n--- a/tests/i440fx-test.c\n+++ b/tests/i440fx-test.c\n@@ -33,11 +33,7 @@ typedef struct FirmwareTestFixture {\n\n static QPCIBus *test_start_get_bus(const TestData *s)\n {\n-    char *cmdline;\n-\n-    cmdline = g_strdup_printf(\"-smp %d\", s->num_cpus);\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n+    global_qtest = qtest_init(\"-smp %d\", s->num_cpus);\n     return qpci_init_pc(global_qtest, NULL);\n }\n\n@@ -136,7 +132,7 @@ static void test_i440fx_defaults(gconstpointer opaque)\n\n     g_free(dev);\n     qpci_free_pc(bus);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n #define PAM_RE 1\n@@ -275,7 +271,7 @@ static void test_i440fx_pam(gconstpointer opaque)\n\n     g_free(dev);\n     qpci_free_pc(bus);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n #define BLOB_SIZE ((size_t)65536)\n@@ -344,10 +340,10 @@ static void test_i440fx_firmware(FirmwareTestFixture *fixture,\n                                          : \"-drive if=pflash,format=raw,file=\",\n                               fw_pathname);\n     g_test_message(\"qemu cmdline: %s\", cmdline);\n-    qtest_start(cmdline);\n+    global_qtest = qtest_init(\"%s\", cmdline);\n     g_free(cmdline);\n\n-    /* QEMU has loaded the firmware (because qtest_start() only returns after\n+    /* QEMU has loaded the firmware (because qtest_init() only returns after\n      * the QMP handshake completes). We must unlink the firmware blob right\n      * here, because any assertion firing below would leak it in the\n      * filesystem. This is also the reason why we recreate the blob every time\n@@ -373,7 +369,7 @@ static void test_i440fx_firmware(FirmwareTestFixture *fixture,\n     }\n\n     g_free(buf);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void add_firmware_test(const char *testpath,\ndiff --git a/tests/i82801b11-test.c b/tests/i82801b11-test.c\nindex a6e31594c9..58436172b7 100644\n--- a/tests/i82801b11-test.c\n+++ b/tests/i82801b11-test.c\n@@ -22,10 +22,11 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/i82801b11/nop\", nop);\n\n-    qtest_start(\"-machine q35 -device i82801b11-bridge,bus=pcie.0,addr=1e.0\");\n+    global_qtest = qtest_init(\"-machine q35 \"\n+                              \"-device i82801b11-bridge,bus=pcie.0,addr=1e.0\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/ide-test.c b/tests/ide-test.c\nindex 084f6a5f96..b22a4fc1c5 100644\n--- a/tests/ide-test.c\n+++ b/tests/ide-test.c\n@@ -124,7 +124,7 @@ static void ide_test_start(const char *cmdline_fmt, ...)\n     cmdline = g_strdup_vprintf(cmdline_fmt, ap);\n     va_end(ap);\n\n-    qtest_start(cmdline);\n+    global_qtest = qtest_init(\"%s\", cmdline);\n     guest_malloc = pc_alloc_init(global_qtest);\n\n     g_free(cmdline);\n@@ -134,7 +134,7 @@ static void ide_test_quit(void)\n {\n     pc_alloc_uninit(guest_malloc);\n     guest_malloc = NULL;\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static QPCIDevice *get_pci_device(QPCIBar *bmdma_bar, QPCIBar *ide_bar)\ndiff --git a/tests/intel-hda-test.c b/tests/intel-hda-test.c\nindex b782b2e944..c10a59d932 100644\n--- a/tests/intel-hda-test.c\n+++ b/tests/intel-hda-test.c\n@@ -18,15 +18,16 @@\n /* Tests only initialization so far. TODO: Replace with functional tests */\n static void ich6_test(void)\n {\n-    qtest_start(\"-device intel-hda,id=\" HDA_ID CODEC_DEVICES);\n-    qtest_end();\n+    global_qtest = qtest_init(\"-device intel-hda,id=\" HDA_ID CODEC_DEVICES);\n+    qtest_quit(global_qtest);\n }\n\n static void ich9_test(void)\n {\n-    qtest_start(\"-machine q35 -device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=\"\n-                HDA_ID CODEC_DEVICES);\n-    qtest_end();\n+    global_qtest = qtest_init(\n+        \"-machine q35 -device ich9-intel-hda,bus=pcie.0,addr=1b.0,id=\"\n+        HDA_ID CODEC_DEVICES);\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/ioh3420-test.c b/tests/ioh3420-test.c\nindex b54c4b9f11..cd5d062370 100644\n--- a/tests/ioh3420-test.c\n+++ b/tests/ioh3420-test.c\n@@ -22,11 +22,12 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/ioh3420/nop\", nop);\n\n-    qtest_start(\"-machine q35 -device ioh3420,bus=pcie.0,addr=1c.0,port=1,\"\n-                \"chassis=1,multifunction=on\");\n+    global_qtest = qtest_init(\n+        \"-machine q35 -device ioh3420,bus=pcie.0,addr=1c.0,port=1,\"\n+        \"chassis=1,multifunction=on\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/ipmi-bt-test.c b/tests/ipmi-bt-test.c\nindex 7e21a9bbcb..476d527cfd 100644\n--- a/tests/ipmi-bt-test.c\n+++ b/tests/ipmi-bt-test.c\n@@ -401,7 +401,6 @@ static void open_socket(void)\n int main(int argc, char **argv)\n {\n     const char *arch = qtest_get_arch();\n-    char *cmdline;\n     int ret;\n\n     /* Check architecture */\n@@ -415,12 +414,10 @@ int main(int argc, char **argv)\n     /* Run the tests */\n     g_test_init(&argc, &argv, NULL);\n\n-    cmdline = g_strdup_printf(\n-          \" -chardev socket,id=ipmi0,host=localhost,port=%d,reconnect=10\"\n-          \" -device ipmi-bmc-extern,chardev=ipmi0,id=bmc0\"\n-          \" -device isa-ipmi-bt,bmc=bmc0\", emu_port);\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n+    global_qtest = qtest_init(\n+        \" -chardev socket,id=ipmi0,host=localhost,port=%d,reconnect=10\"\n+        \" -device ipmi-bmc-extern,chardev=ipmi0,id=bmc0\"\n+        \" -device isa-ipmi-bt,bmc=bmc0\", emu_port);\n     qtest_irq_intercept_in(global_qtest, \"ioapic\");\n     qtest_add_func(\"/ipmi/extern/connect\", test_connect);\n     qtest_add_func(\"/ipmi/extern/bt_base\", test_bt_base);\ndiff --git a/tests/ipmi-kcs-test.c b/tests/ipmi-kcs-test.c\nindex 178ffc1797..2bd3771e9f 100644\n--- a/tests/ipmi-kcs-test.c\n+++ b/tests/ipmi-kcs-test.c\n@@ -264,7 +264,6 @@ static void test_enable_irq(void)\n int main(int argc, char **argv)\n {\n     const char *arch = qtest_get_arch();\n-    char *cmdline;\n     int ret;\n\n     /* Check architecture */\n@@ -276,10 +275,8 @@ int main(int argc, char **argv)\n     /* Run the tests */\n     g_test_init(&argc, &argv, NULL);\n\n-    cmdline = g_strdup_printf(\"-device ipmi-bmc-sim,id=bmc0\"\n+    global_qtest = qtest_init(\"-device ipmi-bmc-sim,id=bmc0\"\n                               \" -device isa-ipmi-kcs,bmc=bmc0\");\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n     qtest_irq_intercept_in(global_qtest, \"ioapic\");\n     qtest_add_func(\"/ipmi/local/kcs_base\", test_kcs_base);\n     qtest_add_func(\"/ipmi/local/kcs_abort\", test_kcs_abort);\ndiff --git a/tests/ipoctal232-test.c b/tests/ipoctal232-test.c\nindex 684914164d..5e1cae3917 100644\n--- a/tests/ipoctal232-test.c\n+++ b/tests/ipoctal232-test.c\n@@ -22,10 +22,11 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/ipoctal232/tpci200/nop\", nop);\n\n-    qtest_start(\"-device tpci200,id=ipack0 -device ipoctal232,bus=ipack0.0\");\n+    global_qtest = qtest_init(\"-device tpci200,id=ipack0 \"\n+                              \"-device ipoctal232,bus=ipack0.0\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/ivshmem-test.c b/tests/ivshmem-test.c\nindex b9e0f573f6..f254f09487 100644\n--- a/tests/ivshmem-test.c\n+++ b/tests/ivshmem-test.c\n@@ -407,7 +407,7 @@ static void test_ivshmem_hotplug(void)\n     const char *arch = qtest_get_arch();\n     gchar *opts;\n\n-    qtest_start(\"\");\n+    global_qtest = qtest_init(\" \");\n\n     opts = g_strdup_printf(\"'shm': '%s', 'size': '1M'\", tmpshm);\n\n@@ -416,7 +416,7 @@ static void test_ivshmem_hotplug(void)\n         qpci_unplug_acpi_device_test(\"iv1\", PCI_SLOT_HP);\n     }\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(opts);\n }\n\ndiff --git a/tests/libqos/libqos.c b/tests/libqos/libqos.c\nindex 24e8156fe2..bd9106a132 100644\n--- a/tests/libqos/libqos.c\n+++ b/tests/libqos/libqos.c\n@@ -20,7 +20,7 @@ QOSState *qtest_vboot(QOSOps *ops, const char *cmdline_fmt, va_list ap)\n     struct QOSState *qs = g_malloc(sizeof(QOSState));\n\n     cmdline = g_strdup_vprintf(cmdline_fmt, ap);\n-    qs->qts = qtest_start(cmdline);\n+    qs->qts = global_qtest = qtest_init(\"%s\", cmdline);\n     qs->ops = ops;\n     if (ops) {\n         if (ops->init_allocator) {\ndiff --git a/tests/m25p80-test.c b/tests/m25p80-test.c\nindex 244aa33dd9..18135cfb86 100644\n--- a/tests/m25p80-test.c\n+++ b/tests/m25p80-test.c\n@@ -354,7 +354,6 @@ int main(int argc, char **argv)\n {\n     int ret;\n     int fd;\n-    char *args;\n\n     g_test_init(&argc, &argv, NULL);\n\n@@ -364,10 +363,9 @@ int main(int argc, char **argv)\n     g_assert(ret == 0);\n     close(fd);\n\n-    args = g_strdup_printf(\"-m 256 -machine palmetto-bmc \"\n-                           \"-drive file=%s,format=raw,if=mtd\",\n-                           tmp_path);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-m 256 -machine palmetto-bmc \"\n+                              \"-drive file=%s,format=raw,if=mtd\",\n+                              tmp_path);\n\n     qtest_add_func(\"/m25p80/read_jedec\", test_read_jedec);\n     qtest_add_func(\"/m25p80/erase_sector\", test_erase_sector);\n@@ -380,6 +378,5 @@ int main(int argc, char **argv)\n\n     qtest_quit(global_qtest);\n     unlink(tmp_path);\n-    g_free(args);\n     return ret;\n }\ndiff --git a/tests/m48t59-test.c b/tests/m48t59-test.c\nindex 0f921ef38a..52c61fe33e 100644\n--- a/tests/m48t59-test.c\n+++ b/tests/m48t59-test.c\n@@ -246,7 +246,7 @@ int main(int argc, char **argv)\n\n     g_test_init(&argc, &argv, NULL);\n\n-    s = qtest_start(\"-rtc clock=vm\");\n+    s = global_qtest = qtest_init(\"-rtc clock=vm\");\n\n     qtest_add_func(\"/rtc/bcd/check-time\", bcd_check_time);\n     qtest_add_func(\"/rtc/fuzz-registers\", fuzz_registers);\ndiff --git a/tests/ne2000-test.c b/tests/ne2000-test.c\nindex b7cf3dd2f5..d205bc91a6 100644\n--- a/tests/ne2000-test.c\n+++ b/tests/ne2000-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/ne2000/pci/nop\", pci_nop);\n\n-    qtest_start(\"-device ne2k_pci\");\n+    global_qtest = qtest_init(\"-device ne2k_pci\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/numa-test.c b/tests/numa-test.c\nindex e1b6152244..17bbc0f5f8 100644\n--- a/tests/numa-test.c\n+++ b/tests/numa-test.c\n@@ -25,14 +25,14 @@ static void test_mon_explicit(const void *data)\n     cli = make_cli(data, \"-smp 8 \"\n                    \"-numa node,nodeid=0,cpus=0-3 \"\n                    \"-numa node,nodeid=1,cpus=4-7 \");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n\n     s = hmp(\"info numa\");\n     g_assert(strstr(s, \"node 0 cpus: 0 1 2 3\"));\n     g_assert(strstr(s, \"node 1 cpus: 4 5 6 7\"));\n     g_free(s);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -42,14 +42,14 @@ static void test_mon_default(const void *data)\n     char *cli;\n\n     cli = make_cli(data, \"-smp 8 -numa node -numa node\");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n\n     s = hmp(\"info numa\");\n     g_assert(strstr(s, \"node 0 cpus: 0 2 4 6\"));\n     g_assert(strstr(s, \"node 1 cpus: 1 3 5 7\"));\n     g_free(s);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -61,14 +61,14 @@ static void test_mon_partial(const void *data)\n     cli = make_cli(data, \"-smp 8 \"\n                    \"-numa node,nodeid=0,cpus=0-1 \"\n                    \"-numa node,nodeid=1,cpus=4-5 \");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n\n     s = hmp(\"info numa\");\n     g_assert(strstr(s, \"node 0 cpus: 0 1 2 3 6 7\"));\n     g_assert(strstr(s, \"node 1 cpus: 4 5\"));\n     g_free(s);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -88,7 +88,7 @@ static void test_query_cpus(const void *data)\n     QObject *e;\n\n     cli = make_cli(data, \"-smp 8 -numa node,cpus=0-3 -numa node,cpus=4-7\");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n     cpus = get_cpus(&resp);\n     g_assert(cpus);\n\n@@ -113,7 +113,7 @@ static void test_query_cpus(const void *data)\n     }\n\n     QDECREF(resp);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -130,7 +130,7 @@ static void pc_numa_cpu(const void *data)\n         \"-numa cpu,node-id=0,socket-id=1,core-id=0 \"\n         \"-numa cpu,node-id=0,socket-id=1,core-id=1,thread-id=0 \"\n         \"-numa cpu,node-id=1,socket-id=1,core-id=1,thread-id=1\");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n     cpus = get_cpus(&resp);\n     g_assert(cpus);\n\n@@ -166,7 +166,7 @@ static void pc_numa_cpu(const void *data)\n     }\n\n     QDECREF(resp);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -183,7 +183,7 @@ static void spapr_numa_cpu(const void *data)\n         \"-numa cpu,node-id=0,core-id=1 \"\n         \"-numa cpu,node-id=0,core-id=2 \"\n         \"-numa cpu,node-id=1,core-id=3\");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n     cpus = get_cpus(&resp);\n     g_assert(cpus);\n\n@@ -211,7 +211,7 @@ static void spapr_numa_cpu(const void *data)\n     }\n\n     QDECREF(resp);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\n@@ -226,7 +226,7 @@ static void aarch64_numa_cpu(const void *data)\n         \"-numa node,nodeid=0 -numa node,nodeid=1 \"\n         \"-numa cpu,node-id=1,thread-id=0 \"\n         \"-numa cpu,node-id=0,thread-id=1\");\n-    qtest_start(cli);\n+    global_qtest = qtest_init(\"%s\", cli);\n     cpus = get_cpus(&resp);\n     g_assert(cpus);\n\n@@ -254,7 +254,7 @@ static void aarch64_numa_cpu(const void *data)\n     }\n\n     QDECREF(resp);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(cli);\n }\n\ndiff --git a/tests/nvme-test.c b/tests/nvme-test.c\nindex 7674a446e4..382d26671f 100644\n--- a/tests/nvme-test.c\n+++ b/tests/nvme-test.c\n@@ -22,11 +22,12 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/nvme/nop\", nop);\n\n-    qtest_start(\"-drive id=drv0,if=none,file=null-co://,format=raw \"\n-                \"-device nvme,drive=drv0,serial=foo\");\n+    global_qtest = qtest_init(\n+        \"-drive id=drv0,if=none,file=null-co://,format=raw \"\n+        \"-device nvme,drive=drv0,serial=foo\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c\nindex c4211a4e85..9c36051c07 100644\n--- a/tests/pc-cpu-test.c\n+++ b/tests/pc-cpu-test.c\n@@ -26,15 +26,13 @@ typedef struct PCTestData PCTestData;\n static void test_pc_with_cpu_add(gconstpointer data)\n {\n     const PCTestData *s = data;\n-    char *args;\n     QDict *response;\n     unsigned int i;\n\n-    args = g_strdup_printf(\"-machine %s -cpu %s \"\n-                           \"-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u\",\n-                           s->machine, s->cpu_model,\n-                           s->sockets, s->cores, s->threads, s->maxcpus);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-machine %s -cpu %s \"\n+                              \"-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u\",\n+                              s->machine, s->cpu_model,\n+                              s->sockets, s->cores, s->threads, s->maxcpus);\n\n     for (i = s->sockets * s->cores * s->threads; i < s->maxcpus; i++) {\n         response = qmp(\"{ 'execute': 'cpu-add',\"\n@@ -44,21 +42,18 @@ static void test_pc_with_cpu_add(gconstpointer data)\n         QDECREF(response);\n     }\n\n-    qtest_end();\n-    g_free(args);\n+    qtest_quit(global_qtest);\n }\n\n static void test_pc_without_cpu_add(gconstpointer data)\n {\n     const PCTestData *s = data;\n-    char *args;\n     QDict *response;\n\n-    args = g_strdup_printf(\"-machine %s -cpu %s \"\n-                           \"-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u\",\n-                           s->machine, s->cpu_model,\n-                           s->sockets, s->cores, s->threads, s->maxcpus);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-machine %s -cpu %s \"\n+                              \"-smp sockets=%u,cores=%u,threads=%u,maxcpus=%u\",\n+                              s->machine, s->cpu_model,\n+                              s->sockets, s->cores, s->threads, s->maxcpus);\n\n     response = qmp(\"{ 'execute': 'cpu-add',\"\n                    \"  'arguments': { 'id': %d } }\",\n@@ -67,8 +62,7 @@ static void test_pc_without_cpu_add(gconstpointer data)\n     g_assert(qdict_haskey(response, \"error\"));\n     QDECREF(response);\n\n-    qtest_end();\n-    g_free(args);\n+    qtest_quit(global_qtest);\n }\n\n static void test_data_free(gpointer data)\ndiff --git a/tests/pcnet-test.c b/tests/pcnet-test.c\nindex efb1ef44e9..23e36da805 100644\n--- a/tests/pcnet-test.c\n+++ b/tests/pcnet-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/pcnet/pci/nop\", pci_nop);\n\n-    qtest_start(\"-device pcnet\");\n+    global_qtest = qtest_init(\"-device pcnet\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/pnv-xscom-test.c b/tests/pnv-xscom-test.c\nindex 5adc3fd3a9..852322b3f2 100644\n--- a/tests/pnv-xscom-test.c\n+++ b/tests/pnv-xscom-test.c\n@@ -81,16 +81,11 @@ static void test_xscom_cfam_id(const PnvChip *chip)\n\n static void test_cfam_id(const void *data)\n {\n-    char *args;\n     const PnvChip *chip = data;\n\n-    args = g_strdup_printf(\"-M powernv,accel=tcg -cpu %s\", chip->cpu_model);\n-\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M powernv,accel=tcg -cpu %s\", chip->cpu_model);\n     test_xscom_cfam_id(chip);\n     qtest_quit(global_qtest);\n-\n-    g_free(args);\n }\n\n #define PNV_XSCOM_EX_CORE_BASE(chip, i)                 \\\n@@ -109,16 +104,11 @@ static void test_xscom_core(const PnvChip *chip)\n\n static void test_core(const void *data)\n {\n-    char *args;\n     const PnvChip *chip = data;\n\n-    args = g_strdup_printf(\"-M powernv,accel=tcg -cpu %s\", chip->cpu_model);\n-\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M powernv,accel=tcg -cpu %s\", chip->cpu_model);\n     test_xscom_core(chip);\n     qtest_quit(global_qtest);\n-\n-    g_free(args);\n }\n\n static void add_test(const char *name, void (*test)(const void *data))\ndiff --git a/tests/prom-env-test.c b/tests/prom-env-test.c\nindex eac207b30e..fffef0b252 100644\n--- a/tests/prom-env-test.c\n+++ b/tests/prom-env-test.c\n@@ -44,21 +44,18 @@ static void check_guest_memory(void)\n\n static void test_machine(const void *machine)\n {\n-    char *args;\n     const char *extra_args;\n\n     /* The pseries firmware boots much faster without the default devices */\n     extra_args = strcmp(machine, \"pseries\") == 0 ? \"-nodefaults\" : \"\";\n\n-    args = g_strdup_printf(\"-M %s,accel=tcg %s -prom-env 'use-nvramrc?=true' \"\n-                           \"-prom-env 'nvramrc=%x %x l!' \",\n-                           (const char *)machine, extra_args, MAGIC, ADDRESS);\n-\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-M %s,accel=tcg %s \"\n+                              \"-prom-env 'use-nvramrc?=true' \"\n+                              \"-prom-env 'nvramrc=%x %x l!' \",\n+                              (const char *)machine, extra_args,\n+                              MAGIC, ADDRESS);\n     check_guest_memory();\n     qtest_quit(global_qtest);\n-\n-    g_free(args);\n }\n\n static void add_tests(const char *machines[])\ndiff --git a/tests/pvpanic-test.c b/tests/pvpanic-test.c\nindex 71ebb5c02c..48b71be26f 100644\n--- a/tests/pvpanic-test.c\n+++ b/tests/pvpanic-test.c\n@@ -37,10 +37,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/pvpanic/panic\", test_panic);\n\n-    qtest_start(\"-device pvpanic\");\n+    global_qtest = qtest_init(\"-device pvpanic\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/pxe-test.c b/tests/pxe-test.c\nindex e2d3853534..eaad88601a 100644\n--- a/tests/pxe-test.c\n+++ b/tests/pxe-test.c\n@@ -23,17 +23,13 @@ static char disk[] = \"tests/pxe-test-disk-XXXXXX\";\n\n static void test_pxe_one(const char *params, bool ipv6)\n {\n-    char *args;\n-\n-    args = g_strdup_printf(\"-machine accel=kvm:tcg -nodefaults -boot order=n \"\n-                           \"-netdev user,id=\" NETNAME \",tftp=./,bootfile=%s,\"\n-                           \"ipv4=%s,ipv6=%s %s\", disk, ipv6 ? \"off\" : \"on\",\n-                           ipv6 ? \"on\" : \"off\", params);\n-\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-machine accel=kvm:tcg -nodefaults \"\n+                              \"-boot order=n \"\n+                              \"-netdev user,id=\" NETNAME \",tftp=./,bootfile=%s,\"\n+                              \"ipv4=%s,ipv6=%s %s\", disk, ipv6 ? \"off\" : \"on\",\n+                              ipv6 ? \"on\" : \"off\", params);\n     boot_sector_test(global_qtest);\n     qtest_quit(global_qtest);\n-    g_free(args);\n }\n\n static void test_pxe_e1000(void)\ndiff --git a/tests/q35-test.c b/tests/q35-test.c\nindex e149c4c51d..91a189ce62 100644\n--- a/tests/q35-test.c\n+++ b/tests/q35-test.c\n@@ -84,7 +84,7 @@ static void test_smram_lock(void)\n     QPCIDevice *pcidev;\n     QDict *response;\n\n-    qtest_start(\"-M q35\");\n+    global_qtest = qtest_init(\"-M q35\");\n\n     pcibus = qpci_init_pc(global_qtest, NULL);\n     g_assert(pcibus != NULL);\n@@ -119,7 +119,7 @@ static void test_smram_lock(void)\n     g_free(pcidev);\n     qpci_free_pc(pcibus);\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_tseg_size(const void *data)\n@@ -141,7 +141,7 @@ static void test_tseg_size(const void *data)\n         cmdline = g_strdup_printf(\"-M q35 -m %uM\",\n                                   TSEG_SIZE_TEST_GUEST_RAM_MBYTES);\n     }\n-    qtest_start(cmdline);\n+    global_qtest = qtest_init(\"%s\", cmdline);\n     g_free(cmdline);\n\n     /* locate the DRAM controller */\n@@ -185,7 +185,7 @@ static void test_tseg_size(const void *data)\n\n     g_free(pcidev);\n     qpci_free_pc(pcibus);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/qom-test.c b/tests/qom-test.c\nindex ab0595dc75..5edd735387 100644\n--- a/tests/qom-test.c\n+++ b/tests/qom-test.c\n@@ -90,11 +90,9 @@ static void test_properties(const char *path, bool recurse)\n static void test_machine(gconstpointer data)\n {\n     const char *machine = data;\n-    char *args;\n     QDict *response;\n\n-    args = g_strdup_printf(\"-machine %s\", machine);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-machine %s\", machine);\n\n     test_properties(\"/machine\", true);\n\n@@ -102,8 +100,7 @@ static void test_machine(gconstpointer data)\n     g_assert(qdict_haskey(response, \"return\"));\n     QDECREF(response);\n\n-    qtest_end();\n-    g_free(args);\n+    qtest_quit(global_qtest);\n     g_free((void *)machine);\n }\n\ndiff --git a/tests/rtc-test.c b/tests/rtc-test.c\nindex d7a96cbd79..b6058d28f5 100644\n--- a/tests/rtc-test.c\n+++ b/tests/rtc-test.c\n@@ -690,7 +690,7 @@ int main(int argc, char **argv)\n\n     g_test_init(&argc, &argv, NULL);\n\n-    s = qtest_start(\"-rtc clock=vm\");\n+    s = global_qtest = qtest_init(\"-rtc clock=vm\");\n     qtest_irq_intercept_in(s, \"ioapic\");\n\n     qtest_add_func(\"/rtc/check-time/bcd\", bcd_check_time);\ndiff --git a/tests/rtl8139-test.c b/tests/rtl8139-test.c\nindex 68bfc42178..dc9935439f 100644\n--- a/tests/rtl8139-test.c\n+++ b/tests/rtl8139-test.c\n@@ -197,7 +197,7 @@ int main(int argc, char **argv)\n {\n     int ret;\n\n-    qtest_start(\"-device rtl8139\");\n+    global_qtest = qtest_init(\"-device rtl8139\");\n\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/rtl8139/nop\", nop);\n@@ -205,7 +205,7 @@ int main(int argc, char **argv)\n\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/spapr-phb-test.c b/tests/spapr-phb-test.c\nindex d3522ea093..0d26cbda6c 100644\n--- a/tests/spapr-phb-test.c\n+++ b/tests/spapr-phb-test.c\n@@ -25,11 +25,12 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/spapr-phb/device\", test_phb_device);\n\n-    qtest_start(\"-device \" TYPE_SPAPR_PCI_HOST_BRIDGE \",index=30\");\n+    global_qtest = qtest_init(\"-device \" TYPE_SPAPR_PCI_HOST_BRIDGE\n+                              \",index=30\");\n\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/tco-test.c b/tests/tco-test.c\nindex 0387971953..b2a4baeeef 100644\n--- a/tests/tco-test.c\n+++ b/tests/tco-test.c\n@@ -49,20 +49,18 @@ static void test_end(TestData *d)\n {\n     g_free(d->dev);\n     qpci_free_pc(d->bus);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_init(TestData *d)\n {\n     QTestState *qs;\n-    char *s;\n\n-    s = g_strdup_printf(\"-machine q35 %s %s\",\n-                        d->noreboot ? \"\" : \"-global ICH9-LPC.noreboot=false\",\n-                        !d->args ? \"\" : d->args);\n-    qs = qtest_start(s);\n+    qs = qtest_init(\"-machine q35 %s %s\",\n+                    d->noreboot ? \"\" : \"-global ICH9-LPC.noreboot=false\",\n+                    !d->args ? \"\" : d->args);\n+    global_qtest = qs;\n     qtest_irq_intercept_in(qs, \"ioapic\");\n-    g_free(s);\n\n     d->bus = qpci_init_pc(qs, NULL);\n     d->dev = qpci_device_find(d->bus, QPCI_DEVFN(0x1f, 0x00));\ndiff --git a/tests/test-arm-mptimer.c b/tests/test-arm-mptimer.c\nindex cb8f2df914..a4bef2322a 100644\n--- a/tests/test-arm-mptimer.c\n+++ b/tests/test-arm-mptimer.c\n@@ -1097,9 +1097,9 @@ tests_with_prescaler_arg:\n         goto tests_with_prescaler_arg;\n     }\n\n-    qtest_start(\"-machine vexpress-a9\");\n+    global_qtest = qtest_init(\"-machine vexpress-a9\");\n     ret = g_test_run();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/test-filter-mirror.c b/tests/test-filter-mirror.c\nindex d569d27657..9d8608a609 100644\n--- a/tests/test-filter-mirror.c\n+++ b/tests/test-filter-mirror.c\n@@ -18,7 +18,6 @@\n static void test_mirror(void)\n {\n     int send_sock[2], recv_sock;\n-    char *cmdline;\n     uint32_t ret = 0, len = 0;\n     char send_buf[] = \"Hello! filter-mirror~\";\n     char sock_path[] = \"filter-mirror.XXXXXX\";\n@@ -37,13 +36,12 @@ static void test_mirror(void)\n     ret = mkstemp(sock_path);\n     g_assert_cmpint(ret, !=, -1);\n\n-    cmdline = g_strdup_printf(\"-netdev socket,id=qtest-bn0,fd=%d \"\n-                 \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n-                 \"-chardev socket,id=mirror0,path=%s,server,nowait \"\n-                 \"-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 \"\n-                 , send_sock[1], devstr, sock_path);\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n+    global_qtest = qtest_init(\n+        \"-netdev socket,id=qtest-bn0,fd=%d \"\n+        \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n+        \"-chardev socket,id=mirror0,path=%s,server,nowait \"\n+        \"-object filter-mirror,id=qtest-f0,netdev=qtest-bn0,queue=tx,outdev=mirror0 \"\n+        , send_sock[1], devstr, sock_path);\n\n     recv_sock = unix_connect(sock_path, NULL);\n     g_assert_cmpint(recv_sock, !=, -1);\n@@ -86,7 +84,7 @@ int main(int argc, char **argv)\n\n     qtest_add_func(\"/netfilter/mirror\", test_mirror);\n     ret = g_test_run();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/test-filter-redirector.c b/tests/test-filter-redirector.c\nindex 3afd41110d..b34f8ec2ad 100644\n--- a/tests/test-filter-redirector.c\n+++ b/tests/test-filter-redirector.c\n@@ -70,7 +70,6 @@ static const char *get_devstr(void)\n static void test_redirector_tx(void)\n {\n     int backend_sock[2], recv_sock;\n-    char *cmdline;\n     uint32_t ret = 0, len = 0;\n     char send_buf[] = \"Hello!!\";\n     char sock_path0[] = \"filter-redirector0.XXXXXX\";\n@@ -87,20 +86,19 @@ static void test_redirector_tx(void)\n     ret = mkstemp(sock_path1);\n     g_assert_cmpint(ret, !=, -1);\n\n-    cmdline = g_strdup_printf(\"-netdev socket,id=qtest-bn0,fd=%d \"\n-                \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n-                \"-chardev socket,id=redirector0,path=%s,server,nowait \"\n-                \"-chardev socket,id=redirector1,path=%s,server,nowait \"\n-                \"-chardev socket,id=redirector2,path=%s,nowait \"\n-                \"-object filter-redirector,id=qtest-f0,netdev=qtest-bn0,\"\n-                \"queue=tx,outdev=redirector0 \"\n-                \"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,\"\n-                \"queue=tx,indev=redirector2 \"\n-                \"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,\"\n-                \"queue=tx,outdev=redirector1 \", backend_sock[1], get_devstr(),\n-                sock_path0, sock_path1, sock_path0);\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n+    global_qtest = qtest_init(\n+        \"-netdev socket,id=qtest-bn0,fd=%d \"\n+        \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n+        \"-chardev socket,id=redirector0,path=%s,server,nowait \"\n+        \"-chardev socket,id=redirector1,path=%s,server,nowait \"\n+        \"-chardev socket,id=redirector2,path=%s,nowait \"\n+        \"-object filter-redirector,id=qtest-f0,netdev=qtest-bn0,\"\n+        \"queue=tx,outdev=redirector0 \"\n+        \"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,\"\n+        \"queue=tx,indev=redirector2 \"\n+        \"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,\"\n+        \"queue=tx,outdev=redirector1 \", backend_sock[1], get_devstr(),\n+        sock_path0, sock_path1, sock_path0);\n\n     recv_sock = unix_connect(sock_path1, NULL);\n     g_assert_cmpint(recv_sock, !=, -1);\n@@ -135,13 +133,12 @@ static void test_redirector_tx(void)\n     close(recv_sock);\n     unlink(sock_path0);\n     unlink(sock_path1);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void test_redirector_rx(void)\n {\n     int backend_sock[2], send_sock;\n-    char *cmdline;\n     uint32_t ret = 0, len = 0;\n     char send_buf[] = \"Hello!!\";\n     char sock_path0[] = \"filter-redirector0.XXXXXX\";\n@@ -158,20 +155,19 @@ static void test_redirector_rx(void)\n     ret = mkstemp(sock_path1);\n     g_assert_cmpint(ret, !=, -1);\n\n-    cmdline = g_strdup_printf(\"-netdev socket,id=qtest-bn0,fd=%d \"\n-                \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n-                \"-chardev socket,id=redirector0,path=%s,server,nowait \"\n-                \"-chardev socket,id=redirector1,path=%s,server,nowait \"\n-                \"-chardev socket,id=redirector2,path=%s,nowait \"\n-                \"-object filter-redirector,id=qtest-f0,netdev=qtest-bn0,\"\n-                \"queue=rx,indev=redirector0 \"\n-                \"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,\"\n-                \"queue=rx,outdev=redirector2 \"\n-                \"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,\"\n-                \"queue=rx,indev=redirector1 \", backend_sock[1], get_devstr(),\n-                sock_path0, sock_path1, sock_path0);\n-    qtest_start(cmdline);\n-    g_free(cmdline);\n+    global_qtest = qtest_init(\n+        \"-netdev socket,id=qtest-bn0,fd=%d \"\n+        \"-device %s,netdev=qtest-bn0,id=qtest-e0 \"\n+        \"-chardev socket,id=redirector0,path=%s,server,nowait \"\n+        \"-chardev socket,id=redirector1,path=%s,server,nowait \"\n+        \"-chardev socket,id=redirector2,path=%s,nowait \"\n+        \"-object filter-redirector,id=qtest-f0,netdev=qtest-bn0,\"\n+        \"queue=rx,indev=redirector0 \"\n+        \"-object filter-redirector,id=qtest-f1,netdev=qtest-bn0,\"\n+        \"queue=rx,outdev=redirector2 \"\n+        \"-object filter-redirector,id=qtest-f2,netdev=qtest-bn0,\"\n+        \"queue=rx,indev=redirector1 \", backend_sock[1], get_devstr(),\n+        sock_path0, sock_path1, sock_path0);\n\n     struct iovec iov[] = {\n         {\n@@ -204,7 +200,7 @@ static void test_redirector_rx(void)\n     g_free(recv_buf);\n     unlink(sock_path0);\n     unlink(sock_path1);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/test-hmp.c b/tests/test-hmp.c\nindex 729c0339f7..dd03693707 100644\n--- a/tests/test-hmp.c\n+++ b/tests/test-hmp.c\n@@ -119,16 +119,13 @@ static void test_info_commands(void)\n static void test_machine(gconstpointer data)\n {\n     const char *machine = data;\n-    char *args;\n\n-    args = g_strdup_printf(\"-S -M %s\", machine);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-S -M %s\", machine);\n\n     test_info_commands();\n     test_commands();\n\n-    qtest_end();\n-    g_free(args);\n+    qtest_quit(global_qtest);\n     g_free((void *)data);\n }\n\ndiff --git a/tests/test-netfilter.c b/tests/test-netfilter.c\nindex 2506473365..76caaedfc1 100644\n--- a/tests/test-netfilter.c\n+++ b/tests/test-netfilter.c\n@@ -182,7 +182,6 @@ static void remove_netdev_with_multi_netfilter(void)\n int main(int argc, char **argv)\n {\n     int ret;\n-    char *args;\n     const char *devstr = \"e1000\";\n\n     if (g_str_equal(qtest_get_arch(), \"s390x\")) {\n@@ -197,13 +196,11 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/netfilter/remove_netdev_multi\",\n                    remove_netdev_with_multi_netfilter);\n\n-    args = g_strdup_printf(\"-netdev user,id=qtest-bn0 \"\n-                           \"-device %s,netdev=qtest-bn0\", devstr);\n-    qtest_start(args);\n+    global_qtest = qtest_init(\"-netdev user,id=qtest-bn0 \"\n+                              \"-device %s,netdev=qtest-bn0\", devstr);\n     ret = g_test_run();\n\n-    qtest_end();\n-    g_free(args);\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c\nindex 58a2dd9fe8..5b026ac38a 100644\n--- a/tests/test-x86-cpuid-compat.c\n+++ b/tests/test-x86-cpuid-compat.c\n@@ -59,12 +59,12 @@ static void test_cpuid_prop(const void *data)\n     QNum *value;\n     int64_t val;\n\n-    qtest_start(args->cmdline);\n+    global_qtest = qtest_init(\"%s\", args->cmdline);\n     path = get_cpu0_qom_path();\n     value = qobject_to_qnum(qom_get(path, args->property));\n     g_assert(qnum_get_try_int(value, &val));\n     g_assert_cmpint(val, ==, args->expected_value);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     QDECREF(value);\n     g_free(path);\n@@ -131,13 +131,13 @@ static void test_feature_flag(const void *data)\n     QList *present, *filtered;\n     uint32_t value;\n\n-    qtest_start(args->cmdline);\n+    global_qtest = qtest_init(\"%s\", args->cmdline);\n     path = get_cpu0_qom_path();\n     present = qobject_to_qlist(qom_get(path, \"feature-words\"));\n     filtered = qobject_to_qlist(qom_get(path, \"filtered-features\"));\n     value = get_feature_word(present, args->in_eax, args->in_ecx, args->reg);\n     value |= get_feature_word(filtered, args->in_eax, args->in_ecx, args->reg);\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     g_assert(!!(value & (1U << args->bitnr)) == args->expected_value);\n\n@@ -181,7 +181,8 @@ static void test_plus_minus_subprocess(void)\n      * Note: rules 1 and 2 are planned to be removed soon, and\n      * should generate a warning.\n      */\n-    qtest_start(\"-cpu pentium,-fpu,+fpu,-mce,mce=on,+cx8,cx8=off,+sse4_1,sse4_2=on\");\n+    global_qtest = qtest_init(\"-cpu pentium,-fpu,+fpu,-mce,mce=on,+cx8,\"\n+                              \"cx8=off,+sse4_1,sse4_2=on\");\n     path = get_cpu0_qom_path();\n\n     g_assert_false(qom_get_bool(path, \"fpu\"));\n@@ -195,7 +196,7 @@ static void test_plus_minus_subprocess(void)\n     g_assert_true(qom_get_bool(path, \"sse4-2\"));\n     g_assert_true(qom_get_bool(path, \"sse4.2\"));\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n     g_free(path);\n }\n\ndiff --git a/tests/tmp105-test.c b/tests/tmp105-test.c\nindex a7940a4639..3ef2efff6e 100644\n--- a/tests/tmp105-test.c\n+++ b/tests/tmp105-test.c\n@@ -151,7 +151,7 @@ int main(int argc, char **argv)\n\n     g_test_init(&argc, &argv, NULL);\n\n-    s = qtest_start(\"-machine n800 \"\n+    s = global_qtest = qtest_init(\"-machine n800 \"\n                     \"-device tmp105,bus=i2c-bus.0,id=\" TMP105_TEST_ID\n                     \",address=0x49\");\n     i2c = omap_i2c_create(OMAP2_I2C_1_BASE);\ndiff --git a/tests/tpci200-test.c b/tests/tpci200-test.c\nindex 0321ec27ec..2ed378196d 100644\n--- a/tests/tpci200-test.c\n+++ b/tests/tpci200-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/tpci200/nop\", nop);\n\n-    qtest_start(\"-device tpci200\");\n+    global_qtest = qtest_init(\"-device tpci200\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/usb-hcd-ehci-test.c b/tests/usb-hcd-ehci-test.c\nindex 55d4743a2a..55349a39a2 100644\n--- a/tests/usb-hcd-ehci-test.c\n+++ b/tests/usb-hcd-ehci-test.c\n@@ -156,23 +156,24 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/ehci/pci/ehci-port-2\", pci_ehci_port_2);\n     qtest_add_func(\"/ehci/pci/ehci-port-3-hotplug\", pci_ehci_port_hotplug);\n\n-    qtest_start(\"-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7,\"\n-                \"multifunction=on,id=ich9-ehci-1 \"\n-                \"-device ich9-usb-uhci1,bus=pcie.0,addr=1d.0,\"\n-                \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=0 \"\n-                \"-device ich9-usb-uhci2,bus=pcie.0,addr=1d.1,\"\n-                \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=2 \"\n-                \"-device ich9-usb-uhci3,bus=pcie.0,addr=1d.2,\"\n-                \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=4 \"\n-                \"-drive if=none,id=usbcdrom,media=cdrom \"\n-                \"-device usb-tablet,bus=ich9-ehci-1.0,port=1,usb_version=1 \"\n-                \"-device usb-storage,bus=ich9-ehci-1.0,port=2,drive=usbcdrom \");\n+    global_qtest = qtest_init(\n+        \"-machine q35 -device ich9-usb-ehci1,bus=pcie.0,addr=1d.7,\"\n+        \"multifunction=on,id=ich9-ehci-1 \"\n+        \"-device ich9-usb-uhci1,bus=pcie.0,addr=1d.0,\"\n+        \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=0 \"\n+        \"-device ich9-usb-uhci2,bus=pcie.0,addr=1d.1,\"\n+        \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=2 \"\n+        \"-device ich9-usb-uhci3,bus=pcie.0,addr=1d.2,\"\n+        \"multifunction=on,masterbus=ich9-ehci-1.0,firstport=4 \"\n+        \"-drive if=none,id=usbcdrom,media=cdrom \"\n+        \"-device usb-tablet,bus=ich9-ehci-1.0,port=1,usb_version=1 \"\n+        \"-device usb-storage,bus=ich9-ehci-1.0,port=2,drive=usbcdrom \");\n\n     test_init();\n     ret = g_test_run();\n     test_deinit();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/usb-hcd-ohci-test.c b/tests/usb-hcd-ohci-test.c\nindex 4758813d78..2763c9ec24 100644\n--- a/tests/usb-hcd-ohci-test.c\n+++ b/tests/usb-hcd-ohci-test.c\n@@ -31,9 +31,9 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/ohci/pci/init\", test_ohci_init);\n     qtest_add_func(\"/ohci/pci/hotplug\", test_ohci_hotplug);\n\n-    qtest_start(\"-device pci-ohci,id=ohci\");\n+    global_qtest = qtest_init(\"-device pci-ohci,id=ohci\");\n     ret = g_test_run();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/usb-hcd-xhci-test.c b/tests/usb-hcd-xhci-test.c\nindex c05a339894..cc3fcd82fa 100644\n--- a/tests/usb-hcd-xhci-test.c\n+++ b/tests/usb-hcd-xhci-test.c\n@@ -80,10 +80,10 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/xhci/pci/hotplug\", test_xhci_hotplug);\n     qtest_add_func(\"/xhci/pci/hotplug/usb-uas\", test_usb_uas_hotplug);\n\n-    qtest_start(\"-device nec-usb-xhci,id=xhci\"\n+    global_qtest = qtest_init(\"-device nec-usb-xhci,id=xhci\"\n                 \" -drive id=drive0,if=none,file=null-co://,format=raw\");\n     ret = g_test_run();\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/virtio-balloon-test.c b/tests/virtio-balloon-test.c\nindex 0d0046bf25..7304392c17 100644\n--- a/tests/virtio-balloon-test.c\n+++ b/tests/virtio-balloon-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/virtio/balloon/pci/nop\", pci_nop);\n\n-    qtest_start(\"-device virtio-balloon-pci\");\n+    global_qtest = qtest_init(\"-device virtio-balloon-pci\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/virtio-blk-test.c b/tests/virtio-blk-test.c\nindex 26d0a7e9af..063b0f4013 100644\n--- a/tests/virtio-blk-test.c\n+++ b/tests/virtio-blk-test.c\n@@ -84,24 +84,21 @@ static QOSState *pci_test_start(void)\n\n static void arm_test_start(void)\n {\n-    char *cmdline;\n     char *tmp_path;\n\n     tmp_path = drive_create();\n\n-    cmdline = g_strdup_printf(\"-machine virt \"\n-                                \"-drive if=none,id=drive0,file=%s,format=raw \"\n-                                \"-device virtio-blk-device,drive=drive0\",\n-                                tmp_path);\n-    qtest_start(cmdline);\n+    global_qtest = qtest_init(\"-machine virt \"\n+                              \"-drive if=none,id=drive0,file=%s,format=raw \"\n+                              \"-device virtio-blk-device,drive=drive0\",\n+                              tmp_path);\n     unlink(tmp_path);\n     g_free(tmp_path);\n-    g_free(cmdline);\n }\n\n static void test_end(void)\n {\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static QVirtioPCIDevice *virtio_blk_pci_init(QPCIBus *bus, int slot)\ndiff --git a/tests/virtio-console-test.c b/tests/virtio-console-test.c\nindex 1c3de072f4..73fb30b051 100644\n--- a/tests/virtio-console-test.c\n+++ b/tests/virtio-console-test.c\n@@ -13,16 +13,16 @@\n /* Tests only initialization so far. TODO: Replace with functional tests */\n static void console_pci_nop(void)\n {\n-    qtest_start(\"-device virtio-serial-pci,id=vser0 \"\n+    global_qtest = qtest_init(\"-device virtio-serial-pci,id=vser0 \"\n                 \"-device virtconsole,bus=vser0.0\");\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n static void serialport_pci_nop(void)\n {\n-    qtest_start(\"-device virtio-serial-pci,id=vser0 \"\n+    global_qtest = qtest_init(\"-device virtio-serial-pci,id=vser0 \"\n                 \"-device virtserialport,bus=vser0.0\");\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/virtio-net-test.c b/tests/virtio-net-test.c\nindex 635b942c36..9b32866fb1 100644\n--- a/tests/virtio-net-test.c\n+++ b/tests/virtio-net-test.c\n@@ -30,7 +30,7 @@\n\n static void test_end(void)\n {\n-    qtest_end();\n+    qtest_quit(global_qtest);\n }\n\n #ifndef _WIN32\n@@ -243,7 +243,7 @@ static void hotplug(void)\n {\n     const char *arch = qtest_get_arch();\n\n-    qtest_start(\"-device virtio-net-pci\");\n+    global_qtest = qtest_init(\"-device virtio-net-pci\");\n\n     qpci_plug_device_test(\"virtio-net-pci\", \"net1\", PCI_SLOT_HP, NULL);\n\ndiff --git a/tests/virtio-rng-test.c b/tests/virtio-rng-test.c\nindex dcecf77463..e1b1e89b59 100644\n--- a/tests/virtio-rng-test.c\n+++ b/tests/virtio-rng-test.c\n@@ -37,10 +37,10 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/virtio/rng/pci/nop\", pci_nop);\n     qtest_add_func(\"/virtio/rng/pci/hotplug\", hotplug);\n\n-    qtest_start(\"-device virtio-rng-pci\");\n+    global_qtest = qtest_init(\"-device virtio-rng-pci\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/virtio-serial-test.c b/tests/virtio-serial-test.c\nindex b14d943ada..ce708cc11e 100644\n--- a/tests/virtio-serial-test.c\n+++ b/tests/virtio-serial-test.c\n@@ -49,10 +49,10 @@ int main(int argc, char **argv)\n     qtest_add_func(\"/virtio/serial/pci/nop\", pci_nop);\n     qtest_add_func(\"/virtio/serial/pci/hotplug\", hotplug);\n\n-    qtest_start(\"-device virtio-serial-pci\");\n+    global_qtest = qtest_init(\"-device virtio-serial-pci\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\ndiff --git a/tests/vmgenid-test.c b/tests/vmgenid-test.c\nindex 73473162d0..b149690a1a 100644\n--- a/tests/vmgenid-test.c\n+++ b/tests/vmgenid-test.c\n@@ -130,41 +130,32 @@ static void read_guid_from_monitor(QemuUUID *guid)\n\n static char disk[] = \"tests/vmgenid-test-disk-XXXXXX\";\n\n-static char *guid_cmd_strdup(const char *guid)\n-{\n-    return g_strdup_printf(\"-machine accel=kvm:tcg \"\n-                           \"-device vmgenid,id=testvgid,guid=%s \"\n-                           \"-drive id=hd0,if=none,file=%s,format=raw \"\n-                           \"-device ide-hd,drive=hd0 \",\n-                           guid, disk);\n-}\n-\n+#define GUID_CMD(guid)                          \\\n+    \"-machine accel=kvm:tcg \"                   \\\n+    \"-device vmgenid,id=testvgid,guid=%s \"      \\\n+    \"-drive id=hd0,if=none,file=%s,format=raw \" \\\n+    \"-device ide-hd,drive=hd0 \", guid, disk\n\n static void vmgenid_set_guid_test(void)\n {\n     QemuUUID expected, measured;\n-    gchar *cmd;\n\n     g_assert(qemu_uuid_parse(VGID_GUID, &expected) == 0);\n\n-    cmd = guid_cmd_strdup(VGID_GUID);\n-    qtest_start(cmd);\n+    global_qtest = qtest_init(GUID_CMD(VGID_GUID));\n\n     /* Read the GUID from accessing guest memory */\n     read_guid_from_memory(&measured);\n     g_assert(memcmp(measured.data, expected.data, sizeof(measured.data)) == 0);\n\n     qtest_quit(global_qtest);\n-    g_free(cmd);\n }\n\n static void vmgenid_set_guid_auto_test(void)\n {\n-    char *cmd;\n     QemuUUID measured;\n\n-    cmd = guid_cmd_strdup(\"auto\");\n-    qtest_start(cmd);\n+    global_qtest = qtest_init(GUID_CMD(\"auto\"));\n\n     read_guid_from_memory(&measured);\n\n@@ -172,25 +163,21 @@ static void vmgenid_set_guid_auto_test(void)\n     g_assert(!qemu_uuid_is_null(&measured));\n\n     qtest_quit(global_qtest);\n-    g_free(cmd);\n }\n\n static void vmgenid_query_monitor_test(void)\n {\n     QemuUUID expected, measured;\n-    gchar *cmd;\n\n     g_assert(qemu_uuid_parse(VGID_GUID, &expected) == 0);\n\n-    cmd = guid_cmd_strdup(VGID_GUID);\n-    qtest_start(cmd);\n+    global_qtest = qtest_init(GUID_CMD(VGID_GUID));\n\n     /* Read the GUID via the monitor */\n     read_guid_from_monitor(&measured);\n     g_assert(memcmp(measured.data, expected.data, sizeof(measured.data)) == 0);\n\n     qtest_quit(global_qtest);\n-    g_free(cmd);\n }\n\n int main(int argc, char **argv)\ndiff --git a/tests/vmxnet3-test.c b/tests/vmxnet3-test.c\nindex 159c0ad728..c9a876bcd9 100644\n--- a/tests/vmxnet3-test.c\n+++ b/tests/vmxnet3-test.c\n@@ -22,10 +22,10 @@ int main(int argc, char **argv)\n     g_test_init(&argc, &argv, NULL);\n     qtest_add_func(\"/vmxnet3/nop\", nop);\n\n-    qtest_start(\"-device vmxnet3\");\n+    global_qtest = qtest_init(\"-device vmxnet3\");\n     ret = g_test_run();\n\n-    qtest_end();\n+    qtest_quit(global_qtest);\n\n     return ret;\n }\n",
    "prefixes": [
        "v6",
        "28/29"
    ]
}