@@ -95,6 +95,7 @@ common-obj-y += disas/
tools-obj-y += instrument/
target-obj-y += instrument/
+common-obj-y += instrument/
######################################################################
# guest agent
@@ -1653,6 +1653,48 @@ STEXI
show available trace events and their state
ETEXI
+ {
+ .name = "instr-dynamic",
+ .args_type = "",
+ .params = "",
+ .help = "whether dynamic trace instrumentation is available",
+ .mhandler.cmd = hmp_instr_dynamic,
+ },
+
+STEXI
+@item instr-dynamic
+@findex instr-dynamic
+Whether dynamic trace instrumentation is available.
+ETEXI
+
+ {
+ .name = "instr-load",
+ .args_type = "path:F,args:s?",
+ .params = "path [args]",
+ .help = "load a dynamic instrumentation library",
+ .mhandler.cmd = hmp_instr_load,
+ },
+
+STEXI
+@item instr-load @var{path} [name=value[,...]]
+@findex instr-load
+Load a dynamic instrumentation library.
+ETEXI
+
+ {
+ .name = "instr-unload",
+ .args_type = "",
+ .params = "",
+ .help = "unload the current dynamic instrumentation library",
+ .mhandler.cmd = hmp_instr_unload,
+ },
+
+STEXI
+@item instr-unload
+@findex instr-unload
+Unload the current dynamic instrumentation library.
+ETEXI
+
STEXI
@end table
ETEXI
@@ -66,3 +66,5 @@ endif
# Control code
target-obj-y += control.o
+
+common-obj-$(CONFIG_SOFTMMU) += hmp.o
new file mode 100644
@@ -0,0 +1,66 @@
+/*
+ * HMP interface for dynamic trace instrumentation control commands.
+ *
+ * Copyright (C) 2012-2013 Lluís Vilanova <vilanova@ac.upc.edu>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "instrument/hmp.h"
+
+#include <dlfcn.h>
+
+#include "monitor/monitor.h"
+#include "instrument/control.h"
+
+
+void hmp_instr_dynamic(Monitor *mon, const QDict *qdict)
+{
+ monitor_printf(mon, instr_dynamic() ? "true\n" : "false\n");
+}
+
+void hmp_instr_load(Monitor *mon, const QDict *qdict)
+{
+ /* @todo: Unify with qerror messages? */
+
+ const char *path = qdict_get_try_str(qdict, "path");
+ const char *args = qdict_get_try_str(qdict, "args");
+ const char *argv[1] = {args};
+ InstrLoadError err = instr_load(path, 1, argv);
+ switch (err) {
+ case INSTR_LOAD_OK:
+ monitor_printf(mon, "OK\n");
+ break;
+ case INSTR_LOAD_UNAVAILABLE:
+ monitor_printf(mon, "Not available\n");
+ break;
+ case INSTR_LOAD_LOADED:
+ monitor_printf(mon, "Already loaded\n");
+ break;
+ case INSTR_LOAD_DL:
+ monitor_printf(mon, "Error loading library: %s\n", dlerror());
+ break;
+ }
+}
+
+void hmp_instr_unload(Monitor *mon, const QDict *qdict)
+{
+ /* @todo: Unify with qerror messages? */
+
+ InstrLoadError err = instr_unload();
+ switch (err) {
+ case INSTR_UNLOAD_OK:
+ monitor_printf(mon, "OK\n");
+ break;
+ case INSTR_UNLOAD_UNAVAILABLE:
+ monitor_printf(mon, "Not available\n");
+ break;
+ case INSTR_UNLOAD_UNLOADED:
+ monitor_printf(mon, "Already unloaded\n");
+ break;
+ case INSTR_UNLOAD_DL:
+ monitor_printf(mon, "Error unloading library: %s\n", dlerror());
+ break;
+ }
+}
new file mode 100644
@@ -0,0 +1,21 @@
+/*
+ * HMP interface for dynamic trace instrumentation control commands.
+ *
+ * Copyright (C) 2012-2013 Lluís Vilanova <vilanova@ac.upc.edu>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#ifndef INSTRUMENT__HMP_H
+#define INSTRUMENT__HMP_H
+
+#include "qemu-common.h"
+#include "qapi/qmp/qdict.h"
+
+
+void hmp_instr_dynamic(Monitor *mon, const QDict *qdict);
+void hmp_instr_load(Monitor *mon, const QDict *qdict);
+void hmp_instr_unload(Monitor *mon, const QDict *qdict);
+
+#endif /* INSTRUMENT__HMP_H */
@@ -69,6 +69,7 @@
#include "exec/memory.h"
#include "qmp-commands.h"
#include "hmp.h"
+#include "instrument/hmp.h"
#include "qemu/thread.h"
/* for pic/irq_info */
Add HMP commands to control (un)loading of dynamic instrumentation library. Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> --- Makefile.objs | 1 + hmp-commands.hx | 42 +++++++++++++++++++++++++++++ instrument/Makefile.objs | 2 + instrument/hmp.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ instrument/hmp.h | 21 +++++++++++++++ monitor.c | 1 + 6 files changed, 133 insertions(+) create mode 100644 instrument/hmp.c create mode 100644 instrument/hmp.h