@@ -540,6 +540,29 @@ static void do_change_trace_event_state(Monitor *mon, const QDict *qdict)
bool new_state = qdict_get_bool(qdict, "option");
change_trace_event_state(tp_name, new_state);
}
+
+void do_info_trace(Monitor *mon)
+{
+ unsigned int i;
+ char rec[MAX_TRACE_STR_LEN];
+ unsigned int trace_idx = get_trace_idx();
+
+ for (i = 0; i < trace_idx ; i++) {
+ if (format_trace_string(i, rec)) {
+ monitor_printf(mon, rec);
+ }
+ }
+}
+
+void do_info_all_trace_events(Monitor *mon)
+{
+ unsigned int i;
+
+ for (i = 0; i < NR_TRACE_EVENTS; i++) {
+ monitor_printf(mon, "%s [Event ID %u] : state %u\n",
+ trace_list[i].tp_name, i, trace_list[i].state);
+ }
+}
#endif
static void user_monitor_complete(void *opaque, QObject *ret_data)
@@ -1,8 +1,8 @@
#include <stdlib.h>
#include <stdio.h>
-#include "monitor.h"
#include "trace.h"
+/* Remember to update MAX_TRACE_STR_LEN when changing TraceRecord structure */
typedef struct {
unsigned long event;
unsigned long x1;
@@ -69,27 +69,6 @@ void trace5(TraceEventID event, unsigned long x1, unsigned long x2, unsigned lon
trace(event, x1, x2, x3, x4, x5);
}
-void do_info_trace(Monitor *mon)
-{
- unsigned int i;
-
- for (i = 0; i < trace_idx ; i++) {
- monitor_printf(mon, "Event %lu : %lx %lx %lx %lx %lx\n",
- trace_buf[i].event, trace_buf[i].x1, trace_buf[i].x2,
- trace_buf[i].x3, trace_buf[i].x4, trace_buf[i].x5);
- }
-}
-
-void do_info_all_trace_events(Monitor *mon)
-{
- unsigned int i;
-
- for (i = 0; i < NR_TRACE_EVENTS; i++) {
- monitor_printf(mon, "%s [Event ID %u] : state %u\n",
- trace_list[i].tp_name, i, trace_list[i].state);
- }
-}
-
static TraceEvent* find_trace_event_by_name(const char *tname)
{
unsigned int i;
@@ -115,3 +94,30 @@ void change_trace_event_state(const char *tname, bool tstate)
tp->state = tstate;
}
}
+
+/**
+ * Return the current trace index.
+ *
+ */
+unsigned int get_trace_idx(void)
+{
+ return trace_idx;
+}
+
+/**
+ * returns formatted TraceRecord at a given index in the trace buffer.
+ * FORMAT : "Event %lu : %lx %lx %lx %lx %lx\n"
+ *
+ * @idx : index in the buffer for which trace record is returned.
+ * @trace_str : output string passed.
+ */
+char* format_trace_string(unsigned int idx, char trace_str[])
+{
+ if (idx >= TRACE_BUF_LEN) {
+ return NULL;
+ }
+ sprintf(&trace_str[0], "Event %lu : %lx %lx %lx %lx %lx\n",
+ trace_buf[idx].event, trace_buf[idx].x1, trace_buf[idx].x2,
+ trace_buf[idx].x3, trace_buf[idx].x4, trace_buf[idx].x5);
+ return &trace_str[0];
+}
@@ -125,6 +125,11 @@ typedef struct {
bool state;
} TraceEvent;
+/* Max size of trace string to be displayed via the monitor.
+ * Format : "Event %lu : %lx %lx %lx %lx %lx\n"
+ */
+#define MAX_TRACE_STR_LEN 100
+
void trace1(TraceEventID event, unsigned long x1);
void trace2(TraceEventID event, unsigned long x1, unsigned long x2);
void trace3(TraceEventID event, unsigned long x1, unsigned long x2, unsigned long x3);
@@ -133,6 +138,8 @@ void trace5(TraceEventID event, unsigned long x1, unsigned long x2, unsigned lon
void do_info_trace(Monitor *mon);
void do_info_all_trace_events(Monitor *mon);
void change_trace_event_state(const char *tname, bool tstate);
+unsigned int get_trace_idx(void);
+char* format_trace_string(unsigned int idx, char *trace_str);
EOF
simple_event_num=0
[PATCH] Separate monitor command handler interfaces and tracing internals. Changelog from v3: - cleanup ( removed unnecessary references to 'rec' ) Signed-off-by: Prerna Saxena <prerna@linux.vnet.ibm.com> --- monitor.c | 23 +++++++++++++++++++++++ simpletrace.c | 50 ++++++++++++++++++++++++++++---------------------- tracetool | 7 +++++++ 3 files changed, 58 insertions(+), 22 deletions(-)