|
@@ -36,6 +36,7 @@
|
|
|
#include "qapi/qapi-commands-machine.h"
|
|
|
#include "qapi/qapi-commands-misc.h"
|
|
|
#include "qapi/qapi-commands-ui.h"
|
|
|
+#include "qapi/type-helpers.h"
|
|
|
#include "qapi/qmp/qerror.h"
|
|
|
#include "hw/mem/memory-device.h"
|
|
|
#include "hw/acpi/acpi_dev_interface.h"
|
|
@@ -350,3 +351,34 @@ void qmp_display_reload(DisplayReloadOptions *arg, Error **errp)
|
|
|
abort();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+#ifdef CONFIG_PROFILER
|
|
|
+
|
|
|
+int64_t dev_time;
|
|
|
+
|
|
|
+HumanReadableText *qmp_x_query_profile(Error **errp)
|
|
|
+{
|
|
|
+ g_autoptr(GString) buf = g_string_new("");
|
|
|
+ static int64_t last_cpu_exec_time;
|
|
|
+ int64_t cpu_exec_time;
|
|
|
+ int64_t delta;
|
|
|
+
|
|
|
+ cpu_exec_time = tcg_cpu_exec_time();
|
|
|
+ delta = cpu_exec_time - last_cpu_exec_time;
|
|
|
+
|
|
|
+ g_string_append_printf(buf, "async time %" PRId64 " (%0.3f)\n",
|
|
|
+ dev_time, dev_time / (double)NANOSECONDS_PER_SECOND);
|
|
|
+ g_string_append_printf(buf, "qemu time %" PRId64 " (%0.3f)\n",
|
|
|
+ delta, delta / (double)NANOSECONDS_PER_SECOND);
|
|
|
+ last_cpu_exec_time = cpu_exec_time;
|
|
|
+ dev_time = 0;
|
|
|
+
|
|
|
+ return human_readable_text_from_str(buf);
|
|
|
+}
|
|
|
+#else
|
|
|
+HumanReadableText *qmp_x_query_profile(Error **errp)
|
|
|
+{
|
|
|
+ error_setg(errp, "Internal profiler not compiled");
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+#endif
|