Version 2.7.7
[lttng-modules.git] / probes / lttng-events.h
index 58f4e1200d860f6b01294e6a1b6f341300cb1d09..1fab263dd2521631f0495f35164938fcbd4c4652 100644 (file)
 #include "lttng-probe-user.h"
 #include "../wrapper/vmalloc.h"        /* for wrapper_vmalloc_sync_all() */
 #include "../wrapper/ringbuffer/frontend_types.h"
+#include "../wrapper/ringbuffer/backend.h"
 #include "../wrapper/rcu.h"
 #include "../lttng-events.h"
 #include "../lttng-tracer-core.h"
+#include <asm/byteorder.h>
+#include <linux/swab.h>
+
+#define __LTTNG_NULL_STRING    "(null)"
 
 /*
  * Macro declarations used for all stages.
@@ -327,10 +332,10 @@ static void __event_probe__##_name(void *__data);
 #define _ctf_string(_item, _src, _user, _nowrite)                             \
        if (_user)                                                             \
                __event_len += __dynamic_len[__dynamic_len_idx++] =            \
-                       strlen(_src) + 1;                                      \
+                       max_t(size_t, lttng_strlen_user_inatomic(_src), 1);    \
        else                                                                   \
                __event_len += __dynamic_len[__dynamic_len_idx++] =            \
-                       max_t(size_t, lttng_strlen_user_inatomic(_src), 1);
+                       strlen((_src) ? (_src) : __LTTNG_NULL_STRING) + 1;
 
 #undef TP_PROTO
 #define TP_PROTO(...)  __VA_ARGS__
@@ -396,18 +401,24 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len,           \
                case 2:                                                        \
                {                                                              \
                        union { _type t; int16_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab16s(&__tmp.v);                           \
                        __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
                        break;                                                 \
                }                                                              \
                case 4:                                                        \
                {                                                              \
                        union { _type t; int32_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab32s(&__tmp.v);                           \
                        __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
                        break;                                                 \
                }                                                              \
                case 8:                                                        \
                {                                                              \
                        union { _type t; int64_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab64s(&__tmp.v);                           \
                        __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
                        break;                                                 \
                }                                                              \
@@ -427,18 +438,24 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len,           \
                case 2:                                                        \
                {                                                              \
                        union { _type t; uint16_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab16s(&__tmp.v);                           \
                        __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
                        break;                                                 \
                }                                                              \
                case 4:                                                        \
                {                                                              \
                        union { _type t; uint32_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab32s(&__tmp.v);                           \
                        __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
                        break;                                                 \
                }                                                              \
                case 8:                                                        \
                {                                                              \
                        union { _type t; uint64_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != __BYTE_ORDER)                       \
+                               __swab64s(&__tmp.v);                           \
                        __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
                        break;                                                 \
                }                                                              \
@@ -455,11 +472,15 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len,           \
 
 #undef _ctf_integer_ext_isuser1
 #define _ctf_integer_ext_isuser1(_type, _item, _user_src, _byte_order, _base, _nowrite) \
-{                                                                             \
-       __typeof__(_user_src) _src;                                            \
-       if (get_user(_src, &(_user_src)))                                      \
-               _src = 0;                                                      \
-       _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite) \
+{                                                                                      \
+       union {                                                                         \
+               char __array[sizeof(_user_src)];                                        \
+               __typeof__(_user_src) __v;                                              \
+       } __tmp_fetch;                                                                  \
+       if (lib_ring_buffer_copy_from_user_check_nofault(__tmp_fetch.__array,           \
+                               &(_user_src), sizeof(_user_src)))                       \
+               memset(__tmp_fetch.__array, 0, sizeof(__tmp_fetch.__array));            \
+       _ctf_integer_ext_fetched(_type, _item, __tmp_fetch.__v, _byte_order, _base, _nowrite) \
 }
 
 #undef _ctf_integer_ext
@@ -492,7 +513,8 @@ static inline size_t __event_get_size__##_name(size_t *__dynamic_len,             \
 #undef _ctf_string
 #define _ctf_string(_item, _src, _user, _nowrite)                             \
        {                                                                      \
-               const void *__ctf_tmp_ptr = (_src);                            \
+               const void *__ctf_tmp_ptr =                                    \
+                       ((_src) ? (_src) : __LTTNG_NULL_STRING);               \
                memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *));          \
                __stack_data += sizeof(void *);                                \
        }
@@ -616,10 +638,14 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)              \
 #undef _ctf_integer_ext_isuser1
 #define _ctf_integer_ext_isuser1(_type, _item, _user_src, _byte_order, _base, _nowrite) \
 {                                                                             \
-       __typeof__(_user_src) _src;                                            \
-       if (get_user(_src, &(_user_src)))                                      \
-               _src = 0;                                                      \
-       _ctf_integer_ext_fetched(_type, _item, _src, _byte_order, _base, _nowrite) \
+       union {                                                                         \
+               char __array[sizeof(_user_src)];                                        \
+               __typeof__(_user_src) __v;                                              \
+       } __tmp_fetch;                                                                  \
+       if (lib_ring_buffer_copy_from_user_check_nofault(__tmp_fetch.__array,           \
+                               &(_user_src), sizeof(_user_src)))                       \
+               memset(__tmp_fetch.__array, 0, sizeof(__tmp_fetch.__array));            \
+       _ctf_integer_ext_fetched(_type, _item, __tmp_fetch.__v, _byte_order, _base, _nowrite) \
 }
 
 #undef _ctf_integer_ext
@@ -654,12 +680,16 @@ static inline size_t __event_get_align__##_name(void *__tp_locvar)              \
 
 #undef _ctf_string
 #define _ctf_string(_item, _src, _user, _nowrite)                      \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src)));      \
        if (_user) {                                                    \
+               lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src))); \
                __chan->ops->event_strcpy_from_user(&__ctx, _src,       \
                        __get_dynamic_len(dest));                       \
        } else {                                                        \
-               __chan->ops->event_strcpy(&__ctx, _src,                 \
+               const char *__ctf_tmp_string =                          \
+                       ((_src) ? (_src) : __LTTNG_NULL_STRING);        \
+               lib_ring_buffer_align_ctx(&__ctx,                       \
+                       lttng_alignof(*__ctf_tmp_string));              \
+               __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string,     \
                        __get_dynamic_len(dest));                       \
        }
 
This page took 0.051883 seconds and 4 git commands to generate.