[rtems commit] record: Add system events

Sebastian Huber sebh at rtems.org
Fri Aug 30 09:49:32 UTC 2019


Module:    rtems
Branch:    master
Commit:    8ace7eada4db33a6bda355979045e73c59084773
Changeset: http://git.rtems.org/rtems/commit/?id=8ace7eada4db33a6bda355979045e73c59084773

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Aug 30 09:21:22 2019 +0200

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 c76dd07..f400f02 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 3b03be9..f0d02e6 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 e19f889..5e52651 100644
--- a/cpukit/libtrace/record/record-server.c
+++ b/cpukit/libtrace/record/record-server.c
@@ -31,6 +31,7 @@
 
 #include <rtems/recordserver.h>
 #include <rtems/record.h>
+#include <rtems/version.h>
 #include <rtems/score/threadimpl.h>
 #include <rtems.h>
 
@@ -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 09f8d15..dd45cee 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 e03866f..bac9158 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 848e67e..680e362 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 cc08dfc..f4c19f1 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);



More information about the vc mailing list