#include <linux/kref.h>
#include <linux/uuid.h>
#include <linux/irq_work.h>
-#include <wrapper/uprobes.h>
+#include <linux/uprobes.h>
+
#include <lttng/cpuhotplug.h>
#include <lttng/tracer.h>
#include <lttng/abi.h>
#define lttng_is_signed_type(type) (((type) -1) < (type) 1)
struct lttng_kernel_channel_buffer;
+struct lttng_kernel_channel_counter;
struct lttng_kernel_session;
struct lttng_kernel_ring_buffer_ctx;
unsigned int size; /* in bits */
unsigned short alignment; /* in bits */
unsigned int signedness:1,
- reverse_byte_order:1;
+ reverse_byte_order:1,
+ user:1; /* fetch from user-space */
unsigned int base; /* 2, 8, 10, 16, for pretty print */
};
struct lttng_kernel_type_string {
struct lttng_kernel_type_common parent;
enum lttng_kernel_string_encoding encoding;
+ unsigned int user:1; /* fetch from user-space */
};
struct lttng_kernel_type_enum {
struct lttng_kernel_type_common parent;
const struct lttng_kernel_type_common *elem_type;
unsigned int length; /* Num. elems. */
- unsigned int alignment;
+ unsigned int alignment; /* Alignment in bytes before elements. */
enum lttng_kernel_string_encoding encoding;
};
struct lttng_kernel_type_common parent;
const char *length_name; /* Length field name. If NULL, use previous field. */
const struct lttng_kernel_type_common *elem_type;
- unsigned int alignment; /* Alignment before elements. */
+ unsigned int alignment; /* Alignment in bytes before elements. */
enum lttng_kernel_string_encoding encoding;
};
struct lttng_kernel_type_common parent;
unsigned int nr_fields;
const struct lttng_kernel_event_field * const *fields; /* Array of pointers to fields. */
- unsigned int alignment;
+ unsigned int alignment; /* Alignment in bits */
};
struct lttng_kernel_type_variant {
const char *tag_name; /* Tag field name. If NULL, use previous field. */
const struct lttng_kernel_event_field * const *choices; /* Array of pointers to fields. */
unsigned int nr_choices;
- unsigned int alignment;
+ unsigned int alignment; /* Alignment in bytes */
};
struct lttng_kernel_enum_desc {
const char *name;
const struct lttng_kernel_type_common *type;
unsigned int nowrite:1, /* do not write into trace */
- user:1, /* fetch from user-space */
nofilter:1; /* do not consider for filter */
};
#define PARAMS(args...) args
#endif
-#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \
+#define _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _user, _base) \
((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_integer, { \
.parent = { \
.type = lttng_kernel_type_integer, \
.alignment = (_alignment), \
.signedness = (_signedness), \
.reverse_byte_order = (_byte_order) != __BYTE_ORDER, \
+ .user = (_user), \
.base = (_base), \
}))
-#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \
- lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \
+#define lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, _base) \
+ _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 0, _base)
+
+#define lttng_kernel_static_type_user_integer(_size, _alignment, _signedness, _byte_order, _base) \
+ _lttng_kernel_static_type_integer(_size, _alignment, _signedness, _byte_order, 1, _base)
+
+#define _lttng_kernel_static_type_integer_from_type(_type, _byte_order, _user, _base) \
+ _lttng_kernel_static_type_integer(sizeof(_type) * CHAR_BIT, \
lttng_alignof(_type) * CHAR_BIT, \
lttng_is_signed_type(_type), \
- _byte_order, \
- _base)
+ _byte_order, _user, _base)
+
+#define lttng_kernel_static_type_integer_from_type(_type, _byte_order, _base) \
+ _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 0, _base)
+
+#define lttng_kernel_static_type_user_integer_from_type(_type, _byte_order, _base) \
+ _lttng_kernel_static_type_integer_from_type(_type, _byte_order, 1, _base)
#define lttng_kernel_static_type_enum(_desc, _container_type) \
((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_enum, { \
.elem_type = (_elem_type), \
}))
-#define lttng_kernel_static_type_string(_encoding) \
+#define lttng_kernel_static_type_string(_encoding, _user) \
((const struct lttng_kernel_type_common *) __LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_type_string, { \
.parent = { \
.type = lttng_kernel_type_string, \
}, \
.encoding = lttng_kernel_string_encoding_##_encoding, \
+ .user = (_user), \
}))
#define lttng_kernel_static_type_struct_init(_nr_fields, _fields, _alignment) \
.alignment = (_alignment), \
}))
-#define lttng_kernel_static_event_field(_name, _type, _nowrite, _user, _nofilter) \
+#define lttng_kernel_static_event_field(_name, _type, _nowrite, _nofilter) \
__LTTNG_COMPOUND_LITERAL(const struct lttng_kernel_event_field, { \
.name = (_name), \
.type = (_type), \
.nowrite = (_nowrite), \
- .user = (_user), \
.nofilter = (_nofilter), \
})
enum lttng_kernel_event_type {
LTTNG_KERNEL_EVENT_TYPE_RECORDER = 0,
LTTNG_KERNEL_EVENT_TYPE_NOTIFIER = 1,
+ LTTNG_KERNEL_EVENT_TYPE_COUNTER = 2
};
struct lttng_kernel_event_common {
struct lttng_kernel_channel_buffer *chan;
};
+struct lttng_kernel_event_counter_ctx {
+ int args_available;
+};
+
+struct lttng_kernel_event_counter_private;
+
+struct lttng_kernel_event_counter {
+ struct lttng_kernel_event_common parent;
+ struct lttng_kernel_event_counter_private *priv; /* Private event counter interface */
+
+ struct lttng_kernel_channel_counter *chan;
+
+ int use_args; /* Use input arguments. */
+};
+
struct lttng_kernel_notification_ctx {
int eval_capture; /* Capture evaluation available. */
};
int (*event_reserve)(struct lttng_kernel_ring_buffer_ctx *ctx);
void (*event_commit)(struct lttng_kernel_ring_buffer_ctx *ctx);
void (*event_write)(struct lttng_kernel_ring_buffer_ctx *ctx, const void *src,
- size_t len);
+ size_t len, size_t alignment);
void (*event_write_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
- const void *src, size_t len);
+ const void *src, size_t len, size_t alignment);
void (*event_memset)(struct lttng_kernel_ring_buffer_ctx *ctx,
int c, size_t len);
void (*event_strcpy)(struct lttng_kernel_ring_buffer_ctx *ctx, const char *src,
size_t len);
void (*event_strcpy_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
const char __user *src, size_t len);
+ void (*event_pstrcpy_pad)(struct lttng_kernel_ring_buffer_ctx *ctx,
+ const char *src, size_t len);
+ void (*event_pstrcpy_pad_from_user)(struct lttng_kernel_ring_buffer_ctx *ctx,
+ const char __user *src, size_t len);
void (*lost_event_too_big)(struct lttng_kernel_channel_buffer *lttng_channel);
};
enum lttng_kernel_channel_type {
LTTNG_KERNEL_CHANNEL_TYPE_BUFFER = 0,
+ LTTNG_KERNEL_CHANNEL_TYPE_COUNTER = 1,
};
struct lttng_kernel_channel_common_private;
struct lttng_kernel_channel_buffer_ops *ops;
};
+struct lttng_kernel_channel_counter;
+struct lttng_kernel_channel_counter_ops_private;
+
+struct lttng_kernel_channel_counter_ops {
+ struct lttng_kernel_channel_counter_ops_private *priv; /* Private channel counter ops interface */
+
+ int (*counter_hit)(struct lttng_kernel_event_counter *event_counter,
+ const char *stack_data,
+ struct lttng_kernel_probe_ctx *probe_ctx,
+ struct lttng_kernel_event_counter_ctx *event_counter_ctx);
+};
+
+struct lttng_kernel_channel_counter {
+ struct lttng_kernel_channel_common parent;
+ struct lttng_kernel_channel_counter_private *priv; /* Private channel counter interface */
+
+ struct lttng_kernel_channel_counter_ops *ops;
+};
+
#define LTTNG_DYNAMIC_LEN_STACK_SIZE 128
struct lttng_dynamic_len_stack {
bool lttng_id_tracker_lookup(struct lttng_kernel_id_tracker_rcu *p, int id);
+static inline
+struct lttng_kernel_channel_common *lttng_kernel_get_chan_common_from_event_common(
+ struct lttng_kernel_event_common *event)
+{
+ switch (event->type) {
+ case LTTNG_KERNEL_EVENT_TYPE_RECORDER:
+ {
+ struct lttng_kernel_event_recorder *event_recorder =
+ container_of(event, struct lttng_kernel_event_recorder, parent);
+ struct lttng_kernel_channel_buffer *chan_buf = event_recorder->chan;
+
+ return &chan_buf->parent;
+ }
+ case LTTNG_KERNEL_EVENT_TYPE_COUNTER:
+ {
+ struct lttng_kernel_event_counter *event_counter =
+ container_of(event, struct lttng_kernel_event_counter, parent);
+ struct lttng_kernel_channel_counter *chan_counter = event_counter->chan;
+
+ return &chan_counter->parent;
+ }
+ default:
+ return NULL;
+ }
+}
+
#endif /* _LTTNG_EVENTS_H */