source: rtems/cpukit/include/rtems/record.h @ c46fbb9

Last change on this file since c46fbb9 was c46fbb9, checked in by Sebastian Huber <sebastian.huber@…>, on 12/01/22 at 09:21:25

config: Add CONFIGURE_RECORD_INTERRUPTS_ENABLED

This enables the tracing of interrupt entry/exit events through an
application configuration option. The interrupt processing can be
viewed with Trace Compass using rtems-record-lttng from the RTEMS Tools.

Update #4769.

  • Property mode set to 100644
File size: 50.6 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 * Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de)
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 */
27
28#ifndef _RTEMS_RECORD_H
29#define _RTEMS_RECORD_H
30
31#include "recorddata.h"
32
33#include <rtems/score/atomic.h>
34#include <rtems/score/cpu.h>
35#include <rtems/score/interr.h>
36#include <rtems/score/percpu.h>
37#include <rtems/score/watchdog.h>
38#include <rtems/counter.h>
39
40#ifdef __cplusplus
41extern "C" {
42#endif /* __cplusplus */
43
44typedef struct Record_Control {
45  Atomic_Uint       head;
46  unsigned int      tail;
47  unsigned int      mask;
48  Watchdog_Control  Watchdog;
49  rtems_record_item Header[ 3 ];
50  RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
51    rtems_record_item Items[ RTEMS_ZERO_LENGTH_ARRAY ];
52} Record_Control;
53
54typedef struct {
55  unsigned int    item_count;
56  Record_Control *controls;
57} Record_Configuration;
58
59typedef struct {
60  Record_Control *control;
61  unsigned int    head;
62  uint32_t        now;
63  uint32_t        level;
64} rtems_record_context;
65
66extern const Record_Configuration _Record_Configuration;
67
68void _Record_Initialize( void );
69
70void _Record_Interrupt_initialize( void );
71
72bool _Record_Thread_create(
73  struct _Thread_Control *executing,
74  struct _Thread_Control *created
75);
76
77void _Record_Thread_start(
78  struct _Thread_Control *executing,
79  struct _Thread_Control *started
80);
81
82void _Record_Thread_restart(
83  struct _Thread_Control *executing,
84  struct _Thread_Control *restarted
85);
86
87void _Record_Thread_delete(
88  struct _Thread_Control *executing,
89  struct _Thread_Control *deleted
90);
91
92void _Record_Thread_switch(
93  struct _Thread_Control *executing,
94  struct _Thread_Control *heir
95);
96
97void _Record_Thread_begin( struct _Thread_Control *executing );
98
99void _Record_Thread_exitted( struct _Thread_Control *executing );
100
101void _Record_Fatal_dump_base64(
102  Internal_errors_Source source,
103  bool                   always_set_to_false,
104  Internal_errors_t      code
105);
106
107void _Record_Fatal_dump_base64_zlib(
108  Internal_errors_Source source,
109  bool                   always_set_to_false,
110  Internal_errors_t      code
111);
112
113void _Record_Thread_terminate(
114  struct _Thread_Control *executing
115);
116
117static inline unsigned int _Record_Index(
118  const Record_Control *control,
119  unsigned int          index
120)
121{
122  return index & control->mask;
123}
124
125static inline unsigned int _Record_Head( const Record_Control *control )
126{
127  return _Atomic_Load_uint( &control->head, ATOMIC_ORDER_RELAXED );
128}
129
130static inline unsigned int _Record_Tail( const Record_Control *control )
131{
132  return control->tail;
133}
134
135static inline bool _Record_Is_overflow(
136  const Record_Control *control,
137  unsigned int          tail,
138  unsigned int          head
139)
140{
141  return head - tail >= control->mask + 1U;
142}
143
144static inline unsigned int _Record_Capacity(
145  const Record_Control *control,
146  unsigned int          tail,
147  unsigned int          head
148)
149{
150  return ( tail - head - 1U ) & control->mask;
151}
152
153static inline rtems_counter_ticks _Record_Now( void )
154{
155  return rtems_counter_read();
156}
157
158typedef struct RTEMS_PACKED {
159  uint32_t format;
160  uint32_t magic;
161  rtems_record_item Version;
162  rtems_record_item Processor_maximum;
163  rtems_record_item Count;
164  rtems_record_item Frequency;
165  rtems_record_item Info[64];
166} Record_Stream_header;
167
168size_t _Record_Stream_header_initialize( Record_Stream_header *header );
169
170size_t _Record_String_to_items(
171  rtems_record_event  event,
172  const char         *str,
173  size_t              len,
174  rtems_record_item  *items,
175  size_t              item_count
176);
177
178void _Record_Caller( void *return_address );
179
180void _Record_Caller_3(
181  void               *return_address,
182  rtems_record_event  event,
183  rtems_record_data   data
184);
185
186void _Record_Caller_4(
187  void               *return_address,
188  rtems_record_event  event_0,
189  rtems_record_data   data_0,
190  rtems_record_event  event_1,
191  rtems_record_data   data_1
192);
193
194void _Record_Caller_arg( void *return_address, rtems_record_data data );
195
196void _Record_Caller_arg_2(
197  void              *return_address,
198  rtems_record_data  data_0,
199  rtems_record_data  data_1
200);
201
202void _Record_Caller_arg_3(
203  void              *return_address,
204  rtems_record_data  data_0,
205  rtems_record_data  data_1,
206  rtems_record_data  data_2
207);
208
209void _Record_Caller_arg_4(
210  void              *return_address,
211  rtems_record_data  data_0,
212  rtems_record_data  data_1,
213  rtems_record_data  data_2,
214  rtems_record_data  data_3
215);
216
217void _Record_Caller_arg_5(
218  void              *return_address,
219  rtems_record_data  data_0,
220  rtems_record_data  data_1,
221  rtems_record_data  data_2,
222  rtems_record_data  data_3,
223  rtems_record_data  data_4
224);
225
226void _Record_Caller_arg_6(
227  void              *return_address,
228  rtems_record_data  data_0,
229  rtems_record_data  data_1,
230  rtems_record_data  data_2,
231  rtems_record_data  data_3,
232  rtems_record_data  data_4,
233  rtems_record_data  data_5
234);
235
236void _Record_Caller_arg_7(
237  void              *return_address,
238  rtems_record_data  data_0,
239  rtems_record_data  data_1,
240  rtems_record_data  data_2,
241  rtems_record_data  data_3,
242  rtems_record_data  data_4,
243  rtems_record_data  data_5,
244  rtems_record_data  data_6
245);
246
247void _Record_Caller_arg_8(
248  void              *return_address,
249  rtems_record_data  data_0,
250  rtems_record_data  data_1,
251  rtems_record_data  data_2,
252  rtems_record_data  data_3,
253  rtems_record_data  data_4,
254  rtems_record_data  data_5,
255  rtems_record_data  data_6,
256  rtems_record_data  data_7
257);
258
259void _Record_Caller_arg_9(
260  void              *return_address,
261  rtems_record_data  data_0,
262  rtems_record_data  data_1,
263  rtems_record_data  data_2,
264  rtems_record_data  data_3,
265  rtems_record_data  data_4,
266  rtems_record_data  data_5,
267  rtems_record_data  data_6,
268  rtems_record_data  data_7,
269  rtems_record_data  data_8
270);
271
272void _Record_Caller_arg_10(
273  void              *return_address,
274  rtems_record_data  data_0,
275  rtems_record_data  data_1,
276  rtems_record_data  data_2,
277  rtems_record_data  data_3,
278  rtems_record_data  data_4,
279  rtems_record_data  data_5,
280  rtems_record_data  data_6,
281  rtems_record_data  data_7,
282  rtems_record_data  data_8,
283  rtems_record_data  data_9
284);
285
286void _Record_Entry_2(
287  void               *return_address,
288  rtems_record_event  event,
289  rtems_record_data   data_0,
290  rtems_record_data   data_1
291);
292
293void _Record_Entry_3(
294  void               *return_address,
295  rtems_record_event  event,
296  rtems_record_data   data_0,
297  rtems_record_data   data_1,
298  rtems_record_data   data_2
299);
300
301void _Record_Entry_4(
302  void               *return_address,
303  rtems_record_event  event,
304  rtems_record_data   data_0,
305  rtems_record_data   data_1,
306  rtems_record_data   data_2,
307  rtems_record_data   data_3
308);
309
310void _Record_Entry_5(
311  void               *return_address,
312  rtems_record_event  event,
313  rtems_record_data   data_0,
314  rtems_record_data   data_1,
315  rtems_record_data   data_2,
316  rtems_record_data   data_3,
317  rtems_record_data   data_4
318);
319
320void _Record_Entry_6(
321  void               *return_address,
322  rtems_record_event  event,
323  rtems_record_data   data_0,
324  rtems_record_data   data_1,
325  rtems_record_data   data_2,
326  rtems_record_data   data_3,
327  rtems_record_data   data_4,
328  rtems_record_data   data_5
329);
330
331void _Record_Entry_7(
332  void               *return_address,
333  rtems_record_event  event,
334  rtems_record_data   data_0,
335  rtems_record_data   data_1,
336  rtems_record_data   data_2,
337  rtems_record_data   data_3,
338  rtems_record_data   data_4,
339  rtems_record_data   data_5,
340  rtems_record_data   data_6
341);
342
343void _Record_Entry_8(
344  void               *return_address,
345  rtems_record_event  event,
346  rtems_record_data   data_0,
347  rtems_record_data   data_1,
348  rtems_record_data   data_2,
349  rtems_record_data   data_3,
350  rtems_record_data   data_4,
351  rtems_record_data   data_5,
352  rtems_record_data   data_6,
353  rtems_record_data   data_7
354);
355
356void _Record_Entry_9(
357  void               *return_address,
358  rtems_record_event  event,
359  rtems_record_data   data_0,
360  rtems_record_data   data_1,
361  rtems_record_data   data_2,
362  rtems_record_data   data_3,
363  rtems_record_data   data_4,
364  rtems_record_data   data_5,
365  rtems_record_data   data_6,
366  rtems_record_data   data_7,
367  rtems_record_data   data_8
368);
369
370void _Record_Entry_10(
371  void               *return_address,
372  rtems_record_event  event,
373  rtems_record_data   data_0,
374  rtems_record_data   data_1,
375  rtems_record_data   data_2,
376  rtems_record_data   data_3,
377  rtems_record_data   data_4,
378  rtems_record_data   data_5,
379  rtems_record_data   data_6,
380  rtems_record_data   data_7,
381  rtems_record_data   data_8,
382  rtems_record_data   data_9
383);
384
385void _Record_Exit_2(
386  void               *return_address,
387  rtems_record_event  event,
388  rtems_record_data   data_0,
389  rtems_record_data   data_1
390);
391
392void _Record_Exit_3(
393  void               *return_address,
394  rtems_record_event  event,
395  rtems_record_data   data_0,
396  rtems_record_data   data_1,
397  rtems_record_data   data_2
398);
399
400void _Record_Exit_4(
401  void               *return_address,
402  rtems_record_event  event,
403  rtems_record_data   data_0,
404  rtems_record_data   data_1,
405  rtems_record_data   data_2,
406  rtems_record_data   data_3
407);
408
409void _Record_Exit_5(
410  void               *return_address,
411  rtems_record_event  event,
412  rtems_record_data   data_0,
413  rtems_record_data   data_1,
414  rtems_record_data   data_2,
415  rtems_record_data   data_3,
416  rtems_record_data   data_4
417);
418
419void _Record_Exit_6(
420  void               *return_address,
421  rtems_record_event  event,
422  rtems_record_data   data_0,
423  rtems_record_data   data_1,
424  rtems_record_data   data_2,
425  rtems_record_data   data_3,
426  rtems_record_data   data_4,
427  rtems_record_data   data_5
428);
429
430void _Record_Exit_7(
431  void               *return_address,
432  rtems_record_event  event,
433  rtems_record_data   data_0,
434  rtems_record_data   data_1,
435  rtems_record_data   data_2,
436  rtems_record_data   data_3,
437  rtems_record_data   data_4,
438  rtems_record_data   data_5,
439  rtems_record_data   data_6
440);
441
442void _Record_Exit_8(
443  void               *return_address,
444  rtems_record_event  event,
445  rtems_record_data   data_0,
446  rtems_record_data   data_1,
447  rtems_record_data   data_2,
448  rtems_record_data   data_3,
449  rtems_record_data   data_4,
450  rtems_record_data   data_5,
451  rtems_record_data   data_6,
452  rtems_record_data   data_7
453);
454
455void _Record_Exit_9(
456  void               *return_address,
457  rtems_record_event  event,
458  rtems_record_data   data_0,
459  rtems_record_data   data_1,
460  rtems_record_data   data_2,
461  rtems_record_data   data_3,
462  rtems_record_data   data_4,
463  rtems_record_data   data_5,
464  rtems_record_data   data_6,
465  rtems_record_data   data_7,
466  rtems_record_data   data_8
467);
468
469void _Record_Exit_10(
470  void               *return_address,
471  rtems_record_event  event,
472  rtems_record_data   data_0,
473  rtems_record_data   data_1,
474  rtems_record_data   data_2,
475  rtems_record_data   data_3,
476  rtems_record_data   data_4,
477  rtems_record_data   data_5,
478  rtems_record_data   data_6,
479  rtems_record_data   data_7,
480  rtems_record_data   data_8,
481  rtems_record_data   data_9
482);
483
484/**
485 * @addtogroup RTEMSRecord
486 *
487 * @{
488 */
489
490/**
491 * @brief Prepares to add and commit record items in a critical section with
492 * interrupts disabled.
493 *
494 * This function does not disable interrupts.  It must be called with
495 * interrupts disabled.  Interrupts must be disabled until the corresponding
496 * rtems_record_commit_critical() was called.
497 *
498 * @param context The record context which must be used for the following
499 *   rtems_record_add() and rtems_record_commit_critical() calls.  The record
500 *   context may have an arbitrary content at function entry.
501 * @param cpu_self The control of the current processor.
502 */
503static inline void rtems_record_prepare_critical(
504  rtems_record_context  *context,
505  const Per_CPU_Control *cpu_self
506)
507{
508  Record_Control *control;
509  unsigned int    head;
510
511  context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
512  control = cpu_self->record;
513  context->control = control;
514  head = _Record_Head( control );
515  context->head = head;
516}
517
518/**
519 * @brief Prepares to add and commit record items.
520 *
521 * This function disables interrupts.
522 *
523 * @param context The record context which must be used for the following
524 *   rtems_record_add() and rtems_record_commit() calls.  The record context
525 *   may have an arbitrary content at function entry.
526 *
527 * @see rtems_record_produce().
528 */
529static inline void rtems_record_prepare( rtems_record_context *context )
530{
531  uint32_t               level;
532  const Per_CPU_Control *cpu_self;
533  Record_Control        *control;
534  unsigned int           head;
535
536  _CPU_ISR_Disable( level );
537  RTEMS_COMPILER_MEMORY_BARRIER();
538  context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
539  context->level = level;
540  cpu_self = _Per_CPU_Get();
541  control = cpu_self->record;
542  context->control = control;
543  head = _Record_Head( control );
544  context->head = head;
545}
546
547/**
548 * @brief Adds a record item.
549 *
550 * @param context The record context initialized via rtems_record_prepare().
551 * @param event The record event without a time stamp for the item.
552 * @param data The record data for the item.
553 */
554static inline void rtems_record_add(
555  rtems_record_context *context,
556  rtems_record_event    event,
557  rtems_record_data     data
558)
559{
560  Record_Control    *control;
561  rtems_record_item *item;
562  unsigned int       head;
563
564  control = context->control;
565  head = context->head;
566  item = &control->Items[ _Record_Index( control, head ) ];
567  context->head = head + 1;
568
569  item->event = context->now | event;
570  item->data = data;
571}
572
573/**
574 * @brief Commits a set of record items in a critical section with interrupts
575 * disabled.
576 *
577 * @param context The record context initialized via
578 *   rtems_record_prepare_critical().
579 */
580static inline void rtems_record_commit_critical( rtems_record_context *context )
581{
582  _Atomic_Store_uint(
583    &context->control->head,
584    context->head,
585    ATOMIC_ORDER_RELEASE
586  );
587}
588
589/**
590 * @brief Commits a set of record items.
591 *
592 * @param context The record context initialized via rtems_record_prepare().
593 */
594static inline void rtems_record_commit( rtems_record_context *context )
595{
596  rtems_record_commit_critical( context );
597  RTEMS_COMPILER_MEMORY_BARRIER();
598  _CPU_ISR_Enable( context->level );
599}
600
601/**
602 * @brief Produces a record item.
603 *
604 * @param event The record event without a time stamp for the item.
605 * @param data The record data for the item.
606 */
607void rtems_record_produce( rtems_record_event event, rtems_record_data data );
608
609/**
610 * @brief Produces two record items.
611 *
612 * @param event_0 The record event without a time stamp for the first item.
613 * @param data_0 The record data for the first item.
614 * @param event_1 The record event without a time stamp for the second item.
615 * @param data_1 The record data for the second item.
616 */
617void rtems_record_produce_2(
618  rtems_record_event event_0,
619  rtems_record_data  data_0,
620  rtems_record_event event_1,
621  rtems_record_data  data_1
622);
623
624/**
625 * @brief Produces n record items.
626 *
627 * @param item The record items without a time stamps.
628 * @param n The count of record items.
629 */
630void rtems_record_produce_n(
631  const rtems_record_item *items,
632  size_t                   n
633);
634
635/**
636 * @brief Generates an RTEMS_RECORD_LINE event.
637 *
638 * The event data is the address of the call to this function.
639 */
640void rtems_record_line( void );
641
642/**
643 * @brief Generates an RTEMS_RECORD_LINE event and an extra event.
644 *
645 * The event data is the address of the call to this function.
646 *
647 * @param event The record event without a time stamp for the second item.
648 * @param data The record data for the second item.
649 */
650void rtems_record_line_2(
651  rtems_record_event event,
652  rtems_record_data  data
653);
654
655/**
656 * @brief Generates an RTEMS_RECORD_LINE event and two extra events.
657 *
658 * The event data is the address of the call to this function.
659 *
660 * @param event_0 The record event without a time stamp for the second item.
661 * @param data_0 The record data for the second item.
662 * @param event_1 The record event without a time stamp for the third item.
663 * @param data_1 The record data for the third item.
664 */
665void rtems_record_line_3(
666  rtems_record_event event_0,
667  rtems_record_data  data_0,
668  rtems_record_event event_1,
669  rtems_record_data  data_1
670);
671
672/**
673 * @brief Generates an RTEMS_RECORD_LINE event and one argument event.
674 *
675 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
676 * this function.
677 *
678 * @param data The RTEMS_RECORD_ARG_0 event data.
679 */
680void rtems_record_line_arg( rtems_record_data data );
681
682/**
683 * @brief Generates an RTEMS_RECORD_LINE event and two argument events.
684 *
685 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
686 * this function.
687 *
688 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
689 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
690 */
691void rtems_record_line_arg_2(
692  rtems_record_data data_0,
693  rtems_record_data data_1
694);
695
696/**
697 * @brief Generates an RTEMS_RECORD_LINE event and three argument events.
698 *
699 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
700 * this function.
701 *
702 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
703 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
704 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
705 */
706void rtems_record_line_arg_3(
707  rtems_record_data data_0,
708  rtems_record_data data_1,
709  rtems_record_data data_2
710);
711
712/**
713 * @brief Generates an RTEMS_RECORD_LINE event and four argument events.
714 *
715 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
716 * this function.
717 *
718 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
719 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
720 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
721 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
722 */
723void rtems_record_line_arg_4(
724  rtems_record_data data_0,
725  rtems_record_data data_1,
726  rtems_record_data data_2,
727  rtems_record_data data_3
728);
729
730/**
731 * @brief Generates an RTEMS_RECORD_LINE event and five argument events.
732 *
733 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
734 * this function.
735 *
736 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
737 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
738 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
739 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
740 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
741 */
742void rtems_record_line_arg_5(
743  rtems_record_data data_0,
744  rtems_record_data data_1,
745  rtems_record_data data_2,
746  rtems_record_data data_3,
747  rtems_record_data data_4
748);
749
750/**
751 * @brief Generates an RTEMS_RECORD_LINE event and six argument events.
752 *
753 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
754 * this function.
755 *
756 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
757 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
758 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
759 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
760 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
761 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
762 */
763void rtems_record_line_arg_6(
764  rtems_record_data data_0,
765  rtems_record_data data_1,
766  rtems_record_data data_2,
767  rtems_record_data data_3,
768  rtems_record_data data_4,
769  rtems_record_data data_5
770);
771
772/**
773 * @brief Generates an RTEMS_RECORD_LINE event and seven argument events.
774 *
775 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
776 * this function.
777 *
778 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
779 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
780 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
781 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
782 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
783 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
784 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
785 */
786void rtems_record_line_arg_7(
787  rtems_record_data data_0,
788  rtems_record_data data_1,
789  rtems_record_data data_2,
790  rtems_record_data data_3,
791  rtems_record_data data_4,
792  rtems_record_data data_5,
793  rtems_record_data data_6
794);
795
796/**
797 * @brief Generates an RTEMS_RECORD_LINE event and eight argument events.
798 *
799 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
800 * this function.
801 *
802 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
803 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
804 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
805 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
806 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
807 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
808 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
809 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
810 */
811void rtems_record_line_arg_8(
812  rtems_record_data data_0,
813  rtems_record_data data_1,
814  rtems_record_data data_2,
815  rtems_record_data data_3,
816  rtems_record_data data_4,
817  rtems_record_data data_5,
818  rtems_record_data data_6,
819  rtems_record_data data_7
820);
821
822/**
823 * @brief Generates an RTEMS_RECORD_LINE event and nine argument events.
824 *
825 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
826 * this function.
827 *
828 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
829 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
830 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
831 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
832 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
833 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
834 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
835 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
836 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
837 */
838void rtems_record_line_arg_9(
839  rtems_record_data data_0,
840  rtems_record_data data_1,
841  rtems_record_data data_2,
842  rtems_record_data data_3,
843  rtems_record_data data_4,
844  rtems_record_data data_5,
845  rtems_record_data data_6,
846  rtems_record_data data_7,
847  rtems_record_data data_8
848);
849
850/**
851 * @brief Generates an RTEMS_RECORD_LINE event and ten argument events.
852 *
853 * The event data of the RTEMS_RECORD_LINE event is the address of the call to
854 * this function.
855 *
856 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
857 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
858 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
859 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
860 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
861 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
862 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
863 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
864 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
865 * @param data_9 The RTEMS_RECORD_ARG_9 event data.
866 */
867void rtems_record_line_arg_10(
868  rtems_record_data data_0,
869  rtems_record_data data_1,
870  rtems_record_data data_2,
871  rtems_record_data data_3,
872  rtems_record_data data_4,
873  rtems_record_data data_5,
874  rtems_record_data data_6,
875  rtems_record_data data_7,
876  rtems_record_data data_8,
877  rtems_record_data data_9
878);
879
880/**
881 * @brief Generates an RTEMS_RECORD_CALLER and an RTEMS_RECORD_LINE event.
882 *
883 * The RTEMS_RECORD_CALLER event data is the return address of the function
884 * calling rtems_record_caller().
885 *
886 * The RTEMS_RECORD_LINE event data is the address of the call to
887 * rtems_record_caller().
888 */
889#define rtems_record_caller() _Record_Caller( RTEMS_RETURN_ADDRESS() )
890
891/**
892 * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and an
893 * extra event.
894 *
895 * The RTEMS_RECORD_CALLER event data is the return address of the function
896 * calling rtems_record_caller_3().
897 *
898 * The RTEMS_RECORD_LINE event data is the address of the call to
899 * rtems_record_caller_3().
900 *
901 * @param event The record event without a time stamp for the third item.
902 * @param data The record data for the third item.
903 */
904#define rtems_record_caller_3( event, data ) \
905  _Record_Caller_3( RTEMS_RETURN_ADDRESS(), event, data )
906
907/**
908 * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and two
909 * extra events.
910 *
911 * The RTEMS_RECORD_CALLER event data is the return address of the function
912 * calling rtems_record_caller_4().
913 *
914 * The RTEMS_RECORD_LINE event data is the address of the call to
915 * rtems_record_caller_4().
916 *
917 * @param event_0 The record event without a time stamp for the third item.
918 * @param data_0 The record data for the third item.
919 * @param event_1 The record event without a time stamp for the fourth item.
920 * @param data_1 The record data for the fourth item.
921 */
922#define rtems_record_caller_4( event_0, data_0, event_1, data_1 ) \
923  _Record_Caller_4( \
924    RTEMS_RETURN_ADDRESS(), \
925    event_0, \
926    data_0, \
927    event_1, \
928    data_1 \
929  )
930
931/**
932 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
933 * and one argument event.
934 *
935 * The RTEMS_RECORD_CALLER event data is the return address of the function
936 * calling rtems_record_caller_arg().
937 *
938 * The RTEMS_RECORD_LINE event data is the address of the call to
939 * rtems_record_caller_arg().
940 *
941 * @param data The RTEMS_RECORD_ARG_0 event data.
942 */
943#define rtems_record_caller_arg( data ) \
944  _Record_Caller_arg( RTEMS_RETURN_ADDRESS(), data )
945
946/**
947 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
948 * and two argument events.
949 *
950 * The RTEMS_RECORD_CALLER event data is the return address of the function
951 * calling rtems_record_caller_arg_2().
952 *
953 * The RTEMS_RECORD_LINE event data is the address of the call to
954 * rtems_record_caller_arg_2().
955 *
956 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
957 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
958 */
959#define rtems_record_caller_arg_2( data_0, data_1 ) \
960  _Record_Caller_arg_2( \
961    RTEMS_RETURN_ADDRESS(), \
962    data_0, \
963    data_1 \
964  )
965
966/**
967 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
968 * and three argument events.
969 *
970 * The RTEMS_RECORD_CALLER event data is the return address of the function
971 * calling rtems_record_caller_arg_3().
972 *
973 * The RTEMS_RECORD_LINE event data is the address of the call to
974 * rtems_record_caller_arg_3().
975 *
976 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
977 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
978 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
979 */
980#define rtems_record_caller_arg_3( data_0, data_1, data_2 ) \
981  _Record_Caller_arg_3( \
982    RTEMS_RETURN_ADDRESS(), \
983    data_0, \
984    data_1, \
985    data_2 \
986  )
987
988/**
989 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
990 * and four argument events.
991 *
992 * The RTEMS_RECORD_CALLER event data is the return address of the function
993 * calling rtems_record_caller_arg_4().
994 *
995 * The RTEMS_RECORD_LINE event data is the address of the call to
996 * rtems_record_caller_arg_4().
997 *
998 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
999 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1000 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1001 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1002 */
1003#define rtems_record_caller_arg_4( data_0, data_1, data_2, data_3 ) \
1004  _Record_Caller_arg_4( \
1005    RTEMS_RETURN_ADDRESS(), \
1006    data_0, \
1007    data_1, \
1008    data_2, \
1009    data_3 \
1010  )
1011
1012/**
1013 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1014 * and five argument events.
1015 *
1016 * The RTEMS_RECORD_CALLER event data is the return address of the function
1017 * calling rtems_record_caller_arg_5().
1018 *
1019 * The RTEMS_RECORD_LINE event data is the address of the call to
1020 * rtems_record_caller_arg_5().
1021 *
1022 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1023 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1024 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1025 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1026 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1027 */
1028#define rtems_record_caller_arg_5( data_0, data_1, data_2, data_3, data_4 ) \
1029  _Record_Caller_arg_5( \
1030    RTEMS_RETURN_ADDRESS(), \
1031    data_0, \
1032    data_1, \
1033    data_2, \
1034    data_3, \
1035    data_4 \
1036  )
1037
1038/**
1039 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1040 * and six argument events.
1041 *
1042 * The RTEMS_RECORD_CALLER event data is the return address of the function
1043 * calling rtems_record_caller_arg_6().
1044 *
1045 * The RTEMS_RECORD_LINE event data is the address of the call to
1046 * rtems_record_caller_arg_6().
1047 *
1048 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1049 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1050 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1051 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1052 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1053 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1054 */
1055#define rtems_record_caller_arg_6( \
1056  data_0, \
1057  data_1, \
1058  data_2, \
1059  data_3, \
1060  data_4, \
1061  data_5 \
1062) \
1063  _Record_Caller_arg_6( \
1064    RTEMS_RETURN_ADDRESS(), \
1065    data_0, \
1066    data_1, \
1067    data_2, \
1068    data_3, \
1069    data_4, \
1070    data_5 \
1071  )
1072
1073/**
1074 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1075 * and seven argument events.
1076 *
1077 * The RTEMS_RECORD_CALLER event data is the return address of the function
1078 * calling rtems_record_caller_arg_7().
1079 *
1080 * The RTEMS_RECORD_LINE event data is the address of the call to
1081 * rtems_record_caller_arg_7().
1082 *
1083 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1084 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1085 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1086 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1087 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1088 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1089 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1090 */
1091#define rtems_record_caller_arg_7( \
1092  data_0, \
1093  data_1, \
1094  data_2, \
1095  data_3, \
1096  data_4, \
1097  data_5, \
1098  data_6 \
1099) \
1100  _Record_Caller_arg_7( \
1101    RTEMS_RETURN_ADDRESS(), \
1102    data_0, \
1103    data_1, \
1104    data_2, \
1105    data_3, \
1106    data_4, \
1107    data_5, \
1108    data_6 \
1109  )
1110
1111/**
1112 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1113 * and eight argument events.
1114 *
1115 * The RTEMS_RECORD_CALLER event data is the return address of the function
1116 * calling rtems_record_caller_arg_8().
1117 *
1118 * The RTEMS_RECORD_LINE event data is the address of the call to
1119 * rtems_record_caller_arg_8().
1120 *
1121 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1122 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1123 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1124 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1125 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1126 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1127 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1128 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1129 */
1130#define rtems_record_caller_arg_8( \
1131  data_0, \
1132  data_1, \
1133  data_2, \
1134  data_3, \
1135  data_4, \
1136  data_5, \
1137  data_6, \
1138  data_7 \
1139) \
1140  _Record_Caller_arg_8( \
1141    RTEMS_RETURN_ADDRESS(), \
1142    data_0, \
1143    data_1, \
1144    data_2, \
1145    data_3, \
1146    data_4, \
1147    data_5, \
1148    data_6, \
1149    data_7 \
1150  )
1151
1152/**
1153 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1154 * and nine argument events.
1155 *
1156 * The RTEMS_RECORD_CALLER event data is the return address of the function
1157 * calling rtems_record_caller_arg_9().
1158 *
1159 * The RTEMS_RECORD_LINE event data is the address of the call to
1160 * rtems_record_caller_arg_9().
1161 *
1162 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1163 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1164 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1165 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1166 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1167 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1168 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1169 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1170 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1171 */
1172#define rtems_record_caller_arg_9( \
1173  data_0, \
1174  data_1, \
1175  data_2, \
1176  data_3, \
1177  data_4, \
1178  data_5, \
1179  data_6, \
1180  data_7, \
1181  data_8 \
1182) \
1183  _Record_Caller_arg_9( \
1184    RTEMS_RETURN_ADDRESS(), \
1185    data_0, \
1186    data_1, \
1187    data_2, \
1188    data_3, \
1189    data_4, \
1190    data_5, \
1191    data_6, \
1192    data_7, \
1193    data_8 \
1194  )
1195
1196/**
1197 * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1198 * and ten argument events.
1199 *
1200 * The RTEMS_RECORD_CALLER event data is the return address of the function
1201 * calling rtems_record_caller_arg_10().
1202 *
1203 * The RTEMS_RECORD_LINE event data is the address of the call to
1204 * rtems_record_caller_arg_10().
1205 *
1206 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1207 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1208 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1209 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1210 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1211 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1212 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1213 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1214 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1215 * @param data_10 The RTEMS_RECORD_ARG_10 event data.
1216 */
1217#define rtems_record_caller_arg_10( \
1218  data_0, \
1219  data_1, \
1220  data_2, \
1221  data_3, \
1222  data_4, \
1223  data_5, \
1224  data_6, \
1225  data_7, \
1226  data_8, \
1227  data_9 \
1228) \
1229  _Record_Caller_arg_10( \
1230    RTEMS_RETURN_ADDRESS(), \
1231    data_0, \
1232    data_1, \
1233    data_2, \
1234    data_3, \
1235    data_4, \
1236    data_5, \
1237    data_6, \
1238    data_7, \
1239    data_8, \
1240    data_9 \
1241  )
1242
1243/**
1244 * @brief Generates the specified entry event.
1245 *
1246 * The event data of the specified entry event is the return address of the
1247 * function calling rtems_record_entry().
1248 *
1249 * @param event The entry event.
1250 */
1251#define rtems_record_entry( event ) \
1252  rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1253
1254/**
1255 * @brief Generates the specified entry event and an argument event.
1256 *
1257 * The event data of the specified entry event is the return address of the
1258 * function calling rtems_record_entry_1().
1259 *
1260 * @param event The entry event.
1261 * @param data The RTEMS_RECORD_ARG_0 event data.
1262 */
1263#define rtems_record_entry_1( event, data ) \
1264  rtems_record_produce_2( \
1265    event, \
1266    (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1267    RTEMS_RECORD_ARG_0, \
1268    data \
1269  )
1270
1271/**
1272 * @brief Generates the specified entry event and two argument events.
1273 *
1274 * The event data of the specified entry event is the return address of the
1275 * function calling rtems_record_entry_2().
1276 *
1277 * @param event The entry event.
1278 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1279 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1280 */
1281#define rtems_record_entry_2( event, data_0, data_1 ) \
1282  _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1283
1284/**
1285 * @brief Generates the specified entry event and three argument events.
1286 *
1287 * The event data of the specified entry event is the return address of the
1288 * function calling rtems_record_entry_3().
1289 *
1290 * @param event The entry event.
1291 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1292 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1293 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1294 */
1295#define rtems_record_entry_3( event, data_0, data_1, data_2 ) \
1296  _Record_Entry_3( \
1297    RTEMS_RETURN_ADDRESS(), \
1298    event, \
1299    data_0, \
1300    data_1, \
1301    data_2 \
1302  )
1303
1304/**
1305 * @brief Generates the specified entry event and four argument events.
1306 *
1307 * The event data of the specified entry event is the return address of the
1308 * function calling rtems_record_entry_4().
1309 *
1310 * @param event The entry event.
1311 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1312 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1313 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1314 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1315 */
1316#define rtems_record_entry_4( event, data_0, data_1, data_2, data_3 ) \
1317  _Record_Entry_4( \
1318    RTEMS_RETURN_ADDRESS(), \
1319    event, \
1320    data_0, \
1321    data_1, \
1322    data_2, \
1323    data_3 \
1324  )
1325
1326/**
1327 * @brief Generates the specified entry event and five argument events.
1328 *
1329 * The event data of the specified entry event is the return address of the
1330 * function calling rtems_record_entry_5().
1331 *
1332 * @param event The entry event.
1333 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1334 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1335 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1336 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1337 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1338 */
1339#define rtems_record_entry_5( \
1340  event, \
1341  data_0, \
1342  data_1, \
1343  data_2, \
1344  data_3, \
1345  data_4 \
1346) \
1347  _Record_Entry_5( \
1348    RTEMS_RETURN_ADDRESS(), \
1349    event, \
1350    data_0, \
1351    data_1, \
1352    data_2, \
1353    data_3, \
1354    data_4 \
1355  )
1356
1357/**
1358 * @brief Generates the specified entry event and six argument events.
1359 *
1360 * The event data of the specified entry event is the return address of the
1361 * function calling rtems_record_entry_6().
1362 *
1363 * @param event The entry event.
1364 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1365 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1366 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1367 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1368 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1369 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1370 */
1371#define rtems_record_entry_6( \
1372  event, \
1373  data_0, \
1374  data_1, \
1375  data_2, \
1376  data_3, \
1377  data_4, \
1378  data_5 \
1379) \
1380  _Record_Entry_6( \
1381    RTEMS_RETURN_ADDRESS(), \
1382    event, \
1383    data_0, \
1384    data_1, \
1385    data_2, \
1386    data_3, \
1387    data_4, \
1388    data_5 \
1389  )
1390
1391/**
1392 * @brief Generates the specified entry event and seven argument events.
1393 *
1394 * The event data of the specified entry event is the return address of the
1395 * function calling rtems_record_entry_7().
1396 *
1397 * @param event The entry event.
1398 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1399 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1400 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1401 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1402 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1403 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1404 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1405 */
1406#define rtems_record_entry_7( \
1407  event, \
1408  data_0, \
1409  data_1, \
1410  data_2, \
1411  data_3, \
1412  data_4, \
1413  data_5, \
1414  data_6 \
1415) \
1416  _Record_Entry_7( \
1417    RTEMS_RETURN_ADDRESS(), \
1418    event, \
1419    data_0, \
1420    data_1, \
1421    data_2, \
1422    data_3, \
1423    data_4, \
1424    data_5, \
1425    data_6 \
1426  )
1427
1428/**
1429 * @brief Generates the specified entry event and eight argument events.
1430 *
1431 * The event data of the specified entry event is the return address of the
1432 * function calling rtems_record_entry_8().
1433 *
1434 * @param event The entry event.
1435 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1436 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1437 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1438 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1439 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1440 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1441 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1442 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1443 */
1444#define rtems_record_entry_8( \
1445  event, \
1446  data_0, \
1447  data_1, \
1448  data_2, \
1449  data_3, \
1450  data_4, \
1451  data_5, \
1452  data_6, \
1453  data_7 \
1454) \
1455  _Record_Entry_8( \
1456    RTEMS_RETURN_ADDRESS(), \
1457    event, \
1458    data_0, \
1459    data_1, \
1460    data_2, \
1461    data_3, \
1462    data_4, \
1463    data_5, \
1464    data_6, \
1465    data_7 \
1466  )
1467
1468/**
1469 * @brief Generates the specified entry event and nine argument events.
1470 *
1471 * The event data of the specified entry event is the return address of the
1472 * function calling rtems_record_entry_9().
1473 *
1474 * @param event The entry event.
1475 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1476 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1477 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1478 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1479 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1480 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1481 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1482 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1483 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1484 */
1485#define rtems_record_entry_9( \
1486  event, \
1487  data_0, \
1488  data_1, \
1489  data_2, \
1490  data_3, \
1491  data_4, \
1492  data_5, \
1493  data_6, \
1494  data_7, \
1495  data_8 \
1496) \
1497  _Record_Entry_9( \
1498    RTEMS_RETURN_ADDRESS(), \
1499    event, \
1500    data_0, \
1501    data_1, \
1502    data_2, \
1503    data_3, \
1504    data_4, \
1505    data_5, \
1506    data_6, \
1507    data_7, \
1508    data_8 \
1509  )
1510
1511/**
1512 * @brief Generates the specified entry event and ten argument events.
1513 *
1514 * The event data of the specified entry event is the return address of the function
1515 * calling rtems_record_entry_10().
1516 *
1517 * @param event The entry event.
1518 * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1519 * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1520 * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1521 * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1522 * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1523 * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1524 * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1525 * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1526 * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1527 * @param data_10 The RTEMS_RECORD_ARG_10 event data.
1528 */
1529#define rtems_record_entry_10( \
1530  event, \
1531  data_0, \
1532  data_1, \
1533  data_2, \
1534  data_3, \
1535  data_4, \
1536  data_5, \
1537  data_6, \
1538  data_7, \
1539  data_8, \
1540  data_9 \
1541) \
1542  _Record_Entry_10( \
1543    RTEMS_RETURN_ADDRESS(), \
1544    event, \
1545    data_0, \
1546    data_1, \
1547    data_2, \
1548    data_3, \
1549    data_4, \
1550    data_5, \
1551    data_6, \
1552    data_7, \
1553    data_8, \
1554    data_9 \
1555  )
1556
1557/**
1558 * @brief Generates the specified exit event.
1559 *
1560 * The event data of the specified exit event is the return address of the
1561 * function calling rtems_record_exit().
1562 *
1563 * @param event The exit event.
1564 */
1565#define rtems_record_exit( event ) \
1566  rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1567
1568/**
1569 * @brief Generates the specified exit event and a return event.
1570 *
1571 * The event data of the specified exit event is the return address of the
1572 * function calling rtems_record_exit_1().
1573 *
1574 * @param event The exit event.
1575 * @param data The RTEMS_RECORD_RETURN_0 event data.
1576 */
1577#define rtems_record_exit_1( event, data ) \
1578  rtems_record_produce_2( \
1579    event, \
1580    (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1581    RTEMS_RECORD_RETURN_0, \
1582    data \
1583  )
1584
1585/**
1586 * @brief Generates the specified exit event and two argument events.
1587 *
1588 * The event data of the specified exit event is the return address of the
1589 * function calling rtems_record_exit_2().
1590 *
1591 * @param event The exit event.
1592 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1593 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1594 */
1595#define rtems_record_exit_2( event, data_0, data_1 ) \
1596  _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1597
1598/**
1599 * @brief Generates the specified exit event and three argument events.
1600 *
1601 * The event data of the specified exit event is the return address of the
1602 * function calling rtems_record_exit_3().
1603 *
1604 * @param event The exit event.
1605 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1606 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1607 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1608 */
1609#define rtems_record_exit_3( event, data_0, data_1, data_2 ) \
1610  _Record_Exit_3( \
1611    RTEMS_RETURN_ADDRESS(), \
1612    event, \
1613    data_0, \
1614    data_1, \
1615    data_2 \
1616  )
1617
1618/**
1619 * @brief Generates the specified exit event and four argument events.
1620 *
1621 * The event data of the specified exit event is the return address of the
1622 * function calling rtems_record_exit_4().
1623 *
1624 * @param event The exit event.
1625 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1626 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1627 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1628 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1629 */
1630#define rtems_record_exit_4( event, data_0, data_1, data_2, data_3 ) \
1631  _Record_Exit_4( \
1632    RTEMS_RETURN_ADDRESS(), \
1633    event, \
1634    data_0, \
1635    data_1, \
1636    data_2, \
1637    data_3 \
1638  )
1639
1640/**
1641 * @brief Generates the specified exit event and five argument events.
1642 *
1643 * The event data of the specified exit event is the return address of the
1644 * function calling rtems_record_exit_5().
1645 *
1646 * @param event The exit event.
1647 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1648 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1649 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1650 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1651 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1652 */
1653#define rtems_record_exit_5( \
1654  event, \
1655  data_0, \
1656  data_1, \
1657  data_2, \
1658  data_3, \
1659  data_4 \
1660) \
1661  _Record_Exit_5( \
1662    RTEMS_RETURN_ADDRESS(), \
1663    event, \
1664    data_0, \
1665    data_1, \
1666    data_2, \
1667    data_3, \
1668    data_4 \
1669  )
1670
1671/**
1672 * @brief Generates the specified exit event and six argument events.
1673 *
1674 * The event data of the specified exit event is the return address of the
1675 * function calling rtems_record_exit_6().
1676 *
1677 * @param event The exit event.
1678 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1679 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1680 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1681 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1682 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1683 * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1684 */
1685#define rtems_record_exit_6( \
1686  event, \
1687  data_0, \
1688  data_1, \
1689  data_2, \
1690  data_3, \
1691  data_4, \
1692  data_5 \
1693) \
1694  _Record_Exit_6( \
1695    RTEMS_RETURN_ADDRESS(), \
1696    event, \
1697    data_0, \
1698    data_1, \
1699    data_2, \
1700    data_3, \
1701    data_4, \
1702    data_5 \
1703  )
1704
1705/**
1706 * @brief Generates the specified exit event and seven argument events.
1707 *
1708 * The event data of the specified exit event is the return address of the
1709 * function calling rtems_record_exit_7().
1710 *
1711 * @param event The exit event.
1712 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1713 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1714 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1715 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1716 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1717 * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1718 * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1719 */
1720#define rtems_record_exit_7( \
1721  event, \
1722  data_0, \
1723  data_1, \
1724  data_2, \
1725  data_3, \
1726  data_4, \
1727  data_5, \
1728  data_6 \
1729) \
1730  _Record_Exit_7( \
1731    RTEMS_RETURN_ADDRESS(), \
1732    event, \
1733    data_0, \
1734    data_1, \
1735    data_2, \
1736    data_3, \
1737    data_4, \
1738    data_5, \
1739    data_6 \
1740  )
1741
1742/**
1743 * @brief Generates the specified exit event and eight argument events.
1744 *
1745 * The event data of the specified exit event is the return address of the
1746 * function calling rtems_record_exit_8().
1747 *
1748 * @param event The exit event.
1749 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1750 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1751 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1752 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1753 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1754 * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1755 * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1756 * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1757 */
1758#define rtems_record_exit_8( \
1759  event, \
1760  data_0, \
1761  data_1, \
1762  data_2, \
1763  data_3, \
1764  data_4, \
1765  data_5, \
1766  data_6, \
1767  data_7 \
1768) \
1769  _Record_Exit_8( \
1770    RTEMS_RETURN_ADDRESS(), \
1771    event, \
1772    data_0, \
1773    data_1, \
1774    data_2, \
1775    data_3, \
1776    data_4, \
1777    data_5, \
1778    data_6, \
1779    data_7 \
1780  )
1781
1782/**
1783 * @brief Generates the specified exit event and nine argument events.
1784 *
1785 * The event data of the specified exit event is the return address of the
1786 * function calling rtems_record_exit_9().
1787 *
1788 * @param event The exit event.
1789 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1790 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1791 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1792 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1793 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1794 * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1795 * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1796 * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1797 * @param data_8 The RTEMS_RECORD_RETURN_8 event data.
1798 */
1799#define rtems_record_exit_9( \
1800  event, \
1801  data_0, \
1802  data_1, \
1803  data_2, \
1804  data_3, \
1805  data_4, \
1806  data_5, \
1807  data_6, \
1808  data_7, \
1809  data_8 \
1810) \
1811  _Record_Exit_9( \
1812    RTEMS_RETURN_ADDRESS(), \
1813    event, \
1814    data_0, \
1815    data_1, \
1816    data_2, \
1817    data_3, \
1818    data_4, \
1819    data_5, \
1820    data_6, \
1821    data_7, \
1822    data_8 \
1823  )
1824
1825/**
1826 * @brief Generates the specified exit event and ten argument events.
1827 *
1828 * The event data of the specified exit event is the return address of the function
1829 * calling rtems_record_exit_10().
1830 *
1831 * @param event The exit event.
1832 * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1833 * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1834 * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1835 * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1836 * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1837 * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1838 * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1839 * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1840 * @param data_8 The RTEMS_RECORD_RETURN_8 event data.
1841 * @param data_10 The RTEMS_RECORD_RETURN_10 event data.
1842 */
1843#define rtems_record_exit_10( \
1844  event, \
1845  data_0, \
1846  data_1, \
1847  data_2, \
1848  data_3, \
1849  data_4, \
1850  data_5, \
1851  data_6, \
1852  data_7, \
1853  data_8, \
1854  data_9 \
1855) \
1856  _Record_Exit_10( \
1857    RTEMS_RETURN_ADDRESS(), \
1858    event, \
1859    data_0, \
1860    data_1, \
1861    data_2, \
1862    data_3, \
1863    data_4, \
1864    data_5, \
1865    data_6, \
1866    data_7, \
1867    data_8, \
1868    data_9 \
1869  )
1870
1871/**
1872 * @brief Disables interrupts and generates an RTEMS_RECORD_ISR_DISABLE event.
1873 *
1874 * @return The previous interrupt level.
1875 */
1876uint32_t rtems_record_interrupt_disable( void );
1877
1878/**
1879 * @brief Restores the previous interrupt level and generates an
1880 *   RTEMS_RECORD_ISR_ENABLE event.
1881 *
1882 * @param level The previous interrupt level.  Must be the return value of the
1883 *   corresponding rtems_record_interrupt_disable().
1884 */
1885void rtems_record_interrupt_enable( uint32_t level );
1886
1887typedef void ( *rtems_record_drain_visitor )(
1888  const rtems_record_item *items,
1889  size_t                   count,
1890  void                    *arg
1891);
1892
1893void _Record_Drain(
1894  Record_Control             *control,
1895  uint32_t                    cpu_index,
1896  rtems_record_drain_visitor  visitor,
1897  void                       *arg
1898);
1899
1900/**
1901 * @brief Drains the record items on all processors.
1902 *
1903 * Calls the visitor function for each drained item set.
1904 *
1905 * @param visitor The visitor function.
1906 * @param arg The argument for the visitor function.
1907 */
1908void rtems_record_drain( rtems_record_drain_visitor visitor, void *arg );
1909
1910/** @} */
1911
1912#ifdef __cplusplus
1913}
1914#endif /* __cplusplus */
1915
1916#endif /* _RTEMS_RECORD_H */
Note: See TracBrowser for help on using the repository browser.