/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de) * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _RTEMS_RECORD_H #define _RTEMS_RECORD_H #include "recorddata.h" #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct Record_Control { Atomic_Uint head; unsigned int tail; unsigned int mask; Watchdog_Control Watchdog; rtems_record_item Header[ 3 ]; RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES ) rtems_record_item Items[ RTEMS_ZERO_LENGTH_ARRAY ]; } Record_Control; typedef struct { unsigned int item_count; Record_Control *controls; } Record_Configuration; typedef struct { Record_Control *control; unsigned int head; uint32_t now; uint32_t level; } rtems_record_context; extern const Record_Configuration _Record_Configuration; void _Record_Initialize( void ); bool _Record_Thread_create( struct _Thread_Control *executing, struct _Thread_Control *created ); void _Record_Thread_start( struct _Thread_Control *executing, struct _Thread_Control *started ); void _Record_Thread_restart( struct _Thread_Control *executing, struct _Thread_Control *restarted ); void _Record_Thread_delete( struct _Thread_Control *executing, struct _Thread_Control *deleted ); void _Record_Thread_switch( struct _Thread_Control *executing, struct _Thread_Control *heir ); void _Record_Thread_begin( struct _Thread_Control *executing ); void _Record_Thread_exitted( struct _Thread_Control *executing ); void _Record_Fatal_dump_base64( Internal_errors_Source source, bool always_set_to_false, Internal_errors_t code ); void _Record_Fatal_dump_base64_zlib( Internal_errors_Source source, bool always_set_to_false, Internal_errors_t code ); void _Record_Thread_terminate( struct _Thread_Control *executing ); RTEMS_INLINE_ROUTINE unsigned int _Record_Index( const Record_Control *control, unsigned int index ) { return index & control->mask; } RTEMS_INLINE_ROUTINE unsigned int _Record_Head( const Record_Control *control ) { return _Atomic_Load_uint( &control->head, ATOMIC_ORDER_RELAXED ); } RTEMS_INLINE_ROUTINE unsigned int _Record_Tail( const Record_Control *control ) { return control->tail; } RTEMS_INLINE_ROUTINE bool _Record_Is_overflow( const Record_Control *control, unsigned int tail, unsigned int head ) { return head - tail >= control->mask + 1U; } RTEMS_INLINE_ROUTINE unsigned int _Record_Capacity( const Record_Control *control, unsigned int tail, unsigned int head ) { return ( tail - head - 1U ) & control->mask; } RTEMS_INLINE_ROUTINE rtems_counter_ticks _Record_Now( void ) { return rtems_counter_read(); } typedef struct RTEMS_PACKED { uint32_t format; uint32_t magic; rtems_record_item Version; rtems_record_item Processor_maximum; rtems_record_item Count; rtems_record_item Frequency; rtems_record_item Info[64]; } Record_Stream_header; size_t _Record_Stream_header_initialize( Record_Stream_header *header ); size_t _Record_String_to_items( rtems_record_event event, const char *str, size_t len, rtems_record_item *items, size_t item_count ); void _Record_Caller( void *return_address ); void _Record_Caller_3( void *return_address, rtems_record_event event, rtems_record_data data ); void _Record_Caller_4( void *return_address, rtems_record_event event_0, rtems_record_data data_0, rtems_record_event event_1, rtems_record_data data_1 ); void _Record_Caller_arg( void *return_address, rtems_record_data data ); void _Record_Caller_arg_2( void *return_address, rtems_record_data data_0, rtems_record_data data_1 ); void _Record_Caller_arg_3( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2 ); void _Record_Caller_arg_4( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3 ); void _Record_Caller_arg_5( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4 ); void _Record_Caller_arg_6( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5 ); void _Record_Caller_arg_7( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6 ); void _Record_Caller_arg_8( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7 ); void _Record_Caller_arg_9( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8 ); void _Record_Caller_arg_10( void *return_address, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8, rtems_record_data data_9 ); void _Record_Entry_2( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1 ); void _Record_Entry_3( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2 ); void _Record_Entry_4( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3 ); void _Record_Entry_5( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4 ); void _Record_Entry_6( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5 ); void _Record_Entry_7( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6 ); void _Record_Entry_8( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7 ); void _Record_Entry_9( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8 ); void _Record_Entry_10( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8, rtems_record_data data_9 ); void _Record_Exit_2( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1 ); void _Record_Exit_3( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2 ); void _Record_Exit_4( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3 ); void _Record_Exit_5( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4 ); void _Record_Exit_6( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5 ); void _Record_Exit_7( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6 ); void _Record_Exit_8( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7 ); void _Record_Exit_9( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8 ); void _Record_Exit_10( void *return_address, rtems_record_event event, rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8, rtems_record_data data_9 ); /** * @addtogroup RTEMSRecord * * @{ */ /** * @brief Prepares to add and commit record items in a critical section with * interrupts disabled. * * This function does not disable interrupts. It must be called with * interrupts disabled. Interrupts must be disabled until the corresponding * rtems_record_commit_critical() was called. * * @param context The record context which must be used for the following * rtems_record_add() and rtems_record_commit_critical() calls. The record * context may have an arbitrary content at function entry. * @param cpu_self The control of the current processor. */ RTEMS_INLINE_ROUTINE void rtems_record_prepare_critical( rtems_record_context *context, const Per_CPU_Control *cpu_self ) { Record_Control *control; unsigned int head; context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 ); control = cpu_self->record; context->control = control; head = _Record_Head( control ); context->head = head; } /** * @brief Prepares to add and commit record items. * * This function disables interrupts. * * @param context The record context which must be used for the following * rtems_record_add() and rtems_record_commit() calls. The record context * may have an arbitrary content at function entry. * * @see rtems_record_produce(). */ RTEMS_INLINE_ROUTINE void rtems_record_prepare( rtems_record_context *context ) { uint32_t level; const Per_CPU_Control *cpu_self; Record_Control *control; unsigned int head; _CPU_ISR_Disable( level ); RTEMS_COMPILER_MEMORY_BARRIER(); context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 ); context->level = level; cpu_self = _Per_CPU_Get(); control = cpu_self->record; context->control = control; head = _Record_Head( control ); context->head = head; } /** * @brief Adds a record item. * * @param context The record context initialized via rtems_record_prepare(). * @param event The record event without a time stamp for the item. * @param data The record data for the item. */ RTEMS_INLINE_ROUTINE void rtems_record_add( rtems_record_context *context, rtems_record_event event, rtems_record_data data ) { Record_Control *control; rtems_record_item *item; unsigned int head; control = context->control; head = context->head; item = &control->Items[ _Record_Index( control, head ) ]; context->head = head + 1; item->event = context->now | event; item->data = data; } /** * @brief Commits a set of record items in a critical section with interrupts * disabled. * * @param context The record context initialized via * rtems_record_prepare_critical(). */ RTEMS_INLINE_ROUTINE void rtems_record_commit_critical( rtems_record_context *context ) { _Atomic_Store_uint( &context->control->head, context->head, ATOMIC_ORDER_RELEASE ); } /** * @brief Commits a set of record items. * * @param context The record context initialized via rtems_record_prepare(). */ RTEMS_INLINE_ROUTINE void rtems_record_commit( rtems_record_context *context ) { rtems_record_commit_critical( context ); RTEMS_COMPILER_MEMORY_BARRIER(); _CPU_ISR_Enable( context->level ); } /** * @brief Produces a record item. * * @param event The record event without a time stamp for the item. * @param data The record data for the item. */ void rtems_record_produce( rtems_record_event event, rtems_record_data data ); /** * @brief Produces two record items. * * @param event_0 The record event without a time stamp for the first item. * @param data_0 The record data for the first item. * @param event_1 The record event without a time stamp for the second item. * @param data_1 The record data for the second item. */ void rtems_record_produce_2( rtems_record_event event_0, rtems_record_data data_0, rtems_record_event event_1, rtems_record_data data_1 ); /** * @brief Produces n record items. * * @param item The record items without a time stamps. * @param n The count of record items. */ void rtems_record_produce_n( const rtems_record_item *items, size_t n ); /** * @brief Generates an RTEMS_RECORD_LINE event. * * The event data is the address of the call to this function. */ void rtems_record_line( void ); /** * @brief Generates an RTEMS_RECORD_LINE event and an extra event. * * The event data is the address of the call to this function. * * @param event The record event without a time stamp for the second item. * @param data The record data for the second item. */ void rtems_record_line_2( rtems_record_event event, rtems_record_data data ); /** * @brief Generates an RTEMS_RECORD_LINE event and two extra events. * * The event data is the address of the call to this function. * * @param event_0 The record event without a time stamp for the second item. * @param data_0 The record data for the second item. * @param event_1 The record event without a time stamp for the third item. * @param data_1 The record data for the third item. */ void rtems_record_line_3( rtems_record_event event_0, rtems_record_data data_0, rtems_record_event event_1, rtems_record_data data_1 ); /** * @brief Generates an RTEMS_RECORD_LINE event and one argument event. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data The RTEMS_RECORD_ARG_0 event data. */ void rtems_record_line_arg( rtems_record_data data ); /** * @brief Generates an RTEMS_RECORD_LINE event and two argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. */ void rtems_record_line_arg_2( rtems_record_data data_0, rtems_record_data data_1 ); /** * @brief Generates an RTEMS_RECORD_LINE event and three argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. */ void rtems_record_line_arg_3( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2 ); /** * @brief Generates an RTEMS_RECORD_LINE event and four argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. */ void rtems_record_line_arg_4( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3 ); /** * @brief Generates an RTEMS_RECORD_LINE event and five argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. */ void rtems_record_line_arg_5( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4 ); /** * @brief Generates an RTEMS_RECORD_LINE event and six argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. */ void rtems_record_line_arg_6( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5 ); /** * @brief Generates an RTEMS_RECORD_LINE event and seven argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. */ void rtems_record_line_arg_7( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6 ); /** * @brief Generates an RTEMS_RECORD_LINE event and eight argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. */ void rtems_record_line_arg_8( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7 ); /** * @brief Generates an RTEMS_RECORD_LINE event and nine argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. */ void rtems_record_line_arg_9( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8 ); /** * @brief Generates an RTEMS_RECORD_LINE event and ten argument events. * * The event data of the RTEMS_RECORD_LINE event is the address of the call to * this function. * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. * @param data_9 The RTEMS_RECORD_ARG_9 event data. */ void rtems_record_line_arg_10( rtems_record_data data_0, rtems_record_data data_1, rtems_record_data data_2, rtems_record_data data_3, rtems_record_data data_4, rtems_record_data data_5, rtems_record_data data_6, rtems_record_data data_7, rtems_record_data data_8, rtems_record_data data_9 ); /** * @brief Generates an RTEMS_RECORD_CALLER and an RTEMS_RECORD_LINE event. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller(). */ #define rtems_record_caller() _Record_Caller( RTEMS_RETURN_ADDRESS() ) /** * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and an * extra event. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_3(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_3(). * * @param event The record event without a time stamp for the third item. * @param data The record data for the third item. */ #define rtems_record_caller_3( event, data ) \ _Record_Caller_3( RTEMS_RETURN_ADDRESS(), event, data ) /** * @brief Generates an RTEMS_RECORD_CALLER, an RTEMS_RECORD_LINE event, and two * extra events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_4(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_4(). * * @param event_0 The record event without a time stamp for the third item. * @param data_0 The record data for the third item. * @param event_1 The record event without a time stamp for the fourth item. * @param data_1 The record data for the fourth item. */ #define rtems_record_caller_4( event_0, data_0, event_1, data_1 ) \ _Record_Caller_4( \ RTEMS_RETURN_ADDRESS(), \ event_0, \ data_0, \ event_1, \ data_1 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and one argument event. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg(). * * @param data The RTEMS_RECORD_ARG_0 event data. */ #define rtems_record_caller_arg( data ) \ _Record_Caller_arg( RTEMS_RETURN_ADDRESS(), data ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and two argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_2(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_2(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. */ #define rtems_record_caller_arg_2( data_0, data_1 ) \ _Record_Caller_arg_2( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and three argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_3(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_3(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. */ #define rtems_record_caller_arg_3( data_0, data_1, data_2 ) \ _Record_Caller_arg_3( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and four argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_4(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_4(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. */ #define rtems_record_caller_arg_4( data_0, data_1, data_2, data_3 ) \ _Record_Caller_arg_4( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and five argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_5(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_5(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. */ #define rtems_record_caller_arg_5( data_0, data_1, data_2, data_3, data_4 ) \ _Record_Caller_arg_5( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and six argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_6(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_6(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. */ #define rtems_record_caller_arg_6( \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) \ _Record_Caller_arg_6( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and seven argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_7(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_7(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. */ #define rtems_record_caller_arg_7( \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) \ _Record_Caller_arg_7( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and eight argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_8(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_8(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. */ #define rtems_record_caller_arg_8( \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) \ _Record_Caller_arg_8( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and nine argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_9(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_9(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. */ #define rtems_record_caller_arg_9( \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) \ _Record_Caller_arg_9( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) /** * @brief Generates an RTEMS_RECORD_CALLER event, an RTEMS_RECORD_LINE event, * and ten argument events. * * The RTEMS_RECORD_CALLER event data is the return address of the function * calling rtems_record_caller_arg_10(). * * The RTEMS_RECORD_LINE event data is the address of the call to * rtems_record_caller_arg_10(). * * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. * @param data_10 The RTEMS_RECORD_ARG_10 event data. */ #define rtems_record_caller_arg_10( \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) \ _Record_Caller_arg_10( \ RTEMS_RETURN_ADDRESS(), \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) /** * @brief Generates the specified entry event. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry(). * * @param event The entry event. */ #define rtems_record_entry( event ) \ rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() ) /** * @brief Generates the specified entry event and an argument event. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_1(). * * @param event The entry event. * @param data The RTEMS_RECORD_ARG_0 event data. */ #define rtems_record_entry_1( event, data ) \ rtems_record_produce_2( \ event, \ (rtems_record_data) RTEMS_RETURN_ADDRESS(), \ RTEMS_RECORD_ARG_0, \ data \ ) /** * @brief Generates the specified entry event and two argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_2(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. */ #define rtems_record_entry_2( event, data_0, data_1 ) \ _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 ) /** * @brief Generates the specified entry event and three argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_3(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. */ #define rtems_record_entry_3( event, data_0, data_1, data_2 ) \ _Record_Entry_3( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2 \ ) /** * @brief Generates the specified entry event and four argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_4(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. */ #define rtems_record_entry_4( event, data_0, data_1, data_2, data_3 ) \ _Record_Entry_4( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3 \ ) /** * @brief Generates the specified entry event and five argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_5(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. */ #define rtems_record_entry_5( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4 \ ) \ _Record_Entry_5( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4 \ ) /** * @brief Generates the specified entry event and six argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_6(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. */ #define rtems_record_entry_6( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) \ _Record_Entry_6( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) /** * @brief Generates the specified entry event and seven argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_7(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. */ #define rtems_record_entry_7( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) \ _Record_Entry_7( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) /** * @brief Generates the specified entry event and eight argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_8(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. */ #define rtems_record_entry_8( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) \ _Record_Entry_8( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) /** * @brief Generates the specified entry event and nine argument events. * * The event data of the specified entry event is the return address of the * function calling rtems_record_entry_9(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. */ #define rtems_record_entry_9( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) \ _Record_Entry_9( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) /** * @brief Generates the specified entry event and ten argument events. * * The event data of the specified entry event is the return address of the function * calling rtems_record_entry_10(). * * @param event The entry event. * @param data_0 The RTEMS_RECORD_ARG_0 event data. * @param data_1 The RTEMS_RECORD_ARG_1 event data. * @param data_2 The RTEMS_RECORD_ARG_2 event data. * @param data_3 The RTEMS_RECORD_ARG_3 event data. * @param data_4 The RTEMS_RECORD_ARG_4 event data. * @param data_5 The RTEMS_RECORD_ARG_5 event data. * @param data_6 The RTEMS_RECORD_ARG_6 event data. * @param data_7 The RTEMS_RECORD_ARG_7 event data. * @param data_8 The RTEMS_RECORD_ARG_8 event data. * @param data_10 The RTEMS_RECORD_ARG_10 event data. */ #define rtems_record_entry_10( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) \ _Record_Entry_10( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) /** * @brief Generates the specified exit event. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit(). * * @param event The exit event. */ #define rtems_record_exit( event ) \ rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() ) /** * @brief Generates the specified exit event and a return event. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_1(). * * @param event The exit event. * @param data The RTEMS_RECORD_RETURN_0 event data. */ #define rtems_record_exit_1( event, data ) \ rtems_record_produce_2( \ event, \ (rtems_record_data) RTEMS_RETURN_ADDRESS(), \ RTEMS_RECORD_RETURN_0, \ data \ ) /** * @brief Generates the specified exit event and two argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_2(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. */ #define rtems_record_exit_2( event, data_0, data_1 ) \ _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 ) /** * @brief Generates the specified exit event and three argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_3(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. */ #define rtems_record_exit_3( event, data_0, data_1, data_2 ) \ _Record_Exit_3( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2 \ ) /** * @brief Generates the specified exit event and four argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_4(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. */ #define rtems_record_exit_4( event, data_0, data_1, data_2, data_3 ) \ _Record_Exit_4( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3 \ ) /** * @brief Generates the specified exit event and five argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_5(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. */ #define rtems_record_exit_5( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4 \ ) \ _Record_Exit_5( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4 \ ) /** * @brief Generates the specified exit event and six argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_6(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. * @param data_5 The RTEMS_RECORD_RETURN_5 event data. */ #define rtems_record_exit_6( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) \ _Record_Exit_6( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5 \ ) /** * @brief Generates the specified exit event and seven argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_7(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. * @param data_5 The RTEMS_RECORD_RETURN_5 event data. * @param data_6 The RTEMS_RECORD_RETURN_6 event data. */ #define rtems_record_exit_7( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) \ _Record_Exit_7( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6 \ ) /** * @brief Generates the specified exit event and eight argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_8(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. * @param data_5 The RTEMS_RECORD_RETURN_5 event data. * @param data_6 The RTEMS_RECORD_RETURN_6 event data. * @param data_7 The RTEMS_RECORD_RETURN_7 event data. */ #define rtems_record_exit_8( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) \ _Record_Exit_8( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7 \ ) /** * @brief Generates the specified exit event and nine argument events. * * The event data of the specified exit event is the return address of the * function calling rtems_record_exit_9(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. * @param data_5 The RTEMS_RECORD_RETURN_5 event data. * @param data_6 The RTEMS_RECORD_RETURN_6 event data. * @param data_7 The RTEMS_RECORD_RETURN_7 event data. * @param data_8 The RTEMS_RECORD_RETURN_8 event data. */ #define rtems_record_exit_9( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) \ _Record_Exit_9( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8 \ ) /** * @brief Generates the specified exit event and ten argument events. * * The event data of the specified exit event is the return address of the function * calling rtems_record_exit_10(). * * @param event The exit event. * @param data_0 The RTEMS_RECORD_RETURN_0 event data. * @param data_1 The RTEMS_RECORD_RETURN_1 event data. * @param data_2 The RTEMS_RECORD_RETURN_2 event data. * @param data_3 The RTEMS_RECORD_RETURN_3 event data. * @param data_4 The RTEMS_RECORD_RETURN_4 event data. * @param data_5 The RTEMS_RECORD_RETURN_5 event data. * @param data_6 The RTEMS_RECORD_RETURN_6 event data. * @param data_7 The RTEMS_RECORD_RETURN_7 event data. * @param data_8 The RTEMS_RECORD_RETURN_8 event data. * @param data_10 The RTEMS_RECORD_RETURN_10 event data. */ #define rtems_record_exit_10( \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) \ _Record_Exit_10( \ RTEMS_RETURN_ADDRESS(), \ event, \ data_0, \ data_1, \ data_2, \ data_3, \ data_4, \ data_5, \ data_6, \ data_7, \ data_8, \ data_9 \ ) /** * @brief Disables interrupts and generates an RTEMS_RECORD_ISR_DISABLE event. * * @return The previous interrupt level. */ uint32_t rtems_record_interrupt_disable( void ); /** * @brief Restores the previous interrupt level and generates an * RTEMS_RECORD_ISR_ENABLE event. * * @param level The previous interrupt level. Must be the return value of the * corresponding rtems_record_interrupt_disable(). */ void rtems_record_interrupt_enable( uint32_t level ); typedef void ( *rtems_record_drain_visitor )( const rtems_record_item *items, size_t count, void *arg ); void _Record_Drain( Record_Control *control, uint32_t cpu_index, rtems_record_drain_visitor visitor, void *arg ); /** * @brief Drains the record items on all processors. * * Calls the visitor function for each drained item set. * * @param visitor The visitor function. * @param arg The argument for the visitor function. */ void rtems_record_drain( rtems_record_drain_visitor visitor, void *arg ); /** @} */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _RTEMS_RECORD_H */