Xenomai  3.1
cobalt-rtdm.h
1 /*
2  * Copyright (C) 2014 Jan Kiszka <jan.kiszka@siemens.com>.
3  * Copyright (C) 2014 Philippe Gerum <rpm@xenomai.org>.
4  *
5  * Xenomai is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published
7  * by the Free Software Foundation; either version 2 of the License,
8  * or (at your option) any later version.
9  *
10  * Xenomai is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with Xenomai; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18  * 02111-1307, USA.
19  */
20 #undef TRACE_SYSTEM
21 #define TRACE_SYSTEM cobalt_rtdm
22 
23 #if !defined(_TRACE_COBALT_RTDM_H) || defined(TRACE_HEADER_MULTI_READ)
24 #define _TRACE_COBALT_RTDM_H
25 
26 #include <linux/tracepoint.h>
27 #include <linux/mman.h>
28 #include <linux/sched.h>
29 
30 struct rtdm_fd;
31 struct rtdm_event;
32 struct rtdm_sem;
33 struct rtdm_mutex;
34 struct xnthread;
35 struct rtdm_device;
36 struct rtdm_dev_context;
37 struct _rtdm_mmap_request;
38 
39 DECLARE_EVENT_CLASS(fd_event,
40  TP_PROTO(struct rtdm_fd *fd, int ufd),
41  TP_ARGS(fd, ufd),
42 
43  TP_STRUCT__entry(
44  __field(struct rtdm_device *, dev)
45  __field(int, ufd)
46  ),
47 
48  TP_fast_assign(
49  __entry->dev = rtdm_fd_to_context(fd)->device;
50  __entry->ufd = ufd;
51  ),
52 
53  TP_printk("device=%p fd=%d",
54  __entry->dev, __entry->ufd)
55 );
56 
57 DECLARE_EVENT_CLASS(fd_request,
58  TP_PROTO(struct task_struct *task,
59  struct rtdm_fd *fd, int ufd, unsigned long arg),
60  TP_ARGS(task, fd, ufd, arg),
61 
62  TP_STRUCT__entry(
63  __array(char, comm, TASK_COMM_LEN)
64  __field(pid_t, pid)
65  __field(struct rtdm_device *, dev)
66  __field(int, ufd)
67  __field(unsigned long, arg)
68  ),
69 
70  TP_fast_assign(
71  memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
72  __entry->pid = task_pid_nr(task);
73  __entry->dev = rtdm_fd_to_context(fd)->device;
74  __entry->ufd = ufd;
75  __entry->arg = arg;
76  ),
77 
78  TP_printk("device=%p fd=%d arg=%#lx pid=%d comm=%s",
79  __entry->dev, __entry->ufd, __entry->arg,
80  __entry->pid, __entry->comm)
81 );
82 
83 DECLARE_EVENT_CLASS(fd_request_status,
84  TP_PROTO(struct task_struct *task,
85  struct rtdm_fd *fd, int ufd, int status),
86  TP_ARGS(task, fd, ufd, status),
87 
88  TP_STRUCT__entry(
89  __array(char, comm, TASK_COMM_LEN)
90  __field(pid_t, pid)
91  __field(struct rtdm_device *, dev)
92  __field(int, ufd)
93  ),
94 
95  TP_fast_assign(
96  memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
97  __entry->pid = task_pid_nr(task);
98  __entry->dev =
99  !IS_ERR(fd) ? rtdm_fd_to_context(fd)->device : NULL;
100  __entry->ufd = ufd;
101  ),
102 
103  TP_printk("device=%p fd=%d pid=%d comm=%s",
104  __entry->dev, __entry->ufd, __entry->pid, __entry->comm)
105 );
106 
107 DECLARE_EVENT_CLASS(task_op,
108  TP_PROTO(struct xnthread *task),
109  TP_ARGS(task),
110 
111  TP_STRUCT__entry(
112  __field(struct xnthread *, task)
113  __string(task_name, task->name)
114  ),
115 
116  TP_fast_assign(
117  __entry->task = task;
118  __assign_str(task_name, task->name);
119  ),
120 
121  TP_printk("task %p(%s)", __entry->task, __get_str(task_name))
122 );
123 
124 DECLARE_EVENT_CLASS(event_op,
125  TP_PROTO(struct rtdm_event *ev),
126  TP_ARGS(ev),
127 
128  TP_STRUCT__entry(
129  __field(struct rtdm_event *, ev)
130  ),
131 
132  TP_fast_assign(
133  __entry->ev = ev;
134  ),
135 
136  TP_printk("event=%p", __entry->ev)
137 );
138 
139 DECLARE_EVENT_CLASS(sem_op,
140  TP_PROTO(struct rtdm_sem *sem),
141  TP_ARGS(sem),
142 
143  TP_STRUCT__entry(
144  __field(struct rtdm_sem *, sem)
145  ),
146 
147  TP_fast_assign(
148  __entry->sem = sem;
149  ),
150 
151  TP_printk("sem=%p", __entry->sem)
152 );
153 
154 DECLARE_EVENT_CLASS(mutex_op,
155  TP_PROTO(struct rtdm_mutex *mutex),
156  TP_ARGS(mutex),
157 
158  TP_STRUCT__entry(
159  __field(struct rtdm_mutex *, mutex)
160  ),
161 
162  TP_fast_assign(
163  __entry->mutex = mutex;
164  ),
165 
166  TP_printk("mutex=%p", __entry->mutex)
167 );
168 
169 TRACE_EVENT(cobalt_device_register,
170  TP_PROTO(struct rtdm_device *dev),
171  TP_ARGS(dev),
172 
173  TP_STRUCT__entry(
174  __field(struct rtdm_device *, dev)
175  __string(device_name, dev->name)
176  __field(int, flags)
177  __field(int, class_id)
178  __field(int, subclass_id)
179  __field(int, profile_version)
180  ),
181 
182  TP_fast_assign(
183  __entry->dev = dev;
184  __assign_str(device_name, dev->name);
185  __entry->flags = dev->driver->device_flags;
186  __entry->class_id = dev->driver->profile_info.class_id;
187  __entry->subclass_id = dev->driver->profile_info.subclass_id;
188  __entry->profile_version = dev->driver->profile_info.version;
189  ),
190 
191  TP_printk("%s device %s=%p flags=0x%x, class=%d.%d profile=%d",
192  (__entry->flags & RTDM_DEVICE_TYPE_MASK)
193  == RTDM_NAMED_DEVICE ? "named" : "protocol",
194  __get_str(device_name), __entry->dev,
195  __entry->flags, __entry->class_id, __entry->subclass_id,
196  __entry->profile_version)
197 );
198 
199 TRACE_EVENT(cobalt_device_unregister,
200  TP_PROTO(struct rtdm_device *dev),
201  TP_ARGS(dev),
202 
203  TP_STRUCT__entry(
204  __field(struct rtdm_device *, dev)
205  __string(device_name, dev->name)
206  ),
207 
208  TP_fast_assign(
209  __entry->dev = dev;
210  __assign_str(device_name, dev->name);
211  ),
212 
213  TP_printk("device %s=%p",
214  __get_str(device_name), __entry->dev)
215 );
216 
217 DEFINE_EVENT(fd_event, cobalt_fd_created,
218  TP_PROTO(struct rtdm_fd *fd, int ufd),
219  TP_ARGS(fd, ufd)
220 );
221 
222 DEFINE_EVENT(fd_request, cobalt_fd_open,
223  TP_PROTO(struct task_struct *task,
224  struct rtdm_fd *fd, int ufd,
225  unsigned long oflags),
226  TP_ARGS(task, fd, ufd, oflags)
227 );
228 
229 DEFINE_EVENT(fd_request, cobalt_fd_close,
230  TP_PROTO(struct task_struct *task,
231  struct rtdm_fd *fd, int ufd,
232  unsigned long lock_count),
233  TP_ARGS(task, fd, ufd, lock_count)
234 );
235 
236 DEFINE_EVENT(fd_request, cobalt_fd_socket,
237  TP_PROTO(struct task_struct *task,
238  struct rtdm_fd *fd, int ufd,
239  unsigned long protocol_family),
240  TP_ARGS(task, fd, ufd, protocol_family)
241 );
242 
243 DEFINE_EVENT(fd_request, cobalt_fd_read,
244  TP_PROTO(struct task_struct *task,
245  struct rtdm_fd *fd, int ufd,
246  unsigned long len),
247  TP_ARGS(task, fd, ufd, len)
248 );
249 
250 DEFINE_EVENT(fd_request, cobalt_fd_write,
251  TP_PROTO(struct task_struct *task,
252  struct rtdm_fd *fd, int ufd,
253  unsigned long len),
254  TP_ARGS(task, fd, ufd, len)
255 );
256 
257 DEFINE_EVENT(fd_request, cobalt_fd_ioctl,
258  TP_PROTO(struct task_struct *task,
259  struct rtdm_fd *fd, int ufd,
260  unsigned long request),
261  TP_ARGS(task, fd, ufd, request)
262 );
263 
264 DEFINE_EVENT(fd_request, cobalt_fd_sendmsg,
265  TP_PROTO(struct task_struct *task,
266  struct rtdm_fd *fd, int ufd,
267  unsigned long flags),
268  TP_ARGS(task, fd, ufd, flags)
269 );
270 
271 DEFINE_EVENT(fd_request, cobalt_fd_sendmmsg,
272  TP_PROTO(struct task_struct *task,
273  struct rtdm_fd *fd, int ufd,
274  unsigned long flags),
275  TP_ARGS(task, fd, ufd, flags)
276 );
277 
278 DEFINE_EVENT(fd_request, cobalt_fd_recvmsg,
279  TP_PROTO(struct task_struct *task,
280  struct rtdm_fd *fd, int ufd,
281  unsigned long flags),
282  TP_ARGS(task, fd, ufd, flags)
283 );
284 
285 DEFINE_EVENT(fd_request, cobalt_fd_recvmmsg,
286  TP_PROTO(struct task_struct *task,
287  struct rtdm_fd *fd, int ufd,
288  unsigned long flags),
289  TP_ARGS(task, fd, ufd, flags)
290 );
291 
292 #define cobalt_print_protbits(__prot) \
293  __print_flags(__prot, "|", \
294  {PROT_EXEC, "exec"}, \
295  {PROT_READ, "read"}, \
296  {PROT_WRITE, "write"})
297 
298 #define cobalt_print_mapbits(__flags) \
299  __print_flags(__flags, "|", \
300  {MAP_SHARED, "shared"}, \
301  {MAP_PRIVATE, "private"}, \
302  {MAP_ANONYMOUS, "anon"}, \
303  {MAP_FIXED, "fixed"}, \
304  {MAP_HUGETLB, "huge"}, \
305  {MAP_NONBLOCK, "nonblock"}, \
306  {MAP_NORESERVE, "noreserve"}, \
307  {MAP_POPULATE, "populate"}, \
308  {MAP_UNINITIALIZED, "uninit"})
309 
310 TRACE_EVENT(cobalt_fd_mmap,
311  TP_PROTO(struct task_struct *task,
312  struct rtdm_fd *fd, int ufd, struct _rtdm_mmap_request *rma),
313  TP_ARGS(task, fd, ufd, rma),
314 
315  TP_STRUCT__entry(
316  __array(char, comm, TASK_COMM_LEN)
317  __field(pid_t, pid)
318  __field(struct rtdm_device *, dev)
319  __field(int, ufd)
320  __field(size_t, length)
321  __field(off_t, offset)
322  __field(int, prot)
323  __field(int, flags)
324  ),
325 
326  TP_fast_assign(
327  memcpy(__entry->comm, task->comm, TASK_COMM_LEN);
328  __entry->pid = task_pid_nr(task);
329  __entry->dev = rtdm_fd_to_context(fd)->device;
330  __entry->ufd = ufd;
331  __entry->length = rma->length;
332  __entry->offset = rma->offset;
333  __entry->prot = rma->prot;
334  __entry->flags = rma->flags;
335  ),
336 
337  TP_printk("device=%p fd=%d area={ len:%zu, off:%Lu }"
338  " prot=%#x(%s) flags=%#x(%s) pid=%d comm=%s",
339  __entry->dev, __entry->ufd, __entry->length,
340  (unsigned long long)__entry->offset,
341  __entry->prot, cobalt_print_protbits(__entry->prot),
342  __entry->flags, cobalt_print_mapbits(__entry->flags),
343  __entry->pid, __entry->comm)
344 );
345 
346 DEFINE_EVENT(fd_request_status, cobalt_fd_ioctl_status,
347  TP_PROTO(struct task_struct *task,
348  struct rtdm_fd *fd, int ufd,
349  int status),
350  TP_ARGS(task, fd, ufd, status)
351 );
352 
353 DEFINE_EVENT(fd_request_status, cobalt_fd_read_status,
354  TP_PROTO(struct task_struct *task,
355  struct rtdm_fd *fd, int ufd,
356  int status),
357  TP_ARGS(task, fd, ufd, status)
358 );
359 
360 DEFINE_EVENT(fd_request_status, cobalt_fd_write_status,
361  TP_PROTO(struct task_struct *task,
362  struct rtdm_fd *fd, int ufd,
363  int status),
364  TP_ARGS(task, fd, ufd, status)
365 );
366 
367 DEFINE_EVENT(fd_request_status, cobalt_fd_recvmsg_status,
368  TP_PROTO(struct task_struct *task,
369  struct rtdm_fd *fd, int ufd,
370  int status),
371  TP_ARGS(task, fd, ufd, status)
372 );
373 
374 DEFINE_EVENT(fd_request_status, cobalt_fd_recvmmsg_status,
375  TP_PROTO(struct task_struct *task,
376  struct rtdm_fd *fd, int ufd,
377  int status),
378  TP_ARGS(task, fd, ufd, status)
379 );
380 
381 DEFINE_EVENT(fd_request_status, cobalt_fd_sendmsg_status,
382  TP_PROTO(struct task_struct *task,
383  struct rtdm_fd *fd, int ufd,
384  int status),
385  TP_ARGS(task, fd, ufd, status)
386 );
387 
388 DEFINE_EVENT(fd_request_status, cobalt_fd_sendmmsg_status,
389  TP_PROTO(struct task_struct *task,
390  struct rtdm_fd *fd, int ufd,
391  int status),
392  TP_ARGS(task, fd, ufd, status)
393 );
394 
395 DEFINE_EVENT(fd_request_status, cobalt_fd_mmap_status,
396  TP_PROTO(struct task_struct *task,
397  struct rtdm_fd *fd, int ufd,
398  int status),
399  TP_ARGS(task, fd, ufd, status)
400 );
401 
402 DEFINE_EVENT(task_op, cobalt_driver_task_join,
403  TP_PROTO(struct xnthread *task),
404  TP_ARGS(task)
405 );
406 
407 TRACE_EVENT(cobalt_driver_event_init,
408  TP_PROTO(struct rtdm_event *ev, unsigned long pending),
409  TP_ARGS(ev, pending),
410 
411  TP_STRUCT__entry(
412  __field(struct rtdm_event *, ev)
413  __field(unsigned long, pending)
414  ),
415 
416  TP_fast_assign(
417  __entry->ev = ev;
418  __entry->pending = pending;
419  ),
420 
421  TP_printk("event=%p pending=%#lx",
422  __entry->ev, __entry->pending)
423 );
424 
425 TRACE_EVENT(cobalt_driver_event_wait,
426  TP_PROTO(struct rtdm_event *ev, struct xnthread *task),
427  TP_ARGS(ev, task),
428 
429  TP_STRUCT__entry(
430  __field(struct xnthread *, task)
431  __string(task_name, task->name)
432  __field(struct rtdm_event *, ev)
433  ),
434 
435  TP_fast_assign(
436  __entry->task = task;
437  __assign_str(task_name, task->name);
438  __entry->ev = ev;
439  ),
440 
441  TP_printk("event=%p task=%p(%s)",
442  __entry->ev, __entry->task, __get_str(task_name))
443 );
444 
445 DEFINE_EVENT(event_op, cobalt_driver_event_signal,
446  TP_PROTO(struct rtdm_event *ev),
447  TP_ARGS(ev)
448 );
449 
450 DEFINE_EVENT(event_op, cobalt_driver_event_clear,
451  TP_PROTO(struct rtdm_event *ev),
452  TP_ARGS(ev)
453 );
454 
455 DEFINE_EVENT(event_op, cobalt_driver_event_pulse,
456  TP_PROTO(struct rtdm_event *ev),
457  TP_ARGS(ev)
458 );
459 
460 DEFINE_EVENT(event_op, cobalt_driver_event_destroy,
461  TP_PROTO(struct rtdm_event *ev),
462  TP_ARGS(ev)
463 );
464 
465 TRACE_EVENT(cobalt_driver_sem_init,
466  TP_PROTO(struct rtdm_sem *sem, unsigned long value),
467  TP_ARGS(sem, value),
468 
469  TP_STRUCT__entry(
470  __field(struct rtdm_sem *, sem)
471  __field(unsigned long, value)
472  ),
473 
474  TP_fast_assign(
475  __entry->sem = sem;
476  __entry->value = value;
477  ),
478 
479  TP_printk("sem=%p value=%lu",
480  __entry->sem, __entry->value)
481 );
482 
483 TRACE_EVENT(cobalt_driver_sem_wait,
484  TP_PROTO(struct rtdm_sem *sem, struct xnthread *task),
485  TP_ARGS(sem, task),
486 
487  TP_STRUCT__entry(
488  __field(struct xnthread *, task)
489  __string(task_name, task->name)
490  __field(struct rtdm_sem *, sem)
491  ),
492 
493  TP_fast_assign(
494  __entry->task = task;
495  __assign_str(task_name, task->name);
496  __entry->sem = sem;
497  ),
498 
499  TP_printk("sem=%p task=%p(%s)",
500  __entry->sem, __entry->task, __get_str(task_name))
501 );
502 
503 DEFINE_EVENT(sem_op, cobalt_driver_sem_up,
504  TP_PROTO(struct rtdm_sem *sem),
505  TP_ARGS(sem)
506 );
507 
508 DEFINE_EVENT(sem_op, cobalt_driver_sem_destroy,
509  TP_PROTO(struct rtdm_sem *sem),
510  TP_ARGS(sem)
511 );
512 
513 DEFINE_EVENT(mutex_op, cobalt_driver_mutex_init,
514  TP_PROTO(struct rtdm_mutex *mutex),
515  TP_ARGS(mutex)
516 );
517 
518 DEFINE_EVENT(mutex_op, cobalt_driver_mutex_release,
519  TP_PROTO(struct rtdm_mutex *mutex),
520  TP_ARGS(mutex)
521 );
522 
523 DEFINE_EVENT(mutex_op, cobalt_driver_mutex_destroy,
524  TP_PROTO(struct rtdm_mutex *mutex),
525  TP_ARGS(mutex)
526 );
527 
528 TRACE_EVENT(cobalt_driver_mutex_wait,
529  TP_PROTO(struct rtdm_mutex *mutex, struct xnthread *task),
530  TP_ARGS(mutex, task),
531 
532  TP_STRUCT__entry(
533  __field(struct xnthread *, task)
534  __string(task_name, task->name)
535  __field(struct rtdm_mutex *, mutex)
536  ),
537 
538  TP_fast_assign(
539  __entry->task = task;
540  __assign_str(task_name, task->name);
541  __entry->mutex = mutex;
542  ),
543 
544  TP_printk("mutex=%p task=%p(%s)",
545  __entry->mutex, __entry->task, __get_str(task_name))
546 );
547 
548 #endif /* _TRACE_COBALT_RTDM_H */
549 
550 /* This part must be outside protection */
551 #undef TRACE_INCLUDE_PATH
552 #undef TRACE_INCLUDE_FILE
553 #define TRACE_INCLUDE_FILE cobalt-rtdm
554 #include <trace/define_trace.h>
struct rtdm_profile_info profile_info
Class profile information.
Definition: driver.h:255
int device_flags
Device flags, see Device Flags for details.
Definition: driver.h:260
struct rtdm_driver * driver
Device driver.
Definition: driver.h:340
int class_id
Device class ID, see RTDM_CLASS_xxx.
Definition: driver.h:219
int version
Supported device profile version.
Definition: driver.h:224
#define RTDM_NAMED_DEVICE
If set, the device is addressed via a clear-text name.
Definition: driver.h:83
Device context.
Definition: driver.h:136
RTDM device.
Definition: driver.h:338
#define RTDM_DEVICE_TYPE_MASK
Mask selecting the device type.
Definition: driver.h:90
int subclass_id
Device sub-class, see RTDM_SUBCLASS_xxx definition in the Device Profiles.
Definition: driver.h:222