Userspace-probe registration is implemented in a 2-step process. The two
steps registration is necessary because a userspace-probe event can have
an arbitrary number of call sites.
The first step is registering the event through the existing
LTTNG_KERNEL_EVENT command on the channel ioctl FD. This creates an
event with no callsites and thus no instrumentation at all.
The second step is attaching callsites to the event. It's done through
the new LTTNG_KERNEL_ADD_CALLSITE command on the event ioctl FD
received during the first step.
Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
(*events)[i].type = LTTNG_EVENT_SYSCALL;
break;
case LTTNG_KERNEL_ALL:
(*events)[i].type = LTTNG_EVENT_SYSCALL;
break;
case LTTNG_KERNEL_ALL:
+ /* fall-through. */
+ default:
+int kernctl_add_callsite(int fd, struct lttng_kernel_event_callsite *callsite)
+{
+ return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_ADD_CALLSITE, callsite);
+}
+
int kernctl_tracepoint_list(int fd)
{
return compat_ioctl_no_arg(fd, LTTNG_KERNEL_OLD_TRACEPOINT_LIST,
int kernctl_tracepoint_list(int fd)
{
return compat_ioctl_no_arg(fd, LTTNG_KERNEL_OLD_TRACEPOINT_LIST,
/* Apply on event FD */
int kernctl_filter(int fd, struct lttng_filter_bytecode *filter);
/* Apply on event FD */
int kernctl_filter(int fd, struct lttng_filter_bytecode *filter);
+int kernctl_add_callsite(int fd, struct lttng_kernel_event_callsite *callsite);
int kernctl_tracepoint_list(int fd);
int kernctl_syscall_list(int fd);
int kernctl_tracepoint_list(int fd);
int kernctl_syscall_list(int fd);
/* Event FD ioctl */
#define LTTNG_KERNEL_FILTER _IO(0xF6, 0x90)
/* Event FD ioctl */
#define LTTNG_KERNEL_FILTER _IO(0xF6, 0x90)
+#define LTTNG_KERNEL_ADD_CALLSITE _IO(0xF6, 0x91)
#endif /* _LTT_KERNEL_IOCTL_H */
#endif /* _LTT_KERNEL_IOCTL_H */
LTTNG_KERNEL_KRETPROBE = 3,
LTTNG_KERNEL_NOOP = 4, /* not hooked */
LTTNG_KERNEL_SYSCALL = 5,
LTTNG_KERNEL_KRETPROBE = 3,
LTTNG_KERNEL_NOOP = 4, /* not hooked */
LTTNG_KERNEL_SYSCALL = 5,
+ LTTNG_KERNEL_UPROBE = 6,
};
enum lttng_kernel_context_type {
};
enum lttng_kernel_context_type {
char symbol_name[LTTNG_KERNEL_SYM_NAME_LEN];
} LTTNG_PACKED;
char symbol_name[LTTNG_KERNEL_SYM_NAME_LEN];
} LTTNG_PACKED;
+struct lttng_kernel_uprobe {
+ int fd;
+} LTTNG_PACKED;
+
+struct lttng_kernel_event_callsite_uprobe {
+ uint64_t offset;
+} LTTNG_PACKED;
+
+struct lttng_kernel_event_callsite {
+ union {
+ struct lttng_kernel_event_callsite_uprobe uprobe;
+ } u;
+} LTTNG_PACKED;
+
/* Function tracer */
struct lttng_kernel_function {
char symbol_name[LTTNG_KERNEL_SYM_NAME_LEN];
/* Function tracer */
struct lttng_kernel_function {
char symbol_name[LTTNG_KERNEL_SYM_NAME_LEN];
union {
struct lttng_kernel_kretprobe kretprobe;
struct lttng_kernel_kprobe kprobe;
union {
struct lttng_kernel_kretprobe kretprobe;
struct lttng_kernel_kprobe kprobe;
+ struct lttng_kernel_uprobe uprobe;
struct lttng_kernel_function ftrace;
char padding[LTTNG_KERNEL_EVENT_PADDING2];
} u;
struct lttng_kernel_function ftrace;
char padding[LTTNG_KERNEL_EVENT_PADDING2];
} u;