return -1;
 }
 
+void set_syscall_enter_id(int num, int id)
+{
+       syscalls_metadata[num]->enter_id = id;
+}
+
+void set_syscall_exit_id(int num, int id)
+{
+       syscalls_metadata[num]->exit_id = id;
+}
+
 static int __init arch_init_ftrace_syscalls(void)
 {
        int i;
 
 
 #define SYSCALL_TRACE_ENTER_EVENT(sname)                               \
        static struct ftrace_event_call event_enter_##sname;            \
+       struct trace_event enter_syscall_print_##sname = {              \
+               .trace                  = print_syscall_enter,          \
+       };                                                              \
        static int init_enter_##sname(void)                             \
        {                                                               \
-               int num;                                                \
+               int num, id;                                            \
                num = syscall_name_to_nr("sys"#sname);                  \
                if (num < 0)                                            \
                        return -ENOSYS;                                 \
-               register_ftrace_event(&event_syscall_enter);            \
+               id = register_ftrace_event(&enter_syscall_print_##sname);\
+               if (!id)                                                \
+                       return -ENODEV;                                 \
+               event_enter_##sname.id = id;                            \
+               set_syscall_enter_id(num, id);                          \
                INIT_LIST_HEAD(&event_enter_##sname.fields);            \
                init_preds(&event_enter_##sname);                       \
                return 0;                                               \
 
 #define SYSCALL_TRACE_EXIT_EVENT(sname)                                        \
        static struct ftrace_event_call event_exit_##sname;             \
+       struct trace_event exit_syscall_print_##sname = {               \
+               .trace                  = print_syscall_exit,           \
+       };                                                              \
        static int init_exit_##sname(void)                              \
        {                                                               \
-               int num;                                                \
+               int num, id;                                            \
                num = syscall_name_to_nr("sys"#sname);                  \
                if (num < 0)                                            \
                        return -ENOSYS;                                 \
-               register_ftrace_event(&event_syscall_exit);             \
+               id = register_ftrace_event(&exit_syscall_print_##sname);\
+               if (!id)                                                \
+                       return -ENODEV;                                 \
+               event_exit_##sname.id = id;                             \
+               set_syscall_exit_id(num, id);                           \
                INIT_LIST_HEAD(&event_exit_##sname.fields);             \
                init_preds(&event_exit_##sname);                        \
                return 0;                                               \
 
  * @nb_args: number of parameters it takes
  * @types: list of types as strings
  * @args: list of args as strings (args[i] matches types[i])
+ * @enter_id: associated ftrace enter event id
+ * @exit_id: associated ftrace exit event id
  */
 struct syscall_metadata {
        const char      *name;
        int             nb_args;
        const char      **types;
        const char      **args;
+       int             enter_id;
+       int             exit_id;
 };
 
 #ifdef CONFIG_FTRACE_SYSCALLS
 extern struct syscall_metadata *syscall_nr_to_meta(int nr);
 extern int syscall_name_to_nr(char *name);
+void set_syscall_enter_id(int num, int id);
+void set_syscall_exit_id(int num, int id);
 extern struct trace_event event_syscall_enter;
 extern struct trace_event event_syscall_exit;
 extern int reg_event_syscall_enter(void *ptr);
 extern void unreg_event_syscall_enter(void *ptr);
 extern int reg_event_syscall_exit(void *ptr);
 extern void unreg_event_syscall_exit(void *ptr);
+enum print_line_t print_syscall_enter(struct trace_iterator *iter, int flags);
+enum print_line_t print_syscall_exit(struct trace_iterator *iter, int flags);
 #endif
 
 #endif /* _TRACE_SYSCALL_H */
 
        TRACE_GRAPH_ENT,
        TRACE_USER_STACK,
        TRACE_HW_BRANCHES,
-       TRACE_SYSCALL_ENTER,
-       TRACE_SYSCALL_EXIT,
        TRACE_KMEM_ALLOC,
        TRACE_KMEM_FREE,
        TRACE_POWER,
                          TRACE_KMEM_ALLOC);    \
                IF_ASSIGN(var, ent, struct kmemtrace_free_entry,        \
                          TRACE_KMEM_FREE);     \
-               IF_ASSIGN(var, ent, struct syscall_trace_enter,         \
-                         TRACE_SYSCALL_ENTER);                         \
-               IF_ASSIGN(var, ent, struct syscall_trace_exit,          \
-                         TRACE_SYSCALL_EXIT);                          \
                __ftrace_bad_type();                                    \
        } while (0)
 
 
        struct syscall_metadata *entry;
        int i, ret, syscall;
 
-       trace_assign_type(trace, ent);
-
+       trace = (typeof(trace))ent;
        syscall = trace->nr;
-
        entry = syscall_nr_to_meta(syscall);
+
        if (!entry)
                goto end;
 
+       if (entry->enter_id != ent->type) {
+               WARN_ON_ONCE(1);
+               goto end;
+       }
+
        ret = trace_seq_printf(s, "%s(", entry->name);
        if (!ret)
                return TRACE_TYPE_PARTIAL_LINE;
        struct syscall_metadata *entry;
        int ret;
 
-       trace_assign_type(trace, ent);
-
+       trace = (typeof(trace))ent;
        syscall = trace->nr;
-
        entry = syscall_nr_to_meta(syscall);
+
        if (!entry) {
                trace_seq_printf(s, "\n");
                return TRACE_TYPE_HANDLED;
        }
 
+       if (entry->exit_id != ent->type) {
+               WARN_ON_ONCE(1);
+               return TRACE_TYPE_UNHANDLED;
+       }
+
        ret = trace_seq_printf(s, "%s -> 0x%lx\n", entry->name,
                                trace->ret);
        if (!ret)
 
        size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args;
 
-       event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_ENTER, size,
+       event = trace_current_buffer_lock_reserve(sys_data->enter_id, size,
                                                        0, 0);
        if (!event)
                return;
        if (!sys_data)
                return;
 
-       event = trace_current_buffer_lock_reserve(TRACE_SYSCALL_EXIT,
+       event = trace_current_buffer_lock_reserve(sys_data->exit_id,
                                sizeof(*entry), 0, 0);
        if (!event)
                return;
 
 struct trace_event event_syscall_enter = {
        .trace                  = print_syscall_enter,
-       .type                   = TRACE_SYSCALL_ENTER
 };
 
 struct trace_event event_syscall_exit = {
        .trace                  = print_syscall_exit,
-       .type                   = TRACE_SYSCALL_EXIT
 };