From: Mathieu Desnoyers Date: Sat, 17 Sep 2011 17:28:35 +0000 (-0400) Subject: Use different event name for compat syscalls X-Git-Tag: v2.0-pre9~32 X-Git-Url: https://git.lttng.org/?a=commitdiff_plain;h=b76dc1a0b1f4eb9f7ae754d2b44a431d9a24b1a5;p=lttng-modules.git Use different event name for compat syscalls Signed-off-by: Mathieu Desnoyers --- diff --git a/instrumentation/syscalls/headers/syscalls_unknown.h b/instrumentation/syscalls/headers/syscalls_unknown.h index 4b82f15d..7050387f 100644 --- a/instrumentation/syscalls/headers/syscalls_unknown.h +++ b/instrumentation/syscalls/headers/syscalls_unknown.h @@ -22,6 +22,19 @@ TRACE_EVENT(sys_unknown, ), TP_printk() ) +TRACE_EVENT(compat_sys_unknown, + TP_PROTO(unsigned int id, unsigned long *args), + TP_ARGS(id, args), + TP_STRUCT__entry( + __field(unsigned int, id) + __array(unsigned long, args, UNKNOWN_SYSCALL_NRARGS) + ), + TP_fast_assign( + tp_assign(id, id) + tp_memcpy(args, args, UNKNOWN_SYSCALL_NRARGS * sizeof(*args)) + ), + TP_printk() +) /* * This is going to hook on sys_exit in the kernel. * We change the name so we don't clash with the sys_exit syscall entry diff --git a/ltt-events.h b/ltt-events.h index dfab9a5f..e00714d0 100644 --- a/ltt-events.h +++ b/ltt-events.h @@ -243,6 +243,7 @@ struct ltt_channel { struct ltt_transport *transport; struct ltt_event **sc_table; /* for syscall tracing */ struct ltt_event *sc_unknown; /* for unknown syscalls */ + struct ltt_event *sc_compat_unknown; struct ltt_event *sc_exit; /* for syscall exit */ int header_type; /* 0: unset, 1: compact, 2: large */ int metadata_dumped:1; diff --git a/lttng-syscalls.c b/lttng-syscalls.c index 40bf9575..b712502b 100644 --- a/lttng-syscalls.c +++ b/lttng-syscalls.c @@ -77,13 +77,11 @@ static struct trace_syscall_entry sc_table[] = { #undef CREATE_SYSCALL_TABLE -static void syscall_entry_unknown(struct ltt_channel *chan, +static void syscall_entry_unknown(struct ltt_event *event, struct pt_regs *regs, unsigned int id) { unsigned long args[UNKNOWN_SYSCALL_NRARGS]; - struct ltt_event *event; - event = chan->sc_unknown; syscall_get_arguments(current, regs, 0, UNKNOWN_SYSCALL_NRARGS, args); __event_probe__sys_unknown(event, id, args); } @@ -99,13 +97,17 @@ static void syscall_entry_probe(void *__data, struct pt_regs *regs, long id) struct ltt_channel *chan = __data; struct ltt_event *event; - if (unlikely(is_compat_task() || id >= ARRAY_SIZE(sc_table))) { - syscall_entry_unknown(chan, regs, id); + if (unlikely(is_compat_task())) { + syscall_entry_unknown(chan->sc_compat_unknown, regs, id); + return; + } + if (unlikely(id >= ARRAY_SIZE(sc_table))) { + syscall_entry_unknown(chan->sc_unknown, regs, id); return; } event = chan->sc_table[id]; if (unlikely(!event)) { - syscall_entry_unknown(chan, regs, id); + syscall_entry_unknown(chan->sc_unknown, regs, id); return; } entry = &sc_table[id]; @@ -230,6 +232,22 @@ int lttng_syscalls_register(struct ltt_channel *chan, void *filter) } } + if (!chan->sc_compat_unknown) { + struct lttng_kernel_event ev; + const struct lttng_event_desc *desc = + &__event_desc___compat_sys_unknown; + + memset(&ev, 0, sizeof(ev)); + strncpy(ev.name, desc->name, LTTNG_SYM_NAME_LEN); + ev.name[LTTNG_SYM_NAME_LEN - 1] = '\0'; + ev.instrumentation = LTTNG_KERNEL_NOOP; + chan->sc_compat_unknown = ltt_event_create(chan, &ev, filter, + desc); + if (!chan->sc_compat_unknown) { + return -EINVAL; + } + } + if (!chan->sc_exit) { struct lttng_kernel_event ev; const struct lttng_event_desc *desc =