forked from Imagelibrary/rtems
record: Add rtems_record_dump()
Add rtems_record_dump_base64() and rtems_record_dump_base64_zlib(). Add CONFIGURE_RECORD_FATAL_DUMP_BASE64 and CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB configuration options. Update #3904.
This commit is contained in:
@@ -471,6 +471,11 @@ librtemscpu_a_SOURCES += libstdthreads/thrd.c
|
||||
librtemscpu_a_SOURCES += libstdthreads/tss.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-client.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-dump.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-dump-fatal.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-dump-zfatal.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-dump-base64.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-dump-zbase64.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-server.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-sysinit.c
|
||||
librtemscpu_a_SOURCES += libtrace/record/record-text.c
|
||||
|
||||
@@ -139,6 +139,7 @@ include_rtems_HEADERS += include/rtems/rbtree.h
|
||||
include_rtems_HEADERS += include/rtems/record.h
|
||||
include_rtems_HEADERS += include/rtems/recordclient.h
|
||||
include_rtems_HEADERS += include/rtems/recorddata.h
|
||||
include_rtems_HEADERS += include/rtems/recorddump.h
|
||||
include_rtems_HEADERS += include/rtems/recordserver.h
|
||||
include_rtems_HEADERS += include/rtems/ringbuf.h
|
||||
include_rtems_HEADERS += include/rtems/rtc.h
|
||||
|
||||
@@ -79,7 +79,23 @@ extern "C" {
|
||||
const User_extensions_Table _User_extensions_Initial_extensions[] = {
|
||||
#if CONFIGURE_RECORD_PER_PROCESSOR_ITEMS > 0 \
|
||||
&& defined(CONFIGURE_RECORD_EXTENSIONS_ENABLED)
|
||||
RECORD_EXTENSION,
|
||||
{
|
||||
_Record_Thread_create,
|
||||
_Record_Thread_start,
|
||||
_Record_Thread_restart,
|
||||
_Record_Thread_delete,
|
||||
_Record_Thread_switch,
|
||||
_Record_Thread_begin,
|
||||
_Record_Thread_exitted,
|
||||
#ifdef CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB
|
||||
_Record_Fatal_dump_base64_zlib,
|
||||
#elif defined(CONFIGURE_RECORD_FATAL_DUMP_BASE64)
|
||||
_Record_Fatal_dump_base64,
|
||||
#else
|
||||
NULL,
|
||||
#endif
|
||||
_Record_Thread_terminate
|
||||
},
|
||||
#endif
|
||||
#ifdef _CONFIGURE_ENABLE_NEWLIB_REENTRANCY
|
||||
RTEMS_NEWLIB_EXTENSION,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* Copyright (C) 2018, 2019 embedded brains GmbH
|
||||
* Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
#include <rtems/score/atomic.h>
|
||||
#include <rtems/score/cpu.h>
|
||||
#include <rtems/score/interr.h>
|
||||
#include <rtems/score/percpu.h>
|
||||
#include <rtems/score/watchdog.h>
|
||||
#include <rtems/counter.h>
|
||||
@@ -95,23 +96,22 @@ void _Record_Thread_begin( struct _Thread_Control *executing );
|
||||
|
||||
void _Record_Thread_exitted( struct _Thread_Control *executing );
|
||||
|
||||
void _Record_Fatal_dump_base64(
|
||||
Internal_errors_Source source,
|
||||
bool always_set_to_false,
|
||||
Internal_errors_t code
|
||||
);
|
||||
|
||||
void _Record_Fatal_dump_base64_zlib(
|
||||
Internal_errors_Source source,
|
||||
bool always_set_to_false,
|
||||
Internal_errors_t code
|
||||
);
|
||||
|
||||
void _Record_Thread_terminate(
|
||||
struct _Thread_Control *executing
|
||||
);
|
||||
|
||||
#define RECORD_EXTENSION \
|
||||
{ \
|
||||
_Record_Thread_create, \
|
||||
_Record_Thread_start, \
|
||||
_Record_Thread_restart, \
|
||||
_Record_Thread_delete, \
|
||||
_Record_Thread_switch, \
|
||||
_Record_Thread_begin, \
|
||||
_Record_Thread_exitted, \
|
||||
NULL, \
|
||||
_Record_Thread_terminate \
|
||||
}
|
||||
|
||||
RTEMS_INLINE_ROUTINE unsigned int _Record_Index(
|
||||
const Record_Control *control,
|
||||
unsigned int index
|
||||
|
||||
118
cpukit/include/rtems/recorddump.h
Normal file
118
cpukit/include/rtems/recorddump.h
Normal file
@@ -0,0 +1,118 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_RECORDDUMP_H
|
||||
#define _RTEMS_RECORDDUMP_H
|
||||
|
||||
#include <rtems/record.h>
|
||||
|
||||
#include <zlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/**
|
||||
* @addtogroup RTEMSRecord
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Handler for record dumps to output a chunk of data.
|
||||
*
|
||||
* @param arg The argument passed to rtems_record_dump().
|
||||
* @param data The begin of the data chunk.
|
||||
* @param length The length in bytes of the data chunk.
|
||||
*/
|
||||
typedef void ( *rtems_record_dump_chunk )(
|
||||
void *arg,
|
||||
const void *data,
|
||||
size_t length
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Dumps the record header, the thread names, and all items of all
|
||||
* processors.
|
||||
*
|
||||
* @param chunk Handler to dump a chunk of data.
|
||||
* @param flush Handler to flush the data.
|
||||
* @param arg The argument for the handlers.
|
||||
*/
|
||||
void rtems_record_dump(
|
||||
rtems_record_dump_chunk chunk,
|
||||
void *arg
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Dumps the event records in base64 encoding.
|
||||
*
|
||||
* @param put_char The put char handler.
|
||||
* @param arg The argument for the put char handler.
|
||||
*
|
||||
* @see rtems_record_dump().
|
||||
*/
|
||||
void rtems_record_dump_base64( void ( *put_char )( int, void * ), void *arg );
|
||||
|
||||
/**
|
||||
* @brief The context for record dumps with zlib compression and base64
|
||||
* encoding.
|
||||
*/
|
||||
typedef struct {
|
||||
void ( *put_char )( int, void * );
|
||||
void *arg;
|
||||
int out;
|
||||
unsigned char buf[ 57 ];
|
||||
z_stream stream;
|
||||
char *mem_begin;
|
||||
size_t mem_available;
|
||||
char mem[ 0x80000 ];
|
||||
} rtems_record_dump_base64_zlib_context;
|
||||
|
||||
/**
|
||||
* @brief Dumps the event records compressed with zlib in base64 encoding.
|
||||
*
|
||||
* @param ctx The context to perform the record dump with zlib compression and
|
||||
* base64 encoding. This context is too large for normal stack sizes.
|
||||
* @param put_char The put char handler.
|
||||
* @param arg The argument for the put char handler.
|
||||
*
|
||||
* @see rtems_record_dump().
|
||||
*/
|
||||
void rtems_record_dump_zlib_base64(
|
||||
rtems_record_dump_base64_zlib_context *ctx,
|
||||
void ( *put_char )( int, void * ),
|
||||
void *arg
|
||||
);
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _RTEMS_RECORDDUMP_H */
|
||||
110
cpukit/libtrace/record/record-dump-base64.c
Normal file
110
cpukit/libtrace/record/record-dump-base64.c
Normal file
@@ -0,0 +1,110 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/recorddump.h>
|
||||
#include <rtems/score/io.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct {
|
||||
IO_Put_char put_char;
|
||||
void *arg;
|
||||
int out;
|
||||
size_t index;
|
||||
char buf[ 57 ];
|
||||
} dump_context;
|
||||
|
||||
static void put_char( int c, void *arg )
|
||||
{
|
||||
dump_context *ctx;
|
||||
|
||||
ctx = arg;
|
||||
|
||||
( *ctx->put_char )( c, ctx->arg );
|
||||
++ctx->out;
|
||||
|
||||
if ( ctx->out >= 76 ) {
|
||||
ctx->out = 0;
|
||||
( *ctx->put_char )( '\n', ctx->arg );
|
||||
}
|
||||
}
|
||||
|
||||
static void chunk( void *arg, const void *data, size_t length )
|
||||
{
|
||||
dump_context *ctx;
|
||||
size_t index;
|
||||
const char *in;
|
||||
const void *end;
|
||||
|
||||
ctx = arg;
|
||||
index = ctx->index;
|
||||
in = data;
|
||||
end = in + length;
|
||||
|
||||
while ( in != end ) {
|
||||
ctx->buf[ index ] = *in;
|
||||
++in;
|
||||
|
||||
if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) {
|
||||
index = 0;
|
||||
_IO_Base64(
|
||||
put_char,
|
||||
ctx,
|
||||
ctx->buf,
|
||||
sizeof( ctx->buf ),
|
||||
NULL,
|
||||
INT_MAX
|
||||
);
|
||||
} else {
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
ctx->index = index;
|
||||
}
|
||||
|
||||
static void flush( dump_context *ctx )
|
||||
{
|
||||
_IO_Base64( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX );
|
||||
}
|
||||
|
||||
void rtems_record_dump_base64( IO_Put_char put_char, void *arg )
|
||||
{
|
||||
dump_context ctx;
|
||||
|
||||
memset( &ctx, 0, sizeof( ctx ) );
|
||||
ctx.put_char = put_char;
|
||||
ctx.arg = arg;
|
||||
|
||||
rtems_record_dump( chunk, &ctx );
|
||||
flush( &ctx );
|
||||
}
|
||||
50
cpukit/libtrace/record/record-dump-fatal.c
Normal file
50
cpukit/libtrace/record/record-dump-fatal.c
Normal file
@@ -0,0 +1,50 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/recorddump.h>
|
||||
#include <rtems/bspIo.h>
|
||||
|
||||
void _Record_Fatal_dump_base64(
|
||||
Internal_errors_Source source,
|
||||
bool always_set_to_false,
|
||||
Internal_errors_t code
|
||||
)
|
||||
{
|
||||
rtems_record_produce_2(
|
||||
RTEMS_RECORD_FATAL_SOURCE,
|
||||
source,
|
||||
RTEMS_RECORD_FATAL_CODE,
|
||||
code
|
||||
);
|
||||
printk( "\n*** BEGIN OF RECORDS BASE64 ***\n" );
|
||||
rtems_record_dump_base64( rtems_put_char, NULL );
|
||||
printk( "\n*** END OF RECORDS BASE64 ***\n" );
|
||||
}
|
||||
160
cpukit/libtrace/record/record-dump-zbase64.c
Normal file
160
cpukit/libtrace/record/record-dump-zbase64.c
Normal file
@@ -0,0 +1,160 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/recorddump.h>
|
||||
#include <rtems/score/io.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
|
||||
static void *dump_zalloc( void *opaque, unsigned items, unsigned size )
|
||||
{
|
||||
rtems_record_dump_base64_zlib_context *ctx;
|
||||
char *mem_begin;
|
||||
size_t mem_available;
|
||||
|
||||
ctx = opaque;
|
||||
size *= items;
|
||||
mem_available = ctx->mem_available;
|
||||
|
||||
if ( mem_available < size ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mem_begin = ctx->mem_begin;
|
||||
ctx->mem_begin = mem_begin + size;
|
||||
ctx->mem_available = mem_available - size;
|
||||
return mem_begin;
|
||||
}
|
||||
|
||||
static void dump_zfree( void *opaque, void *ptr )
|
||||
{
|
||||
(void) opaque;
|
||||
(void) ptr;
|
||||
}
|
||||
|
||||
static void put_char( int c, void *arg )
|
||||
{
|
||||
rtems_record_dump_base64_zlib_context *ctx;
|
||||
|
||||
ctx = arg;
|
||||
|
||||
( *ctx->put_char )( c, ctx->arg );
|
||||
++ctx->out;
|
||||
|
||||
if ( ctx->out >= 76 ) {
|
||||
ctx->out = 0;
|
||||
( *ctx->put_char )( '\n', ctx->arg );
|
||||
}
|
||||
}
|
||||
|
||||
static void chunk( void *arg, const void *data, size_t length )
|
||||
{
|
||||
rtems_record_dump_base64_zlib_context *ctx;
|
||||
|
||||
ctx = arg;
|
||||
ctx->stream.next_in = RTEMS_DECONST( void *, data );
|
||||
ctx->stream.avail_in = length;
|
||||
|
||||
while ( ctx->stream.avail_in > 0 ) {
|
||||
int err;
|
||||
|
||||
err = deflate( &ctx->stream, Z_NO_FLUSH );
|
||||
if ( err != Z_OK ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ctx->stream.avail_out == 0 ) {
|
||||
ctx->stream.next_out = &ctx->buf[ 0 ];
|
||||
ctx->stream.avail_out = sizeof( ctx->buf );
|
||||
|
||||
_IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void flush( rtems_record_dump_base64_zlib_context *ctx )
|
||||
{
|
||||
while ( true ) {
|
||||
int err;
|
||||
|
||||
err = deflate( &ctx->stream, Z_FINISH );
|
||||
if ( err != Z_OK ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( ctx->stream.avail_out == 0 ) {
|
||||
ctx->stream.next_out = &ctx->buf[ 0 ];
|
||||
ctx->stream.avail_out = sizeof( ctx->buf );
|
||||
|
||||
_IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX );
|
||||
}
|
||||
}
|
||||
|
||||
_IO_Base64(
|
||||
put_char,
|
||||
ctx,
|
||||
ctx->buf,
|
||||
sizeof( ctx->buf ) - ctx->stream.avail_out,
|
||||
NULL,
|
||||
INT_MAX
|
||||
);
|
||||
}
|
||||
|
||||
void rtems_record_dump_zlib_base64(
|
||||
rtems_record_dump_base64_zlib_context *ctx,
|
||||
void ( *put_char )( int, void * ),
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
int err;
|
||||
|
||||
ctx->put_char = put_char;
|
||||
ctx->arg = arg;
|
||||
ctx->out = 0;
|
||||
ctx->stream.zalloc = dump_zalloc;
|
||||
ctx->stream.zfree = dump_zfree;
|
||||
ctx->stream.opaque = ctx;
|
||||
ctx->mem_begin = &ctx->mem[ 0 ];
|
||||
ctx->mem_available = sizeof( ctx->mem );
|
||||
|
||||
err = deflateInit( &ctx->stream, Z_BEST_COMPRESSION );
|
||||
if (err != Z_OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
ctx->stream.next_out = &ctx->buf[ 0 ];
|
||||
ctx->stream.avail_out = sizeof( ctx->buf );
|
||||
|
||||
rtems_record_dump( chunk, ctx );
|
||||
flush( ctx );
|
||||
deflateEnd( &ctx->stream );
|
||||
}
|
||||
52
cpukit/libtrace/record/record-dump-zfatal.c
Normal file
52
cpukit/libtrace/record/record-dump-zfatal.c
Normal file
@@ -0,0 +1,52 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/recorddump.h>
|
||||
#include <rtems/bspIo.h>
|
||||
|
||||
static rtems_record_dump_base64_zlib_context context;
|
||||
|
||||
void _Record_Fatal_dump_base64_zlib(
|
||||
Internal_errors_Source source,
|
||||
bool always_set_to_false,
|
||||
Internal_errors_t code
|
||||
)
|
||||
{
|
||||
rtems_record_produce_2(
|
||||
RTEMS_RECORD_FATAL_SOURCE,
|
||||
source,
|
||||
RTEMS_RECORD_FATAL_CODE,
|
||||
code
|
||||
);
|
||||
printk( "\n*** BEGIN OF RECORDS BASE64 ZLIB ***\n" );
|
||||
rtems_record_dump_zlib_base64( &context, rtems_put_char, NULL );
|
||||
printk( "\n*** END OF RECORDS BASE64 ZLIB ***\n" );
|
||||
}
|
||||
108
cpukit/libtrace/record/record-dump.c
Normal file
108
cpukit/libtrace/record/record-dump.c
Normal file
@@ -0,0 +1,108 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/recorddump.h>
|
||||
#include <rtems/score/threadimpl.h>
|
||||
|
||||
typedef struct {
|
||||
rtems_record_dump_chunk chunk;
|
||||
void *arg;
|
||||
} dump_context;
|
||||
|
||||
static void dump_chunk( dump_context *ctx, const void *data, size_t length )
|
||||
{
|
||||
( *ctx->chunk )( ctx->arg, data, length );
|
||||
}
|
||||
|
||||
static bool thread_names_visitor( rtems_tcb *tcb, void *arg )
|
||||
{
|
||||
dump_context *ctx;
|
||||
char name[ 2 * THREAD_DEFAULT_MAXIMUM_NAME_SIZE ];
|
||||
size_t n;
|
||||
size_t i;
|
||||
rtems_record_item item;
|
||||
rtems_record_data data;
|
||||
|
||||
ctx = arg;
|
||||
item.event = RTEMS_RECORD_THREAD_ID;
|
||||
item.data = tcb->Object.id;
|
||||
dump_chunk( ctx, &item, sizeof( item ) );
|
||||
|
||||
n = _Thread_Get_name( tcb, name, sizeof( name ) );
|
||||
i = 0;
|
||||
|
||||
while ( i < n ) {
|
||||
size_t j;
|
||||
|
||||
data = 0;
|
||||
|
||||
for ( j = 0; i < n && j < sizeof( data ); ++j ) {
|
||||
rtems_record_data c;
|
||||
|
||||
c = (unsigned char) name[ i ];
|
||||
data |= c << ( j * 8 );
|
||||
++i;
|
||||
}
|
||||
|
||||
item.event = RTEMS_RECORD_THREAD_NAME;
|
||||
item.data = data;
|
||||
dump_chunk( ctx, &item, sizeof( item ) );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void drain_visitor(
|
||||
const rtems_record_item *items,
|
||||
size_t count,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
dump_chunk( arg, items, count * sizeof( *items ) );
|
||||
}
|
||||
|
||||
void rtems_record_dump(
|
||||
rtems_record_dump_chunk chunk,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
Record_Stream_header header;
|
||||
size_t size;
|
||||
dump_context ctx;
|
||||
|
||||
ctx.chunk = chunk;
|
||||
ctx.arg = arg;
|
||||
|
||||
size = _Record_Stream_header_initialize( &header );
|
||||
dump_chunk( &ctx, &header, size );
|
||||
rtems_task_iterate( thread_names_visitor, &ctx );
|
||||
rtems_record_drain( drain_visitor, &ctx );
|
||||
}
|
||||
@@ -1124,6 +1124,7 @@ lib_docs += record02/record02.doc
|
||||
record02_SOURCES = record02/init.c
|
||||
record02_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_record02) \
|
||||
$(support_includes)
|
||||
record02_LDADD = $(RTEMS_ROOT)cpukit/librtemscpu.a $(RTEMS_ROOT)cpukit/libz.a $(LDADD)
|
||||
endif
|
||||
|
||||
if TEST_rtmonuse
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
|
||||
/*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* Copyright (C) 2018, 2019 embedded brains GmbH
|
||||
* Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de)
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -94,18 +94,11 @@ static void drain_visitor(
|
||||
rtems_test_assert(cs == RTEMS_RECORD_CLIENT_SUCCESS);
|
||||
}
|
||||
|
||||
static void Init(rtems_task_argument arg)
|
||||
static void generate_events(void)
|
||||
{
|
||||
test_context *ctx;
|
||||
Record_Stream_header header;
|
||||
size_t size;
|
||||
rtems_record_client_status cs;
|
||||
int i;
|
||||
uint32_t level;
|
||||
|
||||
TEST_BEGIN();
|
||||
ctx = &test_instance;
|
||||
|
||||
for (i = 0; i < 10; ++i) {
|
||||
rtems_task_wake_after(1);
|
||||
}
|
||||
@@ -160,6 +153,19 @@ static void Init(rtems_task_argument arg)
|
||||
rtems_record_exit_10(RTEMS_RECORD_USER_4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
|
||||
level = rtems_record_interrupt_disable();
|
||||
rtems_record_interrupt_enable(level);
|
||||
}
|
||||
|
||||
static void Init(rtems_task_argument arg)
|
||||
{
|
||||
test_context *ctx;
|
||||
Record_Stream_header header;
|
||||
size_t size;
|
||||
rtems_record_client_status cs;
|
||||
|
||||
TEST_BEGIN();
|
||||
ctx = &test_instance;
|
||||
|
||||
generate_events();
|
||||
|
||||
rtems_record_client_init(&ctx->client, client_handler, NULL);
|
||||
size = _Record_Stream_header_initialize(&header);
|
||||
@@ -168,6 +174,12 @@ static void Init(rtems_task_argument arg)
|
||||
rtems_record_drain(drain_visitor, ctx);
|
||||
rtems_record_client_destroy(&ctx->client);
|
||||
|
||||
generate_events();
|
||||
|
||||
_Record_Fatal_dump_base64(RTEMS_FATAL_SOURCE_APPLICATION, false, 123);
|
||||
|
||||
generate_events();
|
||||
|
||||
TEST_END();
|
||||
rtems_test_exit(0);
|
||||
}
|
||||
@@ -182,10 +194,12 @@ static void Init(rtems_task_argument arg)
|
||||
|
||||
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
|
||||
|
||||
#define CONFIGURE_RECORD_PER_PROCESSOR_ITEMS 256
|
||||
#define CONFIGURE_RECORD_PER_PROCESSOR_ITEMS 512
|
||||
|
||||
#define CONFIGURE_RECORD_EXTENSIONS_ENABLED
|
||||
|
||||
#define CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB
|
||||
|
||||
#define CONFIGURE_INIT
|
||||
|
||||
#include <rtems/confdefs.h>
|
||||
|
||||
Reference in New Issue
Block a user