|
@@ -1090,4 +1090,35 @@ HumanReadableText *qmp_x_query_opcount(Error **errp)
|
|
return human_readable_text_from_str(buf);
|
|
return human_readable_text_from_str(buf);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#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
|
|
|
|
+
|
|
#endif /* !CONFIG_USER_ONLY */
|
|
#endif /* !CONFIG_USER_ONLY */
|