Bläddra i källkod

trace: [stderr] add support for dynamically enabling/disabling events

Uses the generic interface provided in "trace/control.h" in order to provide
a programmatic interface as well as command line and monitor controls.

Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
Lluís 14 år sedan
förälder
incheckning
9a82b6a590
7 ändrade filer med 81 tillägg och 11 borttagningar
  1. 2 0
      Makefile.objs
  2. 1 0
      configure
  3. 0 5
      docs/tracing.txt
  4. 2 1
      qemu-options.hx
  5. 28 5
      scripts/tracetool
  6. 37 0
      trace/stderr.c
  7. 11 0
      trace/stderr.h

+ 2 - 0
Makefile.objs

@@ -384,6 +384,8 @@ trace-nested-$(CONFIG_TRACE_DEFAULT) += default.o
 trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o
 trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o
 trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
 trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
 
 
+trace-nested-$(CONFIG_TRACE_STDERR) += stderr.o
+
 trace-nested-y += control.o
 trace-nested-y += control.o
 
 
 trace-obj-y += $(addprefix trace/, $(trace-nested-y))
 trace-obj-y += $(addprefix trace/, $(trace-nested-y))

+ 1 - 0
configure

@@ -3078,6 +3078,7 @@ if test "$trace_backend" = "simple"; then
 fi
 fi
 if test "$trace_backend" = "stderr"; then
 if test "$trace_backend" = "stderr"; then
   echo "CONFIG_TRACE_STDERR=y" >> $config_host_mak
   echo "CONFIG_TRACE_STDERR=y" >> $config_host_mak
+  trace_default=no
 fi
 fi
 if test "$trace_backend" = "ust"; then
 if test "$trace_backend" = "ust"; then
   echo "CONFIG_TRACE_UST=y" >> $config_host_mak
   echo "CONFIG_TRACE_UST=y" >> $config_host_mak

+ 0 - 5
docs/tracing.txt

@@ -178,11 +178,6 @@ effectively turns trace events into debug printfs.
 This is the simplest backend and can be used together with existing code that
 This is the simplest backend and can be used together with existing code that
 uses DPRINTF().
 uses DPRINTF().
 
 
-Note that with this backend trace events cannot be programmatically
-enabled/disabled. Thus, in order to trim down the amount of output and the
-performance impact of tracing, you might want to add the "disable" property in
-the "trace-events" file for those events you are not interested in.
-
 === Simpletrace ===
 === Simpletrace ===
 
 
 The "simple" backend supports common use cases and comes as part of the QEMU
 The "simple" backend supports common use cases and comes as part of the QEMU

+ 2 - 1
qemu-options.hx

@@ -2454,7 +2454,8 @@ Immediately enable events listed in @var{file}.
 The file must contain one event name (as listed in the @var{trace-events} file)
 The file must contain one event name (as listed in the @var{trace-events} file)
 per line.
 per line.
 
 
-This option is only available when using the @var{simple} tracing backend.
+This option is only available when using the @var{simple} and @var{stderr}
+tracing backends.
 @item file=@var{file}
 @item file=@var{file}
 Log output traces to @var{file}.
 Log output traces to @var{file}.
 
 

+ 28 - 5
scripts/tracetool

@@ -241,7 +241,12 @@ linetoh_begin_stderr()
 {
 {
     cat <<EOF
     cat <<EOF
 #include <stdio.h>
 #include <stdio.h>
+#include "trace/stderr.h"
+
+extern TraceEvent trace_list[];
 EOF
 EOF
+
+    stderr_event_num=0
 }
 }
 
 
 linetoh_stderr()
 linetoh_stderr()
@@ -260,29 +265,47 @@ linetoh_stderr()
     cat <<EOF
     cat <<EOF
 static inline void trace_$name($args)
 static inline void trace_$name($args)
 {
 {
-    fprintf(stderr, "$name $fmt\n" $argnames);
+    if (trace_list[$stderr_event_num].state != 0) {
+        fprintf(stderr, "$name $fmt\n" $argnames);
+    }
 }
 }
 EOF
 EOF
+    stderr_event_num=$((stderr_event_num + 1))
+
 }
 }
 
 
 linetoh_end_stderr()
 linetoh_end_stderr()
 {
 {
-return
+    cat <<EOF
+#define NR_TRACE_EVENTS $stderr_event_num
+EOF
 }
 }
 
 
 linetoc_begin_stderr()
 linetoc_begin_stderr()
 {
 {
-return
+    cat <<EOF
+#include "trace.h"
+
+TraceEvent trace_list[] = {
+EOF
+    stderr_event_num=0
 }
 }
 
 
 linetoc_stderr()
 linetoc_stderr()
 {
 {
-return
+    local name
+    name=$(get_name "$1")
+    cat <<EOF
+{.tp_name = "$name", .state=0},
+EOF
+    stderr_event_num=$(($stderr_event_num + 1))
 }
 }
 
 
 linetoc_end_stderr()
 linetoc_end_stderr()
 {
 {
-return
+    cat <<EOF
+};
+EOF
 }
 }
 #END OF STDERR
 #END OF STDERR
 
 

+ 37 - 0
trace/stderr.c

@@ -0,0 +1,37 @@
+#include "trace.h"
+#include "trace/control.h"
+
+
+void trace_print_events(FILE *stream, fprintf_function stream_printf)
+{
+    unsigned int i;
+
+    for (i = 0; i < NR_TRACE_EVENTS; i++) {
+        stream_printf(stream, "%s [Event ID %u] : state %u\n",
+                      trace_list[i].tp_name, i, trace_list[i].state);
+    }
+}
+
+bool trace_event_set_state(const char *name, bool state)
+{
+    unsigned int i;
+
+    for (i = 0; i < NR_TRACE_EVENTS; i++) {
+        if (!strcmp(trace_list[i].tp_name, name)) {
+            trace_list[i].state = state;
+            return true;
+        }
+    }
+    return false;
+}
+
+bool trace_backend_init(const char *events, const char *file)
+{
+    if (file) {
+        fprintf(stderr, "error: -trace file=...: "
+                "option not supported by the selected tracing backend\n");
+        return false;
+    }
+    trace_backend_init_events(events);
+    return true;
+}

+ 11 - 0
trace/stderr.h

@@ -0,0 +1,11 @@
+#ifndef TRACE_STDERR_H
+#define TRACE_STDERR_H
+
+typedef uint64_t TraceEventID;
+
+typedef struct {
+    const char *tp_name;
+    bool state;
+} TraceEvent;
+
+#endif /* ! TRACE_STDERR_H */