X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Fust%2Fmarker.h;h=604aa23fa798dec2c72a830090e18d745a0a87da;hb=f08ebbe29cc9f6fa1c108907be5d9d92d297067e;hp=a1f55b0b76338f6db9fa7d4c7309b3f7f6ba862c;hpb=773655f35716237829e6e252e27165ca4044f930;p=ust.git diff --git a/include/ust/marker.h b/include/ust/marker.h index a1f55b0..604aa23 100644 --- a/include/ust/marker.h +++ b/include/ust/marker.h @@ -75,11 +75,7 @@ struct marker { const char *tp_name; /* Optional tracepoint name */ void *tp_cb; /* Optional tracepoint callback */ void *location; /* Address of marker in code */ -} __attribute__((aligned(128)));/* - * Aligned on 128 bytes because it is - * globally visible and gcc happily - * align these on the structure size. - */ +}; #define GET_MARKER(channel, name) (__mark_##channel##_##name) @@ -98,7 +94,7 @@ struct marker { */ \ ".ifndef __mstrtab_" __stringify(channel) "_" __stringify(name) "_channel_" __stringify(unique) "\n\t" \ /*".section __markers_strings\n\t"*/ \ - ".section __markers_strings,\"aw\",@progbits\n\t" \ + ".section __markers_strings,\"aw\"\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" \ @@ -110,16 +106,15 @@ struct marker { ); \ asm volatile ( \ /*".section __markers\n\t"*/ \ - ".section __markers,\"aw\",@progbits\n\t" \ - ".balign 8\n\t" \ + ".section __markers,\"aw\"\n\t" \ "2:\n\t" \ _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 */ \ + ".hword 0\n\t" /* channel_id */ \ + ".hword 0\n\t" /* event_id */ \ ".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 */ \ @@ -129,7 +124,11 @@ struct marker { _ASM_PTR "0\n\t" /* tp_cb */ \ _ASM_PTR "(1f)\n\t" /* location */ \ ".previous\n\t" \ - "1:\n\t" \ + /*".section __markers_ptrs\n\t"*/ \ + ".section __markers_ptrs,\"a\"\n\t" \ + _ASM_PTR "(2b)\n\t" \ + ".previous\n\t" \ + "1:\n\t" \ ARCH_COPY_ADDR("%[outptr]") \ : [outptr] "=r" (m) ); \ \ @@ -147,13 +146,16 @@ struct marker { __attribute__((section("__markers_strings"))) \ = #channel "\0" #name "\0" format; \ static struct marker GET_MARKER(channel, name) \ - __attribute__((section("__markers"), aligned(128))) = \ + __attribute__((section("__markers"))) = \ { __mstrtab_##channel##_##name, \ &__mstrtab_##channel##_##name[sizeof(#channel)], \ &__mstrtab_##channel##_##name[sizeof(#channel) + sizeof(#name)], \ 0, 0, 0, 0, marker_probe_cb, \ { __mark_empty_function, NULL}, \ - NULL, tp_name_str, tp_cb } + NULL, tp_name_str, tp_cb }; \ + static struct marker * const __mark_ptr_##channel##_##name \ + __attribute__((used, section("__markers_ptrs"))) = \ + &GET_MARKER(channel, name); /* * Make sure the alignment of the structure in the __markers section will @@ -198,8 +200,8 @@ struct marker { call_private, ®s, ## args); \ } while (0) -extern void marker_update_probe_range(struct marker *begin, - struct marker *end); +extern void marker_update_probe_range(struct marker * const *begin, + struct marker * const *end); /** * trace_mark - Marker using code patching @@ -302,15 +304,15 @@ extern void *marker_get_private_data(const char *channel, const char *name, struct marker_iter { //ust// struct module *module; struct lib *lib; - struct marker *marker; + struct marker * const *marker; }; extern void marker_iter_start(struct marker_iter *iter); extern void marker_iter_next(struct marker_iter *iter); extern void marker_iter_stop(struct marker_iter *iter); extern void marker_iter_reset(struct marker_iter *iter); -extern int marker_get_iter_range(struct marker **marker, struct marker *begin, - struct marker *end); +extern int marker_get_iter_range(struct marker * const **marker, struct marker * const *begin, + struct marker * const *end); extern void marker_update_process(void); extern int is_marker_enabled(const char *channel, const char *name); @@ -329,7 +331,7 @@ struct marker_addr { }; struct lib { - struct marker *markers_start; + struct marker * const *markers_start; #ifdef CONFIG_UST_GDB_INTEGRATION struct marker_addr *markers_addr_start; #endif @@ -337,21 +339,25 @@ struct lib { struct cds_list_head list; }; -extern int marker_register_lib(struct marker *markers_start, int markers_count); -extern int marker_unregister_lib(struct marker *markers_start); +extern int marker_register_lib(struct marker * const *markers_start, int markers_count); +extern int marker_unregister_lib(struct marker * const *markers_start); #define MARKER_LIB \ - extern struct marker __start___markers[] __attribute__((weak, visibility("hidden"))); \ - extern struct marker __stop___markers[] __attribute__((weak, visibility("hidden"))); \ + extern struct marker * const __start___markers_ptrs[] __attribute__((weak, visibility("hidden"))); \ + extern struct marker * const __stop___markers_ptrs[] __attribute__((weak, visibility("hidden"))); \ + static struct marker * const __mark_ptr_dummy \ + __attribute__((used, section("__markers_ptrs"))) = NULL;\ \ static void __attribute__((constructor)) __markers__init(void) \ { \ - marker_register_lib(__start___markers, (((long)__stop___markers)-((long)__start___markers))/sizeof(struct marker)); \ - } \ - \ - static void __attribute__((destructor)) __markers__destroy(void) \ + marker_register_lib(__start___markers_ptrs, \ + __stop___markers_ptrs \ + - __start___markers_ptrs); \ + } \ + \ + static void __attribute__((destructor)) __markers__destroy(void)\ { \ - marker_unregister_lib(__start___markers); \ + marker_unregister_lib(__start___markers_ptrs); \ } extern void marker_set_new_marker_cb(void (*cb)(struct marker *));