include/disas/disas.h | 2 +- include/exec/cpu-all.h | 25 ++- include/exec/log.h | 4 +- include/qemu/plugin.h | 65 +++--- include/qemu/qemu-plugin.h | 2 +- linux-user/qemu.h | 31 ++- target/alpha/cpu-param.h | 15 +- accel/tcg/translate-all.c | 54 ++++- bsd-user/main.c | 4 +- disas.c | 37 +++- linux-user/elfload.c | 503 +++++++++++++++++++++--------------------- linux-user/flatload.c | 6 + linux-user/main.c | 27 +-- plugins/api.c | 4 +- tcg/tcg.c | 4 +- .travis.yml | 18 +- MAINTAINERS | 1 + accel/tcg/trace-events | 8 +- tests/guest-debug/run-test.py | 6 + 19 files changed, 424 insertions(+), 392 deletions(-)
The following changes since commit 2478b8ecd45f81a21b9aa319ce7147a790a2144f:
Merge remote-tracking branch 'remotes/kraxel/tags/ui-20200515-pull-request' into staging (2020-05-15 11:18:13 +0100)
are available in the Git repository at:
https://github.com/stsquad/qemu.git tags/pull-testing-tcg-plugins-150520-2
for you to fetch changes up to adf1cfbdc29e6e3342ca07701be4d2cbfd7d3907:
MAINTAINERS: update the orphaned cpus-common.c file (2020-05-15 15:25:16 +0100)
----------------------------------------------------------------
Various testing, tcg and plugin updates
- fix bug in gdbstub tests that leave hanging QEMUs
- tweak s390x travis test
- re-factor guest_base handling
- support "notes" in disassembler output
- include guest address notes in out_asm
- cleanup plugin headers and and constify hwaddr
- updates MAINTAINERS for cpu-common.c
----------------------------------------------------------------
Alex Bennée (7):
tests/guest-debug: catch hanging guests
linux-user: completely re-write init_guest_space
accel/tcg: don't disable exec_tb trace events
disas: include an optional note for the start of disassembly
disas: add optional note support to cap_disas
translate-all: include guest address in out_asm output
MAINTAINERS: update the orphaned cpus-common.c file
Philippe Mathieu-Daudé (3):
qemu/plugin: Trivial code movement
qemu/plugin: Move !CONFIG_PLUGIN stubs altogether
qemu/qemu-plugin: Make qemu_plugin_hwaddr_is_io() hwaddr argument const
Richard Henderson (2):
exec/cpu-all: Use bool for have_guest_base
accel/tcg: Relax va restrictions on 64-bit guests
Thomas Huth (1):
travis.yml: Improve the --disable-tcg test on s390x
include/disas/disas.h | 2 +-
include/exec/cpu-all.h | 25 ++-
include/exec/log.h | 4 +-
include/qemu/plugin.h | 65 +++---
include/qemu/qemu-plugin.h | 2 +-
linux-user/qemu.h | 31 ++-
target/alpha/cpu-param.h | 15 +-
accel/tcg/translate-all.c | 54 ++++-
bsd-user/main.c | 4 +-
disas.c | 37 +++-
linux-user/elfload.c | 503 +++++++++++++++++++++---------------------
linux-user/flatload.c | 6 +
linux-user/main.c | 27 +--
plugins/api.c | 4 +-
tcg/tcg.c | 4 +-
.travis.yml | 18 +-
MAINTAINERS | 1 +
accel/tcg/trace-events | 8 +-
tests/guest-debug/run-test.py | 6 +
19 files changed, 424 insertions(+), 392 deletions(-)
--
2.20.1
On Fri, 15 May 2020 at 15:44, Alex Bennée <alex.bennee@linaro.org> wrote: > > The following changes since commit 2478b8ecd45f81a21b9aa319ce7147a790a2144f: > > Merge remote-tracking branch 'remotes/kraxel/tags/ui-20200515-pull-request' into staging (2020-05-15 11:18:13 +0100) > > are available in the Git repository at: > > https://github.com/stsquad/qemu.git tags/pull-testing-tcg-plugins-150520-2 > > for you to fetch changes up to adf1cfbdc29e6e3342ca07701be4d2cbfd7d3907: > > MAINTAINERS: update the orphaned cpus-common.c file (2020-05-15 15:25:16 +0100) > > ---------------------------------------------------------------- > Various testing, tcg and plugin updates > > - fix bug in gdbstub tests that leave hanging QEMUs > - tweak s390x travis test > - re-factor guest_base handling > - support "notes" in disassembler output > - include guest address notes in out_asm > - cleanup plugin headers and and constify hwaddr > - updates MAINTAINERS for cpu-common.c Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/5.1 for any user-visible changes. -- PMM
If gdb never actually connected with the guest we need to catch that
and clean-up after ourselves.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200513175134.19619-2-alex.bennee@linaro.org>
diff --git a/tests/guest-debug/run-test.py b/tests/guest-debug/run-test.py
index d9af9573b9e..71c55690546 100755
--- a/tests/guest-debug/run-test.py
+++ b/tests/guest-debug/run-test.py
@@ -80,4 +80,10 @@ if __name__ == '__main__':
print("GDB crashed? SKIPPING")
exit(0)
+ try:
+ inferior.wait(2)
+ except subprocess.TimeoutExpired:
+ print("GDB never connected? Killed guest")
+ inferior.kill()
+
exit(result)
--
2.20.1
From: Thomas Huth <thuth@redhat.com>
Since the s390x containers do not allow KVM, we only compile-test
the --disable-tcg build on s390x and do not run the qtests. Thus,
it does not make sense to install genisoimage here, and it also does
not make sense to build the s390-ccw.img here again - it is simply
not used without the qtests.
On the other hand, if we do not build the s390-ccw.img anymore, we
can also compile with Clang - so let's use that compiler here to
get some additional test coverage.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200512133849.10624-1-thuth@redhat.com>
Message-Id: <20200513175134.19619-3-alex.bennee@linaro.org>
diff --git a/.travis.yml b/.travis.yml
index fe708792ca2..1ec8a7b4657 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -502,9 +502,10 @@ jobs:
$(exit $BUILD_RC);
fi
- - name: "[s390x] GCC check (KVM)"
+ - name: "[s390x] Clang (disable-tcg)"
arch: s390x
dist: bionic
+ compiler: clang
addons:
apt_packages:
- libaio-dev
@@ -528,21 +529,10 @@ jobs:
- libusb-1.0-0-dev
- libvdeplug-dev
- libvte-2.91-dev
- # Tests dependencies
- - genisoimage
env:
- TEST_CMD="make check-unit"
- - CONFIG="--disable-containers --disable-tcg --enable-kvm --disable-tools"
- script:
- - ( cd ${SRC_DIR} ; git submodule update --init roms/SLOF )
- - BUILD_RC=0 && make -j${JOBS} || BUILD_RC=$?
- - |
- if [ "$BUILD_RC" -eq 0 ] ; then
- mv pc-bios/s390-ccw/*.img pc-bios/ ;
- ${TEST_CMD} ;
- else
- $(exit $BUILD_RC);
- fi
+ - CONFIG="--disable-containers --disable-tcg --enable-kvm
+ --disable-tools --host-cc=clang --cxx=clang++"
# Release builds
# The make-release script expect a QEMU version, so our tag must start with a 'v'.
--
2.20.1
I doubt the well predicted trace event check is particularly special in the grand context of TCG code execution. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200513175134.19619-8-alex.bennee@linaro.org> diff --git a/accel/tcg/trace-events b/accel/tcg/trace-events index 01852217a66..385b9f749b8 100644 --- a/accel/tcg/trace-events +++ b/accel/tcg/trace-events @@ -1,10 +1,10 @@ # See docs/devel/tracing.txt for syntax documentation. -# TCG related tracing (mostly disabled by default) +# TCG related tracing # cpu-exec.c -disable exec_tb(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR -disable exec_tb_nocache(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR -disable exec_tb_exit(void *last_tb, unsigned int flags) "tb:%p flags=0x%x" +exec_tb(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR +exec_tb_nocache(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR +exec_tb_exit(void *last_tb, unsigned int flags) "tb:%p flags=0x%x" # translate-all.c translate_block(void *tb, uintptr_t pc, uint8_t *tb_code) "tb:%p, pc:0x%"PRIxPTR", tb_code:%p" -- 2.20.1
Include support for outputting a note at the top of a chunk of
disassembly to capstone as well.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Message-Id: <20200513175134.19619-10-alex.bennee@linaro.org>
diff --git a/disas.c b/disas.c
index 7e8692de301..45285d3f63f 100644
--- a/disas.c
+++ b/disas.c
@@ -260,7 +260,8 @@ static void cap_dump_insn_units(disassemble_info *info, cs_insn *insn,
}
}
-static void cap_dump_insn(disassemble_info *info, cs_insn *insn)
+static void cap_dump_insn(disassemble_info *info, cs_insn *insn,
+ const char *note)
{
fprintf_function print = info->fprintf_func;
int i, n, split;
@@ -281,7 +282,11 @@ static void cap_dump_insn(disassemble_info *info, cs_insn *insn)
}
/* Print the actual instruction. */
- print(info->stream, " %-8s %s\n", insn->mnemonic, insn->op_str);
+ print(info->stream, " %-8s %s", insn->mnemonic, insn->op_str);
+ if (note) {
+ print(info->stream, "\t\t%s", note);
+ }
+ print(info->stream, "\n");
/* Dump any remaining part of the insn on subsequent lines. */
for (i = split; i < n; i += split) {
@@ -313,7 +318,7 @@ static bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size)
size -= tsize;
while (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
- cap_dump_insn(info, insn);
+ cap_dump_insn(info, insn, NULL);
}
/* If the target memory is not consumed, go back for more... */
@@ -342,7 +347,8 @@ static bool cap_disas_target(disassemble_info *info, uint64_t pc, size_t size)
}
/* Disassemble SIZE bytes at CODE for the host. */
-static bool cap_disas_host(disassemble_info *info, void *code, size_t size)
+static bool cap_disas_host(disassemble_info *info, void *code, size_t size,
+ const char *note)
{
csh handle;
const uint8_t *cbuf;
@@ -358,7 +364,8 @@ static bool cap_disas_host(disassemble_info *info, void *code, size_t size)
pc = (uintptr_t)code;
while (cs_disasm_iter(handle, &cbuf, &size, &pc, insn)) {
- cap_dump_insn(info, insn);
+ cap_dump_insn(info, insn, note);
+ note = NULL;
}
if (size != 0) {
(*info->fprintf_func)(info->stream,
@@ -402,7 +409,7 @@ static bool cap_disas_monitor(disassemble_info *info, uint64_t pc, int count)
csize += tsize;
if (cs_disasm_iter(handle, &cbuf, &csize, &pc, insn)) {
- cap_dump_insn(info, insn);
+ cap_dump_insn(info, insn, NULL);
if (--count <= 0) {
break;
}
@@ -416,7 +423,7 @@ static bool cap_disas_monitor(disassemble_info *info, uint64_t pc, int count)
#endif /* !CONFIG_USER_ONLY */
#else
# define cap_disas_target(i, p, s) false
-# define cap_disas_host(i, p, s) false
+# define cap_disas_host(i, p, s, n) false
# define cap_disas_monitor(i, p, c) false
# define cap_disas_plugin(i, p, c) false
#endif /* CONFIG_CAPSTONE */
@@ -664,7 +671,7 @@ void disas(FILE *out, void *code, unsigned long size, const char *note)
print_insn = print_insn_hppa;
#endif
- if (s.info.cap_arch >= 0 && cap_disas_host(&s.info, code, size)) {
+ if (s.info.cap_arch >= 0 && cap_disas_host(&s.info, code, size, note)) {
return;
}
--
2.20.1
We already have information about where each guest instructions
representation starts stored in the tcg_ctx->gen_insn_data so we can
rectify the PC for faults. We can re-use this information to annotate
the out_asm output with guest instruction address which makes it a bit
easier to work out where you are especially with longer blocks. A
minor wrinkle is that some instructions get optimised away so we have
to scan forward until we find some actual generated code.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200513175134.19619-11-alex.bennee@linaro.org>
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index cdf58bb420e..42ce1dfcff7 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -1794,14 +1794,43 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM) &&
qemu_log_in_addr_range(tb->pc)) {
FILE *logfile = qemu_log_lock();
+ int code_size, data_size = 0;
+ g_autoptr(GString) note = g_string_new("[tb header & initial instruction]");
+ size_t chunk_start = 0;
+ int insn = 0;
qemu_log("OUT: [size=%d]\n", gen_code_size);
if (tcg_ctx->data_gen_ptr) {
- size_t code_size = tcg_ctx->data_gen_ptr - tb->tc.ptr;
- size_t data_size = gen_code_size - code_size;
- size_t i;
+ code_size = tcg_ctx->data_gen_ptr - tb->tc.ptr;
+ data_size = gen_code_size - code_size;
+ } else {
+ code_size = gen_code_size;
+ }
- log_disas(tb->tc.ptr, code_size, NULL);
+ /* Dump header and the first instruction */
+ chunk_start = tcg_ctx->gen_insn_end_off[insn];
+ log_disas(tb->tc.ptr, chunk_start, note->str);
+ /*
+ * Dump each instruction chunk, wrapping up empty chunks into
+ * the next instruction. The whole array is offset so the
+ * first entry is the beginning of the 2nd instruction.
+ */
+ while (insn <= tb->icount && chunk_start < code_size) {
+ size_t chunk_end = tcg_ctx->gen_insn_end_off[insn];
+ if (chunk_end > chunk_start) {
+ g_string_printf(note, "[guest addr: " TARGET_FMT_lx "]",
+ tcg_ctx->gen_insn_data[insn][0]);
+ log_disas(tb->tc.ptr + chunk_start, chunk_end - chunk_start,
+ note->str);
+ chunk_start = chunk_end;
+ }
+ insn++;
+ }
+
+ /* Finally dump any data we may have after the block */
+ if (data_size) {
+ int i;
+ qemu_log(" data: [size=%d]\n", data_size);
for (i = 0; i < data_size; i += sizeof(tcg_target_ulong)) {
if (sizeof(tcg_target_ulong) == 8) {
qemu_log("0x%08" PRIxPTR ": .quad 0x%016" PRIx64 "\n",
@@ -1813,8 +1842,6 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
*(uint32_t *)(tcg_ctx->data_gen_ptr + i));
}
}
- } else {
- log_disas(tb->tc.ptr, gen_code_size, NULL);
}
qemu_log("\n");
qemu_log_flush();
--
2.20.1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Move the qemu_plugin_event enum declaration earlier.
This will make the next commit easier to review.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200510171119.20827-2-f4bug@amsat.org>
Message-Id: <20200513173200.11830-2-alex.bennee@linaro.org>
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index 11687e8cdc3..e45f950fe36 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -13,6 +13,22 @@
#include "qemu/queue.h"
#include "qemu/option.h"
+/*
+ * Events that plugins can subscribe to.
+ */
+enum qemu_plugin_event {
+ QEMU_PLUGIN_EV_VCPU_INIT,
+ QEMU_PLUGIN_EV_VCPU_EXIT,
+ QEMU_PLUGIN_EV_VCPU_TB_TRANS,
+ QEMU_PLUGIN_EV_VCPU_IDLE,
+ QEMU_PLUGIN_EV_VCPU_RESUME,
+ QEMU_PLUGIN_EV_VCPU_SYSCALL,
+ QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
+ QEMU_PLUGIN_EV_FLUSH,
+ QEMU_PLUGIN_EV_ATEXIT,
+ QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
+};
+
/*
* Option parsing/processing.
* Note that we can load an arbitrary number of plugins.
@@ -47,22 +63,6 @@ static inline int qemu_plugin_load_list(QemuPluginList *head)
}
#endif /* !CONFIG_PLUGIN */
-/*
- * Events that plugins can subscribe to.
- */
-enum qemu_plugin_event {
- QEMU_PLUGIN_EV_VCPU_INIT,
- QEMU_PLUGIN_EV_VCPU_EXIT,
- QEMU_PLUGIN_EV_VCPU_TB_TRANS,
- QEMU_PLUGIN_EV_VCPU_IDLE,
- QEMU_PLUGIN_EV_VCPU_RESUME,
- QEMU_PLUGIN_EV_VCPU_SYSCALL,
- QEMU_PLUGIN_EV_VCPU_SYSCALL_RET,
- QEMU_PLUGIN_EV_FLUSH,
- QEMU_PLUGIN_EV_ATEXIT,
- QEMU_PLUGIN_EV_MAX, /* total number of plugin events we support */
-};
-
union qemu_plugin_cb_sig {
qemu_plugin_simple_cb_t simple;
qemu_plugin_udata_cb_t udata;
--
2.20.1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
Simplify the ifdef'ry by moving all stubs together.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20200510171119.20827-3-f4bug@amsat.org>
Message-Id: <20200513173200.11830-3-alex.bennee@linaro.org>
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index e45f950fe36..ab790ad105c 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -46,22 +46,6 @@ static inline void qemu_plugin_add_opts(void)
void qemu_plugin_opt_parse(const char *optarg, QemuPluginList *head);
int qemu_plugin_load_list(QemuPluginList *head);
-#else /* !CONFIG_PLUGIN */
-static inline void qemu_plugin_add_opts(void)
-{ }
-
-static inline void qemu_plugin_opt_parse(const char *optarg,
- QemuPluginList *head)
-{
- error_report("plugin interface not enabled in this build");
- exit(1);
-}
-
-static inline int qemu_plugin_load_list(QemuPluginList *head)
-{
- return 0;
-}
-#endif /* !CONFIG_PLUGIN */
union qemu_plugin_cb_sig {
qemu_plugin_simple_cb_t simple;
@@ -182,8 +166,6 @@ struct qemu_plugin_insn *qemu_plugin_tb_insn_get(struct qemu_plugin_tb *tb)
return insn;
}
-#ifdef CONFIG_PLUGIN
-
void qemu_plugin_vcpu_init_hook(CPUState *cpu);
void qemu_plugin_vcpu_exit_hook(CPUState *cpu);
void qemu_plugin_tb_trans_cb(CPUState *cpu, struct qemu_plugin_tb *tb);
@@ -207,6 +189,21 @@ void qemu_plugin_disable_mem_helpers(CPUState *cpu);
#else /* !CONFIG_PLUGIN */
+static inline void qemu_plugin_add_opts(void)
+{ }
+
+static inline void qemu_plugin_opt_parse(const char *optarg,
+ QemuPluginList *head)
+{
+ error_report("plugin interface not enabled in this build");
+ exit(1);
+}
+
+static inline int qemu_plugin_load_list(QemuPluginList *head)
+{
+ return 0;
+}
+
static inline void qemu_plugin_vcpu_init_hook(CPUState *cpu)
{ }
--
2.20.1
We forgot to update MAINTAINERS when this code was re-factored. Fixes: 267f685b8b Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200513173200.11830-5-alex.bennee@linaro.org> diff --git a/MAINTAINERS b/MAINTAINERS index f02e2907023..47ef3139e6d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -115,6 +115,7 @@ M: Richard Henderson <rth@twiddle.net> R: Paolo Bonzini <pbonzini@redhat.com> S: Maintained F: cpus.c +F: cpus-common.c F: exec.c F: accel/tcg/ F: accel/stubs/tcg-stub.c -- 2.20.1
© 2016 - 2025 Red Hat, Inc.