* [Qemu-devel] [PATCH 0/7] trace: Add guest code events
@ 2017-09-10 16:11 Lluís Vilanova
2017-09-10 16:15 ` [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before" Lluís Vilanova
` (7 more replies)
0 siblings, 8 replies; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:11 UTC (permalink / raw)
To: qemu-devel; +Cc: Stefan Hajnoczi
Adds events to trace guest code execution.
Events with additional info are disabled by default to minimize overheads, since
that additional information might not be necessarily needed.
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
Lluís Vilanova (7):
trace: Add event "guest_bbl_before"
trace: Add event "guest_inst_before"
trace: Add event "guest_inst_info_before"
tcg: Add support for "inlining" regions of code
trace: Add event "guest_bbl_after"
trace: Add event "guest_inst_after"
trace: Add event "guest_inst_info_after"
accel/tcg/translator.c | 104 ++++++++++++++++++++++++++++
include/exec/translator.h | 22 ++++++
include/qemu/log.h | 1
include/qemu/typedefs.h | 1
tcg/tcg-op.c | 2 +
tcg/tcg-op.h | 40 +++++++++++
tcg/tcg-opc.h | 3 +
tcg/tcg.c | 166 +++++++++++++++++++++++++++++++++++++++++++++
tcg/tcg.h | 23 ++++++
trace-events | 55 +++++++++++++++
util/log.c | 2 +
11 files changed, 418 insertions(+), 1 deletion(-)
To: qemu-devel@nongnu.org
Cc: Stefan Hajnoczi <stefanha@redhat.com>
^ permalink raw reply [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
@ 2017-09-10 16:15 ` Lluís Vilanova
2017-09-13 16:59 ` Richard Henderson
2017-09-10 16:19 ` [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before" Lluís Vilanova
` (6 subsequent siblings)
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:15 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 6 ++++++
trace-events | 11 +++++++++++
2 files changed, 17 insertions(+)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index afa3af478a..91b3b0da32 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -13,6 +13,7 @@
#include "cpu.h"
#include "tcg/tcg.h"
#include "tcg/tcg-op.h"
+#include "trace-tcg.h"
#include "exec/exec-all.h"
#include "exec/gen-icount.h"
#include "exec/log.h"
@@ -91,6 +92,11 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
}
}
+ /* Tracing before */
+ if (db->num_insns == 1) {
+ trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
+ }
+
/* Disassemble one instruction. The translate_insn hook should
update db->pc_next and db->is_jmp to indicate what should be
done next -- either exiting this loop or locate the start of
diff --git a/trace-events b/trace-events
index 1f50f56d9d..d242f54254 100644
--- a/trace-events
+++ b/trace-events
@@ -88,6 +88,17 @@ vcpu guest_cpu_exit(void)
# Targets: all
vcpu guest_cpu_reset(void)
+
+## Guest code
+
+# @vaddr: BBL's starting virtual address
+#
+# Mark start of BBL execution (before anything gets really executed).
+#
+# Mode: user, softmmu
+# Targets: TCG(all)
+vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+
# @vaddr: Access' virtual address.
# @info : Access' information (see below).
#
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
2017-09-10 16:15 ` [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before" Lluís Vilanova
@ 2017-09-10 16:19 ` Lluís Vilanova
2017-09-13 17:02 ` Richard Henderson
2017-09-10 16:23 ` [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before" Lluís Vilanova
` (5 subsequent siblings)
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:19 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 3 +++
trace-events | 8 ++++++++
2 files changed, 11 insertions(+)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index 91b3b0da32..287d27b4f7 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -69,6 +69,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
while (true) {
+ target_ulong pc_insn = db->pc_next;
+
db->num_insns++;
ops->insn_start(db, cpu);
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
@@ -96,6 +98,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
if (db->num_insns == 1) {
trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
}
+ trace_guest_inst_before_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
/* Disassemble one instruction. The translate_insn hook should
update db->pc_next and db->is_jmp to indicate what should be
diff --git a/trace-events b/trace-events
index d242f54254..46457c6158 100644
--- a/trace-events
+++ b/trace-events
@@ -99,6 +99,14 @@ vcpu guest_cpu_reset(void)
# Targets: TCG(all)
vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+# @vaddr: Instruction's virtual address
+#
+# Mark start of instruction execution (before anything gets really executed).
+#
+# Mode: user, softmmu
+# Targets: TCG(all)
+vcpu tcg guest_inst_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+
# @vaddr: Access' virtual address.
# @info : Access' information (see below).
#
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
2017-09-10 16:15 ` [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before" Lluís Vilanova
2017-09-10 16:19 ` [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before" Lluís Vilanova
@ 2017-09-10 16:23 ` Lluís Vilanova
2017-09-13 17:07 ` Richard Henderson
2017-09-10 16:27 ` [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code Lluís Vilanova
` (4 subsequent siblings)
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:23 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 18 ++++++++++++++++++
trace-events | 9 +++++++++
2 files changed, 27 insertions(+)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index 287d27b4f7..6598931171 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -70,6 +70,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
while (true) {
target_ulong pc_insn = db->pc_next;
+ TCGv_i32 insn_size_tcg = 0;
+ int insn_size_opcode_idx;
db->num_insns++;
ops->insn_start(db, cpu);
@@ -99,6 +101,16 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
}
trace_guest_inst_before_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
+ if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
+ insn_size_tcg = tcg_temp_new_i32();
+ insn_size_opcode_idx = tcg_op_buf_count();
+ tcg_gen_movi_i32(insn_size_tcg, 0xdeadbeef);
+
+ trace_guest_inst_info_before_tcg(
+ cpu, tcg_ctx.tcg_env, pc_insn, insn_size_tcg);
+
+ tcg_temp_free_i32(insn_size_tcg);
+ }
/* Disassemble one instruction. The translate_insn hook should
update db->pc_next and db->is_jmp to indicate what should be
@@ -113,6 +125,12 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
ops->translate_insn(db, cpu);
}
+ /* Tracing after (patched values) */
+ if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
+ unsigned int insn_size = db->pc_next - pc_insn;
+ tcg_set_insn_param(insn_size_opcode_idx, 1, insn_size);
+ }
+
/* Stop translation if translate_insn so indicated. */
if (db->is_jmp != DISAS_NEXT) {
break;
diff --git a/trace-events b/trace-events
index 46457c6158..4e61697297 100644
--- a/trace-events
+++ b/trace-events
@@ -107,6 +107,15 @@ vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PR
# Targets: TCG(all)
vcpu tcg guest_inst_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+# @vaddr: Instruction's virtual address
+# @size: Instruction's size in bytes
+#
+# Same as 'guest_inst_before', with additional information.
+#
+# Mode: user, softmmu
+# Targets: TCG(all)
+disable vcpu tcg guest_inst_info_before(uint64_t vaddr, TCGv_i32 size) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64" size=%d"
+
# @vaddr: Access' virtual address.
# @info : Access' information (see below).
#
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
` (2 preceding siblings ...)
2017-09-10 16:23 ` [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before" Lluís Vilanova
@ 2017-09-10 16:27 ` Lluís Vilanova
2017-09-13 17:09 ` Richard Henderson
2017-09-10 16:31 ` [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after" Lluís Vilanova
` (3 subsequent siblings)
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:27 UTC (permalink / raw)
To: qemu-devel; +Cc: Stefan Hajnoczi, Richard Henderson
TCG BBLs and instructions have multiple exit points from where to raise
tracing events, but some of the necessary information in the generic
disassembly infrastructure is not available until after generating these
exit points.
This patch adds support for "inline points" (where the tracing code will
be placed), and "inline regions" (which identify the TCG code that must
be inlined). The TCG compiler will basically copy each inline region to
any inline points that reference it.
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
include/qemu/log.h | 1
include/qemu/typedefs.h | 1
tcg/tcg-op.h | 39 +++++++++++
tcg/tcg-opc.h | 3 +
tcg/tcg.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++
tcg/tcg.h | 18 +++++
util/log.c | 2 +
7 files changed, 230 insertions(+)
diff --git a/include/qemu/log.h b/include/qemu/log.h
index a50e994c21..23acc63c73 100644
--- a/include/qemu/log.h
+++ b/include/qemu/log.h
@@ -43,6 +43,7 @@ static inline bool qemu_log_separate(void)
#define CPU_LOG_PAGE (1 << 14)
#define LOG_TRACE (1 << 15)
#define CPU_LOG_TB_OP_IND (1 << 16)
+#define CPU_LOG_TB_OP_INLINE (1 << 17)
/* Returns true if a bit is set in the current loglevel mask
*/
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index 39bc8351a3..2fb5670af3 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -96,6 +96,7 @@ typedef struct SerialState SerialState;
typedef struct SHPCDevice SHPCDevice;
typedef struct SMBusDevice SMBusDevice;
typedef struct SSIBus SSIBus;
+typedef struct TCGInlineLabel TCGInlineLabel;
typedef struct uWireSlave uWireSlave;
typedef struct VirtIODevice VirtIODevice;
typedef struct Visitor Visitor;
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index 5d3278f243..da3784f8f2 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -326,6 +326,45 @@ void tcg_gen_ext16u_i32(TCGv_i32 ret, TCGv_i32 arg);
void tcg_gen_bswap16_i32(TCGv_i32 ret, TCGv_i32 arg);
void tcg_gen_bswap32_i32(TCGv_i32 ret, TCGv_i32 arg);
+static inline int _get_inline_index(TCGInlineLabel *l)
+{
+ TCGContext *s = &tcg_ctx;
+ return l - s->inline_labels;
+}
+
+static inline void gen_set_inline_point(TCGInlineLabel *l)
+{
+ TCGContext *s = &tcg_ctx;
+ TCGInlinePoint *p = tcg_malloc(sizeof(TCGInlinePoint));
+ p->op_idx = s->gen_next_op_idx;
+ p->next_point = l->first_point;
+ l->first_point = p;
+ tcg_gen_op1i(INDEX_op_set_inline_point,
+ _get_inline_index(l));
+}
+
+static inline void gen_set_inline_region_begin(TCGInlineLabel *l)
+{
+ TCGContext *s = &tcg_ctx;
+ if (l->begin_op_idx != -1) {
+ tcg_abort();
+ }
+ l->begin_op_idx = s->gen_next_op_idx;
+ tcg_gen_op1i(INDEX_op_set_inline_region_begin,
+ _get_inline_index(l));
+}
+
+static inline void gen_set_inline_region_end(TCGInlineLabel *l)
+{
+ TCGContext *s = &tcg_ctx;
+ if (l->begin_op_idx == -1) {
+ tcg_abort();
+ }
+ l->end_op_idx = s->gen_next_op_idx;
+ tcg_gen_op1i(INDEX_op_set_inline_region_end,
+ _get_inline_index(l));
+}
+
static inline void tcg_gen_discard_i32(TCGv_i32 arg)
{
tcg_gen_op1_i32(INDEX_op_discard, arg);
diff --git a/tcg/tcg-opc.h b/tcg/tcg-opc.h
index 956fb1e9f3..279ac0dc1f 100644
--- a/tcg/tcg-opc.h
+++ b/tcg/tcg-opc.h
@@ -29,6 +29,9 @@
/* predefined ops */
DEF(discard, 1, 0, 0, TCG_OPF_NOT_PRESENT)
DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
+DEF(set_inline_point, 0, 0, 1, TCG_OPF_NOT_PRESENT)
+DEF(set_inline_region_begin, 0, 0, 1, TCG_OPF_NOT_PRESENT)
+DEF(set_inline_region_end, 0, 0, 1, TCG_OPF_NOT_PRESENT)
/* variable number of parameters */
DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
diff --git a/tcg/tcg.c b/tcg/tcg.c
index fd8a3dfe93..b48196da27 100644
--- a/tcg/tcg.c
+++ b/tcg/tcg.c
@@ -251,6 +251,23 @@ TCGLabel *gen_new_label(void)
return l;
}
+TCGInlineLabel *gen_new_inline_label(void)
+{
+ TCGContext *s = &tcg_ctx;
+ int idx;
+ TCGInlineLabel *l;
+
+ if (s->nb_inline_labels >= TCG_MAX_INLINE_LABELS) {
+ tcg_abort();
+ }
+ idx = s->nb_inline_labels++;
+ l = &s->inline_labels[idx];
+ l->first_point = NULL;
+ l->begin_op_idx = -1;
+ l->end_op_idx = -1;
+ return l;
+}
+
#include "tcg-target.inc.c"
/* pool based memory allocation */
@@ -462,6 +479,10 @@ void tcg_func_start(TCGContext *s)
s->nb_labels = 0;
s->current_frame_offset = s->frame_start;
+ s->inline_labels = tcg_malloc(sizeof(TCGInlineLabel) *
+ TCG_MAX_INLINE_LABELS);
+ s->nb_inline_labels = 0;
+
#ifdef CONFIG_DEBUG_TCG
s->goto_tb_issue_mask = 0;
#endif
@@ -1423,6 +1444,139 @@ static inline void tcg_la_bb_end(TCGContext *s, uint8_t *temp_state)
}
}
+static inline int _get_op_next(TCGContext *s, int idx)
+{
+ return s->gen_op_buf[idx].next;
+}
+
+static inline void _set_op_next(TCGContext *s, int idx, int next)
+{
+ s->gen_op_buf[idx].next = next;
+}
+
+static inline int _get_op_prev(TCGContext *s, int idx)
+{
+ return s->gen_op_buf[idx].prev;
+}
+
+static inline void _set_op_prev(TCGContext *s, int idx, int prev)
+{
+ s->gen_op_buf[idx].prev = prev;
+}
+
+static inline void _inline_region_ignore(TCGContext *s, TCGInlineLabel *l)
+{
+ int l_prev = _get_op_prev(s, l->begin_op_idx);
+ int l_next = _get_op_next(s, l->end_op_idx);
+ _set_op_next(s, l_prev, l_next);
+ _set_op_prev(s, l_next, l_prev);
+}
+
+static inline void _op_ignore(TCGContext *s, int op_idx)
+{
+ int p_prev = _get_op_prev(s, op_idx);
+ int p_next = _get_op_next(s, op_idx);
+ _set_op_next(s, p_prev, p_next);
+ _set_op_prev(s, p_next, p_prev);
+}
+
+static inline void _inline_point_ignore(TCGContext *s, TCGInlinePoint *p)
+{
+ _op_ignore(s, p->op_idx);
+}
+
+static inline void _inline_weave(TCGContext *s, TCGInlinePoint *p,
+ int begin, int end)
+{
+ int begin_prev = _get_op_prev(s, begin);
+ int end_next = _get_op_next(s, end);
+ int p_prev = _get_op_prev(s, p->op_idx);
+ int p_next = _get_op_next(s, p->op_idx);
+ /* point.prev -> begin */
+ _set_op_next(s, p_prev, begin);
+ _set_op_prev(s, begin, p_prev);
+ /* end -> point.next */
+ _set_op_next(s, end, p_next);
+ _set_op_prev(s, p_next, end);
+ /* begin.prev -> end.next */
+ _set_op_next(s, begin_prev, end_next);
+ _set_op_prev(s, end_next, begin_prev);
+}
+
+/*
+ * Handles inline_set_label/inline_region_begin/inline_region_end opcodes (which
+ * will disappear after this optimization).
+ */
+static void tcg_inline(TCGContext *s)
+{
+ int i;
+ for (i = 0; i < s->nb_inline_labels; i++) {
+ TCGInlineLabel *l = &s->inline_labels[i];
+ size_t region_op_count = l->end_op_idx - l->begin_op_idx - 1;
+
+ /* open region is an error */
+ if (l->begin_op_idx != -1 && l->end_op_idx == -1) {
+ tcg_abort();
+ }
+
+ if (l->first_point == NULL) { /* region without points */
+ _inline_region_ignore(s, l);
+ } else if (l->begin_op_idx == -1) { /* points without region */
+ TCGInlinePoint *p;
+ for (p = l->first_point; p != NULL; p = p->next_point) {
+ _inline_point_ignore(s, p);
+ }
+ } else if (region_op_count == 0) { /* empty region */
+ TCGInlinePoint *p;
+ for (p = l->first_point; p != NULL; p = p->next_point) {
+ _inline_point_ignore(s, p);
+ }
+ _inline_region_ignore(s, l);
+ } else { /* actual inlining */
+ bool first_point = true;
+ int l_begin = _get_op_next(s, l->begin_op_idx);
+ int l_end = _get_op_prev(s, l->end_op_idx);
+ TCGInlinePoint *p;
+ for (p = l->first_point; p != NULL; p = p->next_point) {
+ if (first_point) {
+ /* redirect point to existing region (skip markers) */
+ _inline_weave(s, p, l_begin, l_end);
+ _op_ignore(s, l->begin_op_idx);
+ _op_ignore(s, l->end_op_idx);
+ } else {
+ /* create a copy of the region */
+ int l_end_next = _get_op_next(s, l_end);
+ int op;
+ int pos = p->op_idx;
+ for (op = l_begin; op != l_end_next;
+ op = _get_op_next(s, op)) {
+ /* insert opcode copies */
+ int insert_idx = s->gen_next_op_idx;
+ int opc = s->gen_op_buf[op].opc;
+ int args = s->gen_op_buf[op].args;
+ int nargs = tcg_op_defs[opc].nb_args;
+ if (opc == INDEX_op_call) {
+ nargs += s->gen_op_buf[op].calli;
+ nargs += s->gen_op_buf[op].callo;
+ }
+ tcg_op_insert_after(s, &s->gen_op_buf[pos], opc, nargs);
+ pos = insert_idx;
+ s->gen_op_buf[pos].calli = s->gen_op_buf[op].calli;
+ s->gen_op_buf[pos].callo = s->gen_op_buf[op].callo;
+ /* insert argument copies */
+ memcpy(&s->gen_opparam_buf[s->gen_op_buf[pos].args],
+ &s->gen_opparam_buf[args],
+ nargs * sizeof(s->gen_opparam_buf[0]));
+ }
+ _op_ignore(s, p->op_idx);
+ }
+ first_point = false;
+ }
+ }
+ }
+}
+
+
/* Liveness analysis : update the opc_arg_life array to tell if a
given input arguments is dead. Instructions updating dead
temporaries are removed. */
@@ -2560,6 +2714,18 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
}
#endif
+ /* inline code regions before any optimization pass */
+ tcg_inline(s);
+
+#ifdef DEBUG_DISAS
+ if (unlikely(qemu_loglevel_mask(CPU_LOG_TB_OP_INLINE)
+ && qemu_log_in_addr_range(tb->pc))) {
+ qemu_log("OP after inline:\n");
+ tcg_dump_ops(s);
+ qemu_log("\n");
+ }
+#endif
+
#ifdef CONFIG_PROFILER
s->opt_time -= profile_getclock();
#endif
diff --git a/tcg/tcg.h b/tcg/tcg.h
index ac94133870..c6e3c6e68d 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -397,6 +397,20 @@ static inline unsigned get_alignment_bits(TCGMemOp memop)
typedef tcg_target_ulong TCGArg;
+#define TCG_MAX_INLINE_REGIONS 1
+#define TCG_MAX_INLINE_LABELS TCG_MAX_INLINE_REGIONS
+
+typedef struct TCGInlinePoint {
+ int op_idx;
+ struct TCGInlinePoint *next_point;
+} TCGInlinePoint;
+
+typedef struct TCGInlineLabel {
+ TCGInlinePoint *first_point;
+ int begin_op_idx, end_op_idx;
+} TCGInlineLabel;
+
+
/* Define type and accessor macros for TCG variables.
TCG variables are the inputs and outputs of TCG ops, as described
@@ -649,6 +663,9 @@ struct TCGContext {
int nb_temps;
int nb_indirects;
+ TCGInlineLabel *inline_labels;
+ int nb_inline_labels;
+
/* goto_tb support */
tcg_insn_unit *code_buf;
uint16_t *tb_jmp_reset_offset; /* tb->jmp_reset_offset */
@@ -950,6 +967,7 @@ TCGv_i32 tcg_const_local_i32(int32_t val);
TCGv_i64 tcg_const_local_i64(int64_t val);
TCGLabel *gen_new_label(void);
+TCGInlineLabel *gen_new_inline_label(void);
/**
* label_arg
diff --git a/util/log.c b/util/log.c
index 96f30dd21a..947a982c74 100644
--- a/util/log.c
+++ b/util/log.c
@@ -246,6 +246,8 @@ const QEMULogItem qemu_log_items[] = {
"show target assembly code for each compiled TB" },
{ CPU_LOG_TB_OP, "op",
"show micro ops for each compiled TB" },
+ { CPU_LOG_TB_OP_INLINE, "op_inline",
+ "show micro ops after inlining" },
{ CPU_LOG_TB_OP_OPT, "op_opt",
"show micro ops after optimization" },
{ CPU_LOG_TB_OP_IND, "op_ind",
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
` (3 preceding siblings ...)
2017-09-10 16:27 ` [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code Lluís Vilanova
@ 2017-09-10 16:31 ` Lluís Vilanova
2017-09-13 17:34 ` Richard Henderson
2017-09-10 16:35 ` [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after" Lluís Vilanova
` (2 subsequent siblings)
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:31 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Need to use "TCG inlining" to avoid showing a trace entry for each exit
point (up to two per BBL).
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
include/exec/translator.h | 22 ++++++++++++++++++
tcg/tcg-op.c | 2 ++
tcg/tcg-op.h | 1 +
tcg/tcg.h | 5 ++++
trace-events | 11 +++++++++
6 files changed, 94 insertions(+), 1 deletion(-)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index 6598931171..d66d601c89 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -35,6 +35,7 @@ void translator_loop_temp_check(DisasContextBase *db)
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
CPUState *cpu, TranslationBlock *tb)
{
+ target_ulong pc_bbl;
int max_insns;
/* Initialize DisasContext */
@@ -63,6 +64,11 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
/* Reset the temp count so that we can identify leaks */
tcg_clear_temp_count();
+ /* Tracking gen_goto_tb / gen_exit_tb */
+ pc_bbl = db->pc_first;
+ tcg_ctx.disas.seen_goto_tb = false;
+ tcg_ctx.disas.in_guest_code = false;
+
/* Start translating. */
gen_tb_start(db->tb);
ops->tb_start(db, cpu);
@@ -74,6 +80,11 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
int insn_size_opcode_idx;
db->num_insns++;
+ if (db->num_insns == 1) {
+ tcg_ctx.disas.in_guest_code = true;
+ tcg_ctx.disas.inline_label = NULL;
+ }
+
ops->insn_start(db, cpu);
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
@@ -144,6 +155,22 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
}
}
+ /* Tracing after */
+ if (TRACE_GUEST_BBL_AFTER_ENABLED) {
+ tcg_ctx.disas.in_guest_code = false;
+ if (tcg_ctx.disas.inline_label == NULL) {
+ tcg_ctx.disas.inline_label = gen_new_inline_label();
+ }
+
+ gen_set_inline_region_begin(tcg_ctx.disas.inline_label);
+
+ if (TRACE_GUEST_BBL_AFTER_ENABLED) {
+ trace_guest_bbl_after_tcg(cpu, tcg_ctx.tcg_env, pc_bbl);
+ }
+
+ gen_set_inline_region_end(tcg_ctx.disas.inline_label);
+ }
+
/* Emit code to exit the TB, as indicated by db->is_jmp. */
ops->tb_stop(db, cpu);
gen_tb_end(db->tb, db->num_insns);
@@ -163,3 +190,30 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
}
#endif
}
+
+
+void translator__gen_goto_tb(TCGContext *ctx)
+{
+ if (ctx->disas.in_guest_code &&
+ (TRACE_GUEST_BBL_AFTER_ENABLED)) {
+ if (ctx->disas.inline_label == NULL) {
+ ctx->disas.inline_label = gen_new_inline_label();
+ }
+ gen_set_inline_point(ctx->disas.inline_label);
+ /* disable next exit_tb */
+ ctx->disas.seen_goto_tb = true;
+ }
+}
+
+void translator__gen_exit_tb(TCGContext *ctx)
+{
+ if (ctx->disas.in_guest_code && !ctx->disas.seen_goto_tb &&
+ (TRACE_GUEST_BBL_AFTER_ENABLED)) {
+ if (ctx->disas.inline_label == NULL) {
+ ctx->disas.inline_label = gen_new_inline_label();
+ }
+ gen_set_inline_point(ctx->disas.inline_label);
+ /* enable next exit_tb */
+ ctx->disas.seen_goto_tb = false;
+ }
+}
diff --git a/include/exec/translator.h b/include/exec/translator.h
index e2dc2a04ae..83aeea59a1 100644
--- a/include/exec/translator.h
+++ b/include/exec/translator.h
@@ -20,7 +20,6 @@
#include "exec/exec-all.h"
-#include "tcg/tcg.h"
/**
@@ -71,6 +70,21 @@ typedef struct DisasContextBase {
bool singlestep_enabled;
} DisasContextBase;
+/**
+ * TCGContextDisas:
+ * @seen_goto_tb: Whether we've seen a call to tcg_gen_goto_tb().
+ * @in_guest_code: Whether we're generating guest code (or supporting
+ * boilerplate otherwise).
+ * @inline_label: Inline label.
+ *
+ * Extensions to #TCGContext specific to the generic translation framework.
+ */
+typedef struct TCGContextDisas {
+ bool seen_goto_tb;
+ bool in_guest_code;
+ TCGInlineLabel *inline_label;
+} TCGContextDisas;
+
/**
* TranslatorOps:
* @init_disas_context:
@@ -117,6 +131,8 @@ typedef struct TranslatorOps {
void (*disas_log)(const DisasContextBase *db, CPUState *cpu);
} TranslatorOps;
+#include "tcg/tcg.h"
+
/**
* translator_loop:
* @ops: Target-specific operations.
@@ -141,4 +157,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
void translator_loop_temp_check(DisasContextBase *db);
+/* Internal functions to hook tracing into */
+void translator__gen_goto_tb(TCGContext *ctx);
+void translator__gen_exit_tb(TCGContext *ctx);
+
#endif /* EXEC__TRANSLATOR_H */
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
index 688d91755b..575b4faf84 100644
--- a/tcg/tcg-op.c
+++ b/tcg/tcg-op.c
@@ -2578,6 +2578,8 @@ void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg)
void tcg_gen_goto_tb(unsigned idx)
{
+ translator__gen_goto_tb(&tcg_ctx);
+
/* We only support two chained exits. */
tcg_debug_assert(idx <= 1);
#ifdef CONFIG_DEBUG_TCG
diff --git a/tcg/tcg-op.h b/tcg/tcg-op.h
index da3784f8f2..9ab1497bc1 100644
--- a/tcg/tcg-op.h
+++ b/tcg/tcg-op.h
@@ -817,6 +817,7 @@ static inline void tcg_gen_insn_start(target_ulong pc, target_ulong a1,
static inline void tcg_gen_exit_tb(uintptr_t val)
{
+ translator__gen_exit_tb(&tcg_ctx);
tcg_gen_op1i(INDEX_op_exit_tb, val);
}
diff --git a/tcg/tcg.h b/tcg/tcg.h
index c6e3c6e68d..6483ed75d6 100644
--- a/tcg/tcg.h
+++ b/tcg/tcg.h
@@ -655,6 +655,8 @@ QEMU_BUILD_BUG_ON(OPPARAM_BUF_SIZE > (1 << 14));
/* Make sure that we don't overflow 64 bits without noticing. */
QEMU_BUILD_BUG_ON(sizeof(TCGOp) > 8);
+#include "exec/translator.h"
+
struct TCGContext {
uint8_t *pool_cur, *pool_end;
TCGPool *pool_first, *pool_current, *pool_first_large;
@@ -730,6 +732,9 @@ struct TCGContext {
CPUState *cpu; /* *_trans */
TCGv_env tcg_env; /* *_exec */
+ /* Used by generic gen_intermediate_code */
+ TCGContextDisas disas;
+
/* These structures are private to tcg-target.inc.c. */
#ifdef TCG_TARGET_NEED_LDST_LABELS
struct TCGLabelQemuLdst *ldst_labels;
diff --git a/trace-events b/trace-events
index 4e61697297..ce54bb4993 100644
--- a/trace-events
+++ b/trace-events
@@ -99,6 +99,17 @@ vcpu guest_cpu_reset(void)
# Targets: TCG(all)
vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+# @vaddr: BBL's starting virtual address
+#
+# Mark end of BBL execution (after the BBL-exiting instruction).
+#
+# NOTE: This event might not be raised if the BBL ends unexpectedly (e.g.,
+# triggers an exception).
+#
+# Mode: user, softmmu
+# Targets: TCG(all)
+vcpu tcg guest_bbl_after(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+
# @vaddr: Instruction's virtual address
#
# Mark start of instruction execution (before anything gets really executed).
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
` (4 preceding siblings ...)
2017-09-10 16:31 ` [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after" Lluís Vilanova
@ 2017-09-10 16:35 ` Lluís Vilanova
2017-09-13 18:01 ` Richard Henderson
2017-09-10 16:39 ` [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after" Lluís Vilanova
2017-09-10 16:45 ` [Qemu-devel] [PATCH 0/7] trace: Add guest code events no-reply
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:35 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 23 ++++++++++++++++++-----
trace-events | 8 ++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index d66d601c89..c010aeee45 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -35,7 +35,8 @@ void translator_loop_temp_check(DisasContextBase *db)
void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
CPUState *cpu, TranslationBlock *tb)
{
- target_ulong pc_bbl;
+ target_ulong pc_bbl, pc_insn = 0;
+ bool translated_insn = false;
int max_insns;
/* Initialize DisasContext */
@@ -75,10 +76,15 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
while (true) {
- target_ulong pc_insn = db->pc_next;
TCGv_i32 insn_size_tcg = 0;
int insn_size_opcode_idx;
+ /* Tracing after (previous instruction) */
+ if (db->num_insns > 0) {
+ trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
+ }
+ pc_insn = db->pc_next;
+
db->num_insns++;
if (db->num_insns == 1) {
tcg_ctx.disas.in_guest_code = true;
@@ -136,6 +142,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
ops->translate_insn(db, cpu);
}
+ translated_insn = true;
/* Tracing after (patched values) */
if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
unsigned int insn_size = db->pc_next - pc_insn;
@@ -156,7 +163,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
}
/* Tracing after */
- if (TRACE_GUEST_BBL_AFTER_ENABLED) {
+ if (TRACE_GUEST_BBL_AFTER_ENABLED ||
+ TRACE_GUEST_INST_AFTER_ENABLED) {
tcg_ctx.disas.in_guest_code = false;
if (tcg_ctx.disas.inline_label == NULL) {
tcg_ctx.disas.inline_label = gen_new_inline_label();
@@ -164,6 +172,9 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
gen_set_inline_region_begin(tcg_ctx.disas.inline_label);
+ if (TRACE_GUEST_INST_AFTER_ENABLED && translated_insn) {
+ trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
+ }
if (TRACE_GUEST_BBL_AFTER_ENABLED) {
trace_guest_bbl_after_tcg(cpu, tcg_ctx.tcg_env, pc_bbl);
}
@@ -195,7 +206,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
void translator__gen_goto_tb(TCGContext *ctx)
{
if (ctx->disas.in_guest_code &&
- (TRACE_GUEST_BBL_AFTER_ENABLED)) {
+ (TRACE_GUEST_BBL_AFTER_ENABLED ||
+ TRACE_GUEST_INST_AFTER_ENABLED)) {
if (ctx->disas.inline_label == NULL) {
ctx->disas.inline_label = gen_new_inline_label();
}
@@ -208,7 +220,8 @@ void translator__gen_goto_tb(TCGContext *ctx)
void translator__gen_exit_tb(TCGContext *ctx)
{
if (ctx->disas.in_guest_code && !ctx->disas.seen_goto_tb &&
- (TRACE_GUEST_BBL_AFTER_ENABLED)) {
+ (TRACE_GUEST_BBL_AFTER_ENABLED ||
+ TRACE_GUEST_INST_AFTER_ENABLED)) {
if (ctx->disas.inline_label == NULL) {
ctx->disas.inline_label = gen_new_inline_label();
}
diff --git a/trace-events b/trace-events
index ce54bb4993..c477302d8d 100644
--- a/trace-events
+++ b/trace-events
@@ -118,6 +118,14 @@ vcpu tcg guest_bbl_after(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRI
# Targets: TCG(all)
vcpu tcg guest_inst_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+# @vaddr: Instruction's virtual address
+#
+# Mark end of instruction execution (after its operations have taken effect).
+#
+# Mode: user, softmmu
+# Targets: TCG(all)
+vcpu tcg guest_inst_after(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
+
# @vaddr: Instruction's virtual address
# @size: Instruction's size in bytes
#
^ permalink raw reply related [flat|nested] 29+ messages in thread
* [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after"
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
` (5 preceding siblings ...)
2017-09-10 16:35 ` [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after" Lluís Vilanova
@ 2017-09-10 16:39 ` Lluís Vilanova
2017-09-13 18:03 ` Richard Henderson
2017-09-10 16:45 ` [Qemu-devel] [PATCH 0/7] trace: Add guest code events no-reply
7 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-10 16:39 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Paolo Bonzini, Peter Crosthwaite,
Richard Henderson
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
accel/tcg/translator.c | 18 ++++++++++++++----
trace-events | 8 ++++++++
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index c010aeee45..d3039e7fd2 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -36,6 +36,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
CPUState *cpu, TranslationBlock *tb)
{
target_ulong pc_bbl, pc_insn = 0;
+ unsigned int insn_size = 0;
bool translated_insn = false;
int max_insns;
@@ -82,6 +83,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
/* Tracing after (previous instruction) */
if (db->num_insns > 0) {
trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
+ trace_guest_inst_info_after_tcg(
+ cpu, tcg_ctx.tcg_env, pc_insn, insn_size);
}
pc_insn = db->pc_next;
@@ -145,7 +148,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
translated_insn = true;
/* Tracing after (patched values) */
if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
- unsigned int insn_size = db->pc_next - pc_insn;
+ insn_size = db->pc_next - pc_insn;
tcg_set_insn_param(insn_size_opcode_idx, 1, insn_size);
}
@@ -164,7 +167,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
/* Tracing after */
if (TRACE_GUEST_BBL_AFTER_ENABLED ||
- TRACE_GUEST_INST_AFTER_ENABLED) {
+ TRACE_GUEST_INST_AFTER_ENABLED ||
+ TRACE_GUEST_INST_INFO_AFTER_ENABLED) {
tcg_ctx.disas.in_guest_code = false;
if (tcg_ctx.disas.inline_label == NULL) {
tcg_ctx.disas.inline_label = gen_new_inline_label();
@@ -175,6 +179,10 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
if (TRACE_GUEST_INST_AFTER_ENABLED && translated_insn) {
trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
}
+ if (TRACE_GUEST_INST_INFO_AFTER_ENABLED && translated_insn) {
+ trace_guest_inst_info_after_tcg(
+ cpu, tcg_ctx.tcg_env, pc_insn, insn_size);
+ }
if (TRACE_GUEST_BBL_AFTER_ENABLED) {
trace_guest_bbl_after_tcg(cpu, tcg_ctx.tcg_env, pc_bbl);
}
@@ -207,7 +215,8 @@ void translator__gen_goto_tb(TCGContext *ctx)
{
if (ctx->disas.in_guest_code &&
(TRACE_GUEST_BBL_AFTER_ENABLED ||
- TRACE_GUEST_INST_AFTER_ENABLED)) {
+ TRACE_GUEST_INST_AFTER_ENABLED ||
+ TRACE_GUEST_INST_INFO_AFTER_ENABLED)) {
if (ctx->disas.inline_label == NULL) {
ctx->disas.inline_label = gen_new_inline_label();
}
@@ -221,7 +230,8 @@ void translator__gen_exit_tb(TCGContext *ctx)
{
if (ctx->disas.in_guest_code && !ctx->disas.seen_goto_tb &&
(TRACE_GUEST_BBL_AFTER_ENABLED ||
- TRACE_GUEST_INST_AFTER_ENABLED)) {
+ TRACE_GUEST_INST_AFTER_ENABLED ||
+ TRACE_GUEST_INST_INFO_AFTER_ENABLED)) {
if (ctx->disas.inline_label == NULL) {
ctx->disas.inline_label = gen_new_inline_label();
}
diff --git a/trace-events b/trace-events
index c477302d8d..73d797cb48 100644
--- a/trace-events
+++ b/trace-events
@@ -135,6 +135,14 @@ vcpu tcg guest_inst_after(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PR
# Targets: TCG(all)
disable vcpu tcg guest_inst_info_before(uint64_t vaddr, TCGv_i32 size) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64" size=%d"
+# @vaddr: Instruction's virtual address
+# @size: Instruction's size in bytes
+#
+# Same as 'guest_inst_after', with additional information.
+#
+# Targets: TCG(all)
+disable vcpu tcg guest_inst_info_after(uint64_t vaddr, uint32_t size) "vaddr=0x%016"PRIx64" size=%d", "vaddr=0x%016"PRIx64" size=%d"
+
# @vaddr: Access' virtual address.
# @info : Access' information (see below).
#
^ permalink raw reply related [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 0/7] trace: Add guest code events
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
` (6 preceding siblings ...)
2017-09-10 16:39 ` [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after" Lluís Vilanova
@ 2017-09-10 16:45 ` no-reply
2017-09-13 14:36 ` Stefan Hajnoczi
7 siblings, 1 reply; 29+ messages in thread
From: no-reply @ 2017-09-10 16:45 UTC (permalink / raw)
To: vilanova; +Cc: famz, qemu-devel, stefanha
Hi,
This series failed automatic build test. Please find the testing commands and
their output below. If you have docker installed, you can probably reproduce it
locally.
Subject: [Qemu-devel] [PATCH 0/7] trace: Add guest code events
Message-id: 150505986682.19604.11937392314067517230.stgit@frigg.lan
Type: series
=== TEST SCRIPT BEGIN ===
#!/bin/bash
set -e
git submodule update --init dtc
# Let docker tests dump environment info
export SHOW_ENV=1
export J=8
time make docker-test-quick@centos6
time make docker-test-build@min-glib
time make docker-test-mingw@fedora
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
2dd2f0b108 trace: Add event "guest_inst_info_after"
e0f9f5a0d3 trace: Add event "guest_inst_after"
a14f5ef277 trace: Add event "guest_bbl_after"
a4f4a19f85 tcg: Add support for "inlining" regions of code
be4bb81d20 trace: Add event "guest_inst_info_before"
d6f78f6255 trace: Add event "guest_inst_before"
70264163be trace: Add event "guest_bbl_before"
=== OUTPUT BEGIN ===
Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc'
Cloning into '/var/tmp/patchew-tester-tmp-c6vps5k8/src/dtc'...
Submodule path 'dtc': checked out '558cd81bdd432769b59bff01240c44f82cfb1a9d'
BUILD centos6
make[1]: Entering directory '/var/tmp/patchew-tester-tmp-c6vps5k8/src'
ARCHIVE qemu.tgz
ARCHIVE dtc.tgz
COPY RUNNER
RUN test-quick in qemu:centos6
Packages installed:
SDL-devel-1.2.14-7.el6_7.1.x86_64
bison-2.4.1-5.el6.x86_64
bzip2-devel-1.0.5-7.el6_0.x86_64
ccache-3.1.6-2.el6.x86_64
csnappy-devel-0-6.20150729gitd7bc683.el6.x86_64
flex-2.5.35-9.el6.x86_64
gcc-4.4.7-18.el6.x86_64
git-1.7.1-8.el6.x86_64
glib2-devel-2.28.8-9.el6.x86_64
libepoxy-devel-1.2-3.el6.x86_64
libfdt-devel-1.4.0-1.el6.x86_64
librdmacm-devel-1.0.21-0.el6.x86_64
lzo-devel-2.03-3.1.el6_5.1.x86_64
make-3.81-23.el6.x86_64
mesa-libEGL-devel-11.0.7-4.el6.x86_64
mesa-libgbm-devel-11.0.7-4.el6.x86_64
package g++ is not installed
pixman-devel-0.32.8-1.el6.x86_64
spice-glib-devel-0.26-8.el6.x86_64
spice-server-devel-0.12.4-16.el6.x86_64
tar-1.23-15.el6_8.x86_64
vte-devel-0.25.1-9.el6.x86_64
xen-devel-4.6.3-15.el6.x86_64
zlib-devel-1.2.3-29.el6.x86_64
Environment variables:
PACKAGES=bison bzip2-devel ccache csnappy-devel flex g++ gcc git glib2-devel libepoxy-devel libfdt-devel librdmacm-devel lzo-devel make mesa-libEGL-devel mesa-libgbm-devel pixman-devel SDL-devel spice-glib-devel spice-server-devel tar vte-devel xen-devel zlib-devel
HOSTNAME=c49937df8c9c
TERM=xterm
MAKEFLAGS= -j8
HISTSIZE=1000
J=8
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
CCACHE_DIR=/var/tmp/ccache
EXTRA_CONFIGURE_OPTS=
V=
SHOW_ENV=1
MAIL=/var/spool/mail/root
PATH=/usr/lib/ccache:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
LANG=en_US.UTF-8
TARGET_LIST=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
TEST_DIR=/tmp/qemu-test
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
FEATURES= dtc
DEBUG=
G_BROKEN_FILENAMES=1
CCACHE_HASHDIR=
_=/usr/bin/env
Configure options:
--enable-werror --target-list=x86_64-softmmu,aarch64-softmmu --prefix=/var/tmp/qemu-build/install
No C++ compiler available; disabling C++ specific optional code
Install prefix /var/tmp/qemu-build/install
BIOS directory /var/tmp/qemu-build/install/share/qemu
binary directory /var/tmp/qemu-build/install/bin
library directory /var/tmp/qemu-build/install/lib
module directory /var/tmp/qemu-build/install/lib/qemu
libexec directory /var/tmp/qemu-build/install/libexec
include directory /var/tmp/qemu-build/install/include
config directory /var/tmp/qemu-build/install/etc
local state directory /var/tmp/qemu-build/install/var
Manual directory /var/tmp/qemu-build/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path /tmp/qemu-test/src
C compiler cc
Host C compiler cc
C++ compiler
Objective-C compiler cc
ARFLAGS rv
CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -g
QEMU_CFLAGS -I/usr/include/pixman-1 -I$(SRC_PATH)/dtc/libfdt -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -DNCURSES_WIDECHAR -fPIE -DPIE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wno-missing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-all -I/usr/include/libpng12 -I/usr/include/libdrm -I/usr/include/spice-server -I/usr/include/cacard -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/nss3 -I/usr/include/nspr4 -I/usr/include/spice-1 -I/usr/include/cacard -I/usr/include/nss3 -I/usr/include/nspr4
LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g
make make
install install
python python -B
smbd /usr/sbin/smbd
module support no
host CPU x86_64
host big endian no
target list x86_64-softmmu aarch64-softmmu
gprof enabled no
sparse enabled no
strip binaries yes
profiler no
static build no
pixman system
SDL support yes (1.2.14)
GTK support yes (2.24.23)
GTK GL support no
VTE support yes (0.25.1)
TLS priority NORMAL
GNUTLS support no
GNUTLS rnd no
libgcrypt no
libgcrypt kdf no
nettle no
nettle kdf no
libtasn1 no
curses support yes
virgl support no
curl support no
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support no
VNC support yes
VNC SASL support no
VNC JPEG support yes
VNC PNG support yes
xen support yes
xen ctrl version 40600
pv dom build no
brlapi support no
bluez support no
Documentation no
PIE yes
vde support no
netmap support no
Linux AIO support no
ATTR/XATTR support yes
Install blobs yes
KVM support yes
HAX support no
TCG support yes
TCG debug enabled no
TCG interpreter no
RDMA support yes
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
libcap-ng support no
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
vhost-user support yes
Trace backends log
spice support yes (0.12.6/0.12.4)
rbd support no
xfsctl support no
smartcard support yes
libusb no
usb net redir no
OpenGL support yes
OpenGL dmabufs no
libiscsi support no
libnfs support no
build guest agent yes
QGA VSS support no
QGA w32 disk info no
QGA MSI support no
seccomp support no
coroutine backend ucontext
coroutine pool yes
debug stack usage no
crypto afalg no
GlusterFS support no
gcov gcov
gcov enabled no
TPM support yes
libssh2 support no
TPM passthrough yes
QOM debugging yes
Live block migration yes
lzo support yes
snappy support no
bzip2 support yes
NUMA host support no
tcmalloc support no
jemalloc support no
avx2 optimization no
replication support yes
VxHS block device no
mkdir -p dtc/libfdt
GEN aarch64-softmmu/config-devices.mak.tmp
mkdir -p dtc/tests
GEN config-host.h
GEN x86_64-softmmu/config-devices.mak.tmp
GEN qemu-options.def
GEN qapi-types.h
GEN qmp-commands.h
GEN qapi-visit.h
GEN qapi-event.h
GEN x86_64-softmmu/config-devices.mak
GEN aarch64-softmmu/config-devices.mak
GEN qmp-marshal.c
GEN qapi-visit.c
GEN qapi-types.c
GEN qapi-event.c
GEN qmp-introspect.h
GEN qmp-introspect.c
GEN trace/generated-tcg-tracers.h
GEN trace/generated-helpers-wrappers.h
GEN trace/generated-helpers.h
GEN trace/generated-helpers.c
GEN module_block.h
GEN tests/test-qapi-types.h
GEN tests/test-qapi-visit.h
GEN tests/test-qmp-commands.h
GEN tests/test-qapi-event.h
GEN tests/test-qmp-introspect.h
GEN trace-root.h
GEN util/trace.h
GEN crypto/trace.h
GEN io/trace.h
GEN migration/trace.h
GEN block/trace.h
GEN chardev/trace.h
GEN hw/block/trace.h
GEN hw/block/dataplane/trace.h
GEN hw/char/trace.h
GEN hw/intc/trace.h
GEN hw/net/trace.h
GEN hw/virtio/trace.h
GEN hw/audio/trace.h
GEN hw/misc/trace.h
GEN hw/usb/trace.h
GEN hw/scsi/trace.h
GEN hw/nvram/trace.h
GEN hw/display/trace.h
GEN hw/input/trace.h
GEN hw/timer/trace.h
GEN hw/dma/trace.h
GEN hw/sparc/trace.h
GEN hw/sd/trace.h
GEN hw/isa/trace.h
GEN hw/mem/trace.h
GEN hw/i386/trace.h
GEN hw/i386/xen/trace.h
GEN hw/9pfs/trace.h
GEN hw/ppc/trace.h
GEN hw/pci/trace.h
GEN hw/s390x/trace.h
GEN hw/vfio/trace.h
GEN hw/acpi/trace.h
GEN hw/arm/trace.h
GEN hw/alpha/trace.h
GEN hw/xen/trace.h
GEN ui/trace.h
GEN audio/trace.h
GEN net/trace.h
GEN target/arm/trace.h
GEN target/i386/trace.h
GEN target/mips/trace.h
GEN target/sparc/trace.h
GEN target/s390x/trace.h
GEN target/ppc/trace.h
GEN qom/trace.h
GEN linux-user/trace.h
GEN qapi/trace.h
GEN accel/tcg/trace.h
GEN accel/kvm/trace.h
GEN nbd/trace.h
GEN trace-root.c
GEN util/trace.c
GEN crypto/trace.c
GEN io/trace.c
GEN migration/trace.c
GEN block/trace.c
GEN chardev/trace.c
GEN hw/block/trace.c
GEN hw/block/dataplane/trace.c
GEN hw/char/trace.c
GEN hw/intc/trace.c
GEN hw/net/trace.c
GEN hw/virtio/trace.c
GEN hw/audio/trace.c
GEN hw/misc/trace.c
GEN hw/usb/trace.c
GEN hw/scsi/trace.c
GEN hw/nvram/trace.c
GEN hw/display/trace.c
GEN hw/input/trace.c
GEN hw/timer/trace.c
GEN hw/dma/trace.c
GEN hw/sparc/trace.c
GEN hw/sd/trace.c
GEN hw/isa/trace.c
GEN hw/mem/trace.c
GEN hw/i386/trace.c
GEN hw/i386/xen/trace.c
GEN hw/9pfs/trace.c
GEN hw/ppc/trace.c
GEN hw/pci/trace.c
GEN hw/s390x/trace.c
GEN hw/vfio/trace.c
GEN hw/acpi/trace.c
GEN hw/arm/trace.c
GEN hw/alpha/trace.c
GEN hw/xen/trace.c
GEN ui/trace.c
GEN audio/trace.c
GEN net/trace.c
GEN target/arm/trace.c
GEN target/i386/trace.c
GEN target/mips/trace.c
GEN target/sparc/trace.c
GEN target/s390x/trace.c
GEN target/ppc/trace.c
GEN qom/trace.c
GEN linux-user/trace.c
GEN qapi/trace.c
GEN accel/tcg/trace.c
GEN accel/kvm/trace.c
GEN nbd/trace.c
GEN config-all-devices.mak
DEP /tmp/qemu-test/src/dtc/tests/dumptrees.c
DEP /tmp/qemu-test/src/dtc/tests/trees.S
DEP /tmp/qemu-test/src/dtc/tests/testutils.c
DEP /tmp/qemu-test/src/dtc/tests/value-labels.c
DEP /tmp/qemu-test/src/dtc/tests/asm_tree_dump.c
DEP /tmp/qemu-test/src/dtc/tests/truncated_property.c
DEP /tmp/qemu-test/src/dtc/tests/check_path.c
DEP /tmp/qemu-test/src/dtc/tests/overlay_bad_fixup.c
DEP /tmp/qemu-test/src/dtc/tests/overlay.c
DEP /tmp/qemu-test/src/dtc/tests/subnode_iterate.c
DEP /tmp/qemu-test/src/dtc/tests/property_iterate.c
DEP /tmp/qemu-test/src/dtc/tests/integer-expressions.c
DEP /tmp/qemu-test/src/dtc/tests/utilfdt_test.c
DEP /tmp/qemu-test/src/dtc/tests/path_offset_aliases.c
DEP /tmp/qemu-test/src/dtc/tests/add_subnode_with_nops.c
DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_unordered.c
DEP /tmp/qemu-test/src/dtc/tests/dtb_reverse.c
DEP /tmp/qemu-test/src/dtc/tests/dtbs_equal_ordered.c
DEP /tmp/qemu-test/src/dtc/tests/extra-terminating-null.c
DEP /tmp/qemu-test/src/dtc/tests/incbin.c
DEP /tmp/qemu-test/src/dtc/tests/boot-cpuid.c
DEP /tmp/qemu-test/src/dtc/tests/phandle_format.c
DEP /tmp/qemu-test/src/dtc/tests/path-references.c
DEP /tmp/qemu-test/src/dtc/tests/references.c
DEP /tmp/qemu-test/src/dtc/tests/string_escapes.c
DEP /tmp/qemu-test/src/dtc/tests/propname_escapes.c
DEP /tmp/qemu-test/src/dtc/tests/appendprop2.c
DEP /tmp/qemu-test/src/dtc/tests/appendprop1.c
DEP /tmp/qemu-test/src/dtc/tests/del_node.c
DEP /tmp/qemu-test/src/dtc/tests/del_property.c
DEP /tmp/qemu-test/src/dtc/tests/setprop.c
DEP /tmp/qemu-test/src/dtc/tests/set_name.c
DEP /tmp/qemu-test/src/dtc/tests/rw_tree1.c
DEP /tmp/qemu-test/src/dtc/tests/open_pack.c
DEP /tmp/qemu-test/src/dtc/tests/nopulate.c
DEP /tmp/qemu-test/src/dtc/tests/mangle-layout.c
DEP /tmp/qemu-test/src/dtc/tests/move_and_save.c
DEP /tmp/qemu-test/src/dtc/tests/sw_tree1.c
DEP /tmp/qemu-test/src/dtc/tests/nop_node.c
DEP /tmp/qemu-test/src/dtc/tests/nop_property.c
DEP /tmp/qemu-test/src/dtc/tests/setprop_inplace.c
DEP /tmp/qemu-test/src/dtc/tests/stringlist.c
DEP /tmp/qemu-test/src/dtc/tests/addr_size_cells.c
DEP /tmp/qemu-test/src/dtc/tests/notfound.c
DEP /tmp/qemu-test/src/dtc/tests/sized_cells.c
DEP /tmp/qemu-test/src/dtc/tests/char_literal.c
DEP /tmp/qemu-test/src/dtc/tests/get_alias.c
DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_compatible.c
DEP /tmp/qemu-test/src/dtc/tests/node_check_compatible.c
DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_phandle.c
DEP /tmp/qemu-test/src/dtc/tests/node_offset_by_prop_value.c
DEP /tmp/qemu-test/src/dtc/tests/parent_offset.c
DEP /tmp/qemu-test/src/dtc/tests/supernode_atdepth_offset.c
DEP /tmp/qemu-test/src/dtc/tests/get_path.c
DEP /tmp/qemu-test/src/dtc/tests/get_phandle.c
DEP /tmp/qemu-test/src/dtc/tests/getprop.c
DEP /tmp/qemu-test/src/dtc/tests/get_name.c
DEP /tmp/qemu-test/src/dtc/tests/path_offset.c
DEP /tmp/qemu-test/src/dtc/tests/subnode_offset.c
DEP /tmp/qemu-test/src/dtc/tests/find_property.c
DEP /tmp/qemu-test/src/dtc/tests/root_node.c
DEP /tmp/qemu-test/src/dtc/tests/get_mem_rsv.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_overlay.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_addresses.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_empty_tree.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_strerror.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_rw.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_sw.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_wip.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt.c
DEP /tmp/qemu-test/src/dtc/libfdt/fdt_ro.c
DEP /tmp/qemu-test/src/dtc/util.c
DEP /tmp/qemu-test/src/dtc/fdtput.c
DEP /tmp/qemu-test/src/dtc/fdtget.c
DEP /tmp/qemu-test/src/dtc/fdtdump.c
LEX convert-dtsv0-lexer.lex.c
DEP /tmp/qemu-test/src/dtc/srcpos.c
BISON dtc-parser.tab.c
LEX dtc-lexer.lex.c
DEP /tmp/qemu-test/src/dtc/treesource.c
DEP /tmp/qemu-test/src/dtc/livetree.c
DEP /tmp/qemu-test/src/dtc/fstree.c
DEP /tmp/qemu-test/src/dtc/flattree.c
DEP /tmp/qemu-test/src/dtc/dtc.c
DEP /tmp/qemu-test/src/dtc/data.c
DEP /tmp/qemu-test/src/dtc/checks.c
DEP convert-dtsv0-lexer.lex.c
DEP dtc-lexer.lex.c
DEP dtc-parser.tab.c
CHK version_gen.h
UPD version_gen.h
DEP /tmp/qemu-test/src/dtc/util.c
CC libfdt/fdt_ro.o
CC libfdt/fdt.o
CC libfdt/fdt_sw.o
CC libfdt/fdt_strerror.o
CC libfdt/fdt_wip.o
CC libfdt/fdt_empty_tree.o
CC libfdt/fdt_addresses.o
CC libfdt/fdt_rw.o
CC libfdt/fdt_overlay.o
AR libfdt/libfdt.a
ar: creating libfdt/libfdt.a
a - libfdt/fdt.o
a - libfdt/fdt_ro.o
a - libfdt/fdt_wip.o
a - libfdt/fdt_sw.o
a - libfdt/fdt_rw.o
a - libfdt/fdt_strerror.o
a - libfdt/fdt_empty_tree.o
a - libfdt/fdt_addresses.o
a - libfdt/fdt_overlay.o
CC tests/qemu-iotests/socket_scm_helper.o
GEN qga/qapi-generated/qga-qapi-types.h
GEN qga/qapi-generated/qga-qmp-commands.h
GEN qga/qapi-generated/qga-qapi-visit.h
GEN qga/qapi-generated/qga-qapi-visit.c
GEN qga/qapi-generated/qga-qapi-types.c
CC qmp-introspect.o
GEN qga/qapi-generated/qga-qmp-marshal.c
CC qapi-types.o
CC qapi-visit.o
CC qapi-event.o
CC qapi/qapi-visit-core.o
CC qapi/qapi-dealloc-visitor.o
CC qapi/qobject-input-visitor.o
CC qapi/qobject-output-visitor.o
CC qapi/qmp-registry.o
CC qapi/qmp-dispatch.o
CC qapi/string-input-visitor.o
CC qapi/string-output-visitor.o
CC qapi/opts-visitor.o
CC qapi/qapi-clone-visitor.o
CC qapi/qmp-event.o
CC qapi/qapi-util.o
CC qobject/qnull.o
CC qobject/qnum.o
CC qobject/qstring.o
CC qobject/qdict.o
CC qobject/qlist.o
CC qobject/qbool.o
CC qobject/qlit.o
CC qobject/qjson.o
CC qobject/qobject.o
CC qobject/json-lexer.o
CC qobject/json-streamer.o
CC qobject/json-parser.o
CC trace/control.o
CC trace/qmp.o
CC util/osdep.o
CC util/cutils.o
CC util/unicode.o
CC util/qemu-timer-common.o
CC util/bufferiszero.o
CC util/lockcnt.o
CC util/aiocb.o
CC util/async.o
CC util/thread-pool.o
CC util/qemu-timer.o
CC util/main-loop.o
CC util/iohandler.o
CC util/aio-posix.o
CC util/compatfd.o
CC util/event_notifier-posix.o
CC util/mmap-alloc.o
CC util/oslib-posix.o
CC util/qemu-openpty.o
CC util/qemu-thread-posix.o
CC util/memfd.o
CC util/envlist.o
CC util/path.o
CC util/module.o
CC util/host-utils.o
CC util/bitmap.o
CC util/bitops.o
CC util/hbitmap.o
CC util/fifo8.o
CC util/acl.o
CC util/cacheinfo.o
CC util/error.o
CC util/qemu-error.o
CC util/id.o
CC util/iov.o
CC util/qemu-config.o
CC util/qemu-sockets.o
CC util/uri.o
CC util/notify.o
CC util/qemu-option.o
CC util/qemu-progress.o
CC util/keyval.o
CC util/hexdump.o
CC util/crc32c.o
CC util/uuid.o
CC util/throttle.o
CC util/getauxval.o
CC util/readline.o
CC util/rcu.o
CC util/qemu-coroutine.o
CC util/qemu-coroutine-lock.o
CC util/qemu-coroutine-io.o
CC util/qemu-coroutine-sleep.o
CC util/coroutine-ucontext.o
CC util/buffer.o
CC util/timed-average.o
CC util/base64.o
CC util/log.o
CC util/qdist.o
CC util/qht.o
CC util/range.o
CC util/stats64.o
CC util/systemd.o
CC trace-root.o
CC util/trace.o
CC crypto/trace.o
CC io/trace.o
CC migration/trace.o
CC block/trace.o
CC chardev/trace.o
CC hw/block/trace.o
CC hw/block/dataplane/trace.o
CC hw/char/trace.o
CC hw/intc/trace.o
CC hw/net/trace.o
CC hw/virtio/trace.o
CC hw/audio/trace.o
CC hw/misc/trace.o
CC hw/usb/trace.o
CC hw/scsi/trace.o
CC hw/nvram/trace.o
CC hw/display/trace.o
CC hw/input/trace.o
CC hw/timer/trace.o
CC hw/dma/trace.o
CC hw/sparc/trace.o
CC hw/sd/trace.o
CC hw/isa/trace.o
CC hw/mem/trace.o
CC hw/i386/trace.o
CC hw/i386/xen/trace.o
CC hw/9pfs/trace.o
CC hw/ppc/trace.o
CC hw/pci/trace.o
CC hw/s390x/trace.o
CC hw/vfio/trace.o
CC hw/acpi/trace.o
CC hw/arm/trace.o
CC hw/alpha/trace.o
CC hw/xen/trace.o
CC ui/trace.o
CC audio/trace.o
CC net/trace.o
CC target/arm/trace.o
CC target/i386/trace.o
CC target/mips/trace.o
CC target/sparc/trace.o
CC target/s390x/trace.o
CC target/ppc/trace.o
CC qom/trace.o
CC linux-user/trace.o
CC qapi/trace.o
CC accel/tcg/trace.o
CC accel/kvm/trace.o
CC nbd/trace.o
CC crypto/pbkdf-stub.o
CC stubs/arch-query-cpu-def.o
CC stubs/arch-query-cpu-model-expansion.o
CC stubs/arch-query-cpu-model-comparison.o
CC stubs/arch-query-cpu-model-baseline.o
CC stubs/bdrv-next-monitor-owned.o
CC stubs/blk-commit-all.o
CC stubs/blockdev-close-all-bdrv-states.o
CC stubs/clock-warp.o
CC stubs/cpu-get-clock.o
CC stubs/cpu-get-icount.o
CC stubs/dump.o
CC stubs/error-printf.o
CC stubs/fdset.o
CC stubs/gdbstub.o
CC stubs/get-vm-name.o
CC stubs/iothread.o
CC stubs/iothread-lock.o
CC stubs/is-daemonized.o
CC stubs/machine-init-done.o
CC stubs/migr-blocker.o
CC stubs/change-state-handler.o
CC stubs/monitor.o
CC stubs/notify-event.o
CC stubs/qtest.o
CC stubs/replay.o
CC stubs/runstate-check.o
CC stubs/set-fd-handler.o
CC stubs/slirp.o
CC stubs/sysbus.o
CC stubs/trace-control.o
CC stubs/uuid.o
CC stubs/vm-stop.o
CC stubs/vmstate.o
CC stubs/qmp_pc_dimm_device_list.o
CC stubs/target-monitor-defs.o
CC stubs/target-get-monitor-def.o
CC stubs/pc_madt_cpu_entry.o
CC stubs/vmgenid.o
CC stubs/xen-common.o
CC stubs/xen-hvm.o
CC stubs/pci-host-piix.o
CC contrib/ivshmem-client/ivshmem-client.o
CC contrib/ivshmem-client/main.o
CC contrib/ivshmem-server/ivshmem-server.o
CC contrib/ivshmem-server/main.o
CC qemu-nbd.o
CC block.o
CC blockjob.o
CC qemu-io-cmds.o
CC replication.o
CC block/raw-format.o
CC block/qcow.o
CC block/vdi.o
CC block/vmdk.o
CC block/cloop.o
CC block/bochs.o
CC block/vpc.o
CC block/vvfat.o
CC block/dmg.o
CC block/qcow2.o
CC block/qcow2-refcount.o
CC block/qcow2-cluster.o
CC block/qcow2-snapshot.o
CC block/qcow2-cache.o
CC block/qcow2-bitmap.o
CC block/qed.o
CC block/qed-l2-cache.o
CC block/qed-table.o
CC block/qed-cluster.o
CC block/qed-check.o
CC block/vhdx.o
CC block/vhdx-endian.o
CC block/vhdx-log.o
CC block/quorum.o
CC block/parallels.o
CC block/blkdebug.o
CC block/blkverify.o
CC block/blkreplay.o
CC block/block-backend.o
CC block/snapshot.o
CC block/qapi.o
CC block/file-posix.o
CC block/null.o
CC block/mirror.o
CC block/commit.o
CC block/io.o
CC block/throttle-groups.o
CC block/nbd.o
CC block/nbd-client.o
CC block/sheepdog.o
CC block/accounting.o
CC block/dirty-bitmap.o
CC block/write-threshold.o
CC block/backup.o
CC block/replication.o
CC block/throttle.o
CC block/crypto.o
CC nbd/server.o
CC nbd/client.o
CC nbd/common.o
CC block/dmg-bz2.o
CC crypto/init.o
CC crypto/hash.o
CC crypto/hash-glib.o
CC crypto/hmac.o
CC crypto/hmac-glib.o
CC crypto/aes.o
CC crypto/desrfb.o
CC crypto/cipher.o
CC crypto/tlscreds.o
CC crypto/tlscredsanon.o
CC crypto/tlscredsx509.o
CC crypto/tlssession.o
CC crypto/secret.o
CC crypto/random-platform.o
CC crypto/pbkdf.o
CC crypto/ivgen.o
CC crypto/ivgen-essiv.o
CC crypto/ivgen-plain.o
CC crypto/ivgen-plain64.o
CC crypto/afsplit.o
CC crypto/xts.o
CC crypto/block.o
CC crypto/block-qcow.o
CC crypto/block-luks.o
CC io/channel.o
CC io/channel-buffer.o
CC io/channel-command.o
CC io/channel-file.o
CC io/channel-socket.o
CC io/channel-tls.o
CC io/channel-watch.o
CC io/channel-websock.o
CC io/channel-util.o
CC io/dns-resolver.o
CC io/task.o
CC qom/object.o
CC qom/container.o
CC qom/qom-qobject.o
CC qom/object_interfaces.o
GEN qemu-img-cmds.h
CC qemu-io.o
CC qemu-bridge-helper.o
CC blockdev.o
CC blockdev-nbd.o
CC bootdevice.o
CC iothread.o
CC qdev-monitor.o
CC device-hotplug.o
CC os-posix.o
CC bt-host.o
CC bt-vhci.o
CC dma-helpers.o
CC vl.o
CC tpm.o
CC device_tree.o
CC qmp-marshal.o
CC qmp.o
CC hmp.o
CC cpus-common.o
CC audio/audio.o
CC audio/noaudio.o
CC audio/wavaudio.o
CC audio/mixeng.o
CC audio/sdlaudio.o
CC audio/ossaudio.o
CC audio/spiceaudio.o
CC audio/wavcapture.o
CC backends/rng.o
CC backends/rng-egd.o
CC backends/rng-random.o
CC backends/tpm.o
CC backends/hostmem.o
CC backends/hostmem-ram.o
CC backends/hostmem-file.o
CC backends/cryptodev.o
CC backends/cryptodev-builtin.o
CC block/stream.o
CC chardev/msmouse.o
CC chardev/wctablet.o
CC chardev/testdev.o
CC chardev/spice.o
CC disas/arm.o
CC disas/i386.o
CC fsdev/qemu-fsdev-dummy.o
CC fsdev/qemu-fsdev-opts.o
CC fsdev/qemu-fsdev-throttle.o
CC hw/acpi/core.o
CC hw/acpi/piix4.o
CC hw/acpi/pcihp.o
CC hw/acpi/ich9.o
CC hw/acpi/tco.o
CC hw/acpi/cpu_hotplug.o
CC hw/acpi/memory_hotplug.o
CC hw/acpi/cpu.o
CC hw/acpi/nvdimm.o
CC hw/acpi/vmgenid.o
CC hw/acpi/acpi_interface.o
CC hw/acpi/bios-linker-loader.o
CC hw/acpi/aml-build.o
CC hw/acpi/ipmi.o
CC hw/acpi/acpi-stub.o
CC hw/acpi/ipmi-stub.o
CC hw/audio/sb16.o
CC hw/audio/es1370.o
CC hw/audio/ac97.o
CC hw/audio/fmopl.o
CC hw/audio/adlib.o
CC hw/audio/gus.o
CC hw/audio/gusemu_hal.o
CC hw/audio/gusemu_mixer.o
CC hw/audio/cs4231a.o
CC hw/audio/intel-hda.o
CC hw/audio/hda-codec.o
CC hw/audio/pcspk.o
CC hw/audio/wm8750.o
CC hw/audio/lm4549.o
CC hw/audio/pl041.o
CC hw/audio/marvell_88w8618.o
CC hw/audio/soundhw.o
CC hw/block/block.o
CC hw/block/cdrom.o
CC hw/block/hd-geometry.o
CC hw/block/fdc.o
CC hw/block/m25p80.o
CC hw/block/nand.o
CC hw/block/pflash_cfi01.o
CC hw/block/pflash_cfi02.o
CC hw/block/xen_disk.o
CC hw/block/ecc.o
CC hw/block/onenand.o
CC hw/block/nvme.o
CC hw/bt/core.o
CC hw/bt/l2cap.o
CC hw/bt/sdp.o
CC hw/bt/hci.o
CC hw/bt/hid.o
CC hw/bt/hci-csr.o
CC hw/char/ipoctal232.o
CC hw/char/parallel.o
CC hw/char/pl011.o
CC hw/char/serial.o
CC hw/char/serial-isa.o
CC hw/char/serial-pci.o
CC hw/char/virtio-console.o
CC hw/char/xen_console.o
CC hw/char/cadence_uart.o
CC hw/char/debugcon.o
CC hw/char/cmsdk-apb-uart.o
CC hw/char/imx_serial.o
CC hw/core/qdev.o
CC hw/core/qdev-properties.o
CC hw/core/bus.o
CC hw/core/reset.o
CC hw/core/fw-path-provider.o
CC hw/core/irq.o
CC hw/core/hotplug.o
CC hw/core/nmi.o
CC hw/core/ptimer.o
CC hw/core/sysbus.o
CC hw/core/machine.o
CC hw/core/loader.o
CC hw/core/qdev-properties-system.o
CC hw/core/register.o
CC hw/core/or-irq.o
CC hw/core/platform-bus.o
CC hw/cpu/core.o
CC hw/display/ads7846.o
CC hw/display/cirrus_vga.o
CC hw/display/pl110.o
CC hw/display/ssd0303.o
CC hw/display/ssd0323.o
CC hw/display/xenfb.o
CC hw/display/vga-pci.o
CC hw/display/vga-isa.o
CC hw/display/vmware_vga.o
CC hw/display/blizzard.o
CC hw/display/exynos4210_fimd.o
CC hw/display/framebuffer.o
CC hw/display/tc6393xb.o
CC hw/display/qxl.o
CC hw/display/qxl-logger.o
CC hw/display/qxl-render.o
CC hw/dma/pl080.o
CC hw/dma/pl330.o
CC hw/dma/i8257.o
CC hw/dma/xlnx-zynq-devcfg.o
CC hw/gpio/max7310.o
CC hw/gpio/pl061.o
CC hw/gpio/zaurus.o
CC hw/gpio/gpio_key.o
CC hw/i2c/core.o
CC hw/i2c/smbus.o
CC hw/i2c/smbus_eeprom.o
CC hw/i2c/i2c-ddc.o
CC hw/i2c/versatile_i2c.o
CC hw/i2c/smbus_ich9.o
CC hw/i2c/pm_smbus.o
CC hw/i2c/bitbang_i2c.o
CC hw/i2c/exynos4210_i2c.o
CC hw/i2c/imx_i2c.o
CC hw/i2c/aspeed_i2c.o
CC hw/ide/core.o
CC hw/ide/atapi.o
CC hw/ide/qdev.o
CC hw/ide/pci.o
CC hw/ide/isa.o
CC hw/ide/piix.o
CC hw/ide/microdrive.o
CC hw/ide/ahci.o
CC hw/ide/ich.o
CC hw/input/hid.o
CC hw/input/lm832x.o
CC hw/input/pckbd.o
CC hw/input/pl050.o
CC hw/input/ps2.o
CC hw/input/stellaris_input.o
CC hw/input/tsc2005.o
CC hw/input/vmmouse.o
CC hw/input/virtio-input.o
CC hw/input/virtio-input-hid.o
CC hw/input/virtio-input-host.o
CC hw/intc/i8259_common.o
CC hw/intc/i8259.o
CC hw/intc/pl190.o
CC hw/intc/imx_avic.o
CC hw/intc/realview_gic.o
CC hw/intc/ioapic_common.o
CC hw/intc/arm_gic_common.o
CC hw/intc/arm_gic.o
CC hw/intc/arm_gicv2m.o
CC hw/intc/arm_gicv3_common.o
CC hw/intc/arm_gicv3.o
CC hw/intc/arm_gicv3_dist.o
CC hw/intc/arm_gicv3_redist.o
CC hw/intc/arm_gicv3_its_common.o
CC hw/intc/intc.o
CC hw/ipack/ipack.o
CC hw/ipack/tpci200.o
CC hw/ipmi/ipmi.o
CC hw/ipmi/ipmi_bmc_sim.o
CC hw/ipmi/ipmi_bmc_extern.o
CC hw/ipmi/isa_ipmi_kcs.o
CC hw/ipmi/isa_ipmi_bt.o
CC hw/isa/isa-bus.o
CC hw/isa/apm.o
CC hw/mem/pc-dimm.o
CC hw/mem/nvdimm.o
CC hw/misc/applesmc.o
CC hw/misc/max111x.o
CC hw/misc/tmp105.o
CC hw/misc/tmp421.o
CC hw/misc/debugexit.o
CC hw/misc/sga.o
CC hw/misc/pc-testdev.o
CC hw/misc/pci-testdev.o
CC hw/misc/edu.o
CC hw/misc/unimp.o
CC hw/misc/arm_l2x0.o
CC hw/misc/arm_integrator_debug.o
CC hw/misc/a9scu.o
CC hw/misc/arm11scu.o
CC hw/net/xen_nic.o
CC hw/net/ne2000.o
CC hw/net/eepro100.o
CC hw/net/pcnet-pci.o
CC hw/net/pcnet.o
CC hw/net/e1000.o
CC hw/net/e1000x_common.o
CC hw/net/net_tx_pkt.o
CC hw/net/net_rx_pkt.o
CC hw/net/e1000e.o
CC hw/net/e1000e_core.o
CC hw/net/rtl8139.o
CC hw/net/vmxnet3.o
CC hw/net/smc91c111.o
CC hw/net/ne2000-isa.o
CC hw/net/lan9118.o
CC hw/net/xgmac.o
CC hw/net/allwinner_emac.o
CC hw/net/imx_fec.o
CC hw/net/cadence_gem.o
CC hw/net/stellaris_enet.o
CC hw/net/ftgmac100.o
CC hw/net/rocker/rocker.o
CC hw/net/rocker/rocker_fp.o
CC hw/net/rocker/rocker_desc.o
CC hw/net/rocker/rocker_world.o
CC hw/net/rocker/rocker_of_dpa.o
CC hw/nvram/fw_cfg.o
CC hw/nvram/eeprom93xx.o
CC hw/nvram/chrp_nvram.o
CC hw/pci-bridge/pci_bridge_dev.o
CC hw/pci-bridge/pcie_pci_bridge.o
CC hw/pci-bridge/pcie_root_port.o
CC hw/pci-bridge/gen_pcie_root_port.o
CC hw/pci-bridge/pci_expander_bridge.o
CC hw/pci-bridge/xio3130_upstream.o
CC hw/pci-bridge/xio3130_downstream.o
CC hw/pci-bridge/ioh3420.o
CC hw/pci-bridge/i82801b11.o
CC hw/pci-host/pam.o
CC hw/pci-host/versatile.o
CC hw/pci-host/q35.o
CC hw/pci-host/piix.o
CC hw/pci-host/gpex.o
CC hw/pci/pci.o
CC hw/pci/pci_bridge.o
CC hw/pci/msix.o
CC hw/pci/msi.o
CC hw/pci/shpc.o
CC hw/pci/slotid_cap.o
CC hw/pci/pci_host.o
CC hw/pci/pcie_host.o
CC hw/pci/pcie.o
CC hw/pci/pcie_aer.o
CC hw/pci/pcie_port.o
CC hw/pci/pci-stub.o
CC hw/pcmcia/pcmcia.o
CC hw/scsi/scsi-disk.o
CC hw/scsi/scsi-generic.o
CC hw/scsi/scsi-bus.o
CC hw/scsi/lsi53c895a.o
CC hw/scsi/mptsas.o
CC hw/scsi/mptconfig.o
CC hw/scsi/mptendian.o
CC hw/scsi/megasas.o
CC hw/scsi/vmw_pvscsi.o
CC hw/scsi/esp.o
CC hw/scsi/esp-pci.o
CC hw/sd/pl181.o
CC hw/sd/ssi-sd.o
CC hw/sd/sd.o
CC hw/sd/core.o
CC hw/sd/sdhci.o
CC hw/smbios/smbios.o
CC hw/smbios/smbios_type_38.o
CC hw/smbios/smbios-stub.o
CC hw/smbios/smbios_type_38-stub.o
CC hw/ssi/pl022.o
CC hw/ssi/ssi.o
CC hw/ssi/xilinx_spips.o
CC hw/ssi/aspeed_smc.o
CC hw/ssi/stm32f2xx_spi.o
CC hw/timer/arm_timer.o
CC hw/timer/arm_mptimer.o
CC hw/timer/armv7m_systick.o
CC hw/timer/a9gtimer.o
CC hw/timer/cadence_ttc.o
CC hw/timer/ds1338.o
CC hw/timer/hpet.o
CC hw/timer/i8254_common.o
CC hw/timer/i8254.o
CC hw/timer/pl031.o
CC hw/timer/twl92230.o
CC hw/timer/imx_epit.o
CC hw/timer/imx_gpt.o
CC hw/timer/stm32f2xx_timer.o
CC hw/timer/aspeed_timer.o
CC hw/timer/cmsdk-apb-timer.o
CC hw/tpm/tpm_tis.o
CC hw/tpm/tpm_passthrough.o
CC hw/tpm/tpm_util.o
CC hw/usb/core.o
CC hw/usb/combined-packet.o
CC hw/usb/bus.o
CC hw/usb/libhw.o
CC hw/usb/desc.o
CC hw/usb/desc-msos.o
CC hw/usb/hcd-uhci.o
CC hw/usb/hcd-ohci.o
CC hw/usb/hcd-ehci.o
CC hw/usb/hcd-ehci-pci.o
CC hw/usb/hcd-ehci-sysbus.o
CC hw/usb/hcd-xhci.o
CC hw/usb/hcd-xhci-nec.o
CC hw/usb/hcd-musb.o
CC hw/usb/dev-hub.o
CC hw/usb/dev-hid.o
CC hw/usb/dev-wacom.o
CC hw/usb/dev-storage.o
CC hw/usb/dev-uas.o
CC hw/usb/dev-audio.o
CC hw/usb/dev-serial.o
CC hw/usb/dev-network.o
CC hw/usb/dev-bluetooth.o
CC hw/usb/dev-smartcard-reader.o
CC hw/usb/ccid-card-passthru.o
CC hw/usb/ccid-card-emulated.o
CC hw/usb/dev-mtp.o
CC hw/usb/host-stub.o
CC hw/virtio/virtio-rng.o
CC hw/virtio/virtio-pci.o
CC hw/virtio/virtio-bus.o
CC hw/virtio/virtio-mmio.o
CC hw/virtio/vhost-stub.o
CC hw/watchdog/watchdog.o
CC hw/watchdog/wdt_i6300esb.o
CC hw/watchdog/wdt_ib700.o
CC hw/watchdog/wdt_aspeed.o
CC hw/xen/xen_backend.o
CC hw/xen/xen_devconfig.o
CC hw/xen/xen_pvdev.o
CC hw/xen/xen-common.o
CC migration/migration.o
CC migration/socket.o
CC migration/fd.o
CC migration/exec.o
CC migration/tls.o
CC migration/channel.o
CC migration/savevm.o
CC migration/colo-comm.o
CC migration/colo.o
CC migration/colo-failover.o
CC migration/vmstate.o
CC migration/vmstate-types.o
CC migration/page_cache.o
CC migration/qemu-file.o
CC migration/global_state.o
CC migration/qemu-file-channel.o
CC migration/xbzrle.o
CC migration/postcopy-ram.o
CC migration/qjson.o
CC migration/rdma.o
CC migration/block.o
CC net/net.o
CC net/queue.o
CC net/checksum.o
CC net/util.o
CC net/hub.o
CC net/socket.o
CC net/dump.o
CC net/eth.o
CC net/l2tpv3.o
CC net/vhost-user.o
CC net/slirp.o
CC net/filter.o
CC net/filter-buffer.o
CC net/filter-mirror.o
CC net/colo-compare.o
CC net/colo.o
CC net/filter-rewriter.o
CC net/filter-replay.o
CC net/tap.o
CC net/tap-linux.o
CC qom/cpu.o
CC replay/replay.o
CC replay/replay-internal.o
CC replay/replay-events.o
CC replay/replay-time.o
CC replay/replay-input.o
CC replay/replay-char.o
CC replay/replay-snapshot.o
CC replay/replay-net.o
/tmp/qemu-test/src/replay/replay-internal.c: In function ‘replay_put_array’:
/tmp/qemu-test/src/replay/replay-internal.c:65: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
CC replay/replay-audio.o
CC slirp/cksum.o
CC slirp/if.o
CC slirp/ip_icmp.o
CC slirp/ip6_icmp.o
CC slirp/ip6_input.o
CC slirp/ip6_output.o
CC slirp/ip_input.o
CC slirp/ip_output.o
CC slirp/dnssearch.o
CC slirp/dhcpv6.o
CC slirp/slirp.o
CC slirp/mbuf.o
CC slirp/misc.o
CC slirp/sbuf.o
CC slirp/socket.o
CC slirp/tcp_input.o
CC slirp/tcp_output.o
CC slirp/tcp_subr.o
CC slirp/tcp_timer.o
CC slirp/udp.o
CC slirp/udp6.o
CC slirp/bootp.o
CC slirp/tftp.o
CC slirp/arp_table.o
CC slirp/ndp_table.o
CC slirp/ncsi.o
CC ui/keymaps.o
CC ui/console.o
/tmp/qemu-test/src/slirp/tcp_input.c: In function ‘tcp_input’:
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_p’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_len’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_tos’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_id’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_off’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_ttl’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_sum’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_src.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_dst.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:220: warning: ‘save_ip6.ip_nh’ may be used uninitialized in this function
CC ui/cursor.o
CC ui/qemu-pixman.o
CC ui/input.o
CC ui/input-keymap.o
CC ui/input-legacy.o
CC ui/input-linux.o
CC ui/spice-core.o
CC ui/spice-input.o
CC ui/spice-display.o
CC ui/sdl.o
CC ui/sdl_zoom.o
CC ui/x_keymap.o
CC ui/curses.o
CC ui/vnc.o
CC ui/vnc-enc-zlib.o
CC ui/vnc-enc-hextile.o
CC ui/vnc-enc-tight.o
CC ui/vnc-palette.o
CC ui/vnc-enc-zrle.o
CC ui/vnc-auth-vencrypt.o
CC ui/vnc-ws.o
CC ui/vnc-jobs.o
CC ui/gtk.o
CC ui/shader.o
VERT ui/shader/texture-blit-vert.h
CC ui/egl-helpers.o
FRAG ui/shader/texture-blit-frag.h
CC ui/egl-context.o
CC ui/gtk-egl.o
CC chardev/char.o
CC chardev/char-fe.o
CC chardev/char-fd.o
CC chardev/char-file.o
CC chardev/char-io.o
CC chardev/char-mux.o
CC chardev/char-null.o
CC chardev/char-parallel.o
CC chardev/char-pipe.o
CC chardev/char-pty.o
In file included from /usr/include/gtk-2.0/gtk/gtk.h:235,
from /tmp/qemu-test/src/include/ui/gtk.h:10,
from /tmp/qemu-test/src/ui/gtk-egl.c:21:
/usr/include/gtk-2.0/gtk/gtkitemfactory.h:47: warning: function declaration isn’t a prototype
CC chardev/char-ringbuf.o
CC chardev/char-serial.o
CC chardev/char-socket.o
CC chardev/char-stdio.o
In file included from /usr/include/gtk-2.0/gtk/gtk.h:235,
from /tmp/qemu-test/src/include/ui/gtk.h:10,
from /tmp/qemu-test/src/ui/gtk.c:43:
/usr/include/gtk-2.0/gtk/gtkitemfactory.h:47: warning: function declaration isn’t a prototype
CC chardev/char-udp.o
AS optionrom/multiboot.o
AS optionrom/linuxboot.o
LINK tests/qemu-iotests/socket_scm_helper
CC optionrom/linuxboot_dma.o
cc: unrecognized option '-no-integrated-as'
cc: unrecognized option '-no-integrated-as'
AS optionrom/kvmvapic.o
BUILD optionrom/multiboot.img
CC qga/commands.o
BUILD optionrom/linuxboot.img
CC qga/guest-agent-command-state.o
BUILD optionrom/linuxboot_dma.img
BUILD optionrom/kvmvapic.img
BUILD optionrom/multiboot.raw
BUILD optionrom/linuxboot.raw
CC qga/commands-posix.o
CC qga/main.o
BUILD optionrom/linuxboot_dma.raw
BUILD optionrom/kvmvapic.raw
SIGN optionrom/multiboot.bin
CC qga/channel-posix.o
CC qga/qapi-generated/qga-qapi-types.o
SIGN optionrom/linuxboot.bin
SIGN optionrom/linuxboot_dma.bin
SIGN optionrom/kvmvapic.bin
CC qga/qapi-generated/qga-qapi-visit.o
CC qga/qapi-generated/qga-qmp-marshal.o
AR libqemuutil.a
AR libqemustub.a
CC qemu-img.o
LINK qemu-io
LINK qemu-bridge-helper
CC ui/console-gl.o
LINK ivshmem-client
LINK ivshmem-server
LINK qemu-nbd
LINK qemu-ga
GEN aarch64-softmmu/hmp-commands.h
GEN aarch64-softmmu/hmp-commands-info.h
GEN aarch64-softmmu/config-target.h
CC aarch64-softmmu/tcg/optimize.o
CC aarch64-softmmu/tcg/tcg.o
CC aarch64-softmmu/tcg/tcg-op.o
CC aarch64-softmmu/tcg/tcg-common.o
CC aarch64-softmmu/exec.o
CC aarch64-softmmu/tcg/tcg-runtime.o
CC aarch64-softmmu/fpu/softfloat.o
GEN x86_64-softmmu/hmp-commands.h
In file included from /tmp/qemu-test/src/tcg/tcg-common.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
GEN x86_64-softmmu/hmp-commands-info.h
make[1]: *** [tcg/tcg-common.o] Error 1
make[1]: *** Waiting for unfinished jobs....
GEN x86_64-softmmu/config-target.h
LINK qemu-img
In file included from /tmp/qemu-test/src/tcg/tcg-op.h:26,
from /tmp/qemu-test/src/tcg/optimize.c:30:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/optimize.o] Error 1
CC x86_64-softmmu/exec.o
CC x86_64-softmmu/tcg/tcg.o
In file included from /tmp/qemu-test/src/tcg/tcg-op.h:26,
from /tmp/qemu-test/src/tcg/tcg.c:47:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg.o] Error 1
CC x86_64-softmmu/tcg/tcg-op.o
In file included from /tmp/qemu-test/src/exec.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [exec.o] Error 1
CC x86_64-softmmu/tcg/optimize.o
In file included from /tmp/qemu-test/src/include/exec/cpu_ldst.h:115,
from /tmp/qemu-test/src/tcg/tcg-runtime.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg-runtime.o] Error 1
CC x86_64-softmmu/tcg/tcg-common.o
In file included from /tmp/qemu-test/src/tcg/tcg-op.c:30:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg-op.o] Error 1
CC x86_64-softmmu/tcg/tcg-runtime.o
CC x86_64-softmmu/fpu/softfloat.o
In file included from /tmp/qemu-test/src/tcg/tcg-common.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg-common.o] Error 1
make[1]: *** Waiting for unfinished jobs....
In file included from /tmp/qemu-test/src/exec.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [exec.o] Error 1
In file included from /tmp/qemu-test/src/tcg/tcg-op.c:30:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg-op.o] Error 1
In file included from /tmp/qemu-test/src/tcg/tcg-op.h:26,
from /tmp/qemu-test/src/tcg/tcg.c:47:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg.o] Error 1
In file included from /tmp/qemu-test/src/tcg/tcg-op.h:26,
from /tmp/qemu-test/src/tcg/optimize.c:30:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/optimize.o] Error 1
In file included from /tmp/qemu-test/src/include/exec/cpu_ldst.h:115,
from /tmp/qemu-test/src/tcg/tcg-runtime.c:29:
/tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
/tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
make[1]: *** [tcg/tcg-runtime.o] Error 1
make: *** [subdir-aarch64-softmmu] Error 2
make: *** Waiting for unfinished jobs....
make: *** [subdir-x86_64-softmmu] Error 2
Traceback (most recent call last):
File "./tests/docker/docker.py", line 384, in <module>
sys.exit(main())
File "./tests/docker/docker.py", line 381, in main
return args.cmdobj.run(args, argv)
File "./tests/docker/docker.py", line 239, in run
return Docker().run(argv, args.keep, quiet=args.quiet)
File "./tests/docker/docker.py", line 207, in run
quiet=quiet)
File "./tests/docker/docker.py", line 125, in _do_check
return subprocess.check_call(self._command + cmd, **kwargs)
File "/usr/lib64/python2.7/subprocess.py", line 186, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['docker', 'run', '--label', 'com.qemu.instance.uuid=16aa17ca964711e789d552540069c830', '-u', '0', '-t', '--rm', '--net=none', '-e', 'TARGET_LIST=', '-e', 'EXTRA_CONFIGURE_OPTS=', '-e', 'V=', '-e', 'J=8', '-e', 'DEBUG=', '-e', 'SHOW_ENV=1', '-e', 'CCACHE_DIR=/var/tmp/ccache', '-v', '/var/tmp/patchew-tester-tmp-c6vps5k8/src/docker-src.2017-09-10-12.42.48.21915:/var/tmp/qemu:z,ro', '-v', '/root/.cache/qemu-docker-ccache:/var/tmp/ccache:z', 'qemu:centos6', '/var/tmp/qemu/run', 'test-quick']' returned non-zero exit status 2
make[1]: *** [tests/docker/Makefile.include:139: docker-run] Error 1
make[1]: Leaving directory '/var/tmp/patchew-tester-tmp-c6vps5k8/src'
make: *** [tests/docker/Makefile.include:168: docker-run-test-quick@centos6] Error 2
real 2m34.215s
user 0m5.678s
sys 0m1.621s
=== OUTPUT END ===
Test command exited with code: 2
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 0/7] trace: Add guest code events
2017-09-10 16:45 ` [Qemu-devel] [PATCH 0/7] trace: Add guest code events no-reply
@ 2017-09-13 14:36 ` Stefan Hajnoczi
0 siblings, 0 replies; 29+ messages in thread
From: Stefan Hajnoczi @ 2017-09-13 14:36 UTC (permalink / raw)
To: Lluís Vilanova; +Cc: famz, qemu-devel
On Sun, Sep 10, 2017 at 09:45:22AM -0700, no-reply@patchew.org wrote:
> In file included from /tmp/qemu-test/src/tcg/tcg-common.c:29:
> /tmp/qemu-test/src/tcg/tcg.h:411: error: redefinition of typedef ‘TCGInlineLabel’
> /tmp/qemu-test/src/include/qemu/typedefs.h:99: note: previous declaration of ‘TCGInlineLabel’ was here
> GEN x86_64-softmmu/hmp-commands-info.h
> make[1]: *** [tcg/tcg-common.o] Error 1
Please take a look at this failure, Lluís.
Once Richard Henderson has reviewed this series I'd be happy to apply
it.
Stefan
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before"
2017-09-10 16:15 ` [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before" Lluís Vilanova
@ 2017-09-13 16:59 ` Richard Henderson
2017-09-14 14:21 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 16:59 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:15 AM, Lluís Vilanova wrote:
> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
> ---
> accel/tcg/translator.c | 6 ++++++
> trace-events | 11 +++++++++++
> 2 files changed, 17 insertions(+)
>
> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
> index afa3af478a..91b3b0da32 100644
> --- a/accel/tcg/translator.c
> +++ b/accel/tcg/translator.c
> @@ -13,6 +13,7 @@
> #include "cpu.h"
> #include "tcg/tcg.h"
> #include "tcg/tcg-op.h"
> +#include "trace-tcg.h"
> #include "exec/exec-all.h"
> #include "exec/gen-icount.h"
> #include "exec/log.h"
> @@ -91,6 +92,11 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
> }
> }
>
> + /* Tracing before */
> + if (db->num_insns == 1) {
> + trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
> + }
Why not place this before the loop, so that you don't
have to check num_insns == 1?
> +vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
You're really going to print both ENV and PC tagged with "vaddr"?
That just seems confusing.
Also, terminology. A "basic block" ("bb" by preference, not "bbl"), has a
specific meaning (https://en.wikipedia.org/wiki/Basic_block). What we're
generating here is a TranslationBlock (which may consist of many basic blocks),
and oft contracted within the source as "tb".
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before"
2017-09-10 16:19 ` [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before" Lluís Vilanova
@ 2017-09-13 17:02 ` Richard Henderson
2017-09-14 14:40 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 17:02 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:19 AM, Lluís Vilanova wrote:
> while (true) {
> + target_ulong pc_insn = db->pc_next;
Why not just "pc"?
> +
> db->num_insns++;
> ops->insn_start(db, cpu);
> tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
> @@ -96,6 +98,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
> if (db->num_insns == 1) {
> trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
> }
> + trace_guest_inst_before_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
I prefer "insn" over "inst". There are enough other words that begin with
"inst" (e.g. instance) to possibly be confusing. Either that or it's my 20
years working on gcc that ingrained "insn". ;-)
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before"
2017-09-10 16:23 ` [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before" Lluís Vilanova
@ 2017-09-13 17:07 ` Richard Henderson
2017-09-14 14:59 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 17:07 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:23 AM, Lluís Vilanova wrote:
> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
> ---
> accel/tcg/translator.c | 18 ++++++++++++++++++
> trace-events | 9 +++++++++
> 2 files changed, 27 insertions(+)
>
> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
> index 287d27b4f7..6598931171 100644
> --- a/accel/tcg/translator.c
> +++ b/accel/tcg/translator.c
> @@ -70,6 +70,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>
> while (true) {
> target_ulong pc_insn = db->pc_next;
> + TCGv_i32 insn_size_tcg = 0;
> + int insn_size_opcode_idx;
Initializing a TCGv_i32 is wrong.
And surely insn_size_opcode is surely uninitialized?
> + if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
> + insn_size_tcg = tcg_temp_new_i32();
> + insn_size_opcode_idx = tcg_op_buf_count();
> + tcg_gen_movi_i32(insn_size_tcg, 0xdeadbeef);
> +
> + trace_guest_inst_info_before_tcg(
> + cpu, tcg_ctx.tcg_env, pc_insn, insn_size_tcg);
> +
> + tcg_temp_free_i32(insn_size_tcg);
There's no reason you can't declare insn_size_tcg right here and avoid the
incorrect initialization above.
Is there a reason to have both "guest_insn" and "guest_insn_info"?
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-10 16:27 ` [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code Lluís Vilanova
@ 2017-09-13 17:09 ` Richard Henderson
2017-09-14 15:20 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 17:09 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel; +Cc: Stefan Hajnoczi, Richard Henderson
On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
> TCG BBLs and instructions have multiple exit points from where to raise
> tracing events, but some of the necessary information in the generic
> disassembly infrastructure is not available until after generating these
> exit points.
>
> This patch adds support for "inline points" (where the tracing code will
> be placed), and "inline regions" (which identify the TCG code that must
> be inlined). The TCG compiler will basically copy each inline region to
> any inline points that reference it.
I am not keen on this.
Is there a reason you can't just emit the tracing code at the appropriate place
to begin with? Perhaps I have to wait to see how this is used...
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after"
2017-09-10 16:31 ` [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after" Lluís Vilanova
@ 2017-09-13 17:34 ` Richard Henderson
2017-09-14 15:20 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 17:34 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:31 AM, Lluís Vilanova wrote:
> +void translator__gen_goto_tb(TCGContext *ctx)
> +{
> + if (ctx->disas.in_guest_code &&
> + (TRACE_GUEST_BBL_AFTER_ENABLED)) {
> + if (ctx->disas.inline_label == NULL) {
> + ctx->disas.inline_label = gen_new_inline_label();
> + }
> + gen_set_inline_point(ctx->disas.inline_label);
> + /* disable next exit_tb */
> + ctx->disas.seen_goto_tb = true;
> + }
> +}
> +
> +void translator__gen_exit_tb(TCGContext *ctx)
> +{
> + if (ctx->disas.in_guest_code && !ctx->disas.seen_goto_tb &&
> + (TRACE_GUEST_BBL_AFTER_ENABLED)) {
> + if (ctx->disas.inline_label == NULL) {
> + ctx->disas.inline_label = gen_new_inline_label();
> + }
> + gen_set_inline_point(ctx->disas.inline_label);
> + /* enable next exit_tb */
> + ctx->disas.seen_goto_tb = false;
> + }
> +}
I don't understand why you wouldn't just modify tcg_gen_goto_tb and
tcg_gen_exit_tb instead.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after"
2017-09-10 16:35 ` [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after" Lluís Vilanova
@ 2017-09-13 18:01 ` Richard Henderson
2017-09-14 16:23 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 18:01 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:35 AM, Lluís Vilanova wrote:
> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
> ---
> accel/tcg/translator.c | 23 ++++++++++++++++++-----
> trace-events | 8 ++++++++
> 2 files changed, 26 insertions(+), 5 deletions(-)
>
> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
> index d66d601c89..c010aeee45 100644
> --- a/accel/tcg/translator.c
> +++ b/accel/tcg/translator.c
> @@ -35,7 +35,8 @@ void translator_loop_temp_check(DisasContextBase *db)
> void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
> CPUState *cpu, TranslationBlock *tb)
> {
> - target_ulong pc_bbl;
> + target_ulong pc_bbl, pc_insn = 0;
> + bool translated_insn = false;
> int max_insns;
>
> /* Initialize DisasContext */
> @@ -75,10 +76,15 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
> tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
>
> while (true) {
> - target_ulong pc_insn = db->pc_next;
> TCGv_i32 insn_size_tcg = 0;
> int insn_size_opcode_idx;
>
> + /* Tracing after (previous instruction) */
> + if (db->num_insns > 0) {
> + trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
> + }
How does this differ from "guest_inst"? Why would you need two trace points?
Why are you placing this at the beginning of the while loop rather than the end?
> @@ -164,6 +172,9 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>
> gen_set_inline_region_begin(tcg_ctx.disas.inline_label);
>
> + if (TRACE_GUEST_INST_AFTER_ENABLED && translated_insn) {
> + trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
> + }
> if (TRACE_GUEST_BBL_AFTER_ENABLED) {
> trace_guest_bbl_after_tcg(cpu, tcg_ctx.tcg_env, pc_bbl);
> }
I think I'm finally beginning to understand what you're after with your
inlining. But I still think this should be doable in the appropriate opcode
generating functions.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after"
2017-09-10 16:39 ` [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after" Lluís Vilanova
@ 2017-09-13 18:03 ` Richard Henderson
0 siblings, 0 replies; 29+ messages in thread
From: Richard Henderson @ 2017-09-13 18:03 UTC (permalink / raw)
To: Lluís Vilanova, qemu-devel
Cc: Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
On 09/10/2017 09:39 AM, Lluís Vilanova wrote:
> if (TRACE_GUEST_INST_AFTER_ENABLED && translated_insn) {
> trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
> }
> + if (TRACE_GUEST_INST_INFO_AFTER_ENABLED && translated_insn) {
> + trace_guest_inst_info_after_tcg(
> + cpu, tcg_ctx.tcg_env, pc_insn, insn_size);
> + }
Same comments re guest_inst + guest_inst_info, really.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before"
2017-09-13 16:59 ` Richard Henderson
@ 2017-09-14 14:21 ` Lluís Vilanova
0 siblings, 0 replies; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 14:21 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
Richard Henderson writes:
> On 09/10/2017 09:15 AM, Lluís Vilanova wrote:
>> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
>> ---
>> accel/tcg/translator.c | 6 ++++++
>> trace-events | 11 +++++++++++
>> 2 files changed, 17 insertions(+)
>>
>> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
>> index afa3af478a..91b3b0da32 100644
>> --- a/accel/tcg/translator.c
>> +++ b/accel/tcg/translator.c
>> @@ -13,6 +13,7 @@
>> #include "cpu.h"
>> #include "tcg/tcg.h"
>> #include "tcg/tcg-op.h"
>> +#include "trace-tcg.h"
>> #include "exec/exec-all.h"
>> #include "exec/gen-icount.h"
>> #include "exec/log.h"
>> @@ -91,6 +92,11 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>> }
>> }
>>
>> + /* Tracing before */
>> + if (db->num_insns == 1) {
>> + trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
>> + }
> Why not place this before the loop, so that you don't
> have to check num_insns == 1?
In case the translation hits a breakpoint. I do not want the BBL/TB to appear
once before breaking, and then again after continuing.
>> +vcpu tcg guest_bbl_before(uint64_t vaddr) "vaddr=0x%016"PRIx64, "vaddr=0x%016"PRIx64
> You're really going to print both ENV and PC tagged with "vaddr"?
> That just seems confusing.
I'm not sure I follow. The ENV/CPUState is automatically added to the print
format (due to the "vcpu" property). The two format strings are necessary due to
the "tcg" property (translation-time format and execution-time format, since
TCGv arguments are not passed to the tracing function at translation time).
I'm not sure if this addresses your issue.
> Also, terminology. A "basic block" ("bb" by preference, not "bbl"), has a
> specific meaning (https://en.wikipedia.org/wiki/Basic_block). What we're
> generating here is a TranslationBlock (which may consist of many basic blocks),
> and oft contracted within the source as "tb".
Yes, I got carried away by the naming used by some binary analysis tools like
pin. I will change it to TB and that will probably make it clearer.
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before"
2017-09-13 17:02 ` Richard Henderson
@ 2017-09-14 14:40 ` Lluís Vilanova
0 siblings, 0 replies; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 14:40 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
Richard Henderson writes:
> On 09/10/2017 09:19 AM, Lluís Vilanova wrote:
>> while (true) {
>> + target_ulong pc_insn = db->pc_next;
> Why not just "pc"?
>> +
db-> num_insns++;
ops-> insn_start(db, cpu);
>> tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
>> @@ -96,6 +98,7 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>> if (db->num_insns == 1) {
>> trace_guest_bbl_before_tcg(cpu, tcg_ctx.tcg_env, db->pc_first);
>> }
>> + trace_guest_inst_before_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
> I prefer "insn" over "inst". There are enough other words that begin with
> "inst" (e.g. instance) to possibly be confusing. Either that or it's my 20
> years working on gcc that ingrained "insn". ;-)
Both work for me, so no problem in switching to pc and insn.
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before"
2017-09-13 17:07 ` Richard Henderson
@ 2017-09-14 14:59 ` Lluís Vilanova
2017-09-14 16:12 ` Richard Henderson
0 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 14:59 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
Richard Henderson writes:
> On 09/10/2017 09:23 AM, Lluís Vilanova wrote:
>> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
>> ---
>> accel/tcg/translator.c | 18 ++++++++++++++++++
>> trace-events | 9 +++++++++
>> 2 files changed, 27 insertions(+)
>>
>> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
>> index 287d27b4f7..6598931171 100644
>> --- a/accel/tcg/translator.c
>> +++ b/accel/tcg/translator.c
>> @@ -70,6 +70,8 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>>
>> while (true) {
>> target_ulong pc_insn = db->pc_next;
>> + TCGv_i32 insn_size_tcg = 0;
>> + int insn_size_opcode_idx;
> Initializing a TCGv_i32 is wrong.
> And surely insn_size_opcode is surely uninitialized?
>> + if (TRACE_GUEST_INST_INFO_BEFORE_EXEC_ENABLED) {
>> + insn_size_tcg = tcg_temp_new_i32();
>> + insn_size_opcode_idx = tcg_op_buf_count();
>> + tcg_gen_movi_i32(insn_size_tcg, 0xdeadbeef);
>> +
>> + trace_guest_inst_info_before_tcg(
>> + cpu, tcg_ctx.tcg_env, pc_insn, insn_size_tcg);
>> +
>> + tcg_temp_free_i32(insn_size_tcg);
> There's no reason you can't declare insn_size_tcg right here and avoid the
> incorrect initialization above.
Yes, I guess I did not move the declaration here by error after refactoring the
code.
> Is there a reason to have both "guest_insn" and "guest_insn_info"?
I initially wanted to have a bare-bones event with simple information, and an
*_info variant with more detailed information like register usage and physical
addresses (which would be disabled by default to avoid performance impact).
We had a discussion long time ago that led to decide that register usage
information as I implemented it was only partial (it did not capture register
usage helpers), and thus was not worth adding.
Since physical address information is not gonna be added in this series (if at
all), what do you say about hoisting instruction length info into
guest_insn_before/after and dropping the *_info variants?
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-13 17:09 ` Richard Henderson
@ 2017-09-14 15:20 ` Lluís Vilanova
2017-09-14 16:15 ` Richard Henderson
0 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 15:20 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, Stefan Hajnoczi, Richard Henderson
Richard Henderson writes:
> On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
>> TCG BBLs and instructions have multiple exit points from where to raise
>> tracing events, but some of the necessary information in the generic
>> disassembly infrastructure is not available until after generating these
>> exit points.
>>
>> This patch adds support for "inline points" (where the tracing code will
>> be placed), and "inline regions" (which identify the TCG code that must
>> be inlined). The TCG compiler will basically copy each inline region to
>> any inline points that reference it.
> I am not keen on this.
> Is there a reason you can't just emit the tracing code at the appropriate place
> to begin with? Perhaps I have to wait to see how this is used...
As I tried to briefly explain on next patch, the main problem without inlining
is that we will see guest_tb_after_trans twice on the trace for each TB in
conditional instructions on the guest, since they have two exit points (which we
capture when emitting goto_tb in TCG).
We cannot instead emit it only once by overloading the brcond opcode in TCG,
since that can be used internally in the guest instruction emulation without
necessarily ending a TB (or we could have more than one brcond for a single
instruction).
I hope it's clearer now.
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after"
2017-09-13 17:34 ` Richard Henderson
@ 2017-09-14 15:20 ` Lluís Vilanova
2017-09-14 16:16 ` Richard Henderson
0 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 15:20 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
Richard Henderson writes:
> On 09/10/2017 09:31 AM, Lluís Vilanova wrote:
>> +void translator__gen_goto_tb(TCGContext *ctx)
>> +{
>> + if (ctx->disas.in_guest_code &&
>> + (TRACE_GUEST_BBL_AFTER_ENABLED)) {
>> + if (ctx->disas.inline_label == NULL) {
>> + ctx->disas.inline_label = gen_new_inline_label();
>> + }
>> + gen_set_inline_point(ctx->disas.inline_label);
>> + /* disable next exit_tb */
>> + ctx->disas.seen_goto_tb = true;
>> + }
>> +}
>> +
>> +void translator__gen_exit_tb(TCGContext *ctx)
>> +{
>> + if (ctx->disas.in_guest_code && !ctx->disas.seen_goto_tb &&
>> + (TRACE_GUEST_BBL_AFTER_ENABLED)) {
>> + if (ctx->disas.inline_label == NULL) {
>> + ctx->disas.inline_label = gen_new_inline_label();
>> + }
>> + gen_set_inline_point(ctx->disas.inline_label);
>> + /* enable next exit_tb */
>> + ctx->disas.seen_goto_tb = false;
>> + }
>> +}
> I don't understand why you wouldn't just modify tcg_gen_goto_tb and
> tcg_gen_exit_tb instead.
I prefer to keep all generic translation-related tracing on a single file, where
it is easier to reason about.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before"
2017-09-14 14:59 ` Lluís Vilanova
@ 2017-09-14 16:12 ` Richard Henderson
0 siblings, 0 replies; 29+ messages in thread
From: Richard Henderson @ 2017-09-14 16:12 UTC (permalink / raw)
To: Richard Henderson, qemu-devel, Paolo Bonzini, Stefan Hajnoczi,
Peter Crosthwaite
On 09/14/2017 07:59 AM, Lluís Vilanova wrote:
> Since physical address information is not gonna be added in this series (if at
> all), what do you say about hoisting instruction length info into
> guest_insn_before/after and dropping the *_info variants?
That should be fine.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-14 15:20 ` Lluís Vilanova
@ 2017-09-14 16:15 ` Richard Henderson
2017-09-15 12:55 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Richard Henderson @ 2017-09-14 16:15 UTC (permalink / raw)
To: Richard Henderson, qemu-devel, Stefan Hajnoczi
On 09/14/2017 08:20 AM, Lluís Vilanova wrote:
> Richard Henderson writes:
>
>> On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
>>> TCG BBLs and instructions have multiple exit points from where to raise
>>> tracing events, but some of the necessary information in the generic
>>> disassembly infrastructure is not available until after generating these
>>> exit points.
>>>
>>> This patch adds support for "inline points" (where the tracing code will
>>> be placed), and "inline regions" (which identify the TCG code that must
>>> be inlined). The TCG compiler will basically copy each inline region to
>>> any inline points that reference it.
>
>> I am not keen on this.
>
>> Is there a reason you can't just emit the tracing code at the appropriate place
>> to begin with? Perhaps I have to wait to see how this is used...
>
> As I tried to briefly explain on next patch, the main problem without inlining
> is that we will see guest_tb_after_trans twice on the trace for each TB in
> conditional instructions on the guest, since they have two exit points (which we
> capture when emitting goto_tb in TCG).
Without seeing the code, I suspect this is because you didn't examine the
argument to tcg_gen_exit_tb. You can tell when goto_tb must have been emitted
and avoid logging twice.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after"
2017-09-14 15:20 ` Lluís Vilanova
@ 2017-09-14 16:16 ` Richard Henderson
0 siblings, 0 replies; 29+ messages in thread
From: Richard Henderson @ 2017-09-14 16:16 UTC (permalink / raw)
To: Richard Henderson, qemu-devel, Paolo Bonzini, Stefan Hajnoczi,
Peter Crosthwaite
On 09/14/2017 08:20 AM, Lluís Vilanova wrote:
>> I don't understand why you wouldn't just modify tcg_gen_goto_tb and
>> tcg_gen_exit_tb instead.
>
> I prefer to keep all generic translation-related tracing on a single file, where
> it is easier to reason about.
My point here was more about the inline_points. Discussed elsewhere now.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after"
2017-09-13 18:01 ` Richard Henderson
@ 2017-09-14 16:23 ` Lluís Vilanova
0 siblings, 0 replies; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-14 16:23 UTC (permalink / raw)
To: Richard Henderson
Cc: qemu-devel, Paolo Bonzini, Richard Henderson, Stefan Hajnoczi,
Peter Crosthwaite
Richard Henderson writes:
> On 09/10/2017 09:35 AM, Lluís Vilanova wrote:
>> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
>> ---
>> accel/tcg/translator.c | 23 ++++++++++++++++++-----
>> trace-events | 8 ++++++++
>> 2 files changed, 26 insertions(+), 5 deletions(-)
>>
>> diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
>> index d66d601c89..c010aeee45 100644
>> --- a/accel/tcg/translator.c
>> +++ b/accel/tcg/translator.c
>> @@ -35,7 +35,8 @@ void translator_loop_temp_check(DisasContextBase *db)
>> void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>> CPUState *cpu, TranslationBlock *tb)
>> {
>> - target_ulong pc_bbl;
>> + target_ulong pc_bbl, pc_insn = 0;
>> + bool translated_insn = false;
>> int max_insns;
>>
>> /* Initialize DisasContext */
>> @@ -75,10 +76,15 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>> tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
>>
>> while (true) {
>> - target_ulong pc_insn = db->pc_next;
>> TCGv_i32 insn_size_tcg = 0;
>> int insn_size_opcode_idx;
>>
>> + /* Tracing after (previous instruction) */
>> + if (db->num_insns > 0) {
>> + trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
>> + }
> How does this differ from "guest_inst"? Why would you need two trace points?
I assume you mean how it differs from guest_inst_before. The two main ideas are:
* To be able to get a trace an execution-time event only after the instruction
or TB have finished executing successfully (i.e., there could be an exception).
* Some values are only known *after* the instruction is translated (like the
instruction size, or other extra information we might add in the future), so
an efficient way to collect that is to trace guest_bbl_* and guest_insn_after
at translation time (to build a TB "dictionary" as some call it), and trace
guest_bbl_before at execution time (and use the detailed info above that you
got at translation time).
> Why are you placing this at the beginning of the while loop rather than the end?
Yeah, that'll be much clearer.
>> @@ -164,6 +172,9 @@ void translator_loop(const TranslatorOps *ops, DisasContextBase *db,
>>
>> gen_set_inline_region_begin(tcg_ctx.disas.inline_label);
>>
>> + if (TRACE_GUEST_INST_AFTER_ENABLED && translated_insn) {
>> + trace_guest_inst_after_tcg(cpu, tcg_ctx.tcg_env, pc_insn);
>> + }
>> if (TRACE_GUEST_BBL_AFTER_ENABLED) {
>> trace_guest_bbl_after_tcg(cpu, tcg_ctx.tcg_env, pc_bbl);
>> }
> I think I'm finally beginning to understand what you're after with your
> inlining. But I still think this should be doable in the appropriate opcode
> generating functions.
I'm not sure we can if we want to avoid having the duplicate translation-time
events I said in a previous response (since TB can have two exit points and
we're detecting them through goto_tb).
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-14 16:15 ` Richard Henderson
@ 2017-09-15 12:55 ` Lluís Vilanova
2017-09-26 16:31 ` Lluís Vilanova
0 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-15 12:55 UTC (permalink / raw)
To: Richard Henderson; +Cc: Richard Henderson, qemu-devel, Stefan Hajnoczi
Richard Henderson writes:
> On 09/14/2017 08:20 AM, Lluís Vilanova wrote:
>> Richard Henderson writes:
>>
>>> On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
>>>> TCG BBLs and instructions have multiple exit points from where to raise
>>>> tracing events, but some of the necessary information in the generic
>>>> disassembly infrastructure is not available until after generating these
>>>> exit points.
>>>>
>>>> This patch adds support for "inline points" (where the tracing code will
>>>> be placed), and "inline regions" (which identify the TCG code that must
>>>> be inlined). The TCG compiler will basically copy each inline region to
>>>> any inline points that reference it.
>>
>>> I am not keen on this.
>>
>>> Is there a reason you can't just emit the tracing code at the appropriate place
>>> to begin with? Perhaps I have to wait to see how this is used...
>>
>> As I tried to briefly explain on next patch, the main problem without inlining
>> is that we will see guest_tb_after_trans twice on the trace for each TB in
>> conditional instructions on the guest, since they have two exit points (which we
>> capture when emitting goto_tb in TCG).
> Without seeing the code, I suspect this is because you didn't examine the
> argument to tcg_gen_exit_tb. You can tell when goto_tb must have been emitted
> and avoid logging twice.
The generated tracing code for 'guest_*_after' must be right before the
"goto_tb" opcode at the end of a TB (AFAIU generated by
tcg_gen_lookup_and_goto_ptr()), and we have two of those when decoding a guest
conditional jump.
If we couple this with the semantics of the trace_*_tcg functions (trace the
event at translation time, and generate TCG code to trace the event at execution
time), we get the case I described (we don't want to call trace_tb_after_tcg()
or trace_insn_after_tcg() twice for the same TB or instruction).
That is, unless I've missed something.
The only alternative I can think of is changing tracetool to offer an additional
API that provides separate functions for translation-time tracing and
execution-time generation. So from this:
static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
{
trace_event_trans(cpu, ...);
if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
gen_helper_trace_event_exec(env, ...);
}
}
We can extend it into this:
static inline void gen_trace_event_exec(TCGv_env env, ...)
if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
gen_helper_trace_event_exec(env, ...);
}
}
static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
{
trace_event_trans(cpu, ...);
gen_trace_event_exec(env, ...);
}
Cheers,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-15 12:55 ` Lluís Vilanova
@ 2017-09-26 16:31 ` Lluís Vilanova
2017-09-26 16:52 ` Richard Henderson
0 siblings, 1 reply; 29+ messages in thread
From: Lluís Vilanova @ 2017-09-26 16:31 UTC (permalink / raw)
To: Richard Henderson; +Cc: Richard Henderson, qemu-devel, Stefan Hajnoczi
Lluís Vilanova writes:
> Richard Henderson writes:
>> On 09/14/2017 08:20 AM, Lluís Vilanova wrote:
>>> Richard Henderson writes:
>>>
>>>> On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
>>>>> TCG BBLs and instructions have multiple exit points from where to raise
>>>>> tracing events, but some of the necessary information in the generic
>>>>> disassembly infrastructure is not available until after generating these
>>>>> exit points.
>>>>>
>>>>> This patch adds support for "inline points" (where the tracing code will
>>>>> be placed), and "inline regions" (which identify the TCG code that must
>>>>> be inlined). The TCG compiler will basically copy each inline region to
>>>>> any inline points that reference it.
>>>
>>>> I am not keen on this.
>>>
>>>> Is there a reason you can't just emit the tracing code at the appropriate place
>>>> to begin with? Perhaps I have to wait to see how this is used...
>>>
>>> As I tried to briefly explain on next patch, the main problem without inlining
>>> is that we will see guest_tb_after_trans twice on the trace for each TB in
>>> conditional instructions on the guest, since they have two exit points (which we
>>> capture when emitting goto_tb in TCG).
>> Without seeing the code, I suspect this is because you didn't examine the
>> argument to tcg_gen_exit_tb. You can tell when goto_tb must have been emitted
>> and avoid logging twice.
> The generated tracing code for 'guest_*_after' must be right before the
> "goto_tb" opcode at the end of a TB (AFAIU generated by
> tcg_gen_lookup_and_goto_ptr()), and we have two of those when decoding a guest
> conditional jump.
> If we couple this with the semantics of the trace_*_tcg functions (trace the
> event at translation time, and generate TCG code to trace the event at execution
> time), we get the case I described (we don't want to call trace_tb_after_tcg()
> or trace_insn_after_tcg() twice for the same TB or instruction).
> That is, unless I've missed something.
> The only alternative I can think of is changing tracetool to offer an additional
> API that provides separate functions for translation-time tracing and
> execution-time generation. So from this:
> static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
> {
> trace_event_trans(cpu, ...);
> if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
> gen_helper_trace_event_exec(env, ...);
> }
> }
> We can extend it into this:
> static inline void gen_trace_event_exec(TCGv_env env, ...)
> if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
> gen_helper_trace_event_exec(env, ...);
> }
> }
> static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
> {
> trace_event_trans(cpu, ...);
> gen_trace_event_exec(env, ...);
> }
Richard, do you prefer to keep the "TCG inline" feature or switch the internal
tracing API to this second approach?
Thanks,
Lluis
^ permalink raw reply [flat|nested] 29+ messages in thread
* Re: [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code
2017-09-26 16:31 ` Lluís Vilanova
@ 2017-09-26 16:52 ` Richard Henderson
0 siblings, 0 replies; 29+ messages in thread
From: Richard Henderson @ 2017-09-26 16:52 UTC (permalink / raw)
To: Richard Henderson, qemu-devel, Stefan Hajnoczi
On 09/26/2017 09:31 AM, Lluís Vilanova wrote:
> Lluís Vilanova writes:
>
>> Richard Henderson writes:
>>> On 09/14/2017 08:20 AM, Lluís Vilanova wrote:
>>>> Richard Henderson writes:
>>>>
>>>>> On 09/10/2017 09:27 AM, Lluís Vilanova wrote:
>>>>>> TCG BBLs and instructions have multiple exit points from where to raise
>>>>>> tracing events, but some of the necessary information in the generic
>>>>>> disassembly infrastructure is not available until after generating these
>>>>>> exit points.
>>>>>>
>>>>>> This patch adds support for "inline points" (where the tracing code will
>>>>>> be placed), and "inline regions" (which identify the TCG code that must
>>>>>> be inlined). The TCG compiler will basically copy each inline region to
>>>>>> any inline points that reference it.
>>>>
>>>>> I am not keen on this.
>>>>
>>>>> Is there a reason you can't just emit the tracing code at the appropriate place
>>>>> to begin with? Perhaps I have to wait to see how this is used...
>>>>
>>>> As I tried to briefly explain on next patch, the main problem without inlining
>>>> is that we will see guest_tb_after_trans twice on the trace for each TB in
>>>> conditional instructions on the guest, since they have two exit points (which we
>>>> capture when emitting goto_tb in TCG).
>
>>> Without seeing the code, I suspect this is because you didn't examine the
>>> argument to tcg_gen_exit_tb. You can tell when goto_tb must have been emitted
>>> and avoid logging twice.
>
>> The generated tracing code for 'guest_*_after' must be right before the
>> "goto_tb" opcode at the end of a TB (AFAIU generated by
>> tcg_gen_lookup_and_goto_ptr()), and we have two of those when decoding a guest
>> conditional jump.
>
>> If we couple this with the semantics of the trace_*_tcg functions (trace the
>> event at translation time, and generate TCG code to trace the event at execution
>> time), we get the case I described (we don't want to call trace_tb_after_tcg()
>> or trace_insn_after_tcg() twice for the same TB or instruction).
>
>> That is, unless I've missed something.
>
>
>> The only alternative I can think of is changing tracetool to offer an additional
>> API that provides separate functions for translation-time tracing and
>> execution-time generation. So from this:
>
>> static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
>> {
>> trace_event_trans(cpu, ...);
>> if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
>> gen_helper_trace_event_exec(env, ...);
>> }
>> }
>
>> We can extend it into this:
>
>> static inline void gen_trace_event_exec(TCGv_env env, ...)
>> if (trace_event_get_vcpu_state(cpu, EVENT_EXEC)) {
>> gen_helper_trace_event_exec(env, ...);
>> }
>> }
>> static inline void trace_event_tcg(CPUState *cpu, TCGv_env env, ...)
>> {
>> trace_event_trans(cpu, ...);
>> gen_trace_event_exec(env, ...);
>> }
>
> Richard, do you prefer to keep the "TCG inline" feature or switch the internal
> tracing API to this second approach?
I don't think I fully understand what you're proposing. The example
transformation above is merely syntactic and has no functional change.
As previously stated, I'm not keen on the "tcg inline" approach. I would
prefer that you hook into tcg_gen_{exit_tb,goto_tb,goto_ptr} functions within
tcg/tcg-op.c to log transitions between TBs.
r~
^ permalink raw reply [flat|nested] 29+ messages in thread
end of thread, other threads:[~2017-09-26 16:53 UTC | newest]
Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-10 16:11 [Qemu-devel] [PATCH 0/7] trace: Add guest code events Lluís Vilanova
2017-09-10 16:15 ` [Qemu-devel] [PATCH 1/7] trace: Add event "guest_bbl_before" Lluís Vilanova
2017-09-13 16:59 ` Richard Henderson
2017-09-14 14:21 ` Lluís Vilanova
2017-09-10 16:19 ` [Qemu-devel] [PATCH 2/7] trace: Add event "guest_inst_before" Lluís Vilanova
2017-09-13 17:02 ` Richard Henderson
2017-09-14 14:40 ` Lluís Vilanova
2017-09-10 16:23 ` [Qemu-devel] [PATCH 3/7] trace: Add event "guest_inst_info_before" Lluís Vilanova
2017-09-13 17:07 ` Richard Henderson
2017-09-14 14:59 ` Lluís Vilanova
2017-09-14 16:12 ` Richard Henderson
2017-09-10 16:27 ` [Qemu-devel] [PATCH 4/7] tcg: Add support for "inlining" regions of code Lluís Vilanova
2017-09-13 17:09 ` Richard Henderson
2017-09-14 15:20 ` Lluís Vilanova
2017-09-14 16:15 ` Richard Henderson
2017-09-15 12:55 ` Lluís Vilanova
2017-09-26 16:31 ` Lluís Vilanova
2017-09-26 16:52 ` Richard Henderson
2017-09-10 16:31 ` [Qemu-devel] [PATCH 5/7] trace: Add event "guest_bbl_after" Lluís Vilanova
2017-09-13 17:34 ` Richard Henderson
2017-09-14 15:20 ` Lluís Vilanova
2017-09-14 16:16 ` Richard Henderson
2017-09-10 16:35 ` [Qemu-devel] [PATCH 6/7] trace: Add event "guest_inst_after" Lluís Vilanova
2017-09-13 18:01 ` Richard Henderson
2017-09-14 16:23 ` Lluís Vilanova
2017-09-10 16:39 ` [Qemu-devel] [PATCH 7/7] trace: Add event "guest_inst_info_after" Lluís Vilanova
2017-09-13 18:03 ` Richard Henderson
2017-09-10 16:45 ` [Qemu-devel] [PATCH 0/7] trace: Add guest code events no-reply
2017-09-13 14:36 ` Stefan Hajnoczi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).