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.
This commit is contained in:
Sebastian Huber
2019-08-30 11:18:47 +02:00
parent 1e18f645f3
commit 8ace7eada4
7 changed files with 150 additions and 53 deletions
+10 -1
View File
@@ -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 );
+10 -10
View File
@@ -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,
+69 -3
View File
@@ -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 {
+9 -9
View File
@@ -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",
+13 -28
View File
@@ -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;
size_t len;
size_t used;
i = 0;
items[ i ].event = RTEMS_RECORD_THREAD_CREATE;
items[ i ].data = created->Object.id;
items[ 0 ].event = RTEMS_RECORD_THREAD_CREATE;
items[ 0 ].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 );
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;
}
+36
View File
@@ -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,
+3 -2
View File
@@ -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);