qapi: allow unions to contain further unions
[qemu/armbru.git] / accel / tcg / monitor.c
blob1450e160e9589ae1f0457c71f062e8e2c95c4884
1 /*
2 * SPDX-License-Identifier: LGPL-2.1-or-later
4 * QEMU TCG monitor
6 * Copyright (c) 2003-2005 Fabrice Bellard
7 */
9 #include "qemu/osdep.h"
10 #include "qapi/error.h"
11 #include "qapi/type-helpers.h"
12 #include "qapi/qapi-commands-machine.h"
13 #include "monitor/monitor.h"
14 #include "sysemu/cpus.h"
15 #include "sysemu/cpu-timers.h"
16 #include "sysemu/tcg.h"
17 #include "internal.h"
20 static void dump_drift_info(GString *buf)
22 if (!icount_enabled()) {
23 return;
26 g_string_append_printf(buf, "Host - Guest clock %"PRIi64" ms\n",
27 (cpu_get_clock() - icount_get()) / SCALE_MS);
28 if (icount_align_option) {
29 g_string_append_printf(buf, "Max guest delay %"PRIi64" ms\n",
30 -max_delay / SCALE_MS);
31 g_string_append_printf(buf, "Max guest advance %"PRIi64" ms\n",
32 max_advance / SCALE_MS);
33 } else {
34 g_string_append_printf(buf, "Max guest delay NA\n");
35 g_string_append_printf(buf, "Max guest advance NA\n");
39 HumanReadableText *qmp_x_query_jit(Error **errp)
41 g_autoptr(GString) buf = g_string_new("");
43 if (!tcg_enabled()) {
44 error_setg(errp, "JIT information is only available with accel=tcg");
45 return NULL;
48 dump_exec_info(buf);
49 dump_drift_info(buf);
51 return human_readable_text_from_str(buf);
54 HumanReadableText *qmp_x_query_opcount(Error **errp)
56 g_autoptr(GString) buf = g_string_new("");
58 if (!tcg_enabled()) {
59 error_setg(errp,
60 "Opcode count information is only available with accel=tcg");
61 return NULL;
64 tcg_dump_op_count(buf);
66 return human_readable_text_from_str(buf);
69 #ifdef CONFIG_PROFILER
71 int64_t dev_time;
73 HumanReadableText *qmp_x_query_profile(Error **errp)
75 g_autoptr(GString) buf = g_string_new("");
76 static int64_t last_cpu_exec_time;
77 int64_t cpu_exec_time;
78 int64_t delta;
80 cpu_exec_time = tcg_cpu_exec_time();
81 delta = cpu_exec_time - last_cpu_exec_time;
83 g_string_append_printf(buf, "async time %" PRId64 " (%0.3f)\n",
84 dev_time, dev_time / (double)NANOSECONDS_PER_SECOND);
85 g_string_append_printf(buf, "qemu time %" PRId64 " (%0.3f)\n",
86 delta, delta / (double)NANOSECONDS_PER_SECOND);
87 last_cpu_exec_time = cpu_exec_time;
88 dev_time = 0;
90 return human_readable_text_from_str(buf);
92 #else
93 HumanReadableText *qmp_x_query_profile(Error **errp)
95 error_setg(errp, "Internal profiler not compiled");
96 return NULL;
98 #endif
100 static void hmp_tcg_register(void)
102 monitor_register_hmp_info_hrt("jit", qmp_x_query_jit);
103 monitor_register_hmp_info_hrt("opcount", qmp_x_query_opcount);
106 type_init(hmp_tcg_register);