summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-08-30 09:21:22 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-08-30 11:18:47 +0200
commit8ace7eada4db33a6bda355979045e73c59084773 (patch)
treee7b62f605b48c239da489dc74512b4a1938acdb3
parentrecord: Initialize records earlier (diff)
downloadrtems-8ace7eada4db33a6bda355979045e73c59084773.tar.bz2
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.
-rw-r--r--cpukit/include/rtems/record.h11
-rw-r--r--cpukit/include/rtems/recorddata.h20
-rw-r--r--cpukit/libtrace/record/record-server.c72
-rw-r--r--cpukit/libtrace/record/record-text.c18
-rw-r--r--cpukit/libtrace/record/record-userext.c45
-rw-r--r--cpukit/libtrace/record/record.c36
-rw-r--r--testsuites/libtests/record02/init.c5
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 <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 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);