X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=include%2Flttng%2Fust-tracepoint-event.h;h=26ca1d57c53220196ce3ecf1e74593a139a7a626;hb=24a39530da763d983bd7006855b39967ff52ba13;hp=3f99f6626bb75871b27d85f92ba001081fee0dc2;hpb=b1239ad67e8536822d10b595c8641200b84fc8cd;p=lttng-ust.git diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 3f99f662..26ca1d57 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -30,6 +30,8 @@ #include #include +#define __LTTNG_UST_NULL_STRING "(null)" + #undef tp_list_for_each_entry_rcu #define tp_list_for_each_entry_rcu(pos, head, member) \ for (pos = cds_list_entry(tp_rcu_dereference_bp((head)->next), __typeof__(*pos), member); \ @@ -117,6 +119,35 @@ static const char \ #include TRACEPOINT_INCLUDE +/* + * Stage 0.9 of tracepoint event generation + * + * Unfolding the enums + */ +#include + +/* Enumeration entry (single value) */ +#undef ctf_enum_value +#define ctf_enum_value(_string, _value) \ + { _value, _value, _string }, + +/* Enumeration entry (range) */ +#undef ctf_enum_range +#define ctf_enum_range(_string, _range_start, _range_end) \ + { _range_start, _range_end, _string }, + +#undef TP_ENUM_VALUES +#define TP_ENUM_VALUES(...) \ + __VA_ARGS__ + +#undef TRACEPOINT_ENUM +#define TRACEPOINT_ENUM(_provider, _name, _values) \ + const struct lttng_enum_entry __enum_values__##_provider##_##_name[] = { \ + _values \ + }; + +#include TRACEPOINT_INCLUDE + /* * Stage 1 of tracepoint event generation. * @@ -165,8 +196,9 @@ static const char \ }, #undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, \ - _length_type, _src_length, _encoding, _nowrite) \ +#define _ctf_sequence_encoded(_type, _item, _src, \ + _length_type, _src_length, _encoding, _nowrite, \ + _elem_type_base) \ { \ .name = #_item, \ .type = \ @@ -177,7 +209,7 @@ static const char \ .sequence = \ { \ .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \ - .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \ + .elem_type = __type_integer(_type, BYTE_ORDER, _elem_type_base, _encoding), \ }, \ }, \ }, \ @@ -199,6 +231,31 @@ static const char \ .nowrite = _nowrite, \ }, +#undef _ctf_enum +#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ + { \ + .name = #_item, \ + .type = { \ + .atype = atype_enum, \ + .u = { \ + .basic = { \ + .enumeration = { \ + .desc = &__enum_##_provider##_##_name, \ + .container_type = { \ + .size = sizeof(_type) * CHAR_BIT, \ + .alignment = lttng_alignof(_type) * CHAR_BIT, \ + .signedness = lttng_is_signed_type(_type), \ + .reverse_byte_order = 0, \ + .base = 10, \ + .encoding = lttng_encode_none, \ + }, \ + }, \ + }, \ + }, \ + }, \ + .nowrite = _nowrite, \ + }, + #undef TP_FIELDS #define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ @@ -208,6 +265,14 @@ static const char \ _fields \ }; +#undef TRACEPOINT_ENUM +#define TRACEPOINT_ENUM(_provider, _name, _values) \ + static const struct lttng_enum_desc __enum_##_provider##_##_name = { \ + .name = #_provider "_" #_name, \ + .entries = __enum_values__##_provider##_##_name, \ + .nr_entries = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name), \ + }; + #include TRACEPOINT_INCLUDE /* @@ -229,7 +294,7 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #include TRACEPOINT_INCLUDE /* - * Stage 3 of tracepoint event generation. + * Stage 3.0 of tracepoint event generation. * * Create static inline function that calculates event size. */ @@ -254,8 +319,8 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); __event_len += sizeof(_type) * (_length); #undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ - _src_length, _encoding, _nowrite) \ +#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ + _src_length, _encoding, _nowrite, _elem_type_base) \ __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_length_type)); \ __event_len += sizeof(_length_type); \ __event_len += lib_ring_buffer_align(__event_len, lttng_alignof(_type)); \ @@ -265,7 +330,12 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #undef _ctf_string #define _ctf_string(_item, _src, _nowrite) \ - __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1; + __event_len += __dynamic_len[__dynamic_len_idx++] = \ + strlen((_src) ? (_src) : __LTTNG_UST_NULL_STRING) + 1; + +#undef _ctf_enum +#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) #undef TP_ARGS #define TP_ARGS(...) __VA_ARGS__ @@ -391,7 +461,7 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ - _src_length, _encoding, _nowrite) \ + _src_length, _encoding, _nowrite, _elem_type_base) \ { \ unsigned long __ctf_tmp_ulong = (unsigned long) (_src_length); \ const void *__ctf_tmp_ptr = (_src); \ @@ -404,11 +474,16 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS #undef _ctf_string #define _ctf_string(_item, _src, _nowrite) \ { \ - const void *__ctf_tmp_ptr = (_src); \ + const void *__ctf_tmp_ptr = \ + ((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \ __stack_data += sizeof(void *); \ } +#undef _ctf_enum +#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) + #undef TP_ARGS #define TP_ARGS(...) __VA_ARGS__ @@ -426,8 +501,6 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ #include TRACEPOINT_INCLUDE - - /* * Stage 4 of tracepoint event generation. * @@ -451,14 +524,18 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); #undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ - _src_length, _encoding, _nowrite) \ +#define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ + _src_length, _encoding, _nowrite, _elem_type_base) \ __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_length_type)); \ __event_align = _tp_max_t(size_t, __event_align, lttng_alignof(_type)); #undef _ctf_string #define _ctf_string(_item, _src, _nowrite) +#undef _ctf_enum +#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) + #undef TP_ARGS #define TP_ARGS(...) __VA_ARGS__ @@ -514,7 +591,7 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #undef _ctf_sequence_encoded #define _ctf_sequence_encoded(_type, _item, _src, _length_type, \ - _src_length, _encoding, _nowrite) \ + _src_length, _encoding, _nowrite, _elem_type_base) \ { \ _length_type __tmpl = __stackvar.__dynamic_len[__dynamic_len_idx]; \ lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(_length_type));\ @@ -535,13 +612,23 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #undef _ctf_string #define _ctf_string(_item, _src, _nowrite) \ - lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \ - if (__chan->ops->u.has_strcpy) \ - __chan->ops->event_strcpy(&__ctx, _src, \ - __get_dynamic_len(dest)); \ - else \ - __chan->ops->event_write(&__ctx, _src, \ - __get_dynamic_len(dest)); + { \ + const char *__ctf_tmp_string = \ + ((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \ + lib_ring_buffer_align_ctx(&__ctx, \ + lttng_alignof(*__ctf_tmp_string)); \ + if (__chan->ops->u.has_strcpy) \ + __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \ + __get_dynamic_len(dest)); \ + else \ + __chan->ops->event_write(&__ctx, __ctf_tmp_string, \ + __get_dynamic_len(dest)); \ + } + + +#undef _ctf_enum +#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ + _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) /* Beware: this get len actually consumes the len value */ #undef __get_dynamic_len @@ -565,6 +652,25 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ #define _TP_SESSION_CHECK(session, csession) 1 #endif /* TP_SESSION_CHECK */ +/* + * Use of __builtin_return_address(0) sometimes seems to cause stack + * corruption on 32-bit PowerPC. Disable this feature on that + * architecture for now by always using the NULL value for the ip + * context. + */ +#undef _TP_IP_PARAM +#ifdef TP_IP_PARAM +#define _TP_IP_PARAM(x) (x) +#else /* TP_IP_PARAM */ + +#if defined(__PPC__) && !defined(__PPC64__) +#define _TP_IP_PARAM(x) NULL +#else /* #if defined(__PPC__) && !defined(__PPC64__) */ +#define _TP_IP_PARAM(x) __builtin_return_address(0) +#endif /* #else #if defined(__PPC__) && !defined(__PPC64__) */ + +#endif /* TP_IP_PARAM */ + /* * Using twice size for filter stack data to hold size and pointer for * each field (worse case). For integers, max size required is 64-bit. @@ -579,9 +685,10 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); \ static \ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ { \ - struct lttng_event *__event = (struct lttng_event *) __tp_data; \ + struct lttng_event *__event = (struct lttng_event *) __tp_data; \ struct lttng_channel *__chan = __event->chan; \ struct lttng_ust_lib_ring_buffer_ctx __ctx; \ + struct lttng_stack_ctx __lttng_ctx; \ size_t __event_len, __event_align; \ size_t __dynamic_len_idx = 0; \ union { \ @@ -619,9 +726,13 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \ _TP_ARGS_DATA_VAR(_args)); \ __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \ + memset(&__lttng_ctx, 0, sizeof(__lttng_ctx)); \ + __lttng_ctx.event = __event; \ + __lttng_ctx.chan_ctx = tp_rcu_dereference_bp(__chan->ctx); \ + __lttng_ctx.event_ctx = tp_rcu_dereference_bp(__event->ctx); \ lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len, \ - __event_align, -1, __chan->handle); \ - __ctx.ip = __builtin_return_address(0); \ + __event_align, -1, __chan->handle, &__lttng_ctx); \ + __ctx.ip = _TP_IP_PARAM(TP_IP_PARAM); \ __ret = __chan->ops->event_reserve(&__ctx, __event->id); \ if (__ret < 0) \ return; \ @@ -718,7 +829,11 @@ const struct lttng_event_desc __event_desc___##_provider##_##_name = { \ .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \ .loglevel = &__ref_loglevel___##_provider##___##_name, \ .signature = __tp_event_signature___##_provider##___##_template, \ - .u = { .ext = { .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name } }, \ + .u = { \ + .ext = { \ + .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \ + }, \ + }, \ }; #include TRACEPOINT_INCLUDE