mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-24 04:16:05 +08:00
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:
@@ -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 );
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user