[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 16/24] instrument: [hmp] Add control interface
From: |
Lluís Vilanova |
Subject: |
[Qemu-devel] [PATCH v3 16/24] instrument: [hmp] Add control interface |
Date: |
Sun, 21 Apr 2013 21:12:59 +0200 |
User-agent: |
StGit/0.16 |
Add HMP commands to control (un)loading of dynamic instrumentation library.
Signed-off-by: Lluís Vilanova <address@hidden>
---
Makefile.objs | 1 +
hmp-commands.hx | 42 ++++++++++++++++++++++++
instrument/Makefile.objs | 1 +
instrument/hmp.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++
instrument/hmp.h | 21 ++++++++++++
monitor.c | 1 +
6 files changed, 145 insertions(+)
create mode 100644 instrument/hmp.c
create mode 100644 instrument/hmp.h
diff --git a/Makefile.objs b/Makefile.objs
index 4fb565b..151183d 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -95,6 +95,7 @@ common-obj-y += disas/
tools-obj-y += instrument/
target-obj-y += instrument/
+common-obj-y += instrument/
######################################################################
# guest agent
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 3d98604..2e88e4b 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -1653,6 +1653,48 @@ STEXI
show available trace events and their state
ETEXI
+ {
+ .name = "instr-query",
+ .args_type = "",
+ .params = "",
+ .help = "instrumentation state",
+ .mhandler.cmd = hmp_instr_query,
+ },
+
+STEXI
address@hidden instr-dynamic
address@hidden instr-dynamic
+Whether dynamic trace instrumentation is available.
+ETEXI
+
+ {
+ .name = "instr-load",
+ .args_type = "path:F,args:s?",
+ .params = "path [args]",
+ .help = "load an instrumentation library",
+ .mhandler.cmd = hmp_instr_load,
+ },
+
+STEXI
address@hidden instr-load @var{path} [name=value[,...]]
address@hidden instr-load
+Load an instrumentation library.
+ETEXI
+
+ {
+ .name = "instr-unload",
+ .args_type = "handle:i",
+ .params = "",
+ .help = "unload an instrumentation library",
+ .mhandler.cmd = hmp_instr_unload,
+ },
+
+STEXI
address@hidden instr-unload
address@hidden instr-unload
+Unload an instrumentation library.
+ETEXI
+
STEXI
@end table
ETEXI
diff --git a/instrument/Makefile.objs b/instrument/Makefile.objs
index af1c96b..2122272 100644
--- a/instrument/Makefile.objs
+++ b/instrument/Makefile.objs
@@ -68,3 +68,4 @@ endif
target-obj-y += control.o
common-obj-$(CONFIG_SOFTMMU) += qmp.o
+common-obj-$(CONFIG_SOFTMMU) += hmp.o
diff --git a/instrument/hmp.c b/instrument/hmp.c
new file mode 100644
index 0000000..81b334c
--- /dev/null
+++ b/instrument/hmp.c
@@ -0,0 +1,79 @@
+/*
+ * HMP interface for dynamic trace instrumentation control commands.
+ *
+ * Copyright (C) 2012-2013 Lluís Vilanova <address@hidden>
+ *
+ * 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 "qmp-commands.h"
+#include "instrument/control.h"
+
+
+void hmp_instr_query(Monitor *mon, const QDict *qdict)
+{
+ InstrState *state = qmp_instr_query(NULL);
+ monitor_printf(mon, "Type: %s\n", InstrType_lookup[state->type]);
+ monitor_printf(mon, "Active: %s\n", state->active ? "true" : "false");
+}
+
+void hmp_instr_load(Monitor *mon, const QDict *qdict)
+{
+ const char *path = qdict_get_str(qdict, "path");
+ String str;
+ str.str = (char *)qdict_get_try_str(qdict, "args");
+ StringList args;
+ args.value = str.str == NULL ? NULL : &str;
+ args.next = NULL;
+ InstrLoadResult *res = qmp_instr_load(path, args.value != NULL,
+ args.value != NULL ? &args : NULL,
+ NULL);
+ switch (res->code) {
+ case INSTR_LOAD_CODE_OK:
+ monitor_printf(mon, "Handle: %"PRId64"\n", res->handle);
+ monitor_printf(mon, "OK\n");
+ break;
+ case INSTR_LOAD_CODE_UNAVAILABLE:
+ monitor_printf(mon, "Not available\n");
+ break;
+ case INSTR_LOAD_CODE_ERROR:
+ monitor_printf(mon, "Error loading library: %s\n", res->msg);
+ break;
+ default:
+ fprintf(stderr, "Unknown instrumentation load code: %d", res->code);
+ exit(1);
+ break;
+ }
+ qapi_free_InstrLoadResult(res);
+}
+
+void hmp_instr_unload(Monitor *mon, const QDict *qdict)
+{
+ int64_t handle = qdict_get_int(qdict, "handle");
+ InstrUnloadResult *res = qmp_instr_unload(handle, NULL);
+ switch (res->code) {
+ case INSTR_UNLOAD_CODE_OK:
+ monitor_printf(mon, "OK\n");
+ break;
+ case INSTR_UNLOAD_CODE_UNAVAILABLE:
+ monitor_printf(mon, "Not available\n");
+ break;
+ case INSTR_UNLOAD_CODE_INVALID:
+ monitor_printf(mon, "Invalid handle\n");
+ break;
+ case INSTR_UNLOAD_CODE_ERROR:
+ monitor_printf(mon, "Error unloading library: %s\n", res->msg);
+ break;
+ default:
+ fprintf(stderr, "Unknown instrumentation unload code: %d", res->code);
+ exit(1);
+ break;
+ }
+ qapi_free_InstrUnloadResult(res);
+}
diff --git a/instrument/hmp.h b/instrument/hmp.h
new file mode 100644
index 0000000..f54ec0b
--- /dev/null
+++ b/instrument/hmp.h
@@ -0,0 +1,21 @@
+/*
+ * HMP interface for dynamic trace instrumentation control commands.
+ *
+ * Copyright (C) 2012-2013 Lluís Vilanova <address@hidden>
+ *
+ * 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_query(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 */
diff --git a/monitor.c b/monitor.c
index a8f49d9..22284cb 100644
--- a/monitor.c
+++ b/monitor.c
@@ -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 */
- [Qemu-devel] [PATCH v3 10/24] instrument: [dynamic] Call dynamically linked user-provided routines, (continued)
- [Qemu-devel] [PATCH v3 10/24] instrument: [dynamic] Call dynamically linked user-provided routines, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 11/24] qapi: Add a primitive to include other files from a QAPI schema file, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 12/24] qapi: [trivial] Set the input root directory when parsing QAPI files, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 13/24] qapi: [trivial] Allow user to use 'args' as an argument name, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 14/24] instrument: Add internal control interface, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 15/24] instrument: [qmp, qapi] Add control interface, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 16/24] instrument: [hmp] Add control interface,
Lluís Vilanova <=
- [Qemu-devel] [PATCH v3 17/24] Let makefiles add entries to the set of target architecture objects, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 18/24] instrument: Add commandline options to start with an instrumentation library, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 19/24] instrument: Add client-side API to enumerate events, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 20/24] instrument: Add client-side API to control tracing state of events, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 21/24] instrument: Add client-side API to control event instrumentation, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 22/24] build: Fix installation of target-dependant files, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 23/24] instrument: Install headers for dynamic instrumentation clients, Lluís Vilanova, 2013/04/21
- [Qemu-devel] [PATCH v3 24/24] trace: Do not use the word 'new' in event arguments, Lluís Vilanova, 2013/04/21