Adds support for the 'instrument' propery into the "trace-events" file.
Events with this property will generate tracing routines named '${api_name}_backend' (instead of '${api_name}'), and expect the user to provide its own implementation for the '${api_name}' routines. Signed-off-by: Lluís Vilanova <vilan...@ac.upc.edu> --- Makefile.objs | 23 +++++++++++++++++++++-- Makefile.target | 2 +- configure | 38 ++++++++++++++++++++++++++++++++++++++ scripts/simpletrace.py | 2 +- scripts/tracetool | 16 ++++++++++++++++ 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/Makefile.objs b/Makefile.objs index 0012b04..13f9349 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -346,12 +346,12 @@ else trace.h: trace.h-timestamp endif trace.h-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak - $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool --$(TRACE_BACKEND) -h < $< > $@," GEN trace.h") + $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool $(TRACETOOL_EXTRA) --$(TRACE_BACKEND) -h < $< > $@," GEN trace.h") @cmp -s $@ trace.h || cp $@ trace.h trace.c: trace.c-timestamp trace.c-timestamp: $(SRC_PATH)/trace-events $(BUILD_DIR)/config-host.mak - $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool --$(TRACE_BACKEND) -c < $< > $@," GEN trace.c") + $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool $(TRACETOOL_EXTRA) --$(TRACE_BACKEND) -c < $< > $@," GEN trace.c") @cmp -s $@ trace.c || cp $@ trace.c trace.o: trace.c $(GENERATED_HEADERS) @@ -399,6 +399,25 @@ trace-obj-y += $(addprefix trace/, $(trace-nested-y)) $(trace-obj-y): $(GENERATED_HEADERS) ###################################################################### +# trace instrument + +ifdef CONFIG_TRACE_INSTRUMENT +LIBTRACE_INSTRUMENT = libtrace-instrument/libtrace-instrument.a + +.PHONY: force +force: + +$(LIBTRACE_INSTRUMENT): QEMU_CFLAGS += -I$(SRC_PATH)/fpu +$(LIBTRACE_INSTRUMENT): QEMU_CFLAGS += -I$(SRC_PATH)/tcg/$(TARGET_BASE_ARCH) +$(LIBTRACE_INSTRUMENT): VPATH = $(TRACE_INSTRUMENT_PATH) +$(LIBTRACE_INSTRUMENT): $(dir $(LIBTRACE_INSTRUMENT))/Makefile force + $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(dir $@) \ + QEMU_CFLAGS="$(QEMU_CFLAGS)" \ + TARGET_DIR=$(TARGET_DIR)$(dir $@)/ VPATH=$(VPATH) \ + SRC_PATH=$(SRC_PATH) V="$(V)" $(notdir $@)) +endif + +###################################################################### # backdoor backdoor-nested-$(CONFIG_USER_ONLY) += user.o diff --git a/Makefile.target b/Makefile.target index a400d92..1b1c71b 100644 --- a/Makefile.target +++ b/Makefile.target @@ -415,7 +415,7 @@ endif # CONFIG_LINUX_USER obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o -$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(LIBBACKDOOR) +$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(LIBBACKDOOR) $(LIBTRACE_INSTRUMENT) $(call LINK,$^) diff --git a/configure b/configure index 67d4c9a..ab7ced5 100755 --- a/configure +++ b/configure @@ -176,6 +176,7 @@ pie="" zero_malloc="" trace_backend="nop" trace_file="trace" +trace_instrument="" backdoor="" spice="" rbd="" @@ -550,6 +551,8 @@ for opt do ;; --with-trace-file=*) trace_file="$optarg" ;; + --with-trace-instrument=*) trace_instrument="$optarg" + ;; --with-backdoor=*) backdoor="$optarg" ;; --enable-gprof) gprof="yes" @@ -1065,6 +1068,8 @@ echo " --enable-trace-backend=B Set trace backend" echo " Available backends:" $("$source_path"/scripts/tracetool --list-backends) echo " --with-trace-file=NAME Full PATH,NAME of file to store traces" echo " Default:trace-<pid>" +echo " --with-trace-instrument=PATH" +echo " Directory to build user-provided trace event instrumentation library" echo " --with-backdoor=PATH Directory to build user-provided backdoor library" echo " --disable-spice disable spice" echo " --enable-spice enable spice" @@ -2699,6 +2704,26 @@ if compile_prog "" "" ; then fi ########################################## +# check for a valid directory for trace instrumentation +if test -n "$trace_instrument"; then + if test ! -f "$trace_instrument/Makefile"; then + echo + echo "Error: cannot make into '$trace_instrument'" + echo "Please choose a directory where I can run 'make'" + echo + exit 1 + fi + if test ! -f "$trace_instrument/trace-instrument.h"; then + echo + echo "Error: directory '$trace_instrument' does not contain a \"trace-instrument.h\" file" + echo + exit 1 + fi + trace_instrument=`readlink -f "$trace_instrument"` +fi + + +########################################## # End of CC checks # After here, no more $cc or $ld runs @@ -2856,6 +2881,9 @@ echo "uuid support $uuid" echo "vhost-net support $vhost_net" echo "Trace backend $trace_backend" echo "Trace output file $trace_file-<pid>" +if test -n "$trace_instrument"; then +echo "Trace instrument $trace_instrument" +fi if test -n "$backdoor"; then echo "Backdoor lib dir $backdoor" fi @@ -3251,6 +3279,12 @@ echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak if test "$trace_default" = "yes"; then echo "CONFIG_TRACE_DEFAULT=y" >> $config_host_mak fi +if test -n "$trace_instrument"; then + echo "CONFIG_TRACE_INSTRUMENT=y" >> $config_host_mak + echo "TRACE_INSTRUMENT_PATH=\"$trace_instrument\"" >> $config_host_mak + echo "TRACETOOL_EXTRA=--instrument" >> $config_host_mak + QEMU_CFLAGS="-I\"$trace_instrument\" $QEMU_CFLAGS" +fi # backdoor channel if test -n "$backdoor"; then @@ -3370,6 +3404,10 @@ if test "$target" = "arm-linux-user" -o "$target" = "armeb-linux-user" -o "$targ mkdir -p $target_dir/nwfpe fi symlink $source_path/Makefile.target $target_dir/Makefile +if test -n "$trace_instrument"; then + mkdir -p $target_dir/libtrace-instrument + symlink $trace_instrument/Makefile $target_dir/libtrace-instrument/Makefile +fi if test -n "$backdoor"; then mkdir -p $target_dir/libbackdoor symlink $backdoor/Makefile $target_dir/libbackdoor/Makefile diff --git a/scripts/simpletrace.py b/scripts/simpletrace.py index f55e5e6..3706938 100755 --- a/scripts/simpletrace.py +++ b/scripts/simpletrace.py @@ -20,7 +20,7 @@ dropped_event_id = 0xfffffffffffffffe trace_fmt = '=QQQQQQQQ' trace_len = struct.calcsize(trace_fmt) -event_re = re.compile(r'(disable\s+)?([a-zA-Z0-9_]+)\(([^)]*)\).*') +event_re = re.compile(r'(disable\s+|instrument\s+)*([a-zA-Z0-9_]+)\(([^)]*)\).*') def parse_events(fobj): """Parse a trace-events file into {event_num: (name, arg1, ...)}.""" diff --git a/scripts/tracetool b/scripts/tracetool index c699801..6390d21 100755 --- a/scripts/tracetool +++ b/scripts/tracetool @@ -35,6 +35,7 @@ Options: --target-type [type] QEMU emulator target type ('system' or 'user') --probe-prefix [prefix] Prefix for dtrace probe names (default: qemu-\$targettype-\$targetarch) + --instrument Enable static trace point instrumentation EOF exit 1 @@ -553,8 +554,16 @@ convert() "lineto$1_nop" "$str" enabled=0 else + if has_property "$str" "instrument"; then + if [ "$instrument" != "1" ]; then + echo "Event '"$(get_name "$str")"' has the 'instrument' property but instrumentation is not enabled" >&2 + exit 1 + fi + get_api_name_fmt="${get_api_name_fmt_default}_backend" + fi "$process_line" "$str" enabled=1 + unset get_api_name_fmt fi if [ "$1" = "h" ]; then name=$(get_name "$str") @@ -578,6 +587,11 @@ tracetoh() #include "qemu-common.h" EOF convert h + + if [ "$instrument" = "1" ]; then + echo '#include "trace-instrument.h"' + fi + echo "#endif /* TRACE_H */" } @@ -629,6 +643,7 @@ binary= targettype= targetarch= probeprefix= +instrument= until [ -z "$1" ] @@ -640,6 +655,7 @@ do "--target-arch") shift ; targetarch="$1" ;; "--target-type") shift ; targettype="$1" ;; "--probe-prefix") shift ; probeprefix="$1" ;; + "--instrument") instrument="1" ;; "-h" | "-c" | "-d") output="${1#-}" ;; "--stap") output="${1#--}" ;;