X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=include%2Fust%2Fmarker.h;h=287f20f5feebe1a466e59cde943b45c723d1581f;hb=7b2c500757f1e2f25c6d8872110d45a343e7bbbe;hp=72ced98c4e3fb16eedaa17d294566d2622394742;hpb=518d7abb8e3720433c611499f704c3bd9d554102;p=ust.git diff --git a/include/ust/marker.h b/include/ust/marker.h index 72ced98..287f20f 100644 --- a/include/ust/marker.h +++ b/include/ust/marker.h @@ -30,15 +30,12 @@ #include #include #include +#include #include struct marker; -/* To stringify the expansion of a define */ -#define XSTR(d) STR(d) -#define STR(s) #s - /** * marker_probe_func - Type of a marker probe function * @mdata: marker data @@ -83,6 +80,8 @@ struct marker { #define CONFIG_MARKERS #ifdef CONFIG_MARKERS +#define GET_MARKER(channel, name) (__mark_##channel##_##name) + #define _DEFINE_MARKER(channel, name, tp_name_str, tp_cb, format, unique, m) \ struct registers regs; \ \ @@ -96,14 +95,14 @@ struct marker { * will try to create the same symbols, resulting in a conflict. This \ * is not unusual as it can be the result of function inlining. \ */ \ - ".ifndef __mstrtab_" XSTR(channel) "_" XSTR(name) "_channel_" XSTR(unique) "\n\t" \ + ".ifndef __mstrtab_" __stringify(channel) "_" __stringify(name) "_channel_" __stringify(unique) "\n\t" \ /*".section __markers_strings\n\t"*/ \ ".section __markers_strings,\"aw\",@progbits\n\t" \ - "__mstrtab_" XSTR(channel) "_" XSTR(name) "_channel_" XSTR(unique) ":\n\t" \ - ".string \"" XSTR(channel) "\"\n\t" \ - "__mstrtab_" XSTR(channel) "_" XSTR(name) "_name_" XSTR(unique) ":\n\t" \ - ".string \"" XSTR(name) "\"\n\t" \ - "__mstrtab_" XSTR(channel) "_" XSTR(name) "_format_" XSTR(unique) ":\n\t" \ + "__mstrtab_" __stringify(channel) "_" __stringify(name) "_channel_" __stringify(unique) ":\n\t" \ + ".string \"" __stringify(channel) "\"\n\t" \ + "__mstrtab_" __stringify(channel) "_" __stringify(name) "_name_" __stringify(unique) ":\n\t" \ + ".string \"" __stringify(name) "\"\n\t" \ + "__mstrtab_" __stringify(channel) "_" __stringify(name) "_format_" __stringify(unique) ":\n\t" \ ".string " "\"" format "\"" "\n\t" \ ".previous\n\t" \ ".endif\n\t" \ @@ -113,14 +112,14 @@ struct marker { ".section __markers,\"aw\",@progbits\n\t" \ ".balign 8\n\t" \ "2:\n\t" \ - _ASM_PTR "(__mstrtab_" XSTR(channel) "_" XSTR(name) "_channel_" XSTR(unique) ")\n\t" /* channel string */ \ - _ASM_PTR "(__mstrtab_" XSTR(channel) "_" XSTR(name) "_name_" XSTR(unique) ")\n\t" /* name string */ \ - _ASM_PTR "(__mstrtab_" XSTR(channel) "_" XSTR(name) "_format_" XSTR(unique) ")\n\t" /* format string */ \ + _ASM_PTR "(__mstrtab_" __stringify(channel) "_" __stringify(name) "_channel_" __stringify(unique) ")\n\t" /* channel string */ \ + _ASM_PTR "(__mstrtab_" __stringify(channel) "_" __stringify(name) "_name_" __stringify(unique) ")\n\t" /* name string */ \ + _ASM_PTR "(__mstrtab_" __stringify(channel) "_" __stringify(name) "_format_" __stringify(unique) ")\n\t" /* format string */ \ ".byte 0\n\t" /* state imv */ \ ".byte 0\n\t" /* ptype */ \ ".word 0\n\t" /* channel_id */ \ ".word 0\n\t" /* event_id */ \ - ".balign " XSTR(__WORDSIZE) " / 8\n\t" /* alignment */ \ + ".balign " __stringify(__WORDSIZE) " / 8\n\t" /* alignment */ \ _ASM_PTR "(marker_probe_cb)\n\t" /* call */ \ _ASM_PTR "(__mark_empty_function)\n\t" /* marker_probe_closure single.field1 */ \ _ASM_PTR "0\n\t" /* marker_probe_closure single.field2 */ \ @@ -129,8 +128,8 @@ struct marker { _ASM_PTR "0\n\t" /* tp_cb */ \ _ASM_PTR "(1f)\n\t" /* location */ \ ".previous\n\t" \ - ARCH_COPY_ADDR("%[outptr]") \ "1:\n\t" \ + ARCH_COPY_ADDR("%[outptr]") \ : [outptr] "=r" (m) ); \ \ save_registers(®s) @@ -146,7 +145,7 @@ struct marker { static const char __mstrtab_##channel##_##name[] \ __attribute__((section("__markers_strings"))) \ = #channel "\0" #name "\0" format; \ - static struct marker __mark_##channel##_##name \ + static struct marker GET_MARKER(channel, name) \ __attribute__((section("__markers"), aligned(8))) = \ { __mstrtab_##channel##_##name, \ &__mstrtab_##channel##_##name[sizeof(#channel)], \ @@ -188,22 +187,20 @@ struct marker { #define __trace_mark_tp_counter(channel, name, unique, call_private, tp_name, tp_cb, format, args...) \ do { \ - struct marker m; \ + struct registers regs; \ void __check_tp_type(void) \ { \ - register_trace_##tp_name(tp_cb); \ + register_trace_##tp_name(tp_cb, call_private); \ } \ - DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format, unique, m);\ + DEFINE_MARKER_TP(channel, name, tp_name, tp_cb, format);\ __mark_check_format(format, ## args); \ - (*__mark_##channel##_##name.call)(&__mark_##channel##_##name, \ + (*GET_MARKER(channel, name).call)(&GET_MARKER(channel, name), \ call_private, ®s, ## args); \ } while (0) extern void marker_update_probe_range(struct marker *begin, struct marker *end); -#define GET_MARKER(channel, name) (__mark_##channel##_##name) - #else /* !CONFIG_MARKERS */ #define DEFINE_MARKER(channel, name, tp_name, tp_cb, format, m) #define __trace_mark(generic, channel, name, call_private, format, args...) \ @@ -213,7 +210,7 @@ extern void marker_update_probe_range(struct marker *begin, do { \ void __check_tp_type(void) \ { \ - register_trace_##tp_name(tp_cb); \ + register_trace_##tp_name(tp_cb, call_private); \ } \ __mark_check_format(format, ## args); \ } while (0)