Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:13

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  * Copyright (C) 2018, 2024 embedded brains GmbH & Co. KG
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted provided that the following conditions
0008  * are met:
0009  * 1. Redistributions of source code must retain the above copyright
0010  *    notice, this list of conditions and the following disclaimer.
0011  * 2. Redistributions in binary form must reproduce the above copyright
0012  *    notice, this list of conditions and the following disclaimer in the
0013  *    documentation and/or other materials provided with the distribution.
0014  *
0015  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0016  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0017  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0018  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0019  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0020  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0021  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0024  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0025  * POSSIBILITY OF SUCH DAMAGE.
0026  */
0027 
0028 #ifndef _RTEMS_RECORD_H
0029 #define _RTEMS_RECORD_H
0030 
0031 #include "recorddata.h"
0032 
0033 #include <rtems/score/atomic.h>
0034 #include <rtems/score/cpu.h>
0035 #include <rtems/score/interr.h>
0036 #include <rtems/score/percpu.h>
0037 #include <rtems/score/watchdog.h>
0038 #include <rtems/counter.h>
0039 
0040 #ifdef __cplusplus
0041 extern "C" {
0042 #endif /* __cplusplus */
0043 
0044 typedef struct Record_Control {
0045   Atomic_Uint       head;
0046   unsigned int      tail;
0047   unsigned int      mask;
0048   Watchdog_Control  Watchdog;
0049   RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
0050     rtems_record_item Items[ RTEMS_ZERO_LENGTH_ARRAY ];
0051 } Record_Control;
0052 
0053 typedef struct {
0054   unsigned int    item_count;
0055   Record_Control *controls;
0056 } Record_Configuration;
0057 
0058 typedef struct {
0059   Record_Control *control;
0060   unsigned int    head;
0061   uint32_t        now;
0062   uint32_t        level;
0063 } rtems_record_context;
0064 
0065 extern const Record_Configuration _Record_Configuration;
0066 
0067 void _Record_Initialize( void );
0068 
0069 void _Record_Interrupt_initialize( void );
0070 
0071 bool _Record_Thread_create(
0072   struct _Thread_Control *executing,
0073   struct _Thread_Control *created
0074 );
0075 
0076 void _Record_Thread_start(
0077   struct _Thread_Control *executing,
0078   struct _Thread_Control *started
0079 );
0080 
0081 void _Record_Thread_restart(
0082   struct _Thread_Control *executing,
0083   struct _Thread_Control *restarted
0084 );
0085 
0086 void _Record_Thread_delete(
0087   struct _Thread_Control *executing,
0088   struct _Thread_Control *deleted
0089 );
0090 
0091 void _Record_Thread_switch(
0092   struct _Thread_Control *executing,
0093   struct _Thread_Control *heir
0094 );
0095 
0096 void _Record_Thread_begin( struct _Thread_Control *executing );
0097 
0098 void _Record_Thread_exitted( struct _Thread_Control *executing );
0099 
0100 void _Record_Fatal_dump_base64(
0101   Internal_errors_Source source,
0102   bool                   always_set_to_false,
0103   Internal_errors_t      code
0104 );
0105 
0106 void _Record_Fatal_dump_base64_zlib(
0107   Internal_errors_Source source,
0108   bool                   always_set_to_false,
0109   Internal_errors_t      code
0110 );
0111 
0112 void _Record_Thread_terminate(
0113   struct _Thread_Control *executing
0114 );
0115 
0116 static inline unsigned int _Record_Index(
0117   const Record_Control *control,
0118   unsigned int          index
0119 )
0120 {
0121   return index & control->mask;
0122 }
0123 
0124 static inline unsigned int _Record_Head( Record_Control *control )
0125 {
0126 #ifdef RTEMS_SMP
0127   /*
0128    * Use a read-modify-write operation to get the last value stored by the
0129    * record producer.
0130    */
0131   return _Atomic_Fetch_add_uint( &control->head, 0, ATOMIC_ORDER_ACQUIRE );
0132 #else
0133   return _Atomic_Load_uint( &control->head, ATOMIC_ORDER_ACQUIRE );
0134 #endif
0135 }
0136 
0137 static inline unsigned int _Record_Tail( const Record_Control *control )
0138 {
0139   return control->tail;
0140 }
0141 
0142 static inline bool _Record_Is_overflow(
0143   const Record_Control *control,
0144   unsigned int          tail,
0145   unsigned int          head
0146 )
0147 {
0148   return head - tail >= control->mask + 1U;
0149 }
0150 
0151 static inline unsigned int _Record_Capacity(
0152   const Record_Control *control,
0153   unsigned int          tail,
0154   unsigned int          head
0155 )
0156 {
0157   return ( tail - head - 1U ) & control->mask;
0158 }
0159 
0160 static inline rtems_counter_ticks _Record_Now( void )
0161 {
0162   return rtems_counter_read();
0163 }
0164 
0165 typedef struct RTEMS_PACKED {
0166   uint32_t format;
0167   uint32_t magic;
0168   rtems_record_item Version;
0169   rtems_record_item Processor_maximum;
0170   rtems_record_item Count;
0171   rtems_record_item Frequency;
0172   rtems_record_item Info[64];
0173 } Record_Stream_header;
0174 
0175 size_t _Record_Stream_header_initialize( Record_Stream_header *header );
0176 
0177 size_t _Record_String_to_items(
0178   rtems_record_event  event,
0179   const char         *str,
0180   size_t              len,
0181   rtems_record_item  *items,
0182   size_t              item_count
0183 );
0184 
0185 void _Record_Caller( void *return_address );
0186 
0187 void _Record_Caller_3(
0188   void               *return_address,
0189   rtems_record_event  event,
0190   rtems_record_data   data
0191 );
0192 
0193 void _Record_Caller_4(
0194   void               *return_address,
0195   rtems_record_event  event_0,
0196   rtems_record_data   data_0,
0197   rtems_record_event  event_1,
0198   rtems_record_data   data_1
0199 );
0200 
0201 void _Record_Caller_arg( void *return_address, rtems_record_data data );
0202 
0203 void _Record_Caller_arg_2(
0204   void              *return_address,
0205   rtems_record_data  data_0,
0206   rtems_record_data  data_1
0207 );
0208 
0209 void _Record_Caller_arg_3(
0210   void              *return_address,
0211   rtems_record_data  data_0,
0212   rtems_record_data  data_1,
0213   rtems_record_data  data_2
0214 );
0215 
0216 void _Record_Caller_arg_4(
0217   void              *return_address,
0218   rtems_record_data  data_0,
0219   rtems_record_data  data_1,
0220   rtems_record_data  data_2,
0221   rtems_record_data  data_3
0222 );
0223 
0224 void _Record_Caller_arg_5(
0225   void              *return_address,
0226   rtems_record_data  data_0,
0227   rtems_record_data  data_1,
0228   rtems_record_data  data_2,
0229   rtems_record_data  data_3,
0230   rtems_record_data  data_4
0231 );
0232 
0233 void _Record_Caller_arg_6(
0234   void              *return_address,
0235   rtems_record_data  data_0,
0236   rtems_record_data  data_1,
0237   rtems_record_data  data_2,
0238   rtems_record_data  data_3,
0239   rtems_record_data  data_4,
0240   rtems_record_data  data_5
0241 );
0242 
0243 void _Record_Caller_arg_7(
0244   void              *return_address,
0245   rtems_record_data  data_0,
0246   rtems_record_data  data_1,
0247   rtems_record_data  data_2,
0248   rtems_record_data  data_3,
0249   rtems_record_data  data_4,
0250   rtems_record_data  data_5,
0251   rtems_record_data  data_6
0252 );
0253 
0254 void _Record_Caller_arg_8(
0255   void              *return_address,
0256   rtems_record_data  data_0,
0257   rtems_record_data  data_1,
0258   rtems_record_data  data_2,
0259   rtems_record_data  data_3,
0260   rtems_record_data  data_4,
0261   rtems_record_data  data_5,
0262   rtems_record_data  data_6,
0263   rtems_record_data  data_7
0264 );
0265 
0266 void _Record_Caller_arg_9(
0267   void              *return_address,
0268   rtems_record_data  data_0,
0269   rtems_record_data  data_1,
0270   rtems_record_data  data_2,
0271   rtems_record_data  data_3,
0272   rtems_record_data  data_4,
0273   rtems_record_data  data_5,
0274   rtems_record_data  data_6,
0275   rtems_record_data  data_7,
0276   rtems_record_data  data_8
0277 );
0278 
0279 void _Record_Caller_arg_10(
0280   void              *return_address,
0281   rtems_record_data  data_0,
0282   rtems_record_data  data_1,
0283   rtems_record_data  data_2,
0284   rtems_record_data  data_3,
0285   rtems_record_data  data_4,
0286   rtems_record_data  data_5,
0287   rtems_record_data  data_6,
0288   rtems_record_data  data_7,
0289   rtems_record_data  data_8,
0290   rtems_record_data  data_9
0291 );
0292 
0293 void _Record_Entry_2(
0294   void               *return_address,
0295   rtems_record_event  event,
0296   rtems_record_data   data_0,
0297   rtems_record_data   data_1
0298 );
0299 
0300 void _Record_Entry_3(
0301   void               *return_address,
0302   rtems_record_event  event,
0303   rtems_record_data   data_0,
0304   rtems_record_data   data_1,
0305   rtems_record_data   data_2
0306 );
0307 
0308 void _Record_Entry_4(
0309   void               *return_address,
0310   rtems_record_event  event,
0311   rtems_record_data   data_0,
0312   rtems_record_data   data_1,
0313   rtems_record_data   data_2,
0314   rtems_record_data   data_3
0315 );
0316 
0317 void _Record_Entry_5(
0318   void               *return_address,
0319   rtems_record_event  event,
0320   rtems_record_data   data_0,
0321   rtems_record_data   data_1,
0322   rtems_record_data   data_2,
0323   rtems_record_data   data_3,
0324   rtems_record_data   data_4
0325 );
0326 
0327 void _Record_Entry_6(
0328   void               *return_address,
0329   rtems_record_event  event,
0330   rtems_record_data   data_0,
0331   rtems_record_data   data_1,
0332   rtems_record_data   data_2,
0333   rtems_record_data   data_3,
0334   rtems_record_data   data_4,
0335   rtems_record_data   data_5
0336 );
0337 
0338 void _Record_Entry_7(
0339   void               *return_address,
0340   rtems_record_event  event,
0341   rtems_record_data   data_0,
0342   rtems_record_data   data_1,
0343   rtems_record_data   data_2,
0344   rtems_record_data   data_3,
0345   rtems_record_data   data_4,
0346   rtems_record_data   data_5,
0347   rtems_record_data   data_6
0348 );
0349 
0350 void _Record_Entry_8(
0351   void               *return_address,
0352   rtems_record_event  event,
0353   rtems_record_data   data_0,
0354   rtems_record_data   data_1,
0355   rtems_record_data   data_2,
0356   rtems_record_data   data_3,
0357   rtems_record_data   data_4,
0358   rtems_record_data   data_5,
0359   rtems_record_data   data_6,
0360   rtems_record_data   data_7
0361 );
0362 
0363 void _Record_Entry_9(
0364   void               *return_address,
0365   rtems_record_event  event,
0366   rtems_record_data   data_0,
0367   rtems_record_data   data_1,
0368   rtems_record_data   data_2,
0369   rtems_record_data   data_3,
0370   rtems_record_data   data_4,
0371   rtems_record_data   data_5,
0372   rtems_record_data   data_6,
0373   rtems_record_data   data_7,
0374   rtems_record_data   data_8
0375 );
0376 
0377 void _Record_Entry_10(
0378   void               *return_address,
0379   rtems_record_event  event,
0380   rtems_record_data   data_0,
0381   rtems_record_data   data_1,
0382   rtems_record_data   data_2,
0383   rtems_record_data   data_3,
0384   rtems_record_data   data_4,
0385   rtems_record_data   data_5,
0386   rtems_record_data   data_6,
0387   rtems_record_data   data_7,
0388   rtems_record_data   data_8,
0389   rtems_record_data   data_9
0390 );
0391 
0392 void _Record_Exit_2(
0393   void               *return_address,
0394   rtems_record_event  event,
0395   rtems_record_data   data_0,
0396   rtems_record_data   data_1
0397 );
0398 
0399 void _Record_Exit_3(
0400   void               *return_address,
0401   rtems_record_event  event,
0402   rtems_record_data   data_0,
0403   rtems_record_data   data_1,
0404   rtems_record_data   data_2
0405 );
0406 
0407 void _Record_Exit_4(
0408   void               *return_address,
0409   rtems_record_event  event,
0410   rtems_record_data   data_0,
0411   rtems_record_data   data_1,
0412   rtems_record_data   data_2,
0413   rtems_record_data   data_3
0414 );
0415 
0416 void _Record_Exit_5(
0417   void               *return_address,
0418   rtems_record_event  event,
0419   rtems_record_data   data_0,
0420   rtems_record_data   data_1,
0421   rtems_record_data   data_2,
0422   rtems_record_data   data_3,
0423   rtems_record_data   data_4
0424 );
0425 
0426 void _Record_Exit_6(
0427   void               *return_address,
0428   rtems_record_event  event,
0429   rtems_record_data   data_0,
0430   rtems_record_data   data_1,
0431   rtems_record_data   data_2,
0432   rtems_record_data   data_3,
0433   rtems_record_data   data_4,
0434   rtems_record_data   data_5
0435 );
0436 
0437 void _Record_Exit_7(
0438   void               *return_address,
0439   rtems_record_event  event,
0440   rtems_record_data   data_0,
0441   rtems_record_data   data_1,
0442   rtems_record_data   data_2,
0443   rtems_record_data   data_3,
0444   rtems_record_data   data_4,
0445   rtems_record_data   data_5,
0446   rtems_record_data   data_6
0447 );
0448 
0449 void _Record_Exit_8(
0450   void               *return_address,
0451   rtems_record_event  event,
0452   rtems_record_data   data_0,
0453   rtems_record_data   data_1,
0454   rtems_record_data   data_2,
0455   rtems_record_data   data_3,
0456   rtems_record_data   data_4,
0457   rtems_record_data   data_5,
0458   rtems_record_data   data_6,
0459   rtems_record_data   data_7
0460 );
0461 
0462 void _Record_Exit_9(
0463   void               *return_address,
0464   rtems_record_event  event,
0465   rtems_record_data   data_0,
0466   rtems_record_data   data_1,
0467   rtems_record_data   data_2,
0468   rtems_record_data   data_3,
0469   rtems_record_data   data_4,
0470   rtems_record_data   data_5,
0471   rtems_record_data   data_6,
0472   rtems_record_data   data_7,
0473   rtems_record_data   data_8
0474 );
0475 
0476 void _Record_Exit_10(
0477   void               *return_address,
0478   rtems_record_event  event,
0479   rtems_record_data   data_0,
0480   rtems_record_data   data_1,
0481   rtems_record_data   data_2,
0482   rtems_record_data   data_3,
0483   rtems_record_data   data_4,
0484   rtems_record_data   data_5,
0485   rtems_record_data   data_6,
0486   rtems_record_data   data_7,
0487   rtems_record_data   data_8,
0488   rtems_record_data   data_9
0489 );
0490 
0491 /**
0492  * @addtogroup RTEMSRecord
0493  *
0494  * @{
0495  */
0496 
0497 /**
0498  * @brief Prepares to add and commit record items in a critical section with
0499  * interrupts disabled.
0500  *
0501  * This function does not disable interrupts.  It must be called with
0502  * interrupts disabled.  Interrupts must be disabled until the corresponding
0503  * rtems_record_commit_critical() was called.
0504  *
0505  * @param context The record context which must be used for the following
0506  *   rtems_record_add() and rtems_record_commit_critical() calls.  The record
0507  *   context may have an arbitrary content at function entry.
0508  * @param cpu_self The control of the current processor.
0509  */
0510 static inline void rtems_record_prepare_critical(
0511   rtems_record_context  *context,
0512   const Per_CPU_Control *cpu_self
0513 )
0514 {
0515   Record_Control *control;
0516   unsigned int    head;
0517 
0518   context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
0519   control = cpu_self->record;
0520   context->control = control;
0521   head = _Record_Head( control );
0522   context->head = head;
0523 }
0524 
0525 /**
0526  * @brief Prepares to add and commit record items.
0527  *
0528  * This function disables interrupts.
0529  *
0530  * @param context The record context which must be used for the following
0531  *   rtems_record_add() and rtems_record_commit() calls.  The record context
0532  *   may have an arbitrary content at function entry.
0533  *
0534  * @see rtems_record_produce().
0535  */
0536 static inline void rtems_record_prepare( rtems_record_context *context )
0537 {
0538   uint32_t               level;
0539   const Per_CPU_Control *cpu_self;
0540   Record_Control        *control;
0541   unsigned int           head;
0542 
0543   _CPU_ISR_Disable( level );
0544   RTEMS_COMPILER_MEMORY_BARRIER();
0545   context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
0546   context->level = level;
0547   cpu_self = _Per_CPU_Get();
0548   control = cpu_self->record;
0549   context->control = control;
0550   head = _Record_Head( control );
0551   context->head = head;
0552 }
0553 
0554 /**
0555  * @brief Adds a record item.
0556  *
0557  * @param context The record context initialized via rtems_record_prepare().
0558  * @param event The record event without a time stamp for the item.
0559  * @param data The record data for the item.
0560  */
0561 static inline void rtems_record_add(
0562   rtems_record_context *context,
0563   rtems_record_event    event,
0564   rtems_record_data     data
0565 )
0566 {
0567   Record_Control    *control;
0568   rtems_record_item *item;
0569   unsigned int       head;
0570 
0571   control = context->control;
0572   head = context->head;
0573   item = &control->Items[ _Record_Index( control, head ) ];
0574   context->head = head + 1;
0575 
0576   item->event = context->now | event;
0577   item->data = data;
0578 }
0579 
0580 /**
0581  * @brief Commits a set of record items in a critical section with interrupts
0582  * disabled.
0583  *
0584  * @param context The record context initialized via
0585  *   rtems_record_prepare_critical().
0586  */
0587 static inline void rtems_record_commit_critical( rtems_record_context *context )
0588 {
0589   _Atomic_Store_uint(
0590     &context->control->head,
0591     context->head,
0592     ATOMIC_ORDER_RELEASE
0593   );
0594 }
0595 
0596 /**
0597  * @brief Commits a set of record items.
0598  *
0599  * @param context The record context initialized via rtems_record_prepare().
0600  */
0601 static inline void rtems_record_commit( rtems_record_context *context )
0602 {
0603   rtems_record_commit_critical( context );
0604   RTEMS_COMPILER_MEMORY_BARRIER();
0605   _CPU_ISR_Enable( context->level );
0606 }
0607 
0608 /**
0609  * @brief Produces a record item.
0610  *
0611  * @param event The record event without a time stamp for the item.
0612  * @param data The record data for the item.
0613  */
0614 void rtems_record_produce( rtems_record_event event, rtems_record_data data );
0615 
0616 /**
0617  * @brief Produces two record items.
0618  *
0619  * @param event_0 The record event without a time stamp for the first item.
0620  * @param data_0 The record data for the first item.
0621  * @param event_1 The record event without a time stamp for the second item.
0622  * @param data_1 The record data for the second item.
0623  */
0624 void rtems_record_produce_2(
0625   rtems_record_event event_0,
0626   rtems_record_data  data_0,
0627   rtems_record_event event_1,
0628   rtems_record_data  data_1
0629 );
0630 
0631 /**
0632  * @brief Produces n record items.
0633  *
0634  * @param item The record items without a time stamps.
0635  * @param n The count of record items.
0636  */
0637 void rtems_record_produce_n(
0638   const rtems_record_item *items,
0639   size_t                   n
0640 );
0641 
0642 /**
0643  * @brief Generates an RTEMS_RECORD_LINE event.
0644  *
0645  * The event data is the address of the call to this function.
0646  */
0647 void rtems_record_line( void );
0648 
0649 /**
0650  * @brief Generates an RTEMS_RECORD_LINE event and an extra event.
0651  *
0652  * The event data is the address of the call to this function.
0653  *
0654  * @param event The record event without a time stamp for the second item.
0655  * @param data The record data for the second item.
0656  */
0657 void rtems_record_line_2(
0658   rtems_record_event event,
0659   rtems_record_data  data
0660 );
0661 
0662 /**
0663  * @brief Generates an RTEMS_RECORD_LINE event and two extra events.
0664  *
0665  * The event data is the address of the call to this function.
0666  *
0667  * @param event_0 The record event without a time stamp for the second item.
0668  * @param data_0 The record data for the second item.
0669  * @param event_1 The record event without a time stamp for the third item.
0670  * @param data_1 The record data for the third item.
0671  */
0672 void rtems_record_line_3(
0673   rtems_record_event event_0,
0674   rtems_record_data  data_0,
0675   rtems_record_event event_1,
0676   rtems_record_data  data_1
0677 );
0678 
0679 /**
0680  * @brief Generates an RTEMS_RECORD_LINE event and one argument event.
0681  *
0682  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0683  * this function.
0684  *
0685  * @param data The RTEMS_RECORD_ARG_0 event data.
0686  */
0687 void rtems_record_line_arg( rtems_record_data data );
0688 
0689 /**
0690  * @brief Generates an RTEMS_RECORD_LINE event and two argument events.
0691  *
0692  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0693  * this function.
0694  *
0695  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0696  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0697  */
0698 void rtems_record_line_arg_2(
0699   rtems_record_data data_0,
0700   rtems_record_data data_1
0701 );
0702 
0703 /**
0704  * @brief Generates an RTEMS_RECORD_LINE event and three argument events.
0705  *
0706  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0707  * this function.
0708  *
0709  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0710  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0711  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0712  */
0713 void rtems_record_line_arg_3(
0714   rtems_record_data data_0,
0715   rtems_record_data data_1,
0716   rtems_record_data data_2
0717 );
0718 
0719 /**
0720  * @brief Generates an RTEMS_RECORD_LINE event and four argument events.
0721  *
0722  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0723  * this function.
0724  *
0725  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0726  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0727  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0728  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0729  */
0730 void rtems_record_line_arg_4(
0731   rtems_record_data data_0,
0732   rtems_record_data data_1,
0733   rtems_record_data data_2,
0734   rtems_record_data data_3
0735 );
0736 
0737 /**
0738  * @brief Generates an RTEMS_RECORD_LINE event and five argument events.
0739  *
0740  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0741  * this function.
0742  *
0743  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0744  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0745  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0746  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0747  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0748  */
0749 void rtems_record_line_arg_5(
0750   rtems_record_data data_0,
0751   rtems_record_data data_1,
0752   rtems_record_data data_2,
0753   rtems_record_data data_3,
0754   rtems_record_data data_4
0755 );
0756 
0757 /**
0758  * @brief Generates an RTEMS_RECORD_LINE event and six argument events.
0759  *
0760  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0761  * this function.
0762  *
0763  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0764  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0765  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0766  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0767  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0768  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
0769  */
0770 void rtems_record_line_arg_6(
0771   rtems_record_data data_0,
0772   rtems_record_data data_1,
0773   rtems_record_data data_2,
0774   rtems_record_data data_3,
0775   rtems_record_data data_4,
0776   rtems_record_data data_5
0777 );
0778 
0779 /**
0780  * @brief Generates an RTEMS_RECORD_LINE event and seven argument events.
0781  *
0782  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0783  * this function.
0784  *
0785  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0786  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0787  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0788  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0789  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0790  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
0791  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
0792  */
0793 void rtems_record_line_arg_7(
0794   rtems_record_data data_0,
0795   rtems_record_data data_1,
0796   rtems_record_data data_2,
0797   rtems_record_data data_3,
0798   rtems_record_data data_4,
0799   rtems_record_data data_5,
0800   rtems_record_data data_6
0801 );
0802 
0803 /**
0804  * @brief Generates an RTEMS_RECORD_LINE event and eight argument events.
0805  *
0806  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0807  * this function.
0808  *
0809  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0810  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0811  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0812  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0813  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0814  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
0815  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
0816  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
0817  */
0818 void rtems_record_line_arg_8(
0819   rtems_record_data data_0,
0820   rtems_record_data data_1,
0821   rtems_record_data data_2,
0822   rtems_record_data data_3,
0823   rtems_record_data data_4,
0824   rtems_record_data data_5,
0825   rtems_record_data data_6,
0826   rtems_record_data data_7
0827 );
0828 
0829 /**
0830  * @brief Generates an RTEMS_RECORD_LINE event and nine argument events.
0831  *
0832  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0833  * this function.
0834  *
0835  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0836  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0837  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0838  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0839  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0840  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
0841  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
0842  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
0843  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
0844  */
0845 void rtems_record_line_arg_9(
0846   rtems_record_data data_0,
0847   rtems_record_data data_1,
0848   rtems_record_data data_2,
0849   rtems_record_data data_3,
0850   rtems_record_data data_4,
0851   rtems_record_data data_5,
0852   rtems_record_data data_6,
0853   rtems_record_data data_7,
0854   rtems_record_data data_8
0855 );
0856 
0857 /**
0858  * @brief Generates an RTEMS_RECORD_LINE event and ten argument events.
0859  *
0860  * The event data of the RTEMS_RECORD_LINE event is the address of the call to
0861  * this function.
0862  *
0863  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0864  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0865  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0866  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
0867  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
0868  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
0869  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
0870  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
0871  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
0872  * @param data_9 The RTEMS_RECORD_ARG_9 event data.
0873  */
0874 void rtems_record_line_arg_10(
0875   rtems_record_data data_0,
0876   rtems_record_data data_1,
0877   rtems_record_data data_2,
0878   rtems_record_data data_3,
0879   rtems_record_data data_4,
0880   rtems_record_data data_5,
0881   rtems_record_data data_6,
0882   rtems_record_data data_7,
0883   rtems_record_data data_8,
0884   rtems_record_data data_9
0885 );
0886 
0887 /**
0888  * @brief Generates an RTEMS_RECORD_CALLER and an RTEMS_RECORD_LINE event.
0889  *
0890  * The RTEMS_RECORD_CALLER event data is the return address of the function
0891  * calling rtems_record_caller().
0892  *
0893  * The RTEMS_RECORD_LINE event data is the address of the call to
0894  * rtems_record_caller().
0895  */
0896 #define rtems_record_caller() _Record_Caller( RTEMS_RETURN_ADDRESS() )
0897 
0898 /**
0899  * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and an
0900  * extra event.
0901  *
0902  * The RTEMS_RECORD_CALLER event data is the return address of the function
0903  * calling rtems_record_caller_3().
0904  *
0905  * The RTEMS_RECORD_LINE event data is the address of the call to
0906  * rtems_record_caller_3().
0907  *
0908  * @param event The record event without a time stamp for the third item.
0909  * @param data The record data for the third item.
0910  */
0911 #define rtems_record_caller_3( event, data ) \
0912   _Record_Caller_3( RTEMS_RETURN_ADDRESS(), event, data )
0913 
0914 /**
0915  * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and two
0916  * extra events.
0917  *
0918  * The RTEMS_RECORD_CALLER event data is the return address of the function
0919  * calling rtems_record_caller_4().
0920  *
0921  * The RTEMS_RECORD_LINE event data is the address of the call to
0922  * rtems_record_caller_4().
0923  *
0924  * @param event_0 The record event without a time stamp for the third item.
0925  * @param data_0 The record data for the third item.
0926  * @param event_1 The record event without a time stamp for the fourth item.
0927  * @param data_1 The record data for the fourth item.
0928  */
0929 #define rtems_record_caller_4( event_0, data_0, event_1, data_1 ) \
0930   _Record_Caller_4( \
0931     RTEMS_RETURN_ADDRESS(), \
0932     event_0, \
0933     data_0, \
0934     event_1, \
0935     data_1 \
0936   )
0937 
0938 /**
0939  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
0940  * and one argument event.
0941  *
0942  * The RTEMS_RECORD_CALLER event data is the return address of the function
0943  * calling rtems_record_caller_arg().
0944  *
0945  * The RTEMS_RECORD_LINE event data is the address of the call to
0946  * rtems_record_caller_arg().
0947  *
0948  * @param data The RTEMS_RECORD_ARG_0 event data.
0949  */
0950 #define rtems_record_caller_arg( data ) \
0951   _Record_Caller_arg( RTEMS_RETURN_ADDRESS(), data )
0952 
0953 /**
0954  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
0955  * and two argument events.
0956  *
0957  * The RTEMS_RECORD_CALLER event data is the return address of the function
0958  * calling rtems_record_caller_arg_2().
0959  *
0960  * The RTEMS_RECORD_LINE event data is the address of the call to
0961  * rtems_record_caller_arg_2().
0962  *
0963  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0964  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0965  */
0966 #define rtems_record_caller_arg_2( data_0, data_1 ) \
0967   _Record_Caller_arg_2( \
0968     RTEMS_RETURN_ADDRESS(), \
0969     data_0, \
0970     data_1 \
0971   )
0972 
0973 /**
0974  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
0975  * and three argument events.
0976  *
0977  * The RTEMS_RECORD_CALLER event data is the return address of the function
0978  * calling rtems_record_caller_arg_3().
0979  *
0980  * The RTEMS_RECORD_LINE event data is the address of the call to
0981  * rtems_record_caller_arg_3().
0982  *
0983  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
0984  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
0985  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
0986  */
0987 #define rtems_record_caller_arg_3( data_0, data_1, data_2 ) \
0988   _Record_Caller_arg_3( \
0989     RTEMS_RETURN_ADDRESS(), \
0990     data_0, \
0991     data_1, \
0992     data_2 \
0993   )
0994 
0995 /**
0996  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
0997  * and four argument events.
0998  *
0999  * The RTEMS_RECORD_CALLER event data is the return address of the function
1000  * calling rtems_record_caller_arg_4().
1001  *
1002  * The RTEMS_RECORD_LINE event data is the address of the call to
1003  * rtems_record_caller_arg_4().
1004  *
1005  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1006  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1007  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1008  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1009  */
1010 #define rtems_record_caller_arg_4( data_0, data_1, data_2, data_3 ) \
1011   _Record_Caller_arg_4( \
1012     RTEMS_RETURN_ADDRESS(), \
1013     data_0, \
1014     data_1, \
1015     data_2, \
1016     data_3 \
1017   )
1018 
1019 /**
1020  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1021  * and five argument events.
1022  *
1023  * The RTEMS_RECORD_CALLER event data is the return address of the function
1024  * calling rtems_record_caller_arg_5().
1025  *
1026  * The RTEMS_RECORD_LINE event data is the address of the call to
1027  * rtems_record_caller_arg_5().
1028  *
1029  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1030  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1031  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1032  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1033  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1034  */
1035 #define rtems_record_caller_arg_5( data_0, data_1, data_2, data_3, data_4 ) \
1036   _Record_Caller_arg_5( \
1037     RTEMS_RETURN_ADDRESS(), \
1038     data_0, \
1039     data_1, \
1040     data_2, \
1041     data_3, \
1042     data_4 \
1043   )
1044 
1045 /**
1046  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1047  * and six argument events.
1048  *
1049  * The RTEMS_RECORD_CALLER event data is the return address of the function
1050  * calling rtems_record_caller_arg_6().
1051  *
1052  * The RTEMS_RECORD_LINE event data is the address of the call to
1053  * rtems_record_caller_arg_6().
1054  *
1055  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1056  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1057  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1058  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1059  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1060  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1061  */
1062 #define rtems_record_caller_arg_6( \
1063   data_0, \
1064   data_1, \
1065   data_2, \
1066   data_3, \
1067   data_4, \
1068   data_5 \
1069 ) \
1070   _Record_Caller_arg_6( \
1071     RTEMS_RETURN_ADDRESS(), \
1072     data_0, \
1073     data_1, \
1074     data_2, \
1075     data_3, \
1076     data_4, \
1077     data_5 \
1078   )
1079 
1080 /**
1081  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1082  * and seven argument events.
1083  *
1084  * The RTEMS_RECORD_CALLER event data is the return address of the function
1085  * calling rtems_record_caller_arg_7().
1086  *
1087  * The RTEMS_RECORD_LINE event data is the address of the call to
1088  * rtems_record_caller_arg_7().
1089  *
1090  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1091  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1092  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1093  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1094  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1095  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1096  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1097  */
1098 #define rtems_record_caller_arg_7( \
1099   data_0, \
1100   data_1, \
1101   data_2, \
1102   data_3, \
1103   data_4, \
1104   data_5, \
1105   data_6 \
1106 ) \
1107   _Record_Caller_arg_7( \
1108     RTEMS_RETURN_ADDRESS(), \
1109     data_0, \
1110     data_1, \
1111     data_2, \
1112     data_3, \
1113     data_4, \
1114     data_5, \
1115     data_6 \
1116   )
1117 
1118 /**
1119  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1120  * and eight argument events.
1121  *
1122  * The RTEMS_RECORD_CALLER event data is the return address of the function
1123  * calling rtems_record_caller_arg_8().
1124  *
1125  * The RTEMS_RECORD_LINE event data is the address of the call to
1126  * rtems_record_caller_arg_8().
1127  *
1128  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1129  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1130  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1131  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1132  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1133  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1134  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1135  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1136  */
1137 #define rtems_record_caller_arg_8( \
1138   data_0, \
1139   data_1, \
1140   data_2, \
1141   data_3, \
1142   data_4, \
1143   data_5, \
1144   data_6, \
1145   data_7 \
1146 ) \
1147   _Record_Caller_arg_8( \
1148     RTEMS_RETURN_ADDRESS(), \
1149     data_0, \
1150     data_1, \
1151     data_2, \
1152     data_3, \
1153     data_4, \
1154     data_5, \
1155     data_6, \
1156     data_7 \
1157   )
1158 
1159 /**
1160  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1161  * and nine argument events.
1162  *
1163  * The RTEMS_RECORD_CALLER event data is the return address of the function
1164  * calling rtems_record_caller_arg_9().
1165  *
1166  * The RTEMS_RECORD_LINE event data is the address of the call to
1167  * rtems_record_caller_arg_9().
1168  *
1169  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1170  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1171  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1172  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1173  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1174  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1175  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1176  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1177  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1178  */
1179 #define rtems_record_caller_arg_9( \
1180   data_0, \
1181   data_1, \
1182   data_2, \
1183   data_3, \
1184   data_4, \
1185   data_5, \
1186   data_6, \
1187   data_7, \
1188   data_8 \
1189 ) \
1190   _Record_Caller_arg_9( \
1191     RTEMS_RETURN_ADDRESS(), \
1192     data_0, \
1193     data_1, \
1194     data_2, \
1195     data_3, \
1196     data_4, \
1197     data_5, \
1198     data_6, \
1199     data_7, \
1200     data_8 \
1201   )
1202 
1203 /**
1204  * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event,
1205  * and ten argument events.
1206  *
1207  * The RTEMS_RECORD_CALLER event data is the return address of the function
1208  * calling rtems_record_caller_arg_10().
1209  *
1210  * The RTEMS_RECORD_LINE event data is the address of the call to
1211  * rtems_record_caller_arg_10().
1212  *
1213  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1214  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1215  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1216  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1217  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1218  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1219  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1220  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1221  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1222  * @param data_10 The RTEMS_RECORD_ARG_10 event data.
1223  */
1224 #define rtems_record_caller_arg_10( \
1225   data_0, \
1226   data_1, \
1227   data_2, \
1228   data_3, \
1229   data_4, \
1230   data_5, \
1231   data_6, \
1232   data_7, \
1233   data_8, \
1234   data_9 \
1235 ) \
1236   _Record_Caller_arg_10( \
1237     RTEMS_RETURN_ADDRESS(), \
1238     data_0, \
1239     data_1, \
1240     data_2, \
1241     data_3, \
1242     data_4, \
1243     data_5, \
1244     data_6, \
1245     data_7, \
1246     data_8, \
1247     data_9 \
1248   )
1249 
1250 /**
1251  * @brief Generates the specified entry event.
1252  *
1253  * The event data of the specified entry event is the return address of the
1254  * function calling rtems_record_entry().
1255  *
1256  * @param event The entry event.
1257  */
1258 #define rtems_record_entry( event ) \
1259   rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1260 
1261 /**
1262  * @brief Generates the specified entry event and an argument event.
1263  *
1264  * The event data of the specified entry event is the return address of the
1265  * function calling rtems_record_entry_1().
1266  *
1267  * @param event The entry event.
1268  * @param data The RTEMS_RECORD_ARG_0 event data.
1269  */
1270 #define rtems_record_entry_1( event, data ) \
1271   rtems_record_produce_2( \
1272     event, \
1273     (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1274     RTEMS_RECORD_ARG_0, \
1275     data \
1276   )
1277 
1278 /**
1279  * @brief Generates the specified entry event and two argument events.
1280  *
1281  * The event data of the specified entry event is the return address of the
1282  * function calling rtems_record_entry_2().
1283  *
1284  * @param event The entry event.
1285  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1286  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1287  */
1288 #define rtems_record_entry_2( event, data_0, data_1 ) \
1289   _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1290 
1291 /**
1292  * @brief Generates the specified entry event and three argument events.
1293  *
1294  * The event data of the specified entry event is the return address of the
1295  * function calling rtems_record_entry_3().
1296  *
1297  * @param event The entry event.
1298  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1299  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1300  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1301  */
1302 #define rtems_record_entry_3( event, data_0, data_1, data_2 ) \
1303   _Record_Entry_3( \
1304     RTEMS_RETURN_ADDRESS(), \
1305     event, \
1306     data_0, \
1307     data_1, \
1308     data_2 \
1309   )
1310 
1311 /**
1312  * @brief Generates the specified entry event and four argument events.
1313  *
1314  * The event data of the specified entry event is the return address of the
1315  * function calling rtems_record_entry_4().
1316  *
1317  * @param event The entry event.
1318  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1319  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1320  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1321  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1322  */
1323 #define rtems_record_entry_4( event, data_0, data_1, data_2, data_3 ) \
1324   _Record_Entry_4( \
1325     RTEMS_RETURN_ADDRESS(), \
1326     event, \
1327     data_0, \
1328     data_1, \
1329     data_2, \
1330     data_3 \
1331   )
1332 
1333 /**
1334  * @brief Generates the specified entry event and five argument events.
1335  *
1336  * The event data of the specified entry event is the return address of the
1337  * function calling rtems_record_entry_5().
1338  *
1339  * @param event The entry event.
1340  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1341  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1342  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1343  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1344  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1345  */
1346 #define rtems_record_entry_5( \
1347   event, \
1348   data_0, \
1349   data_1, \
1350   data_2, \
1351   data_3, \
1352   data_4 \
1353 ) \
1354   _Record_Entry_5( \
1355     RTEMS_RETURN_ADDRESS(), \
1356     event, \
1357     data_0, \
1358     data_1, \
1359     data_2, \
1360     data_3, \
1361     data_4 \
1362   )
1363 
1364 /**
1365  * @brief Generates the specified entry event and six argument events.
1366  *
1367  * The event data of the specified entry event is the return address of the
1368  * function calling rtems_record_entry_6().
1369  *
1370  * @param event The entry event.
1371  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1372  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1373  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1374  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1375  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1376  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1377  */
1378 #define rtems_record_entry_6( \
1379   event, \
1380   data_0, \
1381   data_1, \
1382   data_2, \
1383   data_3, \
1384   data_4, \
1385   data_5 \
1386 ) \
1387   _Record_Entry_6( \
1388     RTEMS_RETURN_ADDRESS(), \
1389     event, \
1390     data_0, \
1391     data_1, \
1392     data_2, \
1393     data_3, \
1394     data_4, \
1395     data_5 \
1396   )
1397 
1398 /**
1399  * @brief Generates the specified entry event and seven argument events.
1400  *
1401  * The event data of the specified entry event is the return address of the
1402  * function calling rtems_record_entry_7().
1403  *
1404  * @param event The entry event.
1405  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1406  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1407  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1408  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1409  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1410  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1411  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1412  */
1413 #define rtems_record_entry_7( \
1414   event, \
1415   data_0, \
1416   data_1, \
1417   data_2, \
1418   data_3, \
1419   data_4, \
1420   data_5, \
1421   data_6 \
1422 ) \
1423   _Record_Entry_7( \
1424     RTEMS_RETURN_ADDRESS(), \
1425     event, \
1426     data_0, \
1427     data_1, \
1428     data_2, \
1429     data_3, \
1430     data_4, \
1431     data_5, \
1432     data_6 \
1433   )
1434 
1435 /**
1436  * @brief Generates the specified entry event and eight argument events.
1437  *
1438  * The event data of the specified entry event is the return address of the
1439  * function calling rtems_record_entry_8().
1440  *
1441  * @param event The entry event.
1442  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1443  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1444  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1445  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1446  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1447  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1448  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1449  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1450  */
1451 #define rtems_record_entry_8( \
1452   event, \
1453   data_0, \
1454   data_1, \
1455   data_2, \
1456   data_3, \
1457   data_4, \
1458   data_5, \
1459   data_6, \
1460   data_7 \
1461 ) \
1462   _Record_Entry_8( \
1463     RTEMS_RETURN_ADDRESS(), \
1464     event, \
1465     data_0, \
1466     data_1, \
1467     data_2, \
1468     data_3, \
1469     data_4, \
1470     data_5, \
1471     data_6, \
1472     data_7 \
1473   )
1474 
1475 /**
1476  * @brief Generates the specified entry event and nine argument events.
1477  *
1478  * The event data of the specified entry event is the return address of the
1479  * function calling rtems_record_entry_9().
1480  *
1481  * @param event The entry event.
1482  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1483  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1484  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1485  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1486  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1487  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1488  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1489  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1490  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1491  */
1492 #define rtems_record_entry_9( \
1493   event, \
1494   data_0, \
1495   data_1, \
1496   data_2, \
1497   data_3, \
1498   data_4, \
1499   data_5, \
1500   data_6, \
1501   data_7, \
1502   data_8 \
1503 ) \
1504   _Record_Entry_9( \
1505     RTEMS_RETURN_ADDRESS(), \
1506     event, \
1507     data_0, \
1508     data_1, \
1509     data_2, \
1510     data_3, \
1511     data_4, \
1512     data_5, \
1513     data_6, \
1514     data_7, \
1515     data_8 \
1516   )
1517 
1518 /**
1519  * @brief Generates the specified entry event and ten argument events.
1520  *
1521  * The event data of the specified entry event is the return address of the function
1522  * calling rtems_record_entry_10().
1523  *
1524  * @param event The entry event.
1525  * @param data_0 The RTEMS_RECORD_ARG_0 event data.
1526  * @param data_1 The RTEMS_RECORD_ARG_1 event data.
1527  * @param data_2 The RTEMS_RECORD_ARG_2 event data.
1528  * @param data_3 The RTEMS_RECORD_ARG_3 event data.
1529  * @param data_4 The RTEMS_RECORD_ARG_4 event data.
1530  * @param data_5 The RTEMS_RECORD_ARG_5 event data.
1531  * @param data_6 The RTEMS_RECORD_ARG_6 event data.
1532  * @param data_7 The RTEMS_RECORD_ARG_7 event data.
1533  * @param data_8 The RTEMS_RECORD_ARG_8 event data.
1534  * @param data_10 The RTEMS_RECORD_ARG_10 event data.
1535  */
1536 #define rtems_record_entry_10( \
1537   event, \
1538   data_0, \
1539   data_1, \
1540   data_2, \
1541   data_3, \
1542   data_4, \
1543   data_5, \
1544   data_6, \
1545   data_7, \
1546   data_8, \
1547   data_9 \
1548 ) \
1549   _Record_Entry_10( \
1550     RTEMS_RETURN_ADDRESS(), \
1551     event, \
1552     data_0, \
1553     data_1, \
1554     data_2, \
1555     data_3, \
1556     data_4, \
1557     data_5, \
1558     data_6, \
1559     data_7, \
1560     data_8, \
1561     data_9 \
1562   )
1563 
1564 /**
1565  * @brief Generates the specified exit event.
1566  *
1567  * The event data of the specified exit event is the return address of the
1568  * function calling rtems_record_exit().
1569  *
1570  * @param event The exit event.
1571  */
1572 #define rtems_record_exit( event ) \
1573   rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1574 
1575 /**
1576  * @brief Generates the specified exit event and a return event.
1577  *
1578  * The event data of the specified exit event is the return address of the
1579  * function calling rtems_record_exit_1().
1580  *
1581  * @param event The exit event.
1582  * @param data The RTEMS_RECORD_RETURN_0 event data.
1583  */
1584 #define rtems_record_exit_1( event, data ) \
1585   rtems_record_produce_2( \
1586     event, \
1587     (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1588     RTEMS_RECORD_RETURN_0, \
1589     data \
1590   )
1591 
1592 /**
1593  * @brief Generates the specified exit event and two argument events.
1594  *
1595  * The event data of the specified exit event is the return address of the
1596  * function calling rtems_record_exit_2().
1597  *
1598  * @param event The exit event.
1599  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1600  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1601  */
1602 #define rtems_record_exit_2( event, data_0, data_1 ) \
1603   _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1604 
1605 /**
1606  * @brief Generates the specified exit event and three argument events.
1607  *
1608  * The event data of the specified exit event is the return address of the
1609  * function calling rtems_record_exit_3().
1610  *
1611  * @param event The exit event.
1612  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1613  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1614  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1615  */
1616 #define rtems_record_exit_3( event, data_0, data_1, data_2 ) \
1617   _Record_Exit_3( \
1618     RTEMS_RETURN_ADDRESS(), \
1619     event, \
1620     data_0, \
1621     data_1, \
1622     data_2 \
1623   )
1624 
1625 /**
1626  * @brief Generates the specified exit event and four argument events.
1627  *
1628  * The event data of the specified exit event is the return address of the
1629  * function calling rtems_record_exit_4().
1630  *
1631  * @param event The exit event.
1632  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1633  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1634  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1635  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1636  */
1637 #define rtems_record_exit_4( event, data_0, data_1, data_2, data_3 ) \
1638   _Record_Exit_4( \
1639     RTEMS_RETURN_ADDRESS(), \
1640     event, \
1641     data_0, \
1642     data_1, \
1643     data_2, \
1644     data_3 \
1645   )
1646 
1647 /**
1648  * @brief Generates the specified exit event and five argument events.
1649  *
1650  * The event data of the specified exit event is the return address of the
1651  * function calling rtems_record_exit_5().
1652  *
1653  * @param event The exit event.
1654  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1655  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1656  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1657  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1658  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1659  */
1660 #define rtems_record_exit_5( \
1661   event, \
1662   data_0, \
1663   data_1, \
1664   data_2, \
1665   data_3, \
1666   data_4 \
1667 ) \
1668   _Record_Exit_5( \
1669     RTEMS_RETURN_ADDRESS(), \
1670     event, \
1671     data_0, \
1672     data_1, \
1673     data_2, \
1674     data_3, \
1675     data_4 \
1676   )
1677 
1678 /**
1679  * @brief Generates the specified exit event and six argument events.
1680  *
1681  * The event data of the specified exit event is the return address of the
1682  * function calling rtems_record_exit_6().
1683  *
1684  * @param event The exit event.
1685  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1686  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1687  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1688  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1689  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1690  * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1691  */
1692 #define rtems_record_exit_6( \
1693   event, \
1694   data_0, \
1695   data_1, \
1696   data_2, \
1697   data_3, \
1698   data_4, \
1699   data_5 \
1700 ) \
1701   _Record_Exit_6( \
1702     RTEMS_RETURN_ADDRESS(), \
1703     event, \
1704     data_0, \
1705     data_1, \
1706     data_2, \
1707     data_3, \
1708     data_4, \
1709     data_5 \
1710   )
1711 
1712 /**
1713  * @brief Generates the specified exit event and seven argument events.
1714  *
1715  * The event data of the specified exit event is the return address of the
1716  * function calling rtems_record_exit_7().
1717  *
1718  * @param event The exit event.
1719  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1720  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1721  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1722  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1723  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1724  * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1725  * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1726  */
1727 #define rtems_record_exit_7( \
1728   event, \
1729   data_0, \
1730   data_1, \
1731   data_2, \
1732   data_3, \
1733   data_4, \
1734   data_5, \
1735   data_6 \
1736 ) \
1737   _Record_Exit_7( \
1738     RTEMS_RETURN_ADDRESS(), \
1739     event, \
1740     data_0, \
1741     data_1, \
1742     data_2, \
1743     data_3, \
1744     data_4, \
1745     data_5, \
1746     data_6 \
1747   )
1748 
1749 /**
1750  * @brief Generates the specified exit event and eight argument events.
1751  *
1752  * The event data of the specified exit event is the return address of the
1753  * function calling rtems_record_exit_8().
1754  *
1755  * @param event The exit event.
1756  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1757  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1758  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1759  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1760  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1761  * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1762  * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1763  * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1764  */
1765 #define rtems_record_exit_8( \
1766   event, \
1767   data_0, \
1768   data_1, \
1769   data_2, \
1770   data_3, \
1771   data_4, \
1772   data_5, \
1773   data_6, \
1774   data_7 \
1775 ) \
1776   _Record_Exit_8( \
1777     RTEMS_RETURN_ADDRESS(), \
1778     event, \
1779     data_0, \
1780     data_1, \
1781     data_2, \
1782     data_3, \
1783     data_4, \
1784     data_5, \
1785     data_6, \
1786     data_7 \
1787   )
1788 
1789 /**
1790  * @brief Generates the specified exit event and nine argument events.
1791  *
1792  * The event data of the specified exit event is the return address of the
1793  * function calling rtems_record_exit_9().
1794  *
1795  * @param event The exit event.
1796  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1797  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1798  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1799  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1800  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1801  * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1802  * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1803  * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1804  * @param data_8 The RTEMS_RECORD_RETURN_8 event data.
1805  */
1806 #define rtems_record_exit_9( \
1807   event, \
1808   data_0, \
1809   data_1, \
1810   data_2, \
1811   data_3, \
1812   data_4, \
1813   data_5, \
1814   data_6, \
1815   data_7, \
1816   data_8 \
1817 ) \
1818   _Record_Exit_9( \
1819     RTEMS_RETURN_ADDRESS(), \
1820     event, \
1821     data_0, \
1822     data_1, \
1823     data_2, \
1824     data_3, \
1825     data_4, \
1826     data_5, \
1827     data_6, \
1828     data_7, \
1829     data_8 \
1830   )
1831 
1832 /**
1833  * @brief Generates the specified exit event and ten argument events.
1834  *
1835  * The event data of the specified exit event is the return address of the function
1836  * calling rtems_record_exit_10().
1837  *
1838  * @param event The exit event.
1839  * @param data_0 The RTEMS_RECORD_RETURN_0 event data.
1840  * @param data_1 The RTEMS_RECORD_RETURN_1 event data.
1841  * @param data_2 The RTEMS_RECORD_RETURN_2 event data.
1842  * @param data_3 The RTEMS_RECORD_RETURN_3 event data.
1843  * @param data_4 The RTEMS_RECORD_RETURN_4 event data.
1844  * @param data_5 The RTEMS_RECORD_RETURN_5 event data.
1845  * @param data_6 The RTEMS_RECORD_RETURN_6 event data.
1846  * @param data_7 The RTEMS_RECORD_RETURN_7 event data.
1847  * @param data_8 The RTEMS_RECORD_RETURN_8 event data.
1848  * @param data_10 The RTEMS_RECORD_RETURN_10 event data.
1849  */
1850 #define rtems_record_exit_10( \
1851   event, \
1852   data_0, \
1853   data_1, \
1854   data_2, \
1855   data_3, \
1856   data_4, \
1857   data_5, \
1858   data_6, \
1859   data_7, \
1860   data_8, \
1861   data_9 \
1862 ) \
1863   _Record_Exit_10( \
1864     RTEMS_RETURN_ADDRESS(), \
1865     event, \
1866     data_0, \
1867     data_1, \
1868     data_2, \
1869     data_3, \
1870     data_4, \
1871     data_5, \
1872     data_6, \
1873     data_7, \
1874     data_8, \
1875     data_9 \
1876   )
1877 
1878 /**
1879  * @brief Disables interrupts and generates an RTEMS_RECORD_ISR_DISABLE event.
1880  *
1881  * @return The previous interrupt level.
1882  */
1883 uint32_t rtems_record_interrupt_disable( void );
1884 
1885 /**
1886  * @brief Restores the previous interrupt level and generates an
1887  *   RTEMS_RECORD_ISR_ENABLE event.
1888  *
1889  * @param level The previous interrupt level.  Must be the return value of the
1890  *   corresponding rtems_record_interrupt_disable().
1891  */
1892 void rtems_record_interrupt_enable( uint32_t level );
1893 
1894 /**
1895  * @brief This structure controls the record fetching performed by rtems_record_fetch().
1896  *
1897  * The structure shall be initialized by rtems_record_fetch_initialize().
1898  */
1899 typedef struct {
1900   /**
1901    * @brief This member references the first item fetched by the last call to
1902    *   rtems_record_fetch().
1903    */
1904   rtems_record_item *fetched_items;
1905 
1906   /**
1907    * @brief This member contains the count of items fetched by the last call to
1908    *   rtems_record_fetch().
1909    */
1910   size_t fetched_count;
1911 
1912   /**
1913    * @brief The following members should only be accessed by
1914    *   rtems_record_fetch_initialize() and rtems_record_fetch().
1915    */
1916   struct {
1917 #ifdef RTEMS_SMP
1918     /**
1919      * @brief This member contains the index of the processor from which the next
1920      *   records are fetched.
1921      */
1922     uint32_t cpu_index;
1923 #endif
1924 
1925     /**
1926      * @brief This member contains the count of records which need to be fetched
1927      *   from the current processor before the next processor is selected.
1928      */
1929     size_t cpu_todo;
1930 
1931     /**
1932      * @brief This member references the item array used to store fetched items.
1933      */
1934     rtems_record_item *storage_items;
1935 
1936     /**
1937      * @brief This member contains the count of items of the array referenced by
1938      *   ``storage_items``.
1939      */
1940     size_t storage_item_count;
1941   } internal;
1942 } rtems_record_fetch_control;
1943 
1944 /**
1945  * @brief This enumeration provides status codes returned by
1946  *   rtems_record_fetch().
1947  */
1948 typedef enum {
1949   /**
1950    * @brief This enumerator indicates that the current round of record fetches
1951    *   for all configure processors is done.
1952    */
1953   RTEMS_RECORD_FETCH_DONE,
1954 
1955   /**
1956    * @brief This enumerator indicates that the current round of record fetches
1957    *   for all configure processors has to continue.
1958    */
1959   RTEMS_RECORD_FETCH_CONTINUE,
1960 
1961   /**
1962    * @brief This enumerator indicates that the item count passed to
1963    *   rtems_record_fetch() is invalid.
1964    */
1965   RTEMS_RECORD_FETCH_INVALID_ITEM_COUNT
1966 } rtems_record_fetch_status;
1967 
1968 /**
1969  * @brief Returns the count of items which allows getting all available items
1970  *   for one processor through one call to rtems_record_fetch().
1971  *
1972  * The value depends on @ref CONFIGURE_RECORD_PER_PROCESSOR_ITEMS and
1973  * implementation details fo rtems_record_fetch().
1974  */
1975 size_t rtems_record_get_item_count_for_fetch( void );
1976 
1977 /**
1978  * @brief Initializes the record fetch control structure.
1979  *
1980  * This function shall be called before a record fetch control structure is
1981  * passed to rtems_record_fetch().
1982  *
1983  * @param[out] control is the structure to initialize.
1984  *
1985  * @param[out] items is a reference to an item array which is used to store the
1986  *   fetched items.
1987  *
1988  * @param count is the count of items in the referenced array.  See
1989  *   rtems_record_get_item_count_for_fetch().
1990  */
1991 void rtems_record_fetch_initialize(
1992   rtems_record_fetch_control *control,
1993   rtems_record_item          *items,
1994   size_t                      count
1995 );
1996 
1997 /**
1998  * @brief Fetches records from the record buffers of the processors.
1999  *
2000  * The fetched items and count of fetched items is returned through the control
2001  * structure.
2002  *
2003  * @param[in, out] control is the structure used to control the record
2004  *   fetching.  Use rtems_record_fetch_initialize() to initialize it before the
2005  *   first call to rtems_record_fetch().
2006  *
2007  * @retval RTEMS_RECORD_FETCH_DONE This return status indicates that the
2008  *   current round of record fetches for all configure processors is done.
2009  *
2010  * @retval RTEMS_RECORD_FETCH_CONTINUE This return status indicates that the
2011  *   current round of record fetches for all configure processors has to
2012  *   continue.
2013  *
2014  * @retval RTEMS_RECORD_FETCH_INVALID_ITEM_COUNT This return status indicates
2015  *   that the specified item count was invalid.
2016  */
2017 rtems_record_fetch_status rtems_record_fetch(
2018   rtems_record_fetch_control *control
2019 );
2020 
2021 /** @} */
2022 
2023 #ifdef __cplusplus
2024 }
2025 #endif /* __cplusplus */
2026 
2027 #endif /* _RTEMS_RECORD_H */