/* * Copyright (C) 2014 Jan Kiszka . * Copyright (C) 2014 Philippe Gerum . * * Xenomai is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * * Xenomai is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xenomai; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #undef TRACE_SYSTEM #define TRACE_SYSTEM cobalt_rtdm #if !defined(_TRACE_COBALT_RTDM_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_COBALT_RTDM_H #include #include #include struct rtdm_fd; struct rtdm_event; struct rtdm_sem; struct rtdm_mutex; struct xnthread; struct rtdm_device; struct rtdm_dev_context; struct _rtdm_mmap_request; DECLARE_EVENT_CLASS(fd_event, TP_PROTO(struct rtdm_fd *fd, int ufd), TP_ARGS(fd, ufd), TP_STRUCT__entry( __field(struct rtdm_device *, dev) __field(int, ufd) ), TP_fast_assign( __entry->dev = rtdm_fd_to_context(fd)->device; __entry->ufd = ufd; ), TP_printk("device=%p fd=%d", __entry->dev, __entry->ufd) ); DECLARE_EVENT_CLASS(fd_request, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long arg), TP_ARGS(task, fd, ufd, arg), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(struct rtdm_device *, dev) __field(int, ufd) __field(unsigned long, arg) ), TP_fast_assign( memcpy(__entry->comm, task->comm, TASK_COMM_LEN); __entry->pid = task_pid_nr(task); __entry->dev = rtdm_fd_to_context(fd)->device; __entry->ufd = ufd; __entry->arg = arg; ), TP_printk("device=%p fd=%d arg=%#lx pid=%d comm=%s", __entry->dev, __entry->ufd, __entry->arg, __entry->pid, __entry->comm) ); DECLARE_EVENT_CLASS(fd_request_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(struct rtdm_device *, dev) __field(int, ufd) ), TP_fast_assign( memcpy(__entry->comm, task->comm, TASK_COMM_LEN); __entry->pid = task_pid_nr(task); __entry->dev = !IS_ERR(fd) ? rtdm_fd_to_context(fd)->device : NULL; __entry->ufd = ufd; ), TP_printk("device=%p fd=%d pid=%d comm=%s", __entry->dev, __entry->ufd, __entry->pid, __entry->comm) ); DECLARE_EVENT_CLASS(task_op, TP_PROTO(struct xnthread *task), TP_ARGS(task), TP_STRUCT__entry( __field(struct xnthread *, task) __string(task_name, task->name) ), TP_fast_assign( __entry->task = task; __assign_str(task_name, task->name); ), TP_printk("task %p(%s)", __entry->task, __get_str(task_name)) ); DECLARE_EVENT_CLASS(event_op, TP_PROTO(struct rtdm_event *ev), TP_ARGS(ev), TP_STRUCT__entry( __field(struct rtdm_event *, ev) ), TP_fast_assign( __entry->ev = ev; ), TP_printk("event=%p", __entry->ev) ); DECLARE_EVENT_CLASS(sem_op, TP_PROTO(struct rtdm_sem *sem), TP_ARGS(sem), TP_STRUCT__entry( __field(struct rtdm_sem *, sem) ), TP_fast_assign( __entry->sem = sem; ), TP_printk("sem=%p", __entry->sem) ); DECLARE_EVENT_CLASS(mutex_op, TP_PROTO(struct rtdm_mutex *mutex), TP_ARGS(mutex), TP_STRUCT__entry( __field(struct rtdm_mutex *, mutex) ), TP_fast_assign( __entry->mutex = mutex; ), TP_printk("mutex=%p", __entry->mutex) ); TRACE_EVENT(cobalt_device_register, TP_PROTO(struct rtdm_device *dev), TP_ARGS(dev), TP_STRUCT__entry( __field(struct rtdm_device *, dev) __string(device_name, dev->name) __field(int, flags) __field(int, class_id) __field(int, subclass_id) __field(int, profile_version) ), TP_fast_assign( __entry->dev = dev; __assign_str(device_name, dev->name); __entry->flags = dev->driver->device_flags; __entry->class_id = dev->driver->profile_info.class_id; __entry->subclass_id = dev->driver->profile_info.subclass_id; __entry->profile_version = dev->driver->profile_info.version; ), TP_printk("%s device %s=%p flags=0x%x, class=%d.%d profile=%d", (__entry->flags & RTDM_DEVICE_TYPE_MASK) == RTDM_NAMED_DEVICE ? "named" : "protocol", __get_str(device_name), __entry->dev, __entry->flags, __entry->class_id, __entry->subclass_id, __entry->profile_version) ); TRACE_EVENT(cobalt_device_unregister, TP_PROTO(struct rtdm_device *dev), TP_ARGS(dev), TP_STRUCT__entry( __field(struct rtdm_device *, dev) __string(device_name, dev->name) ), TP_fast_assign( __entry->dev = dev; __assign_str(device_name, dev->name); ), TP_printk("device %s=%p", __get_str(device_name), __entry->dev) ); DEFINE_EVENT(fd_event, cobalt_fd_created, TP_PROTO(struct rtdm_fd *fd, int ufd), TP_ARGS(fd, ufd) ); DEFINE_EVENT(fd_request, cobalt_fd_open, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long oflags), TP_ARGS(task, fd, ufd, oflags) ); DEFINE_EVENT(fd_request, cobalt_fd_close, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long lock_count), TP_ARGS(task, fd, ufd, lock_count) ); DEFINE_EVENT(fd_request, cobalt_fd_socket, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long protocol_family), TP_ARGS(task, fd, ufd, protocol_family) ); DEFINE_EVENT(fd_request, cobalt_fd_read, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long len), TP_ARGS(task, fd, ufd, len) ); DEFINE_EVENT(fd_request, cobalt_fd_write, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long len), TP_ARGS(task, fd, ufd, len) ); DEFINE_EVENT(fd_request, cobalt_fd_ioctl, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long request), TP_ARGS(task, fd, ufd, request) ); DEFINE_EVENT(fd_request, cobalt_fd_sendmsg, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long flags), TP_ARGS(task, fd, ufd, flags) ); DEFINE_EVENT(fd_request, cobalt_fd_sendmmsg, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long flags), TP_ARGS(task, fd, ufd, flags) ); DEFINE_EVENT(fd_request, cobalt_fd_recvmsg, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long flags), TP_ARGS(task, fd, ufd, flags) ); DEFINE_EVENT(fd_request, cobalt_fd_recvmmsg, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, unsigned long flags), TP_ARGS(task, fd, ufd, flags) ); #define cobalt_print_protbits(__prot) \ __print_flags(__prot, "|", \ {PROT_EXEC, "exec"}, \ {PROT_READ, "read"}, \ {PROT_WRITE, "write"}) #define cobalt_print_mapbits(__flags) \ __print_flags(__flags, "|", \ {MAP_SHARED, "shared"}, \ {MAP_PRIVATE, "private"}, \ {MAP_ANONYMOUS, "anon"}, \ {MAP_FIXED, "fixed"}, \ {MAP_HUGETLB, "huge"}, \ {MAP_NONBLOCK, "nonblock"}, \ {MAP_NORESERVE, "noreserve"}, \ {MAP_POPULATE, "populate"}, \ {MAP_UNINITIALIZED, "uninit"}) TRACE_EVENT(cobalt_fd_mmap, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, struct _rtdm_mmap_request *rma), TP_ARGS(task, fd, ufd, rma), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) __field(struct rtdm_device *, dev) __field(int, ufd) __field(size_t, length) __field(off_t, offset) __field(int, prot) __field(int, flags) ), TP_fast_assign( memcpy(__entry->comm, task->comm, TASK_COMM_LEN); __entry->pid = task_pid_nr(task); __entry->dev = rtdm_fd_to_context(fd)->device; __entry->ufd = ufd; __entry->length = rma->length; __entry->offset = rma->offset; __entry->prot = rma->prot; __entry->flags = rma->flags; ), TP_printk("device=%p fd=%d area={ len:%zu, off:%Lu }" " prot=%#x(%s) flags=%#x(%s) pid=%d comm=%s", __entry->dev, __entry->ufd, __entry->length, (unsigned long long)__entry->offset, __entry->prot, cobalt_print_protbits(__entry->prot), __entry->flags, cobalt_print_mapbits(__entry->flags), __entry->pid, __entry->comm) ); DEFINE_EVENT(fd_request_status, cobalt_fd_ioctl_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_read_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_write_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_recvmsg_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_recvmmsg_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_sendmsg_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_sendmmsg_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(fd_request_status, cobalt_fd_mmap_status, TP_PROTO(struct task_struct *task, struct rtdm_fd *fd, int ufd, int status), TP_ARGS(task, fd, ufd, status) ); DEFINE_EVENT(task_op, cobalt_driver_task_join, TP_PROTO(struct xnthread *task), TP_ARGS(task) ); TRACE_EVENT(cobalt_driver_event_init, TP_PROTO(struct rtdm_event *ev, unsigned long pending), TP_ARGS(ev, pending), TP_STRUCT__entry( __field(struct rtdm_event *, ev) __field(unsigned long, pending) ), TP_fast_assign( __entry->ev = ev; __entry->pending = pending; ), TP_printk("event=%p pending=%#lx", __entry->ev, __entry->pending) ); TRACE_EVENT(cobalt_driver_event_wait, TP_PROTO(struct rtdm_event *ev, struct xnthread *task), TP_ARGS(ev, task), TP_STRUCT__entry( __field(struct xnthread *, task) __string(task_name, task->name) __field(struct rtdm_event *, ev) ), TP_fast_assign( __entry->task = task; __assign_str(task_name, task->name); __entry->ev = ev; ), TP_printk("event=%p task=%p(%s)", __entry->ev, __entry->task, __get_str(task_name)) ); DEFINE_EVENT(event_op, cobalt_driver_event_signal, TP_PROTO(struct rtdm_event *ev), TP_ARGS(ev) ); DEFINE_EVENT(event_op, cobalt_driver_event_clear, TP_PROTO(struct rtdm_event *ev), TP_ARGS(ev) ); DEFINE_EVENT(event_op, cobalt_driver_event_pulse, TP_PROTO(struct rtdm_event *ev), TP_ARGS(ev) ); DEFINE_EVENT(event_op, cobalt_driver_event_destroy, TP_PROTO(struct rtdm_event *ev), TP_ARGS(ev) ); TRACE_EVENT(cobalt_driver_sem_init, TP_PROTO(struct rtdm_sem *sem, unsigned long value), TP_ARGS(sem, value), TP_STRUCT__entry( __field(struct rtdm_sem *, sem) __field(unsigned long, value) ), TP_fast_assign( __entry->sem = sem; __entry->value = value; ), TP_printk("sem=%p value=%lu", __entry->sem, __entry->value) ); TRACE_EVENT(cobalt_driver_sem_wait, TP_PROTO(struct rtdm_sem *sem, struct xnthread *task), TP_ARGS(sem, task), TP_STRUCT__entry( __field(struct xnthread *, task) __string(task_name, task->name) __field(struct rtdm_sem *, sem) ), TP_fast_assign( __entry->task = task; __assign_str(task_name, task->name); __entry->sem = sem; ), TP_printk("sem=%p task=%p(%s)", __entry->sem, __entry->task, __get_str(task_name)) ); DEFINE_EVENT(sem_op, cobalt_driver_sem_up, TP_PROTO(struct rtdm_sem *sem), TP_ARGS(sem) ); DEFINE_EVENT(sem_op, cobalt_driver_sem_destroy, TP_PROTO(struct rtdm_sem *sem), TP_ARGS(sem) ); DEFINE_EVENT(mutex_op, cobalt_driver_mutex_init, TP_PROTO(struct rtdm_mutex *mutex), TP_ARGS(mutex) ); DEFINE_EVENT(mutex_op, cobalt_driver_mutex_release, TP_PROTO(struct rtdm_mutex *mutex), TP_ARGS(mutex) ); DEFINE_EVENT(mutex_op, cobalt_driver_mutex_destroy, TP_PROTO(struct rtdm_mutex *mutex), TP_ARGS(mutex) ); TRACE_EVENT(cobalt_driver_mutex_wait, TP_PROTO(struct rtdm_mutex *mutex, struct xnthread *task), TP_ARGS(mutex, task), TP_STRUCT__entry( __field(struct xnthread *, task) __string(task_name, task->name) __field(struct rtdm_mutex *, mutex) ), TP_fast_assign( __entry->task = task; __assign_str(task_name, task->name); __entry->mutex = mutex; ), TP_printk("mutex=%p task=%p(%s)", __entry->mutex, __entry->task, __get_str(task_name)) ); #endif /* _TRACE_COBALT_RTDM_H */ /* This part must be outside protection */ #undef TRACE_INCLUDE_PATH #undef TRACE_INCLUDE_FILE #define TRACE_INCLUDE_FILE cobalt-rtdm #include