From 8ace7eada4db33a6bda355979045e73c59084773 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 30 Aug 2019 09:21:22 +0200 Subject: record: Add system events Add system events to identify the target system. Add system events to transfer blocks of memory and register sets. Update #3665. --- cpukit/include/rtems/record.h | 11 ++++- cpukit/include/rtems/recorddata.h | 20 ++++----- cpukit/libtrace/record/record-server.c | 72 +++++++++++++++++++++++++++++++-- cpukit/libtrace/record/record-text.c | 18 ++++----- cpukit/libtrace/record/record-userext.c | 45 +++++++-------------- cpukit/libtrace/record/record.c | 36 +++++++++++++++++ testsuites/libtests/record02/init.c | 5 ++- 7 files changed, 152 insertions(+), 55 deletions(-) diff --git a/cpukit/include/rtems/record.h b/cpukit/include/rtems/record.h index c76dd07ff0..f400f02dac 100644 --- a/cpukit/include/rtems/record.h +++ b/cpukit/include/rtems/record.h @@ -160,9 +160,18 @@ typedef struct RTEMS_PACKED { rtems_record_item Processor_maximum; rtems_record_item Count; rtems_record_item Frequency; + rtems_record_item Info[64]; } Record_Stream_header; -void _Record_Stream_header_initialize( Record_Stream_header *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 ); diff --git a/cpukit/include/rtems/recorddata.h b/cpukit/include/rtems/recorddata.h index 3b03be9890..f0d02e6c11 100644 --- a/cpukit/include/rtems/recorddata.h +++ b/cpukit/include/rtems/recorddata.h @@ -55,7 +55,7 @@ extern "C" { * The record version reflects the record event definitions. It is reported by * the RTEMS_RECORD_VERSION event. */ -#define RTEMS_RECORD_THE_VERSION 6 +#define RTEMS_RECORD_THE_VERSION 7 /** * @brief The items are in 32-bit little-endian format. @@ -99,6 +99,7 @@ typedef enum { RTEMS_RECORD_ACCEPT_ENTRY, RTEMS_RECORD_ACCEPT_EXIT, RTEMS_RECORD_ADDRESS, + RTEMS_RECORD_ARCH, RTEMS_RECORD_ARG_0, RTEMS_RECORD_ARG_1, RTEMS_RECORD_ARG_2, @@ -111,6 +112,7 @@ typedef enum { RTEMS_RECORD_ARG_9, RTEMS_RECORD_BIND_ENTRY, RTEMS_RECORD_BIND_EXIT, + RTEMS_RECORD_BSP, RTEMS_RECORD_BUFFER, RTEMS_RECORD_CALLER, RTEMS_RECORD_CHOWN_ENTRY, @@ -121,6 +123,8 @@ typedef enum { RTEMS_RECORD_CONNECT_EXIT, RTEMS_RECORD_ETHER_INPUT, RTEMS_RECORD_ETHER_OUTPUT, + RTEMS_RECORD_FATAL_CODE, + RTEMS_RECORD_FATAL_SOURCE, RTEMS_RECORD_FCHMOD_ENTRY, RTEMS_RECORD_FCHMOD_EXIT, RTEMS_RECORD_FCNTL_ENTRY, @@ -136,7 +140,6 @@ typedef enum { RTEMS_RECORD_FTRUNCATE_EXIT, RTEMS_RECORD_GETSOCKOPT_ENTRY, RTEMS_RECORD_GETSOCKOPT_EXIT, - RTEMS_RECORD_GIT_HASH, RTEMS_RECORD_HEAP_ALLOC, RTEMS_RECORD_HEAP_FREE, RTEMS_RECORD_HEAP_SIZE, @@ -178,12 +181,14 @@ typedef enum { RTEMS_RECORD_LISTEN_EXIT, RTEMS_RECORD_LSEEK_ENTRY, RTEMS_RECORD_LSEEK_EXIT, + RTEMS_RECORD_MEMORY, RTEMS_RECORD_MKNOD_ENTRY, RTEMS_RECORD_MKNOD_EXIT, RTEMS_RECORD_MMAP_ENTRY, RTEMS_RECORD_MMAP_EXIT, RTEMS_RECORD_MOUNT_ENTRY, RTEMS_RECORD_MOUNT_EXIT, + RTEMS_RECORD_MULTILIB, RTEMS_RECORD_OPEN_ENTRY, RTEMS_RECORD_OPEN_EXIT, RTEMS_RECORD_PAGE_ALLOC, @@ -208,6 +213,7 @@ typedef enum { RTEMS_RECORD_RECVFROM_EXIT, RTEMS_RECORD_RECVMSG_ENTRY, RTEMS_RECORD_RECVMSG_EXIT, + RTEMS_RECORD_REGISTERS, RTEMS_RECORD_RENAME_ENTRY, RTEMS_RECORD_RENAME_EXIT, RTEMS_RECORD_RTEMS_BARRIER_CREATE, @@ -368,6 +374,7 @@ typedef enum { RTEMS_RECORD_THREAD_TIMER_INSERT_REALTIME, RTEMS_RECORD_THREAD_TIMER_INSERT_TICKS, RTEMS_RECORD_THREAD_TIMER_REMOVE, + RTEMS_RECORD_TOOLS, RTEMS_RECORD_UDP_INPUT, RTEMS_RECORD_UDP_OUTPUT, RTEMS_RECORD_UMA_ALLOC_PTR, @@ -380,6 +387,7 @@ typedef enum { RTEMS_RECORD_UNMOUNT_EXIT, RTEMS_RECORD_UPTIME_HIGH, RTEMS_RECORD_UPTIME_LOW, + RTEMS_RECORD_VERSION_CONTROL_KEY, RTEMS_RECORD_WATCHDOG_ADDRESS, RTEMS_RECORD_WATCHDOG_CPU, RTEMS_RECORD_WATCHDOG_INITIALIZE, @@ -398,14 +406,6 @@ typedef enum { RTEMS_RECORD_WRITEV_EXIT, /* Unused system events */ - RTEMS_RECORD_SYSTEM_302, - RTEMS_RECORD_SYSTEM_303, - RTEMS_RECORD_SYSTEM_304, - RTEMS_RECORD_SYSTEM_305, - RTEMS_RECORD_SYSTEM_306, - RTEMS_RECORD_SYSTEM_307, - RTEMS_RECORD_SYSTEM_308, - RTEMS_RECORD_SYSTEM_309, RTEMS_RECORD_SYSTEM_310, RTEMS_RECORD_SYSTEM_311, RTEMS_RECORD_SYSTEM_312, diff --git a/cpukit/libtrace/record/record-server.c b/cpukit/libtrace/record/record-server.c index e19f889d8d..5e52651bd4 100644 --- a/cpukit/libtrace/record/record-server.c +++ b/cpukit/libtrace/record/record-server.c @@ -31,6 +31,7 @@ #include #include +#include #include #include @@ -120,8 +121,13 @@ static void wakeup_timer( rtems_id timer, void *arg ) (void) rtems_timer_reset( timer ); } -void _Record_Stream_header_initialize( Record_Stream_header *header ) +size_t _Record_Stream_header_initialize( Record_Stream_header *header ) { + rtems_record_item *items; + size_t available; + size_t used; + const char *str; + #if BYTE_ORDER == LITTLE_ENDIAN #if __INTPTR_WIDTH__ == 32 header->format = RTEMS_RECORD_FORMAT_LE_32, @@ -157,14 +163,74 @@ void _Record_Stream_header_initialize( Record_Stream_header *header ) header->Frequency.event = RTEMS_RECORD_TIME_EVENT( 0, RTEMS_RECORD_FREQUENCY ); header->Frequency.data = rtems_counter_frequency(); + + items = header->Info; + available = RTEMS_ARRAY_SIZE( header->Info ); + + str = CPU_NAME; + used = _Record_String_to_items( + RTEMS_RECORD_ARCH, + str, + strlen( str ), + items, + available + ); + items += used; + available -= used; + + str = CPU_MODEL_NAME; + used = _Record_String_to_items( + RTEMS_RECORD_MULTILIB, + str, + strlen( str ), + items, + available + ); + items += used; + available -= used; + + str = rtems_board_support_package(); + used = _Record_String_to_items( + RTEMS_RECORD_BSP, + str, + strlen( str ), + items, + available + ); + items += used; + available -= used; + + str = rtems_version_control_key(); + used = _Record_String_to_items( + RTEMS_RECORD_VERSION_CONTROL_KEY, + str, + strlen( str ), + items, + available + ); + items += used; + available -= used; + + str = __VERSION__; + used = _Record_String_to_items( + RTEMS_RECORD_TOOLS, + str, + strlen( str ), + items, + available + ); + items += used; + + return (size_t) ( (char *) items - (char *) header ); } static void send_header( int fd ) { Record_Stream_header header; + size_t size; - _Record_Stream_header_initialize( &header ); - (void) write( fd, &header, sizeof( header ) ); + size = _Record_Stream_header_initialize( &header ); + (void) write( fd, &header, size ); } typedef struct { diff --git a/cpukit/libtrace/record/record-text.c b/cpukit/libtrace/record/record-text.c index 09f8d15d95..dd45ceeab0 100644 --- a/cpukit/libtrace/record/record-text.c +++ b/cpukit/libtrace/record/record-text.c @@ -44,6 +44,7 @@ static const char * const event_text[] = { [ RTEMS_RECORD_ACCEPT_ENTRY ] = "ACCEPT_ENTRY", [ RTEMS_RECORD_ACCEPT_EXIT ] = "ACCEPT_EXIT", [ RTEMS_RECORD_ADDRESS ] = "ADDRESS", + [ RTEMS_RECORD_ARCH ] = "ARCH", [ RTEMS_RECORD_ARG_0 ] = "ARG_0", [ RTEMS_RECORD_ARG_1 ] = "ARG_1", [ RTEMS_RECORD_ARG_2 ] = "ARG_2", @@ -56,6 +57,7 @@ static const char * const event_text[] = { [ RTEMS_RECORD_ARG_9 ] = "ARG_9", [ RTEMS_RECORD_BIND_ENTRY ] = "BIND_ENTRY", [ RTEMS_RECORD_BIND_EXIT ] = "BIND_EXIT", + [ RTEMS_RECORD_BSP ] = "BSP", [ RTEMS_RECORD_BUFFER ] = "BUFFER", [ RTEMS_RECORD_CALLER ] = "CALLER", [ RTEMS_RECORD_CHOWN_ENTRY ] = "CHOWN_ENTRY", @@ -66,6 +68,8 @@ static const char * const event_text[] = { [ RTEMS_RECORD_CONNECT_EXIT ] = "CONNECT_EXIT", [ RTEMS_RECORD_ETHER_INPUT ] = "ETHER_INPUT", [ RTEMS_RECORD_ETHER_OUTPUT ] = "ETHER_OUTPUT", + [ RTEMS_RECORD_FATAL_CODE ] = "FATAL_CODE", + [ RTEMS_RECORD_FATAL_SOURCE ] = "FATAL_SOURCE", [ RTEMS_RECORD_FCHMOD_ENTRY ] = "FCHMOD_ENTRY", [ RTEMS_RECORD_FCHMOD_EXIT ] = "FCHMOD_EXIT", [ RTEMS_RECORD_FCNTL_ENTRY ] = "FCNTL_ENTRY", @@ -81,7 +85,6 @@ static const char * const event_text[] = { [ RTEMS_RECORD_FTRUNCATE_EXIT ] = "FTRUNCATE_EXIT", [ RTEMS_RECORD_GETSOCKOPT_ENTRY ] = "GETSOCKOPT_ENTRY", [ RTEMS_RECORD_GETSOCKOPT_EXIT ] = "GETSOCKOPT_EXIT", - [ RTEMS_RECORD_GIT_HASH ] = "GIT_HASH", [ RTEMS_RECORD_HEAP_ALLOC ] = "HEAP_ALLOC", [ RTEMS_RECORD_HEAP_FREE ] = "HEAP_FREE", [ RTEMS_RECORD_HEAP_SIZE ] = "HEAP_SIZE", @@ -123,12 +126,14 @@ static const char * const event_text[] = { [ RTEMS_RECORD_LISTEN_EXIT ] = "LISTEN_EXIT", [ RTEMS_RECORD_LSEEK_ENTRY ] = "LSEEK_ENTRY", [ RTEMS_RECORD_LSEEK_EXIT ] = "LSEEK_EXIT", + [ RTEMS_RECORD_MEMORY ] = "MEMORY", [ RTEMS_RECORD_MKNOD_ENTRY ] = "MKNOD_ENTRY", [ RTEMS_RECORD_MKNOD_EXIT ] = "MKNOD_EXIT", [ RTEMS_RECORD_MMAP_ENTRY ] = "MMAP_ENTRY", [ RTEMS_RECORD_MMAP_EXIT ] = "MMAP_EXIT", [ RTEMS_RECORD_MOUNT_ENTRY ] = "MOUNT_ENTRY", [ RTEMS_RECORD_MOUNT_EXIT ] = "MOUNT_EXIT", + [ RTEMS_RECORD_MULTILIB ] = "MULTILIB", [ RTEMS_RECORD_OPEN_ENTRY ] = "OPEN_ENTRY", [ RTEMS_RECORD_OPEN_EXIT ] = "OPEN_EXIT", [ RTEMS_RECORD_PAGE_ALLOC ] = "PAGE_ALLOC", @@ -153,6 +158,7 @@ static const char * const event_text[] = { [ RTEMS_RECORD_RECVFROM_EXIT ] = "RECVFROM_EXIT", [ RTEMS_RECORD_RECVMSG_ENTRY ] = "RECVMSG_ENTRY", [ RTEMS_RECORD_RECVMSG_EXIT ] = "RECVMSG_EXIT", + [ RTEMS_RECORD_REGISTERS ] = "REGISTERS", [ RTEMS_RECORD_RENAME_ENTRY ] = "RENAME_ENTRY", [ RTEMS_RECORD_RENAME_EXIT ] = "RENAME_EXIT", [ RTEMS_RECORD_RTEMS_BARRIER_CREATE ] = "RTEMS_BARRIER_CREATE", @@ -313,6 +319,7 @@ static const char * const event_text[] = { [ RTEMS_RECORD_THREAD_TIMER_INSERT_REALTIME ] = "THREAD_TIMER_INSERT_REALTIME", [ RTEMS_RECORD_THREAD_TIMER_INSERT_TICKS ] = "THREAD_TIMER_INSERT_TICKS", [ RTEMS_RECORD_THREAD_TIMER_REMOVE ] = "THREAD_TIMER_REMOVE", + [ RTEMS_RECORD_TOOLS ] = "TOOLS", [ RTEMS_RECORD_UDP_INPUT ] = "UDP_INPUT", [ RTEMS_RECORD_UDP_OUTPUT ] = "UDP_OUTPUT", [ RTEMS_RECORD_UMA_ALLOC_PTR ] = "UMA_ALLOC_PTR", @@ -325,6 +332,7 @@ static const char * const event_text[] = { [ RTEMS_RECORD_UNMOUNT_EXIT ] = "UNMOUNT_EXIT", [ RTEMS_RECORD_UPTIME_HIGH ] = "UPTIME_HIGH", [ RTEMS_RECORD_UPTIME_LOW ] = "UPTIME_LOW", + [ RTEMS_RECORD_VERSION_CONTROL_KEY ] = "VERSION_CONTROL_KEY", [ RTEMS_RECORD_WATCHDOG_ADDRESS ] = "WATCHDOG_ADDRESS", [ RTEMS_RECORD_WATCHDOG_CPU ] = "WATCHDOG_CPU", [ RTEMS_RECORD_WATCHDOG_INITIALIZE ] = "WATCHDOG_INITIALIZE", @@ -341,14 +349,6 @@ static const char * const event_text[] = { [ RTEMS_RECORD_WRITE_EXIT ] = "WRITE_EXIT", [ RTEMS_RECORD_WRITEV_ENTRY ] = "WRITEV_ENTRY", [ RTEMS_RECORD_WRITEV_EXIT ] = "WRITEV_EXIT", - [ RTEMS_RECORD_SYSTEM_302 ] = "SYSTEM_302", - [ RTEMS_RECORD_SYSTEM_303 ] = "SYSTEM_303", - [ RTEMS_RECORD_SYSTEM_304 ] = "SYSTEM_304", - [ RTEMS_RECORD_SYSTEM_305 ] = "SYSTEM_305", - [ RTEMS_RECORD_SYSTEM_306 ] = "SYSTEM_306", - [ RTEMS_RECORD_SYSTEM_307 ] = "SYSTEM_307", - [ RTEMS_RECORD_SYSTEM_308 ] = "SYSTEM_308", - [ RTEMS_RECORD_SYSTEM_309 ] = "SYSTEM_309", [ RTEMS_RECORD_SYSTEM_310 ] = "SYSTEM_310", [ RTEMS_RECORD_SYSTEM_311 ] = "SYSTEM_311", [ RTEMS_RECORD_SYSTEM_312 ] = "SYSTEM_312", diff --git a/cpukit/libtrace/record/record-userext.c b/cpukit/libtrace/record/record-userext.c index e03866f207..bac915843f 100644 --- a/cpukit/libtrace/record/record-userext.c +++ b/cpukit/libtrace/record/record-userext.c @@ -40,36 +40,21 @@ bool _Record_Thread_create( rtems_record_data data; char name[ 2 * THREAD_DEFAULT_MAXIMUM_NAME_SIZE ]; rtems_record_item items[ 1 + sizeof( name ) / sizeof( data ) ]; - size_t n; - size_t i; - size_t j; - - i = 0; - items[ i ].event = RTEMS_RECORD_THREAD_CREATE; - items[ i ].data = created->Object.id; - - n = _Thread_Get_name( created, name, sizeof( name ) ); - j = 0; - - while ( j < n ) { - size_t k; - - data = 0; - - for ( k = 0; j < n && k < sizeof( data ); ++k ) { - rtems_record_data c; - - c = (unsigned char) name[ i ]; - data |= c << ( k * 8 ); - ++j; - } - - ++i; - items[ i ].event = RTEMS_RECORD_THREAD_NAME; - items[ i ].data = data; - } - - rtems_record_produce_n( items, i + 1 ); + size_t len; + size_t used; + + items[ 0 ].event = RTEMS_RECORD_THREAD_CREATE; + items[ 0 ].data = created->Object.id; + + len = _Thread_Get_name( created, name, sizeof( name ) ); + used = _Record_String_to_items( + RTEMS_RECORD_THREAD_NAME, + name, + len, + &items[ 1 ], + RTEMS_ARRAY_SIZE( items ) - 1 + ); + rtems_record_produce_n( items, used + 1 ); return true; } diff --git a/cpukit/libtrace/record/record.c b/cpukit/libtrace/record/record.c index 848e67e5ee..680e362661 100644 --- a/cpukit/libtrace/record/record.c +++ b/cpukit/libtrace/record/record.c @@ -88,6 +88,42 @@ void rtems_record_produce_n( rtems_record_commit( &context ); } +size_t _Record_String_to_items( + rtems_record_event event, + const char *str, + size_t len, + rtems_record_item *items, + size_t item_count +) +{ + size_t s; + size_t i; + + s = 0; + i = 0; + + while ( s < len && i < item_count ) { + rtems_record_data data; + size_t k; + + data = 0; + + for ( k = 0; s < len && k < sizeof( data ); ++k ) { + rtems_record_data c; + + c = (unsigned char) str[ s ]; + data |= c << ( k * 8 ); + ++s; + } + + items[ i ].event = event; + items[ i ].data = data; + ++i; + } + + return i; +} + void _Record_Drain( Record_Control *control, uint32_t cpu_index, diff --git a/testsuites/libtests/record02/init.c b/testsuites/libtests/record02/init.c index cc08dfcb6f..f4c19f1092 100644 --- a/testsuites/libtests/record02/init.c +++ b/testsuites/libtests/record02/init.c @@ -98,6 +98,7 @@ static void Init(rtems_task_argument arg) { test_context *ctx; Record_Stream_header header; + size_t size; rtems_record_client_status cs; int i; uint32_t level; @@ -139,8 +140,8 @@ static void Init(rtems_task_argument arg) rtems_record_interrupt_enable(level); rtems_record_client_init(&ctx->client, client_handler, NULL); - _Record_Stream_header_initialize(&header); - cs = rtems_record_client_run(&ctx->client, &header, sizeof(header)); + size = _Record_Stream_header_initialize(&header); + cs = rtems_record_client_run(&ctx->client, &header, size); rtems_test_assert(cs == RTEMS_RECORD_CLIENT_SUCCESS); rtems_record_drain(drain_visitor, ctx); rtems_record_client_destroy(&ctx->client); -- cgit v1.2.3