All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PULL 0/4] hmp queue
@ 2017-04-25 10:41 Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-25 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

The following changes since commit f4b5b021c847669b1c78050aea26fe9abceef6dd:

  Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2017-04-25 09:21:54 +0100)

are available in the git repository at:

  git://github.com/dagrh/qemu.git tags/pull-hmp-20170425

for you to fetch changes up to 1eb8e78dd1cd4e0b4170fd42f6d8882c867f334b:

  tests: Add a tester for HMP commands (2017-04-25 11:26:52 +0100)

----------------------------------------------------------------
HMP pull with fixed test/strcmp case

----------------------------------------------------------------
Paolo Bonzini (1):
      hmp: gpa2hva and gpa2hpa hostaddr command

Thomas Huth (3):
      libqtest: Ignore QMP events when parsing the response for HMP commands
      libqtest: Add a generic function to run a callback function for every machine
      tests: Add a tester for HMP commands

 hmp-commands.hx        |  32 ++++++++++
 monitor.c              | 101 +++++++++++++++++++++++++++++++
 tests/Makefile.include |   2 +
 tests/libqtest.c       |  36 +++++++++++
 tests/libqtest.h       |  12 +++-
 tests/pc-cpu-test.c    |  95 +++++++++++------------------
 tests/qom-test.c       |  36 ++---------
 tests/test-hmp.c       | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 385 insertions(+), 90 deletions(-)
 create mode 100644 tests/test-hmp.c

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

* [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command
  2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
@ 2017-04-25 10:41 ` Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-25 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: Paolo Bonzini <pbonzini@redhat.com>

These commands are useful when testing machine-check passthrough.
gpa2hva is useful to inject a MADV_HWPOISON madvise from gdb, while
gpa2hpa is useful to inject an error with the mce-inject kernel
module.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <1490021158-4469-1-git-send-email-pbonzini@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20170420133058.12911-1-pbonzini@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 hmp-commands.hx |  32 ++++++++++++++++++
 monitor.c       | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 133 insertions(+)

diff --git a/hmp-commands.hx b/hmp-commands.hx
index 88192817b2..0aca984261 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -526,6 +526,38 @@ Dump 80 16 bit values at the start of the video memory.
 ETEXI
 
     {
+        .name       = "gpa2hva",
+        .args_type  = "addr:l",
+        .params     = "addr",
+        .help       = "print the host virtual address corresponding to a guest physical address",
+        .cmd        = hmp_gpa2hva,
+    },
+
+STEXI
+@item gpa2hva @var{addr}
+@findex gpa2hva
+Print the host virtual address at which the guest's physical address @var{addr}
+is mapped.
+ETEXI
+
+#ifdef CONFIG_LINUX
+    {
+        .name       = "gpa2hpa",
+        .args_type  = "addr:l",
+        .params     = "addr",
+        .help       = "print the host physical address corresponding to a guest physical address",
+        .cmd        = hmp_gpa2hpa,
+    },
+#endif
+
+STEXI
+@item gpa2hpa @var{addr}
+@findex gpa2hpa
+Print the host physical address at which the guest's physical address @var{addr}
+is mapped.
+ETEXI
+
+    {
         .name       = "p|print",
         .args_type  = "fmt:/,val:l",
         .params     = "/fmt expr",
diff --git a/monitor.c b/monitor.c
index be282ecb80..a27dc8003f 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1421,6 +1421,107 @@ static void hmp_physical_memory_dump(Monitor *mon, const QDict *qdict)
     memory_dump(mon, count, format, size, addr, 1);
 }
 
+static void *gpa2hva(MemoryRegion **p_mr, hwaddr addr, Error **errp)
+{
+    MemoryRegionSection mrs = memory_region_find(get_system_memory(),
+                                                 addr, 1);
+
+    if (!mrs.mr) {
+        error_setg(errp, "No memory is mapped at address 0x%" HWADDR_PRIx, addr);
+        return NULL;
+    }
+
+    if (!memory_region_is_ram(mrs.mr) && !memory_region_is_romd(mrs.mr)) {
+        error_setg(errp, "Memory at address 0x%" HWADDR_PRIx "is not RAM", addr);
+        memory_region_unref(mrs.mr);
+        return NULL;
+    }
+
+    *p_mr = mrs.mr;
+    return qemu_map_ram_ptr(mrs.mr->ram_block, mrs.offset_within_region);
+}
+
+static void hmp_gpa2hva(Monitor *mon, const QDict *qdict)
+{
+    hwaddr addr = qdict_get_int(qdict, "addr");
+    Error *local_err = NULL;
+    MemoryRegion *mr = NULL;
+    void *ptr;
+
+    ptr = gpa2hva(&mr, addr, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+        return;
+    }
+
+    monitor_printf(mon, "Host virtual address for 0x%" HWADDR_PRIx
+                   " (%s) is %p\n",
+                   addr, mr->name, ptr);
+
+    memory_region_unref(mr);
+}
+
+#ifdef CONFIG_LINUX
+static uint64_t vtop(void *ptr, Error **errp)
+{
+    uint64_t pinfo;
+    uint64_t ret = -1;
+    uintptr_t addr = (uintptr_t) ptr;
+    uintptr_t pagesize = getpagesize();
+    off_t offset = addr / pagesize * sizeof(pinfo);
+    int fd;
+
+    fd = open("/proc/self/pagemap", O_RDONLY);
+    if (fd == -1) {
+        error_setg_errno(errp, errno, "Cannot open /proc/self/pagemap");
+        return -1;
+    }
+
+    /* Force copy-on-write if necessary.  */
+    atomic_add((uint8_t *)ptr, 0);
+
+    if (pread(fd, &pinfo, sizeof(pinfo), offset) != sizeof(pinfo)) {
+        error_setg_errno(errp, errno, "Cannot read pagemap");
+        goto out;
+    }
+    if ((pinfo & (1ull << 63)) == 0) {
+        error_setg(errp, "Page not present");
+        goto out;
+    }
+    ret = ((pinfo & 0x007fffffffffffffull) * pagesize) | (addr & (pagesize - 1));
+
+out:
+    close(fd);
+    return ret;
+}
+
+static void hmp_gpa2hpa(Monitor *mon, const QDict *qdict)
+{
+    hwaddr addr = qdict_get_int(qdict, "addr");
+    Error *local_err = NULL;
+    MemoryRegion *mr = NULL;
+    void *ptr;
+    uint64_t physaddr;
+
+    ptr = gpa2hva(&mr, addr, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+        return;
+    }
+
+    physaddr = vtop(ptr, &local_err);
+    if (local_err) {
+        error_report_err(local_err);
+    } else {
+        monitor_printf(mon, "Host physical address for 0x%" HWADDR_PRIx
+                       " (%s) is 0x%" PRIx64 "\n",
+                       addr, mr->name, (uint64_t) physaddr);
+    }
+
+    memory_region_unref(mr);
+}
+#endif
+
 static void do_print(Monitor *mon, const QDict *qdict)
 {
     int format = qdict_get_int(qdict, "format");
-- 
2.12.2

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

* [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands
  2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
@ 2017-04-25 10:41 ` Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-25 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: Thomas Huth <thuth@redhat.com>

When running certain HMP commands (like "device_del") via QMP, we
can sometimes get a QMP event in the response first, so that the
"g_assert(ret)" statement in qtest_hmp() triggers and the test
fails. Fix this by ignoring such QMP events while looking for the
real return value from QMP.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1490860207-8302-2-git-send-email-thuth@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
  Added note to qtest_hmp/qtest_hmpv's header description to say
  it discards events
---
 tests/libqtest.c | 6 ++++++
 tests/libqtest.h | 4 +++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 99b1195355..0b0bf1d460 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -588,6 +588,12 @@ char *qtest_hmpv(QTestState *s, const char *fmt, va_list ap)
                      " 'arguments': {'command-line': %s}}",
                      cmd);
     ret = g_strdup(qdict_get_try_str(resp, "return"));
+    while (ret == NULL && qdict_get_try_str(resp, "event")) {
+        /* Ignore asynchronous QMP events */
+        QDECREF(resp);
+        resp = qtest_qmp_receive(s);
+        ret = g_strdup(qdict_get_try_str(resp, "return"));
+    }
     g_assert(ret);
     QDECREF(resp);
     g_free(cmd);
diff --git a/tests/libqtest.h b/tests/libqtest.h
index 2c9962d94f..ee237448da 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -132,11 +132,12 @@ void qtest_qmp_eventwait(QTestState *s, const char *event);
 QDict *qtest_qmp_eventwait_ref(QTestState *s, const char *event);
 
 /**
- * qtest_hmpv:
+ * qtest_hmp:
  * @s: #QTestState instance to operate on.
  * @fmt...: HMP command to send to QEMU
  *
  * 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.
  */
@@ -149,6 +150,7 @@ char *qtest_hmp(QTestState *s, const char *fmt, ...);
  * @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.
  */
-- 
2.12.2

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

* [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine
  2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
@ 2017-04-25 10:41 ` Dr. David Alan Gilbert (git)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
  2017-04-25 13:13 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
  4 siblings, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-25 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: Thomas Huth <thuth@redhat.com>

Some tests need to run single tests for every available machine of the
current QEMU binary. To avoid code duplication, let's extract this
code that deals with 'query-machines' into a separate function.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1490860207-8302-3-git-send-email-thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 tests/libqtest.c    | 30 +++++++++++++++++
 tests/libqtest.h    |  8 +++++
 tests/pc-cpu-test.c | 95 ++++++++++++++++++++---------------------------------
 tests/qom-test.c    | 36 ++++----------------
 4 files changed, 80 insertions(+), 89 deletions(-)

diff --git a/tests/libqtest.c b/tests/libqtest.c
index 0b0bf1d460..512c150266 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -946,3 +946,33 @@ bool qtest_big_endian(QTestState *s)
 {
     return s->big_endian;
 }
+
+void qtest_cb_for_every_machine(void (*cb)(const char *machine))
+{
+    QDict *response, *minfo;
+    QList *list;
+    const QListEntry *p;
+    QObject *qobj;
+    QString *qstr;
+    const char *mname;
+
+    qtest_start("-machine none");
+    response = qmp("{ 'execute': 'query-machines' }");
+    g_assert(response);
+    list = qdict_get_qlist(response, "return");
+    g_assert(list);
+
+    for (p = qlist_first(list); p; p = qlist_next(p)) {
+        minfo = qobject_to_qdict(qlist_entry_obj(p));
+        g_assert(minfo);
+        qobj = qdict_get(minfo, "name");
+        g_assert(qobj);
+        qstr = qobject_to_qstring(qobj);
+        g_assert(qstr);
+        mname = qstring_get_str(qstr);
+        cb(mname);
+    }
+
+    qtest_end();
+    QDECREF(response);
+}
diff --git a/tests/libqtest.h b/tests/libqtest.h
index ee237448da..38bc1e9953 100644
--- a/tests/libqtest.h
+++ b/tests/libqtest.h
@@ -919,4 +919,12 @@ 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, ...);
 
+/**
+ * qtest_cb_for_every_machine:
+ * @cb: Pointer to the callback function
+ *
+ *  Call a callback function for every name of all available machines.
+ */
+void qtest_cb_for_every_machine(void (*cb)(const char *machine));
+
 #endif
diff --git a/tests/pc-cpu-test.c b/tests/pc-cpu-test.c
index c3a2633d3c..c4211a4e85 100644
--- a/tests/pc-cpu-test.c
+++ b/tests/pc-cpu-test.c
@@ -79,69 +79,46 @@ static void test_data_free(gpointer data)
     g_free(pc);
 }
 
-static void add_pc_test_cases(void)
+static void add_pc_test_case(const char *mname)
 {
-    QDict *response, *minfo;
-    QList *list;
-    const QListEntry *p;
-    QObject *qobj;
-    QString *qstr;
-    const char *mname;
     char *path;
     PCTestData *data;
 
-    qtest_start("-machine none");
-    response = qmp("{ 'execute': 'query-machines' }");
-    g_assert(response);
-    list = qdict_get_qlist(response, "return");
-    g_assert(list);
-
-    for (p = qlist_first(list); p; p = qlist_next(p)) {
-        minfo = qobject_to_qdict(qlist_entry_obj(p));
-        g_assert(minfo);
-        qobj = qdict_get(minfo, "name");
-        g_assert(qobj);
-        qstr = qobject_to_qstring(qobj);
-        g_assert(qstr);
-        mname = qstring_get_str(qstr);
-        if (!g_str_has_prefix(mname, "pc-")) {
-            continue;
-        }
-        data = g_malloc(sizeof(PCTestData));
-        data->machine = g_strdup(mname);
-        data->cpu_model = "Haswell"; /* 1.3+ theoretically */
-        data->sockets = 1;
-        data->cores = 3;
-        data->threads = 2;
-        data->maxcpus = data->sockets * data->cores * data->threads * 2;
-        if (g_str_has_suffix(mname, "-1.4") ||
-            (strcmp(mname, "pc-1.3") == 0) ||
-            (strcmp(mname, "pc-1.2") == 0) ||
-            (strcmp(mname, "pc-1.1") == 0) ||
-            (strcmp(mname, "pc-1.0") == 0) ||
-            (strcmp(mname, "pc-0.15") == 0) ||
-            (strcmp(mname, "pc-0.14") == 0) ||
-            (strcmp(mname, "pc-0.13") == 0) ||
-            (strcmp(mname, "pc-0.12") == 0) ||
-            (strcmp(mname, "pc-0.11") == 0) ||
-            (strcmp(mname, "pc-0.10") == 0)) {
-            path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
-                                   mname, data->sockets, data->cores,
-                                   data->threads, data->maxcpus);
-            qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
-                                     test_data_free);
-            g_free(path);
-        } else {
-            path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
-                                   mname, data->sockets, data->cores,
-                                   data->threads, data->maxcpus);
-            qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
-                                     test_data_free);
-            g_free(path);
-        }
+    if (!g_str_has_prefix(mname, "pc-")) {
+        return;
+    }
+    data = g_malloc(sizeof(PCTestData));
+    data->machine = g_strdup(mname);
+    data->cpu_model = "Haswell"; /* 1.3+ theoretically */
+    data->sockets = 1;
+    data->cores = 3;
+    data->threads = 2;
+    data->maxcpus = data->sockets * data->cores * data->threads * 2;
+    if (g_str_has_suffix(mname, "-1.4") ||
+        (strcmp(mname, "pc-1.3") == 0) ||
+        (strcmp(mname, "pc-1.2") == 0) ||
+        (strcmp(mname, "pc-1.1") == 0) ||
+        (strcmp(mname, "pc-1.0") == 0) ||
+        (strcmp(mname, "pc-0.15") == 0) ||
+        (strcmp(mname, "pc-0.14") == 0) ||
+        (strcmp(mname, "pc-0.13") == 0) ||
+        (strcmp(mname, "pc-0.12") == 0) ||
+        (strcmp(mname, "pc-0.11") == 0) ||
+        (strcmp(mname, "pc-0.10") == 0)) {
+        path = g_strdup_printf("cpu/%s/init/%ux%ux%u&maxcpus=%u",
+                               mname, data->sockets, data->cores,
+                               data->threads, data->maxcpus);
+        qtest_add_data_func_full(path, data, test_pc_without_cpu_add,
+                                 test_data_free);
+        g_free(path);
+    } else {
+        path = g_strdup_printf("cpu/%s/add/%ux%ux%u&maxcpus=%u",
+                               mname, data->sockets, data->cores,
+                               data->threads, data->maxcpus);
+        qtest_add_data_func_full(path, data, test_pc_with_cpu_add,
+                                 test_data_free);
+        g_free(path);
     }
-    QDECREF(response);
-    qtest_end();
 }
 
 int main(int argc, char **argv)
@@ -151,7 +128,7 @@ int main(int argc, char **argv)
     g_test_init(&argc, &argv, NULL);
 
     if (strcmp(arch, "i386") == 0 || strcmp(arch, "x86_64") == 0) {
-        add_pc_test_cases();
+        qtest_cb_for_every_machine(add_pc_test_case);
     }
 
     return g_test_run();
diff --git a/tests/qom-test.c b/tests/qom-test.c
index d48f890e84..ab0595dc75 100644
--- a/tests/qom-test.c
+++ b/tests/qom-test.c
@@ -107,46 +107,22 @@ static void test_machine(gconstpointer data)
     g_free((void *)machine);
 }
 
-static void add_machine_test_cases(void)
+static void add_machine_test_case(const char *mname)
 {
     const char *arch = qtest_get_arch();
-    QDict *response, *minfo;
-    QList *list;
-    const QListEntry *p;
-    QObject *qobj;
-    QString *qstr;
-    const char *mname;
 
-    qtest_start("-machine none");
-    response = qmp("{ 'execute': 'query-machines' }");
-    g_assert(response);
-    list = qdict_get_qlist(response, "return");
-    g_assert(list);
-
-    for (p = qlist_first(list); p; p = qlist_next(p)) {
-        minfo = qobject_to_qdict(qlist_entry_obj(p));
-        g_assert(minfo);
-        qobj = qdict_get(minfo, "name");
-        g_assert(qobj);
-        qstr = qobject_to_qstring(qobj);
-        g_assert(qstr);
-        mname = qstring_get_str(qstr);
-        if (!is_blacklisted(arch, mname)) {
-            char *path = g_strdup_printf("qom/%s", mname);
-            qtest_add_data_func(path, g_strdup(mname), test_machine);
-            g_free(path);
-        }
+    if (!is_blacklisted(arch, mname)) {
+        char *path = g_strdup_printf("qom/%s", mname);
+        qtest_add_data_func(path, g_strdup(mname), test_machine);
+        g_free(path);
     }
-
-    qtest_end();
-    QDECREF(response);
 }
 
 int main(int argc, char **argv)
 {
     g_test_init(&argc, &argv, NULL);
 
-    add_machine_test_cases();
+    qtest_cb_for_every_machine(add_machine_test_case);
 
     return g_test_run();
 }
-- 
2.12.2

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

* [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands
  2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
                   ` (2 preceding siblings ...)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
@ 2017-04-25 10:41 ` Dr. David Alan Gilbert (git)
  2017-04-25 13:13 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
  4 siblings, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-25 10:41 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: Thomas Huth <thuth@redhat.com>

HMP commands do not get any automatic testing yet, so on certain
QEMU machines, some HMP commands were causing crashes in the past.
Thus we should test HMP commands in our test suite, too, to avoid
that such problems creep in again in the future.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <1493097407-20482-1-git-send-email-thuth@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 tests/Makefile.include |   2 +
 tests/test-hmp.c       | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+)
 create mode 100644 tests/test-hmp.c

diff --git a/tests/Makefile.include b/tests/Makefile.include
index 579ec07cce..31931c0d77 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -331,6 +331,7 @@ check-qtest-xtensaeb-y = $(check-qtest-xtensa-y)
 check-qtest-s390x-y = tests/boot-serial-test$(EXESUF)
 
 check-qtest-generic-y += tests/qom-test$(EXESUF)
+check-qtest-generic-y += tests/test-hmp$(EXESUF)
 
 qapi-schema += alternate-any.json
 qapi-schema += alternate-array.json
@@ -720,6 +721,7 @@ tests/tpci200-test$(EXESUF): tests/tpci200-test.o
 tests/display-vga-test$(EXESUF): tests/display-vga-test.o
 tests/ipoctal232-test$(EXESUF): tests/ipoctal232-test.o
 tests/qom-test$(EXESUF): tests/qom-test.o
+tests/test-hmp$(EXESUF): tests/test-hmp.o
 tests/drive_del-test$(EXESUF): tests/drive_del-test.o $(libqos-pc-obj-y)
 tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o $(libqos-pc-obj-y)
 tests/nvme-test$(EXESUF): tests/nvme-test.o
diff --git a/tests/test-hmp.c b/tests/test-hmp.c
new file mode 100644
index 0000000000..99e35ec15a
--- /dev/null
+++ b/tests/test-hmp.c
@@ -0,0 +1,161 @@
+/*
+ * Test HMP commands.
+ *
+ * Copyright (c) 2017 Red Hat Inc.
+ *
+ * Author:
+ *    Thomas Huth <thuth@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2
+ * or later. See the COPYING file in the top-level directory.
+ *
+ * This test calls some HMP commands for all machines that the current
+ * QEMU binary provides, to check whether they terminate successfully
+ * (i.e. do not crash QEMU).
+ */
+
+#include "qemu/osdep.h"
+#include "libqtest.h"
+
+static int verbose;
+
+static const char *hmp_cmds[] = {
+    "boot_set ndc",
+    "chardev-add null,id=testchardev1",
+    "chardev-remove testchardev1",
+    "commit all",
+    "cpu-add 1",
+    "cpu 0",
+    "device_add ?",
+    "device_add usb-mouse,id=mouse1",
+    "mouse_button 7",
+    "mouse_move 10 10",
+    "mouse_button 0",
+    "device_del mouse1",
+    "dump-guest-memory /dev/null 0 4096",
+    "gdbserver",
+    "host_net_add user id=net0",
+    "hostfwd_add tcp::43210-:43210",
+    "hostfwd_remove tcp::43210-:43210",
+    "host_net_remove 0 net0",
+    "i /w 0",
+    "log all",
+    "log none",
+    "memsave 0 4096 \"/dev/null\"",
+    "migrate_set_cache_size 1",
+    "migrate_set_downtime 1",
+    "migrate_set_speed 1",
+    "netdev_add user,id=net1",
+    "set_link net1 off",
+    "set_link net1 on",
+    "netdev_del net1",
+    "nmi",
+    "o /w 0 0x1234",
+    "object_add memory-backend-ram,id=mem1,size=256M",
+    "object_del mem1",
+    "pmemsave 0 4096 \"/dev/null\"",
+    "p $pc + 8",
+    "qom-list /",
+    "qom-set /machine initrd test",
+    "screendump /dev/null",
+    "sendkey x",
+    "singlestep on",
+    "wavcapture /dev/null",
+    "stopcapture 0",
+    "sum 0 512",
+    "x /8i 0x100",
+    "xp /16x 0",
+    NULL
+};
+
+/* Run through the list of pre-defined commands */
+static void test_commands(void)
+{
+    char *response;
+    int i;
+
+    for (i = 0; hmp_cmds[i] != NULL; i++) {
+        if (verbose) {
+            fprintf(stderr, "\t%s\n", hmp_cmds[i]);
+        }
+        response = hmp(hmp_cmds[i]);
+        g_free(response);
+    }
+
+}
+
+/* Run through all info commands and call them blindly (without arguments) */
+static void test_info_commands(void)
+{
+    char *resp, *info, *info_buf, *endp;
+
+    info_buf = info = hmp("help info");
+
+    while (*info) {
+        /* Extract the info command, ignore parameters and description */
+        g_assert(strncmp(info, "info ", 5) == 0);
+        endp = strchr(&info[5], ' ');
+        g_assert(endp != NULL);
+        *endp = '\0';
+        /* Now run the info command */
+        if (verbose) {
+            fprintf(stderr, "\t%s\n", info);
+        }
+        resp = hmp(info);
+        g_free(resp);
+        /* And move forward to the next line */
+        info = strchr(endp + 1, '\n');
+        if (!info) {
+            break;
+        }
+        info += 1;
+    }
+
+    g_free(info_buf);
+}
+
+static void test_machine(gconstpointer data)
+{
+    const char *machine = data;
+    char *args;
+
+    args = g_strdup_printf("-S -M %s", machine);
+    qtest_start(args);
+
+    test_info_commands();
+    test_commands();
+
+    qtest_end();
+    g_free(args);
+    g_free((void *)data);
+}
+
+static void add_machine_test_case(const char *mname)
+{
+    char *path;
+
+    /* Ignore blacklisted machines that have known problems */
+    if (!strcmp("puv3", mname) || !strcmp("tricore_testboard", mname) ||
+        !strcmp("xenfv", mname) || !strcmp("xenpv", mname)) {
+        return;
+    }
+
+    path = g_strdup_printf("hmp/%s", mname);
+    qtest_add_data_func(path, g_strdup(mname), test_machine);
+    g_free(path);
+}
+
+int main(int argc, char **argv)
+{
+    char *v_env = getenv("V");
+
+    if (v_env && *v_env >= '2') {
+        verbose = true;
+    }
+
+    g_test_init(&argc, &argv, NULL);
+
+    qtest_cb_for_every_machine(add_machine_test_case);
+
+    return g_test_run();
+}
-- 
2.12.2

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
                   ` (3 preceding siblings ...)
  2017-04-25 10:41 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
@ 2017-04-25 13:13 ` Peter Maydell
  2017-04-25 13:59   ` Dr. David Alan Gilbert
  2017-04-25 14:07   ` Thomas Huth
  4 siblings, 2 replies; 15+ messages in thread
From: Peter Maydell @ 2017-04-25 13:13 UTC (permalink / raw)
  To: Dr. David Alan Gilbert (git); +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth

On 25 April 2017 at 11:41, Dr. David Alan Gilbert (git)
<dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> The following changes since commit f4b5b021c847669b1c78050aea26fe9abceef6dd:
>
>   Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2017-04-25 09:21:54 +0100)
>
> are available in the git repository at:
>
>   git://github.com/dagrh/qemu.git tags/pull-hmp-20170425
>
> for you to fetch changes up to 1eb8e78dd1cd4e0b4170fd42f6d8882c867f334b:
>
>   tests: Add a tester for HMP commands (2017-04-25 11:26:52 +0100)
>
> ----------------------------------------------------------------
> HMP pull with fixed test/strcmp case
>
> ----------------------------------------------------------------

test-hmp fails for me on OSX hosts:

TEST: tests/test-hmp... (pid=6008)
  /aarch64/hmp/n810:
qemu: qemu_mutex_lock: Invalid argument
Broken pipe
FAIL
GTester: last random seed: R02Sd714920da46f8a0e37afec762c6ee23b
(pid=6013)
  /aarch64/hmp/tosa:
qemu: qemu_mutex_lock: Invalid argument
Broken pipe
FAIL
GTester: last random seed: R02Sf3025925b9db75bdfdd9f09cf3119ad5

etc etc.

Can't do a backtrace, I'm afraid -- Apple's debugger doesn't seem
to work if you're not root and the lack of X11 forwarding on the
box I'm using remotely interacts really badly with qtest's
desire to run qemu as a background process that it's hard to
attach a debugger to. Something's probably not initializing
a mutex, though -- Linux by default treats zeroes as a valid
initialized mutex so it won't notice. You may be able to repro
on Linux by using the Linux PTHREAD_MUTEX_ERRORCHECK_NP
mutex attr, possibly.

thanks
-- PMM

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 13:13 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
@ 2017-04-25 13:59   ` Dr. David Alan Gilbert
  2017-04-25 14:07   ` Thomas Huth
  1 sibling, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert @ 2017-04-25 13:59 UTC (permalink / raw)
  To: Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth

* Peter Maydell (peter.maydell@linaro.org) wrote:
> On 25 April 2017 at 11:41, Dr. David Alan Gilbert (git)
> <dgilbert@redhat.com> wrote:
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > The following changes since commit f4b5b021c847669b1c78050aea26fe9abceef6dd:
> >
> >   Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2017-04-25 09:21:54 +0100)
> >
> > are available in the git repository at:
> >
> >   git://github.com/dagrh/qemu.git tags/pull-hmp-20170425
> >
> > for you to fetch changes up to 1eb8e78dd1cd4e0b4170fd42f6d8882c867f334b:
> >
> >   tests: Add a tester for HMP commands (2017-04-25 11:26:52 +0100)
> >
> > ----------------------------------------------------------------
> > HMP pull with fixed test/strcmp case
> >
> > ----------------------------------------------------------------
> 
> test-hmp fails for me on OSX hosts:
> 
> TEST: tests/test-hmp... (pid=6008)
>   /aarch64/hmp/n810:
> qemu: qemu_mutex_lock: Invalid argument
> Broken pipe
> FAIL
> GTester: last random seed: R02Sd714920da46f8a0e37afec762c6ee23b
> (pid=6013)
>   /aarch64/hmp/tosa:
> qemu: qemu_mutex_lock: Invalid argument
> Broken pipe
> FAIL
> GTester: last random seed: R02Sf3025925b9db75bdfdd9f09cf3119ad5
> etc etc.
> 
> Can't do a backtrace, I'm afraid -- Apple's debugger doesn't seem
> to work if you're not root and the lack of X11 forwarding on the
> box I'm using remotely interacts really badly with qtest's
> desire to run qemu as a background process that it's hard to
> attach a debugger to. Something's probably not initializing
> a mutex, though -- Linux by default treats zeroes as a valid
> initialized mutex so it won't notice. You may be able to repro
> on Linux by using the Linux PTHREAD_MUTEX_ERRORCHECK_NP
> mutex attr, possibly.

Hmm,  does running with QTEST_LOG=1  get you any more detail?

Dave

> thanks
> -- PMM
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 13:13 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
  2017-04-25 13:59   ` Dr. David Alan Gilbert
@ 2017-04-25 14:07   ` Thomas Huth
  2017-04-25 15:05     ` Peter Maydell
  1 sibling, 1 reply; 15+ messages in thread
From: Thomas Huth @ 2017-04-25 14:07 UTC (permalink / raw)
  To: Peter Maydell, Dr. David Alan Gilbert (git)
  Cc: QEMU Developers, Paolo Bonzini

On 25.04.2017 15:13, Peter Maydell wrote:
> On 25 April 2017 at 11:41, Dr. David Alan Gilbert (git)
> <dgilbert@redhat.com> wrote:
>> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>>
>> The following changes since commit f4b5b021c847669b1c78050aea26fe9abceef6dd:
>>
>>   Merge remote-tracking branch 'remotes/cody/tags/block-pull-request' into staging (2017-04-25 09:21:54 +0100)
>>
>> are available in the git repository at:
>>
>>   git://github.com/dagrh/qemu.git tags/pull-hmp-20170425
>>
>> for you to fetch changes up to 1eb8e78dd1cd4e0b4170fd42f6d8882c867f334b:
>>
>>   tests: Add a tester for HMP commands (2017-04-25 11:26:52 +0100)
>>
>> ----------------------------------------------------------------
>> HMP pull with fixed test/strcmp case
>>
>> ----------------------------------------------------------------
> 
> test-hmp fails for me on OSX hosts:
> 
> TEST: tests/test-hmp... (pid=6008)
>   /aarch64/hmp/n810:
> qemu: qemu_mutex_lock: Invalid argument
> Broken pipe
> FAIL
> GTester: last random seed: R02Sd714920da46f8a0e37afec762c6ee23b
> (pid=6013)
>   /aarch64/hmp/tosa:
> qemu: qemu_mutex_lock: Invalid argument
> Broken pipe
> FAIL
> GTester: last random seed: R02Sf3025925b9db75bdfdd9f09cf3119ad5

What a bummer... does it only happen with aarch64 or also with the
other binaries?

> Can't do a backtrace, I'm afraid -- Apple's debugger doesn't seem
> to work if you're not root and the lack of X11 forwarding on the
> box I'm using remotely interacts really badly with qtest's
> desire to run qemu as a background process that it's hard to
> attach a debugger to. Something's probably not initializing
> a mutex, though -- Linux by default treats zeroes as a valid
> initialized mutex so it won't notice. You may be able to repro
> on Linux by using the Linux PTHREAD_MUTEX_ERRORCHECK_NP
> mutex attr, possibly.

I tried to set that attribute in qemu_mutex_init() (assuming that this
is what you meant), but it does not make a difference here on Linux -
the test always succeeds.

So another idea: Could you start the test in verbose mode like this:

V=2 QTEST_QEMU_BINARY=aarch64-softmmu/qemu-system-aarch64 tests/test-hmp

Maybe we get a hint which HMP command is causing the trouble here...

 Thomas

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 14:07   ` Thomas Huth
@ 2017-04-25 15:05     ` Peter Maydell
  2017-04-25 15:09       ` Peter Maydell
  0 siblings, 1 reply; 15+ messages in thread
From: Peter Maydell @ 2017-04-25 15:05 UTC (permalink / raw)
  To: Thomas Huth; +Cc: Dr. David Alan Gilbert (git), QEMU Developers, Paolo Bonzini

On 25 April 2017 at 15:07, Thomas Huth <thuth@redhat.com> wrote:
> So another idea: Could you start the test in verbose mode like this:
>
> V=2 QTEST_QEMU_BINARY=aarch64-softmmu/qemu-system-aarch64 tests/test-hmp

manooth$ V=2 QTEST_QEMU_BINARY='aarch64-softmmu/qemu-system-aarch64'
tests/test-hmp
/aarch64/hmp/n810:      info balloon
        info block
        info block-jobs
        info blockstats
        info capture
        info chardev
        info cpus
        info cpustats
        info dump
        info history
        info hotpluggable-cpus
        info iothreads
        info irq
        info jit
qemu: qemu_mutex_lock: Invalid argument
Broken pipe

thanks
-- PMM

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 15:05     ` Peter Maydell
@ 2017-04-25 15:09       ` Peter Maydell
  2017-04-25 15:32         ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 15+ messages in thread
From: Peter Maydell @ 2017-04-25 15:09 UTC (permalink / raw)
  To: Thomas Huth; +Cc: Dr. David Alan Gilbert (git), QEMU Developers, Paolo Bonzini

On 25 April 2017 at 16:05, Peter Maydell <peter.maydell@linaro.org> wrote:
>         info jit
> qemu: qemu_mutex_lock: Invalid argument

Repro without the qtest machinery:

$ lldb -- ./aarch64-softmmu/qemu-system-aarch64 -M n810 -s -S -monitor
stdio -machine accel=qtest

then run and type 'info jit' at the monitor prompt.
Backtrace:

* thread #1: tid = 0x66a715, 0x00007fffd1931d42
libsystem_kernel.dylib`__pthread_kill + 10, queue =
'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x00007fffd1931d42 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fffd1a1f5bf libsystem_pthread.dylib`pthread_kill + 90
    frame #2: 0x00007fffd1897420 libsystem_c.dylib`abort + 129
    frame #3: 0x000000010041bd05
qemu-system-aarch64`error_exit(err=<unavailable>, msg=<unavailable>) +
53 at qemu-thread-posix.c:35
    frame #4: 0x000000010041bd4d
qemu-system-aarch64`qemu_mutex_lock(mutex=<unavailable>) + 29 at
qemu-thread-posix.c:62
    frame #5: 0x0000000100010c7c qemu-system-aarch64`dump_exec_info
[inlined] tb_lock + 12 at translate-all.c:167
    frame #6: 0x0000000100010c70
qemu-system-aarch64`dump_exec_info(f=0x00000001020b6a10,
cpu_fprintf=(qemu-system-aarch64`monitor_fprintf at monitor.c:376)) +
48 at translate-all.c:1869
    frame #7: 0x0000000100048ec9
qemu-system-aarch64`hmp_info_jit(mon=0x00000001020b6a10,
qdict=<unavailable>) + 25 at monitor.c:1089
    frame #8: 0x0000000100043ae5
qemu-system-aarch64`handle_hmp_command(mon=0x00000001020b6a10,
cmdline=<unavailable>) + 3589 at monitor.c:3104
    frame #9: 0x000000010004262e
qemu-system-aarch64`monitor_command_cb(opaque=0x00000001020b6a10,
cmdline=<unavailable>, readline_opaque=<unavailable>) + 30 at
monitor.c:3902
    frame #10: 0x000000010042d355
qemu-system-aarch64`readline_handle_byte(rs=0x00000001028f4400,
ch=<unavailable>) + 3285 at readline.c:393
    frame #11: 0x0000000100046adc
qemu-system-aarch64`monitor_read(opaque=<unavailable>, buf="\n",
size=1) + 60 at monitor.c:3885
    frame #12: 0x00000001003c3cd3
qemu-system-aarch64`fd_chr_read(chan=<unavailable>,
cond=<unavailable>, opaque=<unavailable>) + 179 at char-fd.c:66
    frame #13: 0x00000001010b60bd
libglib-2.0.0.dylib`g_main_context_dispatch + 460
    frame #14: 0x00000001004193a1 qemu-system-aarch64`main_loop_wait
[inlined] glib_pollfds_poll + 545 at main-loop.c:213
    frame #15: 0x0000000100419364 qemu-system-aarch64`main_loop_wait
[inlined] os_host_main_loop_wait(timeout=<unavailable>) + 67 at
main-loop.c:261
    frame #16: 0x0000000100419321
qemu-system-aarch64`main_loop_wait(nonblocking=<unavailable>) + 417 at
main-loop.c:517
    frame #17: 0x000000010019a74f qemu-system-aarch64`qemu_main
[inlined] main_loop + 48 at vl.c:1898
    frame #18: 0x000000010019a71f
qemu-system-aarch64`qemu_main(argc=<unavailable>, argv=<unavailable>,
envp=<unavailable>) + 18623 at vl.c:4709
    frame #19: 0x000000010033d4ce
qemu-system-aarch64`-[QemuCocoaAppController
startEmulationWithArgc:argv:](self=<unavailable>, _cmd=<unavailable>,
argc=<unavailable>, argv=<unavailable>) + 30 at cocoa.m:978
    frame #20: 0x00007fffbbb0252c
CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__
+ 12
    frame #21: 0x00007fffbbb0242b CoreFoundation`_CFXRegistrationPost + 427
    frame #22: 0x00007fffbbb02192
CoreFoundation`___CFXNotificationPost_block_invoke + 50
    frame #23: 0x00007fffbbac0772
CoreFoundation`-[_CFXNotificationRegistrar
find:object:observer:enumerator:] + 2018
    frame #24: 0x00007fffbbabf75b CoreFoundation`_CFXNotificationPost + 667
    frame #25: 0x00007fffbd500997 Foundation`-[NSNotificationCenter
postNotificationName:object:userInfo:] + 66
    frame #26: 0x00007fffb9729b1f AppKit`-[NSApplication
_postDidFinishNotification] + 297
    frame #27: 0x00007fffb9729884 AppKit`-[NSApplication
_sendFinishLaunchingNotification] + 208
    frame #28: 0x00007fffb95ecbe9
AppKit`-[NSApplication(NSAppleEventHandling) _handleAEOpenEvent:] +
552
    frame #29: 0x00007fffb95ec83b
AppKit`-[NSApplication(NSAppleEventHandling)
_handleCoreEvent:withReplyEvent:] + 661
    frame #30: 0x00007fffbd54be1d Foundation`-[NSAppleEventManager
dispatchRawAppleEvent:withRawReply:handlerRefCon:] + 290
    frame #31: 0x00007fffbd54bc97
Foundation`_NSAppleEventManagerGenericHandler + 102
    frame #32: 0x00007fffbc950f26 AE`aeDispatchAppleEvent(AEDesc
const*, AEDesc*, unsigned int, unsigned char*) + 544
    frame #33: 0x00007fffbc950c9d AE`dispatchEventAndSendReply(AEDesc
const*, AEDesc*) + 39
    frame #34: 0x00007fffbc950ba9 AE`aeProcessAppleEvent + 312
    frame #35: 0x00007fffbb05dddf HIToolbox`AEProcessAppleEvent + 55
    frame #36: 0x00007fffb95e80ed AppKit`_DPSNextEvent + 1833
    frame #37: 0x00007fffb9d6385e AppKit`-[NSApplication(NSEvent)
_nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 2796
    frame #38: 0x00007fffb95dc7ab AppKit`-[NSApplication run] + 926
    frame #39: 0x000000010033ee44
qemu-system-aarch64`main(argc=<unavailable>, argv=<unavailable>) +
2212 at cocoa.m:1368
    frame #40: 0x00007fffd1803235 libdyld.dylib`start + 1
    frame #41: 0x00007fffd1803235 libdyld.dylib`start + 1


I don't think it makes a great deal of sense to be able to call into
the TCG dump_exec_info() statistics routine if we never initialized
the TCG accelerator (because we're using -accel=qtest). Not sure
it makes much sense if -accel=kvm, for that matter...

thanks
-- PMM

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-25 15:09       ` Peter Maydell
@ 2017-04-25 15:32         ` Dr. David Alan Gilbert
  0 siblings, 0 replies; 15+ messages in thread
From: Dr. David Alan Gilbert @ 2017-04-25 15:32 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Thomas Huth, QEMU Developers, Paolo Bonzini

* Peter Maydell (peter.maydell@linaro.org) wrote:
> On 25 April 2017 at 16:05, Peter Maydell <peter.maydell@linaro.org> wrote:
> >         info jit
> > qemu: qemu_mutex_lock: Invalid argument
> 
> Repro without the qtest machinery:
> 
> $ lldb -- ./aarch64-softmmu/qemu-system-aarch64 -M n810 -s -S -monitor
> stdio -machine accel=qtest
> 
> then run and type 'info jit' at the monitor prompt.
> Backtrace:
> 
> * thread #1: tid = 0x66a715, 0x00007fffd1931d42
> libsystem_kernel.dylib`__pthread_kill + 10, queue =
> 'com.apple.main-thread', stop reason = signal SIGABRT
>   * frame #0: 0x00007fffd1931d42 libsystem_kernel.dylib`__pthread_kill + 10
>     frame #1: 0x00007fffd1a1f5bf libsystem_pthread.dylib`pthread_kill + 90
>     frame #2: 0x00007fffd1897420 libsystem_c.dylib`abort + 129
>     frame #3: 0x000000010041bd05
> qemu-system-aarch64`error_exit(err=<unavailable>, msg=<unavailable>) +
> 53 at qemu-thread-posix.c:35
>     frame #4: 0x000000010041bd4d
> qemu-system-aarch64`qemu_mutex_lock(mutex=<unavailable>) + 29 at
> qemu-thread-posix.c:62
>     frame #5: 0x0000000100010c7c qemu-system-aarch64`dump_exec_info
> [inlined] tb_lock + 12 at translate-all.c:167
>     frame #6: 0x0000000100010c70
> qemu-system-aarch64`dump_exec_info(f=0x00000001020b6a10,
> cpu_fprintf=(qemu-system-aarch64`monitor_fprintf at monitor.c:376)) +
> 48 at translate-all.c:1869
>     frame #7: 0x0000000100048ec9

OK, that looks like a real bug to me, in the KVM case it should fail
the same way; if I understand correctly the tb_lock only gets init'd
during code_gen_alloc called from tcg_init.

'info jit' needs fixing.

Dave

> qemu-system-aarch64`hmp_info_jit(mon=0x00000001020b6a10,
> qdict=<unavailable>) + 25 at monitor.c:1089
>     frame #8: 0x0000000100043ae5
> qemu-system-aarch64`handle_hmp_command(mon=0x00000001020b6a10,
> cmdline=<unavailable>) + 3589 at monitor.c:3104
>     frame #9: 0x000000010004262e
> qemu-system-aarch64`monitor_command_cb(opaque=0x00000001020b6a10,
> cmdline=<unavailable>, readline_opaque=<unavailable>) + 30 at
> monitor.c:3902
>     frame #10: 0x000000010042d355
> qemu-system-aarch64`readline_handle_byte(rs=0x00000001028f4400,
> ch=<unavailable>) + 3285 at readline.c:393
>     frame #11: 0x0000000100046adc
> qemu-system-aarch64`monitor_read(opaque=<unavailable>, buf="\n",
> size=1) + 60 at monitor.c:3885
>     frame #12: 0x00000001003c3cd3
> qemu-system-aarch64`fd_chr_read(chan=<unavailable>,
> cond=<unavailable>, opaque=<unavailable>) + 179 at char-fd.c:66
>     frame #13: 0x00000001010b60bd
> libglib-2.0.0.dylib`g_main_context_dispatch + 460
>     frame #14: 0x00000001004193a1 qemu-system-aarch64`main_loop_wait
> [inlined] glib_pollfds_poll + 545 at main-loop.c:213
>     frame #15: 0x0000000100419364 qemu-system-aarch64`main_loop_wait
> [inlined] os_host_main_loop_wait(timeout=<unavailable>) + 67 at
> main-loop.c:261
>     frame #16: 0x0000000100419321
> qemu-system-aarch64`main_loop_wait(nonblocking=<unavailable>) + 417 at
> main-loop.c:517
>     frame #17: 0x000000010019a74f qemu-system-aarch64`qemu_main
> [inlined] main_loop + 48 at vl.c:1898
>     frame #18: 0x000000010019a71f
> qemu-system-aarch64`qemu_main(argc=<unavailable>, argv=<unavailable>,
> envp=<unavailable>) + 18623 at vl.c:4709
>     frame #19: 0x000000010033d4ce
> qemu-system-aarch64`-[QemuCocoaAppController
> startEmulationWithArgc:argv:](self=<unavailable>, _cmd=<unavailable>,
> argc=<unavailable>, argv=<unavailable>) + 30 at cocoa.m:978
>     frame #20: 0x00007fffbbb0252c
> CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__
> + 12
>     frame #21: 0x00007fffbbb0242b CoreFoundation`_CFXRegistrationPost + 427
>     frame #22: 0x00007fffbbb02192
> CoreFoundation`___CFXNotificationPost_block_invoke + 50
>     frame #23: 0x00007fffbbac0772
> CoreFoundation`-[_CFXNotificationRegistrar
> find:object:observer:enumerator:] + 2018
>     frame #24: 0x00007fffbbabf75b CoreFoundation`_CFXNotificationPost + 667
>     frame #25: 0x00007fffbd500997 Foundation`-[NSNotificationCenter
> postNotificationName:object:userInfo:] + 66
>     frame #26: 0x00007fffb9729b1f AppKit`-[NSApplication
> _postDidFinishNotification] + 297
>     frame #27: 0x00007fffb9729884 AppKit`-[NSApplication
> _sendFinishLaunchingNotification] + 208
>     frame #28: 0x00007fffb95ecbe9
> AppKit`-[NSApplication(NSAppleEventHandling) _handleAEOpenEvent:] +
> 552
>     frame #29: 0x00007fffb95ec83b
> AppKit`-[NSApplication(NSAppleEventHandling)
> _handleCoreEvent:withReplyEvent:] + 661
>     frame #30: 0x00007fffbd54be1d Foundation`-[NSAppleEventManager
> dispatchRawAppleEvent:withRawReply:handlerRefCon:] + 290
>     frame #31: 0x00007fffbd54bc97
> Foundation`_NSAppleEventManagerGenericHandler + 102
>     frame #32: 0x00007fffbc950f26 AE`aeDispatchAppleEvent(AEDesc
> const*, AEDesc*, unsigned int, unsigned char*) + 544
>     frame #33: 0x00007fffbc950c9d AE`dispatchEventAndSendReply(AEDesc
> const*, AEDesc*) + 39
>     frame #34: 0x00007fffbc950ba9 AE`aeProcessAppleEvent + 312
>     frame #35: 0x00007fffbb05dddf HIToolbox`AEProcessAppleEvent + 55
>     frame #36: 0x00007fffb95e80ed AppKit`_DPSNextEvent + 1833
>     frame #37: 0x00007fffb9d6385e AppKit`-[NSApplication(NSEvent)
> _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 2796
>     frame #38: 0x00007fffb95dc7ab AppKit`-[NSApplication run] + 926
>     frame #39: 0x000000010033ee44
> qemu-system-aarch64`main(argc=<unavailable>, argv=<unavailable>) +
> 2212 at cocoa.m:1368
>     frame #40: 0x00007fffd1803235 libdyld.dylib`start + 1
>     frame #41: 0x00007fffd1803235 libdyld.dylib`start + 1
> 
> 
> I don't think it makes a great deal of sense to be able to call into
> the TCG dump_exec_info() statistics routine if we never initialized
> the TCG accelerator (because we're using -accel=qtest). Not sure
> it makes much sense if -accel=kvm, for that matter...
> 
> thanks
> -- PMM
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-24 16:57   ` Dr. David Alan Gilbert
@ 2017-04-25  3:32     ` Thomas Huth
  0 siblings, 0 replies; 15+ messages in thread
From: Thomas Huth @ 2017-04-25  3:32 UTC (permalink / raw)
  To: Dr. David Alan Gilbert, Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini

On 24.04.2017 18:57, Dr. David Alan Gilbert wrote:
> * Peter Maydell (peter.maydell@linaro.org) wrote:
>> On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
>> <dgilbert@redhat.com> wrote:
>>> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>>>
>>> The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
>>>
>>>   Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
>>>
>>> are available in the git repository at:
>>>
>>>   git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
>>>
>>> for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
>>>
>>>   tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
>>>
>>> ----------------------------------------------------------------
>>> HMP pull
>>>
>>> ----------------------------------------------------------------
>>
>>
>> clang doesn't like some code in test-hmp.c:
>>
>> /home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
>> logical not is only applied to the left hand side of this comparison
>> [-Werror,-Wlogical-not-parentheses]
>>     if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
>>         ^                       ~~
> 
> <snip>
> 
>> It does look rather odd:
>>
>> +    /* Ignore blacklisted machines that have known problems */
>> +    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
>> +        || !strcmp("tricore_testboard", mname)
>> +        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
>> +        return;
>> +    }
>>
>> since it's not using the same kind of expression to test
>> each board name -- is that deliberate, or accidental ?
>>
>> I think this expression means we'll actually skip every machine...
> 
> Yep, you're right, just tried it with logging.

Ouch, not sure how that happened ... looks like I used
"strcmp("isapc", mname) == 0" in the first version of my patch, and then
wanted to switch to "!strcmp()" when I added the xenfv and xenpv
machines, but forgot to remove the "== 0" everywhere :-( Big sorry for
that mess!

> That's accidental; hmm I should add a clang build somewhere.
> 
> Thomas: Do you want to send me a fixed version?

Yes, I'll send a fixed version, where I also correct the memory leak
that you noticed.

 Thomas

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-24 16:50 ` Peter Maydell
@ 2017-04-24 16:57   ` Dr. David Alan Gilbert
  2017-04-25  3:32     ` Thomas Huth
  0 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert @ 2017-04-24 16:57 UTC (permalink / raw)
  To: Peter Maydell; +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth

* Peter Maydell (peter.maydell@linaro.org) wrote:
> On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
> <dgilbert@redhat.com> wrote:
> > From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> >
> > The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
> >
> >   Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
> >
> > are available in the git repository at:
> >
> >   git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
> >
> > for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
> >
> >   tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
> >
> > ----------------------------------------------------------------
> > HMP pull
> >
> > ----------------------------------------------------------------
> 
> 
> clang doesn't like some code in test-hmp.c:
> 
> /home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
> logical not is only applied to the left hand side of this comparison
> [-Werror,-Wlogical-not-parentheses]
>     if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
>         ^                       ~~

<snip>

> It does look rather odd:
> 
> +    /* Ignore blacklisted machines that have known problems */
> +    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
> +        || !strcmp("tricore_testboard", mname)
> +        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
> +        return;
> +    }
> 
> since it's not using the same kind of expression to test
> each board name -- is that deliberate, or accidental ?
> 
> I think this expression means we'll actually skip every machine...

Yep, you're right, just tried it with logging.

That's accidental; hmm I should add a clang build somewhere.

Thomas: Do you want to send me a fixed version?

Dave

> thanks
> -- PMM
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK

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

* Re: [Qemu-devel] [PULL 0/4] hmp queue
  2017-04-24 15:32 Dr. David Alan Gilbert (git)
@ 2017-04-24 16:50 ` Peter Maydell
  2017-04-24 16:57   ` Dr. David Alan Gilbert
  0 siblings, 1 reply; 15+ messages in thread
From: Peter Maydell @ 2017-04-24 16:50 UTC (permalink / raw)
  To: Dr. David Alan Gilbert (git); +Cc: QEMU Developers, Paolo Bonzini, Thomas Huth

On 24 April 2017 at 16:32, Dr. David Alan Gilbert (git)
<dgilbert@redhat.com> wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
>
> The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:
>
>   Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)
>
> are available in the git repository at:
>
>   git://github.com/dagrh/qemu.git tags/pull-hmp-20170424
>
> for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:
>
>   tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)
>
> ----------------------------------------------------------------
> HMP pull
>
> ----------------------------------------------------------------


clang doesn't like some code in test-hmp.c:

/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: error:
logical not is only applied to the left hand side of this comparison
[-Werror,-Wlogical-not-parentheses]
    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
        ^                       ~~
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: note:
add parentheses after the '!' to evaluate the comparison first
    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
        ^
         (                          )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:138:9: note:
add parentheses around left hand side expression to silence this
warning
    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
        ^
        (                      )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: error:
logical not is only applied to the left hand side of this comparison
[-Werror,-Wlogical-not-parentheses]
        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
           ^                       ~~
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: note:
add parentheses after the '!' to evaluate the comparison first
        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
           ^
            (                          )
/home/petmay01/linaro/qemu-for-merges/tests/test-hmp.c:140:12: note:
add parentheses around left hand side expression to silence this
warning
        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
           ^
           (                      )


It does look rather odd:

+    /* Ignore blacklisted machines that have known problems */
+    if (!strcmp("isapc", mname) == 0 ||  !strcmp("puv3", mname)
+        || !strcmp("tricore_testboard", mname)
+        || !strcmp("xenfv", mname) == 0 || !strcmp("xenpv", mname)) {
+        return;
+    }

since it's not using the same kind of expression to test
each board name -- is that deliberate, or accidental ?

I think this expression means we'll actually skip every machine...

thanks
-- PMM

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

* [Qemu-devel] [PULL 0/4] hmp queue
@ 2017-04-24 15:32 Dr. David Alan Gilbert (git)
  2017-04-24 16:50 ` Peter Maydell
  0 siblings, 1 reply; 15+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2017-04-24 15:32 UTC (permalink / raw)
  To: qemu-devel; +Cc: pbonzini, thuth

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

The following changes since commit 4c55b1d0bad8a703f0499fe62e3761a0cd288da3:

  Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2017-04-24' into staging (2017-04-24 14:49:48 +0100)

are available in the git repository at:

  git://github.com/dagrh/qemu.git tags/pull-hmp-20170424

for you to fetch changes up to e4e3992e626c4cc7514b271807c90f587771c646:

  tests: Add a tester for HMP commands (2017-04-24 15:55:35 +0100)

----------------------------------------------------------------
HMP pull

----------------------------------------------------------------
Paolo Bonzini (1):
      hmp: gpa2hva and gpa2hpa hostaddr command

Thomas Huth (3):
      libqtest: Ignore QMP events when parsing the response for HMP commands
      libqtest: Add a generic function to run a callback function for every machine
      tests: Add a tester for HMP commands

 hmp-commands.hx        |  32 ++++++++++
 monitor.c              | 101 +++++++++++++++++++++++++++++++
 tests/Makefile.include |   2 +
 tests/libqtest.c       |  36 +++++++++++
 tests/libqtest.h       |  12 +++-
 tests/pc-cpu-test.c    |  95 +++++++++++------------------
 tests/qom-test.c       |  36 ++---------
 tests/test-hmp.c       | 161 +++++++++++++++++++++++++++++++++++++++++++++++++
 8 files changed, 385 insertions(+), 90 deletions(-)
 create mode 100644 tests/test-hmp.c

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

end of thread, other threads:[~2017-04-25 15:32 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-25 10:41 [Qemu-devel] [PULL 0/4] hmp queue Dr. David Alan Gilbert (git)
2017-04-25 10:41 ` [Qemu-devel] [PULL 1/4] hmp: gpa2hva and gpa2hpa hostaddr command Dr. David Alan Gilbert (git)
2017-04-25 10:41 ` [Qemu-devel] [PULL 2/4] libqtest: Ignore QMP events when parsing the response for HMP commands Dr. David Alan Gilbert (git)
2017-04-25 10:41 ` [Qemu-devel] [PULL 3/4] libqtest: Add a generic function to run a callback function for every machine Dr. David Alan Gilbert (git)
2017-04-25 10:41 ` [Qemu-devel] [PULL 4/4] tests: Add a tester for HMP commands Dr. David Alan Gilbert (git)
2017-04-25 13:13 ` [Qemu-devel] [PULL 0/4] hmp queue Peter Maydell
2017-04-25 13:59   ` Dr. David Alan Gilbert
2017-04-25 14:07   ` Thomas Huth
2017-04-25 15:05     ` Peter Maydell
2017-04-25 15:09       ` Peter Maydell
2017-04-25 15:32         ` Dr. David Alan Gilbert
  -- strict thread matches above, loose matches on Subject: below --
2017-04-24 15:32 Dr. David Alan Gilbert (git)
2017-04-24 16:50 ` Peter Maydell
2017-04-24 16:57   ` Dr. David Alan Gilbert
2017-04-25  3:32     ` Thomas Huth

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.