[PATCH v2] rtems-record: New program

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Aug 12 05:39:35 UTC 2019


Update #3665.
---
 trace/record/record-client.c      |  448 ++++++++++++++
 trace/record/record-main.c        |  339 +++++++++++
 trace/record/record-text.c        | 1071 +++++++++++++++++++++++++++++++++
 trace/record/rtems/recordclient.h |  139 +++++
 trace/record/rtems/recorddata.h   | 1204 +++++++++++++++++++++++++++++++++++++
 trace/record/tree.h               |  801 ++++++++++++++++++++++++
 trace/wscript                     |   62 ++
 wscript                           |    3 +-
 8 files changed, 4066 insertions(+), 1 deletion(-)
 create mode 100644 trace/record/record-client.c
 create mode 100644 trace/record/record-main.c
 create mode 100644 trace/record/record-text.c
 create mode 100644 trace/record/rtems/recordclient.h
 create mode 100644 trace/record/rtems/recorddata.h
 create mode 100644 trace/record/tree.h
 create mode 100644 trace/wscript

diff --git a/trace/record/record-client.c b/trace/record/record-client.c
new file mode 100644
index 0000000..306dd2c
--- /dev/null
+++ b/trace/record/record-client.c
@@ -0,0 +1,448 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * 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.
+ */
+
+/*
+ * This file must be compatible to general purpose POSIX system, e.g. Linux,
+ * FreeBSD.  It may be used for utility programs.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/recordclient.h>
+
+#include <string.h>
+
+static void set_to_bt_scaler(
+  rtems_record_client_context *ctx,
+  uint32_t                     frequency
+)
+{
+  uint64_t bin_per_s;
+
+  bin_per_s = UINT64_C( 1 ) << 32;
+  ctx->to_bt_scaler = ( ( bin_per_s << 31 ) + frequency - 1 ) / frequency;
+}
+
+static rtems_record_client_status call_handler(
+  const rtems_record_client_context *ctx,
+  uint64_t                           bt,
+  rtems_record_event                 event,
+  uint64_t                           data
+)
+{
+  uint32_t seconds;
+  uint32_t nanosec;
+
+  seconds = (uint32_t) ( bt >> 32 );
+  nanosec = (uint32_t) ( ( UINT64_C( 1000000000 ) * (uint32_t) bt ) >> 32 );
+
+  return ( *ctx->handler )(
+    seconds,
+    nanosec,
+    ctx->cpu,
+    event,
+    data,
+    ctx->handler_arg
+  );
+}
+
+static void check_overflow(
+  const rtems_record_client_context *ctx,
+  const rtems_record_client_per_cpu *per_cpu,
+  uint32_t                           new_head
+)
+{
+  uint32_t last_tail;
+  uint32_t last_head;
+  uint32_t capacity;
+  uint32_t new_content;
+  uint64_t bt;
+
+  last_tail = per_cpu->tail[ per_cpu->index ];
+  last_head = per_cpu->head[ per_cpu->index ];
+
+  if ( last_tail == last_head ) {
+    return;
+  }
+
+  capacity = ( last_tail - last_head - 1 ) & ( ctx->count - 1 );
+  new_content = new_head - last_head;
+
+  if ( new_content <= capacity ) {
+    return;
+  }
+
+  bt = ( per_cpu->uptime.time_accumulated * ctx->to_bt_scaler ) >> 31;
+  bt += per_cpu->uptime.bt;
+
+  call_handler(
+    ctx,
+    bt,
+    RTEMS_RECORD_PER_CPU_OVERFLOW,
+    new_content - capacity
+  );
+}
+
+static rtems_record_client_status visit( rtems_record_client_context *ctx )
+{
+  rtems_record_client_per_cpu *per_cpu;
+  uint32_t                     time;
+  rtems_record_event           event;
+  uint64_t                     data;
+  uint64_t                     bt;
+
+  per_cpu = &ctx->per_cpu[ ctx->cpu ];
+  time = RTEMS_RECORD_GET_TIME( ctx->event );
+  event = RTEMS_RECORD_GET_EVENT( ctx->event );
+  data = ctx->data;
+
+  switch ( event ) {
+    case RTEMS_RECORD_PROCESSOR:
+      if ( data >= RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT ) {
+        return RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU;
+      }
+
+      ctx->cpu = (uint32_t) data;
+      per_cpu = &ctx->per_cpu[ ctx->cpu ];
+      break;
+    case RTEMS_RECORD_UPTIME_LOW:
+      per_cpu->uptime.bt = (uint32_t) data;
+      per_cpu->uptime.time_at_bt = time;
+      per_cpu->uptime.time_last = time;
+      per_cpu->uptime.time_accumulated = 0;
+      time = 0;
+      break;
+    case RTEMS_RECORD_UPTIME_HIGH:
+      per_cpu->uptime.bt += (int64_t) data << 32;
+      time = 0;
+      break;
+    case RTEMS_RECORD_PER_CPU_TAIL:
+      per_cpu->tail[ per_cpu->index ] = (uint32_t) data;
+      break;
+    case RTEMS_RECORD_PER_CPU_HEAD:
+      per_cpu->head[ per_cpu->index ]= (uint32_t) data;
+      per_cpu->index ^= 1;
+      check_overflow( ctx, per_cpu, (uint32_t) data );
+      break;
+    case RTEMS_RECORD_PER_CPU_COUNT:
+      ctx->count = (uint32_t) data;
+      break;
+    case RTEMS_RECORD_FREQUENCY:
+      set_to_bt_scaler( ctx, (uint32_t) data );
+      break;
+    case RTEMS_RECORD_VERSION:
+      if ( data != RTEMS_RECORD_THE_VERSION ) {
+        return RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_VERSION;
+      }
+
+      break;
+    default:
+      break;
+  }
+
+  if ( time != 0 ) {
+    uint32_t delta;
+
+    delta = ( time - per_cpu->uptime.time_last )
+      & ( ( UINT32_C( 1 ) << RTEMS_RECORD_TIME_BITS ) - 1 );
+    per_cpu->uptime.time_last = time;
+    per_cpu->uptime.time_accumulated += delta;
+    bt = ( per_cpu->uptime.time_accumulated * ctx->to_bt_scaler ) >> 31;
+    bt += per_cpu->uptime.bt;
+  } else {
+    bt = 0;
+  }
+
+  return call_handler( ctx, bt, event, data );
+}
+
+static rtems_record_client_status consume_32(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  while ( n > 0 ) {
+    size_t m;
+    char *pos;
+
+    m = ctx->todo < n ? ctx->todo : n;
+    pos = ctx->pos;
+    pos = memcpy( pos, buf, m );
+    n -= m;
+    buf = (char *) buf + m;
+
+    if ( m == ctx->todo ) {
+      rtems_record_client_status status;
+
+      ctx->todo = sizeof( ctx->item.format_32 );
+      ctx->pos = &ctx->item.format_32;
+      ctx->event = ctx->item.format_32.event;
+      ctx->data = ctx->item.format_32.data;
+
+      status = visit( ctx );
+
+      if ( status != RTEMS_RECORD_CLIENT_SUCCESS ) {
+        return status;
+      }
+    } else {
+      ctx->todo -= m;
+      ctx->pos = pos + m;
+    }
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+static rtems_record_client_status consume_64(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  while ( n > 0 ) {
+    size_t m;
+    char *pos;
+
+    m = ctx->todo < n ? ctx->todo : n;
+    pos = ctx->pos;
+    pos = memcpy( pos, buf, m );
+    n -= m;
+    buf = (char *) buf + m;
+
+    if ( m == ctx->todo ) {
+      rtems_record_client_status status;
+
+      ctx->todo = sizeof( ctx->item.format_64 );
+      ctx->pos = &ctx->item.format_64;
+      ctx->event = ctx->item.format_64.event;
+      ctx->data = ctx->item.format_64.data;
+
+      status = visit( ctx );
+
+      if ( status != RTEMS_RECORD_CLIENT_SUCCESS ) {
+        return status;
+      }
+    } else {
+      ctx->todo -= m;
+      ctx->pos = pos + m;
+    }
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+static rtems_record_client_status consume_swap_32(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  while ( n > 0 ) {
+    size_t m;
+    char *pos;
+
+    m = ctx->todo < n ? ctx->todo : n;
+    pos = ctx->pos;
+    pos = memcpy( pos, buf, m );
+    n -= m;
+    buf = (char *) buf + m;
+
+    if ( m == ctx->todo ) {
+      rtems_record_client_status status;
+
+      ctx->todo = sizeof( ctx->item.format_32 );
+      ctx->pos = &ctx->item.format_32;
+      ctx->event = __builtin_bswap32( ctx->item.format_32.event );
+      ctx->data = __builtin_bswap32( ctx->item.format_32.data );
+
+      status = visit( ctx );
+
+      if ( status != RTEMS_RECORD_CLIENT_SUCCESS ) {
+        return status;
+      }
+    } else {
+      ctx->todo -= m;
+      ctx->pos = pos + m;
+    }
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+static rtems_record_client_status consume_swap_64(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  while ( n > 0 ) {
+    size_t m;
+    char *pos;
+
+    m = ctx->todo < n ? ctx->todo : n;
+    pos = ctx->pos;
+    pos = memcpy( pos, buf, m );
+    n -= m;
+    buf = (char *) buf + m;
+
+    if ( m == ctx->todo ) {
+      rtems_record_client_status status;
+
+      ctx->todo = sizeof( ctx->item.format_64 );
+      ctx->pos = &ctx->item.format_64;
+      ctx->event = __builtin_bswap32( ctx->item.format_64.event );
+      ctx->data = __builtin_bswap64( ctx->item.format_64.data );
+
+      status = visit( ctx );
+
+      if ( status != RTEMS_RECORD_CLIENT_SUCCESS ) {
+        return status;
+      }
+    } else {
+      ctx->todo -= m;
+      ctx->pos = pos + m;
+    }
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+static rtems_record_client_status consume_init(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  while ( n > 0 ) {
+    size_t m;
+    char *pos;
+
+    m = ctx->todo < n ? ctx->todo : n;
+    pos = ctx->pos;
+    pos = memcpy( pos, buf, m );
+    n -= m;
+    buf = (char *) buf + m;
+
+    if ( m == ctx->todo ) {
+      uint32_t magic;
+
+      magic = ctx->header[ 1 ];
+
+      switch ( ctx->header[ 0 ] ) {
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+        case RTEMS_RECORD_FORMAT_LE_32:
+          ctx->todo = sizeof( ctx->item.format_32 );
+          ctx->pos = &ctx->item.format_32;
+          ctx->consume = consume_32;
+          break;
+        case RTEMS_RECORD_FORMAT_LE_64:
+          ctx->todo = sizeof( ctx->item.format_64 );
+          ctx->pos = &ctx->item.format_64;
+          ctx->consume = consume_64;
+          break;
+        case RTEMS_RECORD_FORMAT_BE_32:
+          ctx->todo = sizeof( ctx->item.format_32 );
+          ctx->pos = &ctx->item.format_32;
+          ctx->consume = consume_swap_32;
+          magic = __builtin_bswap32( magic );
+          break;
+        case RTEMS_RECORD_FORMAT_BE_64:
+          ctx->todo = sizeof( ctx->item.format_64 );
+          ctx->pos = &ctx->item.format_64;
+          ctx->consume = consume_swap_64;
+          magic = __builtin_bswap32( magic );
+          break;
+#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+        case RTEMS_RECORD_FORMAT_LE_32:
+          ctx->todo = sizeof( ctx->item.format_32 );
+          ctx->pos = &ctx->item.format_32;
+          ctx->consume = consume_swap_32;
+          magic = __builtin_bswap32( magic );
+          break;
+        case RTEMS_RECORD_FORMAT_LE_64:
+          ctx->todo = sizeof( ctx->item.format_64 );
+          ctx->pos = &ctx->item.format_64;
+          ctx->consume = consume_swap_64;
+          magic = __builtin_bswap32( magic );
+          break;
+        case RTEMS_RECORD_FORMAT_BE_32:
+          ctx->todo = sizeof( ctx->item.format_32 );
+          ctx->pos = &ctx->item.format_32;
+          ctx->consume = consume_32;
+          break;
+        case RTEMS_RECORD_FORMAT_BE_64:
+          ctx->todo = sizeof( ctx->item.format_64 );
+          ctx->pos = &ctx->item.format_64;
+          ctx->consume = consume_64;
+          break;
+#else
+#error "unexpected __BYTE_ORDER__"
+#endif
+        default:
+          return RTEMS_RECORD_CLIENT_ERROR_UNKNOWN_FORMAT;
+      }
+
+      if ( magic != RTEMS_RECORD_MAGIC ) {
+        return RTEMS_RECORD_CLIENT_ERROR_INVALID_MAGIC;
+      }
+
+      return rtems_record_client_run( ctx, buf, n );
+    } else {
+      ctx->todo -= m;
+      ctx->pos = pos + m;
+    }
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+void rtems_record_client_init(
+  rtems_record_client_context *ctx,
+  rtems_record_client_handler  handler,
+  void                        *arg
+)
+{
+  ctx = memset( ctx, 0, sizeof( *ctx ) );
+  ctx->to_bt_scaler = UINT64_C( 1 ) << 31;
+  ctx->handler = handler;
+  ctx->handler_arg = arg;
+  ctx->todo = sizeof( ctx->header );
+  ctx->pos = &ctx->header;
+  ctx->consume = consume_init;
+}
+
+rtems_record_client_status rtems_record_client_run(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+)
+{
+  return ( *ctx->consume )( ctx, buf, n );
+}
diff --git a/trace/record/record-main.c b/trace/record/record-main.c
new file mode 100644
index 0000000..742428b
--- /dev/null
+++ b/trace/record/record-main.c
@@ -0,0 +1,339 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * 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.
+ */
+
+#include <rtems/recorddata.h>
+#include <rtems/recordclient.h>
+
+#include <sys/queue.h>
+#include <sys/socket.h>
+
+#include <assert.h>
+#include <getopt.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <inttypes.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "tree.h"
+
+#define THRESHOLD_IN_NS 500000000
+
+static const struct option longopts[] = {
+  { "help", 0, NULL, 'h' },
+  { "host", 1, NULL, 'H' },
+  { "port", 1, NULL, 'p' },
+  { "items", 1, NULL, 'i' },
+  { NULL, 0, NULL, 0 }
+};
+
+typedef struct client_item {
+  union {
+    SLIST_ENTRY( client_item ) free_node;
+    RB_ENTRY( client_item )    active_node;
+  };
+  uint64_t                     ns;
+  uint32_t                     cpu;
+  rtems_record_event           event;
+  uint64_t                     data;
+  uint64_t                     counter;
+} client_item;
+
+typedef struct client_context {
+  uint64_t                       ns_threshold;
+  uint64_t                       last_ns;
+  uint32_t                       last_cpu;
+  bool                           flush;
+  bool                           only_one_cpu;
+  uint64_t                       counter;
+  SLIST_HEAD( , client_item )    free_items;
+  RB_HEAD( active, client_item ) active_items;
+} client_context;
+
+static inline int item_cmp( const void *pa, const void *pb )
+{
+  const client_item *a;
+  const client_item *b;
+
+  a = (const client_item *) pa;
+  b = (const client_item *) pb;
+
+  if ( a->ns < b->ns ) {
+    return -1;
+  } else if ( a->ns > b->ns ) {
+    return 1;
+  } else if ( a->counter < b->counter ) {
+    return -1;
+  } else {
+    /* The counter are never equal */
+    return 1;
+  }
+}
+
+RB_GENERATE_INTERNAL( active, client_item, active_node, item_cmp, static inline )
+
+static void usage( char **argv )
+{
+  printf(
+    "%s [--host=HOST] [--port=PORT] [--items=ITEMS]\n"
+    "\n"
+    "Mandatory arguments to long options are mandatory for short options too.\n"
+    "  -h, --help                 print this help text\n"
+    "  -H, --host=HOST            the host IPv4 address of the record server\n"
+    "  -p, --port=PORT            the TCP port of the record server\n"
+    "  -i, --items=ITEMS          the maximum count of active record items\n",
+    argv[ 0 ]
+  );
+}
+
+static int connect_client( const char *host, uint16_t port )
+{
+  struct sockaddr_in in_addr;
+  int fd;
+  int rv;
+
+  fd = socket( PF_INET, SOCK_STREAM, 0 );
+  assert( fd >= 0 );
+
+  memset( &in_addr, 0, sizeof( in_addr ) );
+  in_addr.sin_family = AF_INET;
+  in_addr.sin_port = htons( port );
+  in_addr.sin_addr.s_addr = inet_addr( host );
+  rv = connect( fd, (struct sockaddr *) &in_addr, sizeof( in_addr ) );
+  assert( rv == 0 );
+
+  return fd;
+}
+
+static void print_item( FILE *f, const client_item *item )
+{
+  if ( item->ns != 0 ) {
+    uint32_t seconds;
+    uint32_t nanoseconds;
+
+    seconds = (uint32_t) ( item->ns / 1000000000 );
+    nanoseconds = (uint32_t) ( item->ns % 1000000000 );
+    fprintf( f, "%" PRIu32 ".%09" PRIu32 ":", seconds, nanoseconds );
+  } else {
+    fprintf( f, "*:" );
+  }
+
+  fprintf(
+    f,
+    "%" PRIu32 ":%s:%" PRIx64 "\n",
+    item->cpu,
+    rtems_record_event_text( item->event ),
+    item->data
+  );
+}
+
+static void flush_items( client_context *cctx )
+{
+  uint64_t ns;
+  uint64_t ns_threshold;
+  client_item *x;
+  client_item *y;
+
+  ns = cctx->last_ns;
+  ns_threshold = cctx->ns_threshold;
+
+  if ( ns >= ns_threshold ) {
+    cctx->ns_threshold = ( ( ns + THRESHOLD_IN_NS - 1 ) / THRESHOLD_IN_NS )
+      * THRESHOLD_IN_NS;
+    ns_threshold -= THRESHOLD_IN_NS;
+  }
+
+  if ( SLIST_EMPTY( &cctx->free_items ) ) {
+    uint64_t somewhere_in_the_middle;
+
+    somewhere_in_the_middle = RB_ROOT( &cctx->active_items )->ns;
+
+    if ( ns_threshold < somewhere_in_the_middle ) {
+      ns_threshold = somewhere_in_the_middle;
+    }
+  }
+
+  RB_FOREACH_SAFE( x, active, &cctx->active_items, y ) {
+    if ( x->ns > ns_threshold ) {
+      break;
+    }
+
+    RB_REMOVE( active, &cctx->active_items, x );
+    SLIST_INSERT_HEAD( &cctx->free_items, x, free_node );
+    print_item( stdout, x );
+  }
+}
+
+static rtems_record_client_status handler(
+  uint32_t            seconds,
+  uint32_t            nanoseconds,
+  uint32_t            cpu,
+  rtems_record_event  event,
+  uint64_t            data,
+  void               *arg
+)
+{
+  client_context *cctx;
+  client_item *item;
+  uint64_t ns;
+  bool flush;
+
+  cctx = arg;
+
+  if ( cpu != 0 ) {
+    cctx->only_one_cpu = false;
+  }
+
+  ns = ( (uint64_t) seconds * 1000000000 ) + nanoseconds;
+
+  if ( cctx->only_one_cpu ) {
+    flush = ( ns >= cctx->ns_threshold );
+  } else {
+    if ( cpu != cctx->last_cpu ) {
+      cctx->last_cpu = cpu;
+
+      if ( cpu == 0 ) {
+        flush = ( cctx->flush && cctx->last_ns >= cctx->ns_threshold );
+        cctx->flush = true;
+      } else {
+        flush = false;
+        cctx->flush = ( cctx->flush && cctx->last_ns >= cctx->ns_threshold );
+      }
+    } else {
+      flush = false;
+    }
+  }
+
+  if (
+    ns != 0
+      && event != RTEMS_RECORD_UPTIME_LOW
+      && event != RTEMS_RECORD_UPTIME_HIGH
+  ) {
+    uint64_t counter;
+
+    cctx->last_ns = ns;
+
+    item = SLIST_FIRST( &cctx->free_items );
+    SLIST_REMOVE_HEAD( &cctx->free_items, free_node );
+    item->ns = ns;
+    item->cpu = cpu;
+    item->event = event;
+    item->data = data;
+
+    counter = cctx->counter;
+    cctx->counter = counter + 1;
+    item->counter = counter;
+
+    RB_INSERT( active, &cctx->active_items, item );
+  }
+
+  if ( flush || SLIST_EMPTY( &cctx->free_items ) ) {
+    flush_items( cctx );
+  }
+
+  return RTEMS_RECORD_CLIENT_SUCCESS;
+}
+
+int main( int argc, char **argv )
+{
+  rtems_record_client_context ctx;
+  client_context cctx;
+  client_item *items;
+  const char *host;
+  uint16_t port;
+  int fd;
+  int rv;
+  int opt;
+  int longindex;
+  size_t n;
+  size_t i;
+
+  host = "127.0.0.1";
+  port = 1234;
+  n = RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT * 1024 * 1024;
+
+  while (
+    ( opt = getopt_long( argc, argv, "hH:p:i:", &longopts[0], &longindex ) )
+      != -1
+  ) {
+    switch ( opt ) {
+      case 'h':
+        usage( argv );
+        exit( EXIT_SUCCESS );
+        break;
+      case 'H':
+        host = optarg;
+        break;
+      case 'p':
+        port = (uint16_t) strtoul( optarg, NULL, 10 );
+        break;
+      case 'i':
+        n = (size_t) strtoul( optarg, NULL, 10 );
+        break;
+      default:
+        exit( EXIT_FAILURE );
+        break;
+    }
+  }
+
+  memset( &cctx, 0, sizeof( cctx ) );
+  cctx.only_one_cpu = true;
+  cctx.ns_threshold = 2 * THRESHOLD_IN_NS;
+  SLIST_INIT( &cctx.free_items );
+  RB_INIT( &cctx.active_items );
+
+  items = calloc( n, sizeof( *items ) );
+  assert( items != NULL );
+
+  for ( i = 0; i < n; ++i ) {
+    SLIST_INSERT_HEAD( &cctx.free_items, &items[ i ], free_node );
+  }
+
+  fd = connect_client( host, port );
+  rtems_record_client_init( &ctx, handler, &cctx );
+
+  while ( true ) {
+    int buf[ 8192 ];
+    ssize_t n;
+
+    n = recv( fd, buf, sizeof( buf ), 0 );
+    if ( n >= 0 ) {
+      rtems_record_client_run( &ctx, buf, (size_t) n );
+    } else {
+      break;
+    }
+  }
+
+  rv = close( fd );
+  assert( rv == 0 );
+
+  return 0;
+}
diff --git a/trace/record/record-text.c b/trace/record/record-text.c
new file mode 100644
index 0000000..5652ab0
--- /dev/null
+++ b/trace/record/record-text.c
@@ -0,0 +1,1071 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * 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.
+ */
+
+/*
+ * This file must be compatible to general purpose POSIX system, e.g. Linux,
+ * FreeBSD.  It may be used for utility programs.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/recorddata.h>
+
+#include <stddef.h>
+
+static const char * const event_text[] = {
+  [ RTEMS_RECORD_EMPTY ] = "EMPTY",
+  [ RTEMS_RECORD_VERSION ] = "VERSION",
+  [ RTEMS_RECORD_ACCEPT_ENTRY ] = "ACCEPT_ENTRY",
+  [ RTEMS_RECORD_ACCEPT_EXIT ] = "ACCEPT_EXIT",
+  [ RTEMS_RECORD_BIND_ENTRY ] = "BIND_ENTRY",
+  [ RTEMS_RECORD_BIND_EXIT ] = "BIND_EXIT",
+  [ RTEMS_RECORD_BUFFER ] = "BUFFER",
+  [ RTEMS_RECORD_CHOWN_ENTRY ] = "CHOWN_ENTRY",
+  [ RTEMS_RECORD_CHOWN_EXIT ] = "CHOWN_EXIT",
+  [ RTEMS_RECORD_CLOSE_ENTRY ] = "CLOSE_ENTRY",
+  [ RTEMS_RECORD_CLOSE_EXIT ] = "CLOSE_EXIT",
+  [ RTEMS_RECORD_CONNECT_ENTRY ] = "CONNECT_ENTRY",
+  [ RTEMS_RECORD_CONNECT_EXIT ] = "CONNECT_EXIT",
+  [ RTEMS_RECORD_ETHER_INPUT ] = "ETHER_INPUT",
+  [ RTEMS_RECORD_ETHER_OUTPUT ] = "ETHER_OUTPUT",
+  [ RTEMS_RECORD_FCHMOD_ENTRY ] = "FCHMOD_ENTRY",
+  [ RTEMS_RECORD_FCHMOD_EXIT ] = "FCHMOD_EXIT",
+  [ RTEMS_RECORD_FCNTL_ENTRY ] = "FCNTL_ENTRY",
+  [ RTEMS_RECORD_FCNTL_EXIT ] = "FCNTL_EXIT",
+  [ RTEMS_RECORD_FDATASYNC_ENTRY ] = "FDATASYNC_ENTRY",
+  [ RTEMS_RECORD_FDATASYNC_EXIT ] = "FDATASYNC_EXIT",
+  [ RTEMS_RECORD_FREQUENCY ] = "FREQUENCY",
+  [ RTEMS_RECORD_FSTAT_ENTRY ] = "FSTAT_ENTRY",
+  [ RTEMS_RECORD_FSTAT_EXIT ] = "FSTAT_EXIT",
+  [ RTEMS_RECORD_FSYNC_ENTRY ] = "FSYNC_ENTRY",
+  [ RTEMS_RECORD_FSYNC_EXIT ] = "FSYNC_EXIT",
+  [ RTEMS_RECORD_FTRUNCATE_ENTRY ] = "FTRUNCATE_ENTRY",
+  [ 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",
+  [ RTEMS_RECORD_HEAP_USAGE ] = "HEAP_USAGE",
+  [ RTEMS_RECORD_INTERRUPT_ENTRY ] = "INTERRUPT_ENTRY",
+  [ RTEMS_RECORD_INTERRUPT_EXIT ] = "INTERRUPT_EXIT",
+  [ RTEMS_RECORD_INTERRUPT_INSTALL ] = "INTERRUPT_INSTALL",
+  [ RTEMS_RECORD_INTERRUPT_REMOVE ] = "INTERRUPT_REMOVE",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_ENTRY ] = "INTERRUPT_SERVER_ENTRY",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_EXIT ] = "INTERRUPT_SERVER_EXIT",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_INSTALL ] = "INTERRUPT_SERVER_INSTALL",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_MOVE ] = "INTERRUPT_SERVER_MOVE",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_REMOVE ] = "INTERRUPT_SERVER_REMOVE",
+  [ RTEMS_RECORD_INTERRUPT_SERVER_TRIGGER ] = "INTERRUPT_SERVER_TRIGGER",
+  [ RTEMS_RECORD_IOCTL_ENTRY ] = "IOCTL_ENTRY",
+  [ RTEMS_RECORD_IOCTL_EXIT ] = "IOCTL_EXIT",
+  [ RTEMS_RECORD_IP6_INPUT ] = "IP6_INPUT",
+  [ RTEMS_RECORD_IP6_OUTPUT ] = "IP6_OUTPUT",
+  [ RTEMS_RECORD_IP_INPUT ] = "IP_INPUT",
+  [ RTEMS_RECORD_IP_OUTPUT ] = "IP_OUTPUT",
+  [ RTEMS_RECORD_KEVENT_ENTRY ] = "KEVENT_ENTRY",
+  [ RTEMS_RECORD_KEVENT_EXIT ] = "KEVENT_EXIT",
+  [ RTEMS_RECORD_KQUEUE_ENTRY ] = "KQUEUE_ENTRY",
+  [ RTEMS_RECORD_KQUEUE_EXIT ] = "KQUEUE_EXIT",
+  [ RTEMS_RECORD_LENGTH ] = "LENGTH",
+  [ RTEMS_RECORD_LINK_ENTRY ] = "LINK_ENTRY",
+  [ RTEMS_RECORD_LINK_EXIT ] = "LINK_EXIT",
+  [ RTEMS_RECORD_LISTEN_ENTRY ] = "LISTEN_ENTRY",
+  [ RTEMS_RECORD_LISTEN_EXIT ] = "LISTEN_EXIT",
+  [ RTEMS_RECORD_LSEEK_ENTRY ] = "LSEEK_ENTRY",
+  [ RTEMS_RECORD_LSEEK_EXIT ] = "LSEEK_EXIT",
+  [ 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_OPEN_ENTRY ] = "OPEN_ENTRY",
+  [ RTEMS_RECORD_OPEN_EXIT ] = "OPEN_EXIT",
+  [ RTEMS_RECORD_PAGE_ALLOC ] = "PAGE_ALLOC",
+  [ RTEMS_RECORD_PAGE_FREE ] = "PAGE_FREE",
+  [ RTEMS_RECORD_PER_CPU_COUNT ] = "PER_CPU_COUNT",
+  [ RTEMS_RECORD_PER_CPU_HEAD ] = "PER_CPU_HEAD",
+  [ RTEMS_RECORD_PER_CPU_OVERFLOW ] = "PER_CPU_OVERFLOW",
+  [ RTEMS_RECORD_PER_CPU_TAIL ] = "PER_CPU_TAIL",
+  [ RTEMS_RECORD_POLL_ENTRY ] = "POLL_ENTRY",
+  [ RTEMS_RECORD_POLL_EXIT ] = "POLL_EXIT",
+  [ RTEMS_RECORD_PROCESSOR ] = "PROCESSOR",
+  [ RTEMS_RECORD_PROCESSOR_MAXIMUM ] = "PROCESSOR_MAXIMUM",
+  [ RTEMS_RECORD_READ_ENTRY ] = "READ_ENTRY",
+  [ RTEMS_RECORD_READ_EXIT ] = "READ_EXIT",
+  [ RTEMS_RECORD_READLINK_ENTRY ] = "READLINK_ENTRY",
+  [ RTEMS_RECORD_READLINK_EXIT ] = "READLINK_EXIT",
+  [ RTEMS_RECORD_READV_ENTRY ] = "READV_ENTRY",
+  [ RTEMS_RECORD_READV_EXIT ] = "READV_EXIT",
+  [ RTEMS_RECORD_RECV_ENTRY ] = "RECV_ENTRY",
+  [ RTEMS_RECORD_RECV_EXIT ] = "RECV_EXIT",
+  [ RTEMS_RECORD_RECVFROM_ENTRY ] = "RECVFROM_ENTRY",
+  [ RTEMS_RECORD_RECVFROM_EXIT ] = "RECVFROM_EXIT",
+  [ RTEMS_RECORD_RECVMSG_ENTRY ] = "RECVMSG_ENTRY",
+  [ RTEMS_RECORD_RECVMSG_EXIT ] = "RECVMSG_EXIT",
+  [ RTEMS_RECORD_RENAME_ENTRY ] = "RENAME_ENTRY",
+  [ RTEMS_RECORD_RENAME_EXIT ] = "RENAME_EXIT",
+  [ RTEMS_RECORD_RTEMS_BARRIER_CREATE ] = "RTEMS_BARRIER_CREATE",
+  [ RTEMS_RECORD_RTEMS_BARRIER_DELETE ] = "RTEMS_BARRIER_DELETE",
+  [ RTEMS_RECORD_RTEMS_BARRIER_RELEASE ] = "RTEMS_BARRIER_RELEASE",
+  [ RTEMS_RECORD_RTEMS_BARRIER_WAIT ] = "RTEMS_BARRIER_WAIT",
+  [ RTEMS_RECORD_RTEMS_EVENT_RECEIVE ] = "RTEMS_EVENT_RECEIVE",
+  [ RTEMS_RECORD_RTEMS_EVENT_SEND ] = "RTEMS_EVENT_SEND",
+  [ RTEMS_RECORD_RTEMS_EVENT_SYSTEM_RECEIVE ] = "RTEMS_EVENT_SYSTEM_RECEIVE",
+  [ RTEMS_RECORD_RTEMS_EVENT_SYSTEM_SEND ] = "RTEMS_EVENT_SYSTEM_SEND",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_BROADCAST ] = "RTEMS_MESSAGE_QUEUE_BROADCAST",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_CREATE ] = "RTEMS_MESSAGE_QUEUE_CREATE",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_DELETE ] = "RTEMS_MESSAGE_QUEUE_DELETE",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_FLUSH ] = "RTEMS_MESSAGE_QUEUE_FLUSH",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_RECEIVE ] = "RTEMS_MESSAGE_QUEUE_RECEIVE",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_SEND ] = "RTEMS_MESSAGE_QUEUE_SEND",
+  [ RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_URGENT ] = "RTEMS_MESSAGE_QUEUE_URGENT",
+  [ RTEMS_RECORD_RTEMS_PARTITION_CREATE ] = "RTEMS_PARTITION_CREATE",
+  [ RTEMS_RECORD_RTEMS_PARTITION_DELETE ] = "RTEMS_PARTITION_DELETE",
+  [ RTEMS_RECORD_RTEMS_PARTITION_GET_BUFFER ] = "RTEMS_PARTITION_GET_BUFFER",
+  [ RTEMS_RECORD_RTEMS_PARTITION_RETURN_BUFFER ] = "RTEMS_PARTITION_RETURN_BUFFER",
+  [ RTEMS_RECORD_RTEMS_RATE_MONOTONIC_CANCEL ] = "RTEMS_RATE_MONOTONIC_CANCEL",
+  [ RTEMS_RECORD_RTEMS_RATE_MONOTONIC_CREATE ] = "RTEMS_RATE_MONOTONIC_CREATE",
+  [ RTEMS_RECORD_RTEMS_RATE_MONOTONIC_DELETE ] = "RTEMS_RATE_MONOTONIC_DELETE",
+  [ RTEMS_RECORD_RTEMS_RATE_MONOTONIC_PERIOD ] = "RTEMS_RATE_MONOTONIC_PERIOD",
+  [ RTEMS_RECORD_RTEMS_SEMAPHORE_CREATE ] = "RTEMS_SEMAPHORE_CREATE",
+  [ RTEMS_RECORD_RTEMS_SEMAPHORE_DELETE ] = "RTEMS_SEMAPHORE_DELETE",
+  [ RTEMS_RECORD_RTEMS_SEMAPHORE_FLUSH ] = "RTEMS_SEMAPHORE_FLUSH",
+  [ RTEMS_RECORD_RTEMS_SEMAPHORE_OBTAIN ] = "RTEMS_SEMAPHORE_OBTAIN",
+  [ RTEMS_RECORD_RTEMS_SEMAPHORE_RELEASE ] = "RTEMS_SEMAPHORE_RELEASE",
+  [ RTEMS_RECORD_RTEMS_TIMER_CANCEL ] = "RTEMS_TIMER_CANCEL",
+  [ RTEMS_RECORD_RTEMS_TIMER_CREATE ] = "RTEMS_TIMER_CREATE",
+  [ RTEMS_RECORD_RTEMS_TIMER_DELETE ] = "RTEMS_TIMER_DELETE",
+  [ RTEMS_RECORD_RTEMS_TIMER_FIRE_AFTER ] = "RTEMS_TIMER_FIRE_AFTER",
+  [ RTEMS_RECORD_RTEMS_TIMER_FIRE_WHEN ] = "RTEMS_TIMER_FIRE_WHEN",
+  [ RTEMS_RECORD_RTEMS_TIMER_RESET ] = "RTEMS_TIMER_RESET",
+  [ RTEMS_RECORD_RTEMS_TIMER_SERVER_FIRE_AFTER ] = "RTEMS_TIMER_SERVER_FIRE_AFTER",
+  [ RTEMS_RECORD_RTEMS_TIMER_SERVER_FIRE_WHEN ] = "RTEMS_TIMER_SERVER_FIRE_WHEN",
+  [ RTEMS_RECORD_SBWAIT_ENTRY ] = "SBWAIT_ENTRY",
+  [ RTEMS_RECORD_SBWAIT_EXIT ] = "SBWAIT_EXIT",
+  [ RTEMS_RECORD_SBWAKEUP_ENTRY ] = "SBWAKEUP_ENTRY",
+  [ RTEMS_RECORD_SBWAKEUP_EXIT ] = "SBWAKEUP_EXIT",
+  [ RTEMS_RECORD_SELECT_ENTRY ] = "SELECT_ENTRY",
+  [ RTEMS_RECORD_SELECT_EXIT ] = "SELECT_EXIT",
+  [ RTEMS_RECORD_SEND_ENTRY ] = "SEND_ENTRY",
+  [ RTEMS_RECORD_SEND_EXIT ] = "SEND_EXIT",
+  [ RTEMS_RECORD_SENDMSG_ENTRY ] = "SENDMSG_ENTRY",
+  [ RTEMS_RECORD_SENDMSG_EXIT ] = "SENDMSG_EXIT",
+  [ RTEMS_RECORD_SENDTO_ENTRY ] = "SENDTO_ENTRY",
+  [ RTEMS_RECORD_SENDTO_EXIT ] = "SENDTO_EXIT",
+  [ RTEMS_RECORD_SETSOCKOPT_ENTRY ] = "SETSOCKOPT_ENTRY",
+  [ RTEMS_RECORD_SETSOCKOPT_EXIT ] = "SETSOCKOPT_EXIT",
+  [ RTEMS_RECORD_SHUTDOWN_ENTRY ] = "SHUTDOWN_ENTRY",
+  [ RTEMS_RECORD_SHUTDOWN_EXIT ] = "SHUTDOWN_EXIT",
+  [ RTEMS_RECORD_SOABORT_ENTRY ] = "SOABORT_ENTRY",
+  [ RTEMS_RECORD_SOABORT_EXIT ] = "SOABORT_EXIT",
+  [ RTEMS_RECORD_SOACCEPT_ENTRY ] = "SOACCEPT_ENTRY",
+  [ RTEMS_RECORD_SOACCEPT_EXIT ] = "SOACCEPT_EXIT",
+  [ RTEMS_RECORD_SOALLOC_ENTRY ] = "SOALLOC_ENTRY",
+  [ RTEMS_RECORD_SOALLOC_EXIT ] = "SOALLOC_EXIT",
+  [ RTEMS_RECORD_SOBINDAT_ENTRY ] = "SOBINDAT_ENTRY",
+  [ RTEMS_RECORD_SOBINDAT_EXIT ] = "SOBINDAT_EXIT",
+  [ RTEMS_RECORD_SOBIND_ENTRY ] = "SOBIND_ENTRY",
+  [ RTEMS_RECORD_SOBIND_EXIT ] = "SOBIND_EXIT",
+  [ RTEMS_RECORD_SOCKET_ENTRY ] = "SOCKET_ENTRY",
+  [ RTEMS_RECORD_SOCKET_EXIT ] = "SOCKET_EXIT",
+  [ RTEMS_RECORD_SOCLOSE_ENTRY ] = "SOCLOSE_ENTRY",
+  [ RTEMS_RECORD_SOCLOSE_EXIT ] = "SOCLOSE_EXIT",
+  [ RTEMS_RECORD_SOCONNECT2_ENTRY ] = "SOCONNECT2_ENTRY",
+  [ RTEMS_RECORD_SOCONNECT2_EXIT ] = "SOCONNECT2_EXIT",
+  [ RTEMS_RECORD_SOCONNECTAT_ENTRY ] = "SOCONNECTAT_ENTRY",
+  [ RTEMS_RECORD_SOCONNECTAT_EXIT ] = "SOCONNECTAT_EXIT",
+  [ RTEMS_RECORD_SOCREATE_ENTRY ] = "SOCREATE_ENTRY",
+  [ RTEMS_RECORD_SOCREATE_EXIT ] = "SOCREATE_EXIT",
+  [ RTEMS_RECORD_SODEALLOC_ENTRY ] = "SODEALLOC_ENTRY",
+  [ RTEMS_RECORD_SODEALLOC_EXIT ] = "SODEALLOC_EXIT",
+  [ RTEMS_RECORD_SODISCONNECT_ENTRY ] = "SODISCONNECT_ENTRY",
+  [ RTEMS_RECORD_SODISCONNECT_EXIT ] = "SODISCONNECT_EXIT",
+  [ RTEMS_RECORD_SOFREE_ENTRY ] = "SOFREE_ENTRY",
+  [ RTEMS_RECORD_SOFREE_EXIT ] = "SOFREE_EXIT",
+  [ RTEMS_RECORD_SOLISTEN_ENTRY ] = "SOLISTEN_ENTRY",
+  [ RTEMS_RECORD_SOLISTEN_EXIT ] = "SOLISTEN_EXIT",
+  [ RTEMS_RECORD_SONEWCONN_ENTRY ] = "SONEWCONN_ENTRY",
+  [ RTEMS_RECORD_SONEWCONN_EXIT ] = "SONEWCONN_EXIT",
+  [ RTEMS_RECORD_SORECEIVE_ENTRY ] = "SORECEIVE_ENTRY",
+  [ RTEMS_RECORD_SORECEIVE_EXIT ] = "SORECEIVE_EXIT",
+  [ RTEMS_RECORD_SORFLUSH_ENTRY ] = "SORFLUSH_ENTRY",
+  [ RTEMS_RECORD_SORFLUSH_EXIT ] = "SORFLUSH_EXIT",
+  [ RTEMS_RECORD_SOSEND_ENTRY ] = "SOSEND_ENTRY",
+  [ RTEMS_RECORD_SOSEND_EXIT ] = "SOSEND_EXIT",
+  [ RTEMS_RECORD_SOSHUTDOWN_ENTRY ] = "SOSHUTDOWN_ENTRY",
+  [ RTEMS_RECORD_SOSHUTDOWN_EXIT ] = "SOSHUTDOWN_EXIT",
+  [ RTEMS_RECORD_STATVFS_ENTRY ] = "STATVFS_ENTRY",
+  [ RTEMS_RECORD_STATVFS_EXIT ] = "STATVFS_EXIT",
+  [ RTEMS_RECORD_SYMLINK_ENTRY ] = "SYMLINK_ENTRY",
+  [ RTEMS_RECORD_SYMLINK_EXIT ] = "SYMLINK_EXIT",
+  [ RTEMS_RECORD_TCP_CLOSE ] = "TCP_CLOSE",
+  [ RTEMS_RECORD_TCP_INPUT ] = "TCP_INPUT",
+  [ RTEMS_RECORD_TCP_OUTPUT ] = "TCP_OUTPUT",
+  [ RTEMS_RECORD_THREAD_BEGIN ] = "THREAD_BEGIN",
+  [ RTEMS_RECORD_THREAD_CREATE ] = "THREAD_CREATE",
+  [ RTEMS_RECORD_THREAD_DELETE ] = "THREAD_DELETE",
+  [ RTEMS_RECORD_THREAD_EXIT ] = "THREAD_EXIT",
+  [ RTEMS_RECORD_THREAD_EXITTED ] = "THREAD_EXITTED",
+  [ RTEMS_RECORD_THREAD_ID ] = "THREAD_ID",
+  [ RTEMS_RECORD_THREAD_NAME ] = "THREAD_NAME",
+  [ RTEMS_RECORD_THREAD_PRIO_CURRENT_HIGH ] = "THREAD_PRIO_CURRENT_HIGH",
+  [ RTEMS_RECORD_THREAD_PRIO_CURRENT_LOW ] = "THREAD_PRIO_CURRENT_LOW",
+  [ RTEMS_RECORD_THREAD_PRIO_REAL_HIGH ] = "THREAD_PRIO_REAL_HIGH",
+  [ RTEMS_RECORD_THREAD_PRIO_REAL_LOW ] = "THREAD_PRIO_REAL_LOW",
+  [ RTEMS_RECORD_THREAD_QUEUE_ENQUEUE ] = "THREAD_QUEUE_ENQUEUE",
+  [ RTEMS_RECORD_THREAD_QUEUE_ENQUEUE_STICKY ] = "THREAD_QUEUE_ENQUEUE_STICKY",
+  [ RTEMS_RECORD_THREAD_QUEUE_EXTRACT ] = "THREAD_QUEUE_EXTRACT",
+  [ RTEMS_RECORD_THREAD_QUEUE_SURRENDER ] = "THREAD_QUEUE_SURRENDER",
+  [ RTEMS_RECORD_THREAD_QUEUE_SURRENDER_STICKY ] = "THREAD_QUEUE_SURRENDER_STICKY",
+  [ RTEMS_RECORD_THREAD_RESOURCE_OBTAIN ] = "THREAD_RESOURCE_OBTAIN",
+  [ RTEMS_RECORD_THREAD_RESOURCE_RELEASE ] = "THREAD_RESOURCE_RELEASE",
+  [ RTEMS_RECORD_THREAD_RESTART ] = "THREAD_RESTART",
+  [ RTEMS_RECORD_THREAD_STACK_CURRENT ] = "THREAD_STACK_CURRENT",
+  [ RTEMS_RECORD_THREAD_STACK_SIZE ] = "THREAD_STACK_SIZE",
+  [ RTEMS_RECORD_THREAD_STACK_USAGE ] = "THREAD_STACK_USAGE",
+  [ RTEMS_RECORD_THREAD_START ] = "THREAD_START",
+  [ RTEMS_RECORD_THREAD_STATE_CLEAR ] = "THREAD_STATE_CLEAR",
+  [ RTEMS_RECORD_THREAD_STATE_SET ] = "THREAD_STATE_SET",
+  [ RTEMS_RECORD_THREAD_SWITCH_IN ] = "THREAD_SWITCH_IN",
+  [ RTEMS_RECORD_THREAD_SWITCH_OUT ] = "THREAD_SWITCH_OUT",
+  [ RTEMS_RECORD_THREAD_TERMINATE ] = "THREAD_TERMINATE",
+  [ RTEMS_RECORD_UDP_INPUT ] = "UDP_INPUT",
+  [ RTEMS_RECORD_UDP_OUTPUT ] = "UDP_OUTPUT",
+  [ RTEMS_RECORD_UMA_ALLOC_PTR ] = "UMA_ALLOC_PTR",
+  [ RTEMS_RECORD_UMA_ALLOC_ZONE ] = "UMA_ALLOC_ZONE",
+  [ RTEMS_RECORD_UMA_FREE_PTR ] = "UMA_FREE_PTR",
+  [ RTEMS_RECORD_UMA_FREE_ZONE ] = "UMA_FREE_ZONE",
+  [ RTEMS_RECORD_UNLINK_ENTRY ] = "UNLINK_ENTRY",
+  [ RTEMS_RECORD_UNLINK_EXIT ] = "UNLINK_EXIT",
+  [ RTEMS_RECORD_UNMOUNT_ENTRY ] = "UNMOUNT_ENTRY",
+  [ RTEMS_RECORD_UNMOUNT_EXIT ] = "UNMOUNT_EXIT",
+  [ RTEMS_RECORD_UPTIME_HIGH ] = "UPTIME_HIGH",
+  [ RTEMS_RECORD_UPTIME_LOW ] = "UPTIME_LOW",
+  [ RTEMS_RECORD_WORKSPACE_ALLOC ] = "WORKSPACE_ALLOC",
+  [ RTEMS_RECORD_WORKSPACE_FREE ] = "WORKSPACE_FREE",
+  [ RTEMS_RECORD_WORKSPACE_SIZE ] = "WORKSPACE_SIZE",
+  [ RTEMS_RECORD_WORKSPACE_USAGE ] = "WORKSPACE_USAGE",
+  [ RTEMS_RECORD_WRITE_ENTRY ] = "WRITE_ENTRY",
+  [ RTEMS_RECORD_WRITE_EXIT ] = "WRITE_EXIT",
+  [ RTEMS_RECORD_WRITEV_ENTRY ] = "WRITEV_ENTRY",
+  [ RTEMS_RECORD_WRITEV_EXIT ] = "WRITEV_EXIT",
+  [ RTEMS_RECORD_SYSTEM_238 ] = "SYSTEM_238",
+  [ RTEMS_RECORD_SYSTEM_239 ] = "SYSTEM_239",
+  [ RTEMS_RECORD_SYSTEM_240 ] = "SYSTEM_240",
+  [ RTEMS_RECORD_SYSTEM_241 ] = "SYSTEM_241",
+  [ RTEMS_RECORD_SYSTEM_242 ] = "SYSTEM_242",
+  [ RTEMS_RECORD_SYSTEM_243 ] = "SYSTEM_243",
+  [ RTEMS_RECORD_SYSTEM_244 ] = "SYSTEM_244",
+  [ RTEMS_RECORD_SYSTEM_245 ] = "SYSTEM_245",
+  [ RTEMS_RECORD_SYSTEM_246 ] = "SYSTEM_246",
+  [ RTEMS_RECORD_SYSTEM_247 ] = "SYSTEM_247",
+  [ RTEMS_RECORD_SYSTEM_248 ] = "SYSTEM_248",
+  [ RTEMS_RECORD_SYSTEM_249 ] = "SYSTEM_249",
+  [ RTEMS_RECORD_SYSTEM_250 ] = "SYSTEM_250",
+  [ RTEMS_RECORD_SYSTEM_251 ] = "SYSTEM_251",
+  [ RTEMS_RECORD_SYSTEM_252 ] = "SYSTEM_252",
+  [ RTEMS_RECORD_SYSTEM_253 ] = "SYSTEM_253",
+  [ RTEMS_RECORD_SYSTEM_254 ] = "SYSTEM_254",
+  [ RTEMS_RECORD_SYSTEM_255 ] = "SYSTEM_255",
+  [ RTEMS_RECORD_SYSTEM_256 ] = "SYSTEM_256",
+  [ RTEMS_RECORD_SYSTEM_257 ] = "SYSTEM_257",
+  [ RTEMS_RECORD_SYSTEM_258 ] = "SYSTEM_258",
+  [ RTEMS_RECORD_SYSTEM_259 ] = "SYSTEM_259",
+  [ RTEMS_RECORD_SYSTEM_260 ] = "SYSTEM_260",
+  [ RTEMS_RECORD_SYSTEM_261 ] = "SYSTEM_261",
+  [ RTEMS_RECORD_SYSTEM_262 ] = "SYSTEM_262",
+  [ RTEMS_RECORD_SYSTEM_263 ] = "SYSTEM_263",
+  [ RTEMS_RECORD_SYSTEM_264 ] = "SYSTEM_264",
+  [ RTEMS_RECORD_SYSTEM_265 ] = "SYSTEM_265",
+  [ RTEMS_RECORD_SYSTEM_266 ] = "SYSTEM_266",
+  [ RTEMS_RECORD_SYSTEM_267 ] = "SYSTEM_267",
+  [ RTEMS_RECORD_SYSTEM_268 ] = "SYSTEM_268",
+  [ RTEMS_RECORD_SYSTEM_269 ] = "SYSTEM_269",
+  [ RTEMS_RECORD_SYSTEM_270 ] = "SYSTEM_270",
+  [ RTEMS_RECORD_SYSTEM_271 ] = "SYSTEM_271",
+  [ RTEMS_RECORD_SYSTEM_272 ] = "SYSTEM_272",
+  [ RTEMS_RECORD_SYSTEM_273 ] = "SYSTEM_273",
+  [ RTEMS_RECORD_SYSTEM_274 ] = "SYSTEM_274",
+  [ RTEMS_RECORD_SYSTEM_275 ] = "SYSTEM_275",
+  [ RTEMS_RECORD_SYSTEM_276 ] = "SYSTEM_276",
+  [ RTEMS_RECORD_SYSTEM_277 ] = "SYSTEM_277",
+  [ RTEMS_RECORD_SYSTEM_278 ] = "SYSTEM_278",
+  [ RTEMS_RECORD_SYSTEM_279 ] = "SYSTEM_279",
+  [ RTEMS_RECORD_SYSTEM_280 ] = "SYSTEM_280",
+  [ RTEMS_RECORD_SYSTEM_281 ] = "SYSTEM_281",
+  [ RTEMS_RECORD_SYSTEM_282 ] = "SYSTEM_282",
+  [ RTEMS_RECORD_SYSTEM_283 ] = "SYSTEM_283",
+  [ RTEMS_RECORD_SYSTEM_284 ] = "SYSTEM_284",
+  [ RTEMS_RECORD_SYSTEM_285 ] = "SYSTEM_285",
+  [ RTEMS_RECORD_SYSTEM_286 ] = "SYSTEM_286",
+  [ RTEMS_RECORD_SYSTEM_287 ] = "SYSTEM_287",
+  [ RTEMS_RECORD_SYSTEM_288 ] = "SYSTEM_288",
+  [ RTEMS_RECORD_SYSTEM_289 ] = "SYSTEM_289",
+  [ RTEMS_RECORD_SYSTEM_290 ] = "SYSTEM_290",
+  [ RTEMS_RECORD_SYSTEM_291 ] = "SYSTEM_291",
+  [ RTEMS_RECORD_SYSTEM_292 ] = "SYSTEM_292",
+  [ RTEMS_RECORD_SYSTEM_293 ] = "SYSTEM_293",
+  [ RTEMS_RECORD_SYSTEM_294 ] = "SYSTEM_294",
+  [ RTEMS_RECORD_SYSTEM_295 ] = "SYSTEM_295",
+  [ RTEMS_RECORD_SYSTEM_296 ] = "SYSTEM_296",
+  [ RTEMS_RECORD_SYSTEM_297 ] = "SYSTEM_297",
+  [ RTEMS_RECORD_SYSTEM_298 ] = "SYSTEM_298",
+  [ RTEMS_RECORD_SYSTEM_299 ] = "SYSTEM_299",
+  [ RTEMS_RECORD_SYSTEM_300 ] = "SYSTEM_300",
+  [ RTEMS_RECORD_SYSTEM_301 ] = "SYSTEM_301",
+  [ 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",
+  [ RTEMS_RECORD_SYSTEM_313 ] = "SYSTEM_313",
+  [ RTEMS_RECORD_SYSTEM_314 ] = "SYSTEM_314",
+  [ RTEMS_RECORD_SYSTEM_315 ] = "SYSTEM_315",
+  [ RTEMS_RECORD_SYSTEM_316 ] = "SYSTEM_316",
+  [ RTEMS_RECORD_SYSTEM_317 ] = "SYSTEM_317",
+  [ RTEMS_RECORD_SYSTEM_318 ] = "SYSTEM_318",
+  [ RTEMS_RECORD_SYSTEM_319 ] = "SYSTEM_319",
+  [ RTEMS_RECORD_SYSTEM_320 ] = "SYSTEM_320",
+  [ RTEMS_RECORD_SYSTEM_321 ] = "SYSTEM_321",
+  [ RTEMS_RECORD_SYSTEM_322 ] = "SYSTEM_322",
+  [ RTEMS_RECORD_SYSTEM_323 ] = "SYSTEM_323",
+  [ RTEMS_RECORD_SYSTEM_324 ] = "SYSTEM_324",
+  [ RTEMS_RECORD_SYSTEM_325 ] = "SYSTEM_325",
+  [ RTEMS_RECORD_SYSTEM_326 ] = "SYSTEM_326",
+  [ RTEMS_RECORD_SYSTEM_327 ] = "SYSTEM_327",
+  [ RTEMS_RECORD_SYSTEM_328 ] = "SYSTEM_328",
+  [ RTEMS_RECORD_SYSTEM_329 ] = "SYSTEM_329",
+  [ RTEMS_RECORD_SYSTEM_330 ] = "SYSTEM_330",
+  [ RTEMS_RECORD_SYSTEM_331 ] = "SYSTEM_331",
+  [ RTEMS_RECORD_SYSTEM_332 ] = "SYSTEM_332",
+  [ RTEMS_RECORD_SYSTEM_333 ] = "SYSTEM_333",
+  [ RTEMS_RECORD_SYSTEM_334 ] = "SYSTEM_334",
+  [ RTEMS_RECORD_SYSTEM_335 ] = "SYSTEM_335",
+  [ RTEMS_RECORD_SYSTEM_336 ] = "SYSTEM_336",
+  [ RTEMS_RECORD_SYSTEM_337 ] = "SYSTEM_337",
+  [ RTEMS_RECORD_SYSTEM_338 ] = "SYSTEM_338",
+  [ RTEMS_RECORD_SYSTEM_339 ] = "SYSTEM_339",
+  [ RTEMS_RECORD_SYSTEM_340 ] = "SYSTEM_340",
+  [ RTEMS_RECORD_SYSTEM_341 ] = "SYSTEM_341",
+  [ RTEMS_RECORD_SYSTEM_342 ] = "SYSTEM_342",
+  [ RTEMS_RECORD_SYSTEM_343 ] = "SYSTEM_343",
+  [ RTEMS_RECORD_SYSTEM_344 ] = "SYSTEM_344",
+  [ RTEMS_RECORD_SYSTEM_345 ] = "SYSTEM_345",
+  [ RTEMS_RECORD_SYSTEM_346 ] = "SYSTEM_346",
+  [ RTEMS_RECORD_SYSTEM_347 ] = "SYSTEM_347",
+  [ RTEMS_RECORD_SYSTEM_348 ] = "SYSTEM_348",
+  [ RTEMS_RECORD_SYSTEM_349 ] = "SYSTEM_349",
+  [ RTEMS_RECORD_SYSTEM_350 ] = "SYSTEM_350",
+  [ RTEMS_RECORD_SYSTEM_351 ] = "SYSTEM_351",
+  [ RTEMS_RECORD_SYSTEM_352 ] = "SYSTEM_352",
+  [ RTEMS_RECORD_SYSTEM_353 ] = "SYSTEM_353",
+  [ RTEMS_RECORD_SYSTEM_354 ] = "SYSTEM_354",
+  [ RTEMS_RECORD_SYSTEM_355 ] = "SYSTEM_355",
+  [ RTEMS_RECORD_SYSTEM_356 ] = "SYSTEM_356",
+  [ RTEMS_RECORD_SYSTEM_357 ] = "SYSTEM_357",
+  [ RTEMS_RECORD_SYSTEM_358 ] = "SYSTEM_358",
+  [ RTEMS_RECORD_SYSTEM_359 ] = "SYSTEM_359",
+  [ RTEMS_RECORD_SYSTEM_360 ] = "SYSTEM_360",
+  [ RTEMS_RECORD_SYSTEM_361 ] = "SYSTEM_361",
+  [ RTEMS_RECORD_SYSTEM_362 ] = "SYSTEM_362",
+  [ RTEMS_RECORD_SYSTEM_363 ] = "SYSTEM_363",
+  [ RTEMS_RECORD_SYSTEM_364 ] = "SYSTEM_364",
+  [ RTEMS_RECORD_SYSTEM_365 ] = "SYSTEM_365",
+  [ RTEMS_RECORD_SYSTEM_366 ] = "SYSTEM_366",
+  [ RTEMS_RECORD_SYSTEM_367 ] = "SYSTEM_367",
+  [ RTEMS_RECORD_SYSTEM_368 ] = "SYSTEM_368",
+  [ RTEMS_RECORD_SYSTEM_369 ] = "SYSTEM_369",
+  [ RTEMS_RECORD_SYSTEM_370 ] = "SYSTEM_370",
+  [ RTEMS_RECORD_SYSTEM_371 ] = "SYSTEM_371",
+  [ RTEMS_RECORD_SYSTEM_372 ] = "SYSTEM_372",
+  [ RTEMS_RECORD_SYSTEM_373 ] = "SYSTEM_373",
+  [ RTEMS_RECORD_SYSTEM_374 ] = "SYSTEM_374",
+  [ RTEMS_RECORD_SYSTEM_375 ] = "SYSTEM_375",
+  [ RTEMS_RECORD_SYSTEM_376 ] = "SYSTEM_376",
+  [ RTEMS_RECORD_SYSTEM_377 ] = "SYSTEM_377",
+  [ RTEMS_RECORD_SYSTEM_378 ] = "SYSTEM_378",
+  [ RTEMS_RECORD_SYSTEM_379 ] = "SYSTEM_379",
+  [ RTEMS_RECORD_SYSTEM_380 ] = "SYSTEM_380",
+  [ RTEMS_RECORD_SYSTEM_381 ] = "SYSTEM_381",
+  [ RTEMS_RECORD_SYSTEM_382 ] = "SYSTEM_382",
+  [ RTEMS_RECORD_SYSTEM_383 ] = "SYSTEM_383",
+  [ RTEMS_RECORD_SYSTEM_384 ] = "SYSTEM_384",
+  [ RTEMS_RECORD_SYSTEM_385 ] = "SYSTEM_385",
+  [ RTEMS_RECORD_SYSTEM_386 ] = "SYSTEM_386",
+  [ RTEMS_RECORD_SYSTEM_387 ] = "SYSTEM_387",
+  [ RTEMS_RECORD_SYSTEM_388 ] = "SYSTEM_388",
+  [ RTEMS_RECORD_SYSTEM_389 ] = "SYSTEM_389",
+  [ RTEMS_RECORD_SYSTEM_390 ] = "SYSTEM_390",
+  [ RTEMS_RECORD_SYSTEM_391 ] = "SYSTEM_391",
+  [ RTEMS_RECORD_SYSTEM_392 ] = "SYSTEM_392",
+  [ RTEMS_RECORD_SYSTEM_393 ] = "SYSTEM_393",
+  [ RTEMS_RECORD_SYSTEM_394 ] = "SYSTEM_394",
+  [ RTEMS_RECORD_SYSTEM_395 ] = "SYSTEM_395",
+  [ RTEMS_RECORD_SYSTEM_396 ] = "SYSTEM_396",
+  [ RTEMS_RECORD_SYSTEM_397 ] = "SYSTEM_397",
+  [ RTEMS_RECORD_SYSTEM_398 ] = "SYSTEM_398",
+  [ RTEMS_RECORD_SYSTEM_399 ] = "SYSTEM_399",
+  [ RTEMS_RECORD_SYSTEM_400 ] = "SYSTEM_400",
+  [ RTEMS_RECORD_SYSTEM_401 ] = "SYSTEM_401",
+  [ RTEMS_RECORD_SYSTEM_402 ] = "SYSTEM_402",
+  [ RTEMS_RECORD_SYSTEM_403 ] = "SYSTEM_403",
+  [ RTEMS_RECORD_SYSTEM_404 ] = "SYSTEM_404",
+  [ RTEMS_RECORD_SYSTEM_405 ] = "SYSTEM_405",
+  [ RTEMS_RECORD_SYSTEM_406 ] = "SYSTEM_406",
+  [ RTEMS_RECORD_SYSTEM_407 ] = "SYSTEM_407",
+  [ RTEMS_RECORD_SYSTEM_408 ] = "SYSTEM_408",
+  [ RTEMS_RECORD_SYSTEM_409 ] = "SYSTEM_409",
+  [ RTEMS_RECORD_SYSTEM_410 ] = "SYSTEM_410",
+  [ RTEMS_RECORD_SYSTEM_411 ] = "SYSTEM_411",
+  [ RTEMS_RECORD_SYSTEM_412 ] = "SYSTEM_412",
+  [ RTEMS_RECORD_SYSTEM_413 ] = "SYSTEM_413",
+  [ RTEMS_RECORD_SYSTEM_414 ] = "SYSTEM_414",
+  [ RTEMS_RECORD_SYSTEM_415 ] = "SYSTEM_415",
+  [ RTEMS_RECORD_SYSTEM_416 ] = "SYSTEM_416",
+  [ RTEMS_RECORD_SYSTEM_417 ] = "SYSTEM_417",
+  [ RTEMS_RECORD_SYSTEM_418 ] = "SYSTEM_418",
+  [ RTEMS_RECORD_SYSTEM_419 ] = "SYSTEM_419",
+  [ RTEMS_RECORD_SYSTEM_420 ] = "SYSTEM_420",
+  [ RTEMS_RECORD_SYSTEM_421 ] = "SYSTEM_421",
+  [ RTEMS_RECORD_SYSTEM_422 ] = "SYSTEM_422",
+  [ RTEMS_RECORD_SYSTEM_423 ] = "SYSTEM_423",
+  [ RTEMS_RECORD_SYSTEM_424 ] = "SYSTEM_424",
+  [ RTEMS_RECORD_SYSTEM_425 ] = "SYSTEM_425",
+  [ RTEMS_RECORD_SYSTEM_426 ] = "SYSTEM_426",
+  [ RTEMS_RECORD_SYSTEM_427 ] = "SYSTEM_427",
+  [ RTEMS_RECORD_SYSTEM_428 ] = "SYSTEM_428",
+  [ RTEMS_RECORD_SYSTEM_429 ] = "SYSTEM_429",
+  [ RTEMS_RECORD_SYSTEM_430 ] = "SYSTEM_430",
+  [ RTEMS_RECORD_SYSTEM_431 ] = "SYSTEM_431",
+  [ RTEMS_RECORD_SYSTEM_432 ] = "SYSTEM_432",
+  [ RTEMS_RECORD_SYSTEM_433 ] = "SYSTEM_433",
+  [ RTEMS_RECORD_SYSTEM_434 ] = "SYSTEM_434",
+  [ RTEMS_RECORD_SYSTEM_435 ] = "SYSTEM_435",
+  [ RTEMS_RECORD_SYSTEM_436 ] = "SYSTEM_436",
+  [ RTEMS_RECORD_SYSTEM_437 ] = "SYSTEM_437",
+  [ RTEMS_RECORD_SYSTEM_438 ] = "SYSTEM_438",
+  [ RTEMS_RECORD_SYSTEM_439 ] = "SYSTEM_439",
+  [ RTEMS_RECORD_SYSTEM_440 ] = "SYSTEM_440",
+  [ RTEMS_RECORD_SYSTEM_441 ] = "SYSTEM_441",
+  [ RTEMS_RECORD_SYSTEM_442 ] = "SYSTEM_442",
+  [ RTEMS_RECORD_SYSTEM_443 ] = "SYSTEM_443",
+  [ RTEMS_RECORD_SYSTEM_444 ] = "SYSTEM_444",
+  [ RTEMS_RECORD_SYSTEM_445 ] = "SYSTEM_445",
+  [ RTEMS_RECORD_SYSTEM_446 ] = "SYSTEM_446",
+  [ RTEMS_RECORD_SYSTEM_447 ] = "SYSTEM_447",
+  [ RTEMS_RECORD_SYSTEM_448 ] = "SYSTEM_448",
+  [ RTEMS_RECORD_SYSTEM_449 ] = "SYSTEM_449",
+  [ RTEMS_RECORD_SYSTEM_450 ] = "SYSTEM_450",
+  [ RTEMS_RECORD_SYSTEM_451 ] = "SYSTEM_451",
+  [ RTEMS_RECORD_SYSTEM_452 ] = "SYSTEM_452",
+  [ RTEMS_RECORD_SYSTEM_453 ] = "SYSTEM_453",
+  [ RTEMS_RECORD_SYSTEM_454 ] = "SYSTEM_454",
+  [ RTEMS_RECORD_SYSTEM_455 ] = "SYSTEM_455",
+  [ RTEMS_RECORD_SYSTEM_456 ] = "SYSTEM_456",
+  [ RTEMS_RECORD_SYSTEM_457 ] = "SYSTEM_457",
+  [ RTEMS_RECORD_SYSTEM_458 ] = "SYSTEM_458",
+  [ RTEMS_RECORD_SYSTEM_459 ] = "SYSTEM_459",
+  [ RTEMS_RECORD_SYSTEM_460 ] = "SYSTEM_460",
+  [ RTEMS_RECORD_SYSTEM_461 ] = "SYSTEM_461",
+  [ RTEMS_RECORD_SYSTEM_462 ] = "SYSTEM_462",
+  [ RTEMS_RECORD_SYSTEM_463 ] = "SYSTEM_463",
+  [ RTEMS_RECORD_SYSTEM_464 ] = "SYSTEM_464",
+  [ RTEMS_RECORD_SYSTEM_465 ] = "SYSTEM_465",
+  [ RTEMS_RECORD_SYSTEM_466 ] = "SYSTEM_466",
+  [ RTEMS_RECORD_SYSTEM_467 ] = "SYSTEM_467",
+  [ RTEMS_RECORD_SYSTEM_468 ] = "SYSTEM_468",
+  [ RTEMS_RECORD_SYSTEM_469 ] = "SYSTEM_469",
+  [ RTEMS_RECORD_SYSTEM_470 ] = "SYSTEM_470",
+  [ RTEMS_RECORD_SYSTEM_471 ] = "SYSTEM_471",
+  [ RTEMS_RECORD_SYSTEM_472 ] = "SYSTEM_472",
+  [ RTEMS_RECORD_SYSTEM_473 ] = "SYSTEM_473",
+  [ RTEMS_RECORD_SYSTEM_474 ] = "SYSTEM_474",
+  [ RTEMS_RECORD_SYSTEM_475 ] = "SYSTEM_475",
+  [ RTEMS_RECORD_SYSTEM_476 ] = "SYSTEM_476",
+  [ RTEMS_RECORD_SYSTEM_477 ] = "SYSTEM_477",
+  [ RTEMS_RECORD_SYSTEM_478 ] = "SYSTEM_478",
+  [ RTEMS_RECORD_SYSTEM_479 ] = "SYSTEM_479",
+  [ RTEMS_RECORD_SYSTEM_480 ] = "SYSTEM_480",
+  [ RTEMS_RECORD_SYSTEM_481 ] = "SYSTEM_481",
+  [ RTEMS_RECORD_SYSTEM_482 ] = "SYSTEM_482",
+  [ RTEMS_RECORD_SYSTEM_483 ] = "SYSTEM_483",
+  [ RTEMS_RECORD_SYSTEM_484 ] = "SYSTEM_484",
+  [ RTEMS_RECORD_SYSTEM_485 ] = "SYSTEM_485",
+  [ RTEMS_RECORD_SYSTEM_486 ] = "SYSTEM_486",
+  [ RTEMS_RECORD_SYSTEM_487 ] = "SYSTEM_487",
+  [ RTEMS_RECORD_SYSTEM_488 ] = "SYSTEM_488",
+  [ RTEMS_RECORD_SYSTEM_489 ] = "SYSTEM_489",
+  [ RTEMS_RECORD_SYSTEM_490 ] = "SYSTEM_490",
+  [ RTEMS_RECORD_SYSTEM_491 ] = "SYSTEM_491",
+  [ RTEMS_RECORD_SYSTEM_492 ] = "SYSTEM_492",
+  [ RTEMS_RECORD_SYSTEM_493 ] = "SYSTEM_493",
+  [ RTEMS_RECORD_SYSTEM_494 ] = "SYSTEM_494",
+  [ RTEMS_RECORD_SYSTEM_495 ] = "SYSTEM_495",
+  [ RTEMS_RECORD_SYSTEM_496 ] = "SYSTEM_496",
+  [ RTEMS_RECORD_SYSTEM_497 ] = "SYSTEM_497",
+  [ RTEMS_RECORD_SYSTEM_498 ] = "SYSTEM_498",
+  [ RTEMS_RECORD_SYSTEM_499 ] = "SYSTEM_499",
+  [ RTEMS_RECORD_SYSTEM_500 ] = "SYSTEM_500",
+  [ RTEMS_RECORD_SYSTEM_501 ] = "SYSTEM_501",
+  [ RTEMS_RECORD_SYSTEM_502 ] = "SYSTEM_502",
+  [ RTEMS_RECORD_SYSTEM_503 ] = "SYSTEM_503",
+  [ RTEMS_RECORD_SYSTEM_504 ] = "SYSTEM_504",
+  [ RTEMS_RECORD_SYSTEM_505 ] = "SYSTEM_505",
+  [ RTEMS_RECORD_SYSTEM_506 ] = "SYSTEM_506",
+  [ RTEMS_RECORD_SYSTEM_507 ] = "SYSTEM_507",
+  [ RTEMS_RECORD_SYSTEM_508 ] = "SYSTEM_508",
+  [ RTEMS_RECORD_SYSTEM_509 ] = "SYSTEM_509",
+  [ RTEMS_RECORD_SYSTEM_510 ] = "SYSTEM_510",
+  [ RTEMS_RECORD_USER_0 ] = "USER_0",
+  [ RTEMS_RECORD_USER_1 ] = "USER_1",
+  [ RTEMS_RECORD_USER_2 ] = "USER_2",
+  [ RTEMS_RECORD_USER_3 ] = "USER_3",
+  [ RTEMS_RECORD_USER_4 ] = "USER_4",
+  [ RTEMS_RECORD_USER_5 ] = "USER_5",
+  [ RTEMS_RECORD_USER_6 ] = "USER_6",
+  [ RTEMS_RECORD_USER_7 ] = "USER_7",
+  [ RTEMS_RECORD_USER_8 ] = "USER_8",
+  [ RTEMS_RECORD_USER_9 ] = "USER_9",
+  [ RTEMS_RECORD_USER_10 ] = "USER_10",
+  [ RTEMS_RECORD_USER_11 ] = "USER_11",
+  [ RTEMS_RECORD_USER_12 ] = "USER_12",
+  [ RTEMS_RECORD_USER_13 ] = "USER_13",
+  [ RTEMS_RECORD_USER_14 ] = "USER_14",
+  [ RTEMS_RECORD_USER_15 ] = "USER_15",
+  [ RTEMS_RECORD_USER_16 ] = "USER_16",
+  [ RTEMS_RECORD_USER_17 ] = "USER_17",
+  [ RTEMS_RECORD_USER_18 ] = "USER_18",
+  [ RTEMS_RECORD_USER_19 ] = "USER_19",
+  [ RTEMS_RECORD_USER_20 ] = "USER_20",
+  [ RTEMS_RECORD_USER_21 ] = "USER_21",
+  [ RTEMS_RECORD_USER_22 ] = "USER_22",
+  [ RTEMS_RECORD_USER_23 ] = "USER_23",
+  [ RTEMS_RECORD_USER_24 ] = "USER_24",
+  [ RTEMS_RECORD_USER_25 ] = "USER_25",
+  [ RTEMS_RECORD_USER_26 ] = "USER_26",
+  [ RTEMS_RECORD_USER_27 ] = "USER_27",
+  [ RTEMS_RECORD_USER_28 ] = "USER_28",
+  [ RTEMS_RECORD_USER_29 ] = "USER_29",
+  [ RTEMS_RECORD_USER_30 ] = "USER_30",
+  [ RTEMS_RECORD_USER_31 ] = "USER_31",
+  [ RTEMS_RECORD_USER_32 ] = "USER_32",
+  [ RTEMS_RECORD_USER_33 ] = "USER_33",
+  [ RTEMS_RECORD_USER_34 ] = "USER_34",
+  [ RTEMS_RECORD_USER_35 ] = "USER_35",
+  [ RTEMS_RECORD_USER_36 ] = "USER_36",
+  [ RTEMS_RECORD_USER_37 ] = "USER_37",
+  [ RTEMS_RECORD_USER_38 ] = "USER_38",
+  [ RTEMS_RECORD_USER_39 ] = "USER_39",
+  [ RTEMS_RECORD_USER_40 ] = "USER_40",
+  [ RTEMS_RECORD_USER_41 ] = "USER_41",
+  [ RTEMS_RECORD_USER_42 ] = "USER_42",
+  [ RTEMS_RECORD_USER_43 ] = "USER_43",
+  [ RTEMS_RECORD_USER_44 ] = "USER_44",
+  [ RTEMS_RECORD_USER_45 ] = "USER_45",
+  [ RTEMS_RECORD_USER_46 ] = "USER_46",
+  [ RTEMS_RECORD_USER_47 ] = "USER_47",
+  [ RTEMS_RECORD_USER_48 ] = "USER_48",
+  [ RTEMS_RECORD_USER_49 ] = "USER_49",
+  [ RTEMS_RECORD_USER_50 ] = "USER_50",
+  [ RTEMS_RECORD_USER_51 ] = "USER_51",
+  [ RTEMS_RECORD_USER_52 ] = "USER_52",
+  [ RTEMS_RECORD_USER_53 ] = "USER_53",
+  [ RTEMS_RECORD_USER_54 ] = "USER_54",
+  [ RTEMS_RECORD_USER_55 ] = "USER_55",
+  [ RTEMS_RECORD_USER_56 ] = "USER_56",
+  [ RTEMS_RECORD_USER_57 ] = "USER_57",
+  [ RTEMS_RECORD_USER_58 ] = "USER_58",
+  [ RTEMS_RECORD_USER_59 ] = "USER_59",
+  [ RTEMS_RECORD_USER_60 ] = "USER_60",
+  [ RTEMS_RECORD_USER_61 ] = "USER_61",
+  [ RTEMS_RECORD_USER_62 ] = "USER_62",
+  [ RTEMS_RECORD_USER_63 ] = "USER_63",
+  [ RTEMS_RECORD_USER_64 ] = "USER_64",
+  [ RTEMS_RECORD_USER_65 ] = "USER_65",
+  [ RTEMS_RECORD_USER_66 ] = "USER_66",
+  [ RTEMS_RECORD_USER_67 ] = "USER_67",
+  [ RTEMS_RECORD_USER_68 ] = "USER_68",
+  [ RTEMS_RECORD_USER_69 ] = "USER_69",
+  [ RTEMS_RECORD_USER_70 ] = "USER_70",
+  [ RTEMS_RECORD_USER_71 ] = "USER_71",
+  [ RTEMS_RECORD_USER_72 ] = "USER_72",
+  [ RTEMS_RECORD_USER_73 ] = "USER_73",
+  [ RTEMS_RECORD_USER_74 ] = "USER_74",
+  [ RTEMS_RECORD_USER_75 ] = "USER_75",
+  [ RTEMS_RECORD_USER_76 ] = "USER_76",
+  [ RTEMS_RECORD_USER_77 ] = "USER_77",
+  [ RTEMS_RECORD_USER_78 ] = "USER_78",
+  [ RTEMS_RECORD_USER_79 ] = "USER_79",
+  [ RTEMS_RECORD_USER_80 ] = "USER_80",
+  [ RTEMS_RECORD_USER_81 ] = "USER_81",
+  [ RTEMS_RECORD_USER_82 ] = "USER_82",
+  [ RTEMS_RECORD_USER_83 ] = "USER_83",
+  [ RTEMS_RECORD_USER_84 ] = "USER_84",
+  [ RTEMS_RECORD_USER_85 ] = "USER_85",
+  [ RTEMS_RECORD_USER_86 ] = "USER_86",
+  [ RTEMS_RECORD_USER_87 ] = "USER_87",
+  [ RTEMS_RECORD_USER_88 ] = "USER_88",
+  [ RTEMS_RECORD_USER_89 ] = "USER_89",
+  [ RTEMS_RECORD_USER_90 ] = "USER_90",
+  [ RTEMS_RECORD_USER_91 ] = "USER_91",
+  [ RTEMS_RECORD_USER_92 ] = "USER_92",
+  [ RTEMS_RECORD_USER_93 ] = "USER_93",
+  [ RTEMS_RECORD_USER_94 ] = "USER_94",
+  [ RTEMS_RECORD_USER_95 ] = "USER_95",
+  [ RTEMS_RECORD_USER_96 ] = "USER_96",
+  [ RTEMS_RECORD_USER_97 ] = "USER_97",
+  [ RTEMS_RECORD_USER_98 ] = "USER_98",
+  [ RTEMS_RECORD_USER_99 ] = "USER_99",
+  [ RTEMS_RECORD_USER_100 ] = "USER_100",
+  [ RTEMS_RECORD_USER_101 ] = "USER_101",
+  [ RTEMS_RECORD_USER_102 ] = "USER_102",
+  [ RTEMS_RECORD_USER_103 ] = "USER_103",
+  [ RTEMS_RECORD_USER_104 ] = "USER_104",
+  [ RTEMS_RECORD_USER_105 ] = "USER_105",
+  [ RTEMS_RECORD_USER_106 ] = "USER_106",
+  [ RTEMS_RECORD_USER_107 ] = "USER_107",
+  [ RTEMS_RECORD_USER_108 ] = "USER_108",
+  [ RTEMS_RECORD_USER_109 ] = "USER_109",
+  [ RTEMS_RECORD_USER_110 ] = "USER_110",
+  [ RTEMS_RECORD_USER_111 ] = "USER_111",
+  [ RTEMS_RECORD_USER_112 ] = "USER_112",
+  [ RTEMS_RECORD_USER_113 ] = "USER_113",
+  [ RTEMS_RECORD_USER_114 ] = "USER_114",
+  [ RTEMS_RECORD_USER_115 ] = "USER_115",
+  [ RTEMS_RECORD_USER_116 ] = "USER_116",
+  [ RTEMS_RECORD_USER_117 ] = "USER_117",
+  [ RTEMS_RECORD_USER_118 ] = "USER_118",
+  [ RTEMS_RECORD_USER_119 ] = "USER_119",
+  [ RTEMS_RECORD_USER_120 ] = "USER_120",
+  [ RTEMS_RECORD_USER_121 ] = "USER_121",
+  [ RTEMS_RECORD_USER_122 ] = "USER_122",
+  [ RTEMS_RECORD_USER_123 ] = "USER_123",
+  [ RTEMS_RECORD_USER_124 ] = "USER_124",
+  [ RTEMS_RECORD_USER_125 ] = "USER_125",
+  [ RTEMS_RECORD_USER_126 ] = "USER_126",
+  [ RTEMS_RECORD_USER_127 ] = "USER_127",
+  [ RTEMS_RECORD_USER_128 ] = "USER_128",
+  [ RTEMS_RECORD_USER_129 ] = "USER_129",
+  [ RTEMS_RECORD_USER_130 ] = "USER_130",
+  [ RTEMS_RECORD_USER_131 ] = "USER_131",
+  [ RTEMS_RECORD_USER_132 ] = "USER_132",
+  [ RTEMS_RECORD_USER_133 ] = "USER_133",
+  [ RTEMS_RECORD_USER_134 ] = "USER_134",
+  [ RTEMS_RECORD_USER_135 ] = "USER_135",
+  [ RTEMS_RECORD_USER_136 ] = "USER_136",
+  [ RTEMS_RECORD_USER_137 ] = "USER_137",
+  [ RTEMS_RECORD_USER_138 ] = "USER_138",
+  [ RTEMS_RECORD_USER_139 ] = "USER_139",
+  [ RTEMS_RECORD_USER_140 ] = "USER_140",
+  [ RTEMS_RECORD_USER_141 ] = "USER_141",
+  [ RTEMS_RECORD_USER_142 ] = "USER_142",
+  [ RTEMS_RECORD_USER_143 ] = "USER_143",
+  [ RTEMS_RECORD_USER_144 ] = "USER_144",
+  [ RTEMS_RECORD_USER_145 ] = "USER_145",
+  [ RTEMS_RECORD_USER_146 ] = "USER_146",
+  [ RTEMS_RECORD_USER_147 ] = "USER_147",
+  [ RTEMS_RECORD_USER_148 ] = "USER_148",
+  [ RTEMS_RECORD_USER_149 ] = "USER_149",
+  [ RTEMS_RECORD_USER_150 ] = "USER_150",
+  [ RTEMS_RECORD_USER_151 ] = "USER_151",
+  [ RTEMS_RECORD_USER_152 ] = "USER_152",
+  [ RTEMS_RECORD_USER_153 ] = "USER_153",
+  [ RTEMS_RECORD_USER_154 ] = "USER_154",
+  [ RTEMS_RECORD_USER_155 ] = "USER_155",
+  [ RTEMS_RECORD_USER_156 ] = "USER_156",
+  [ RTEMS_RECORD_USER_157 ] = "USER_157",
+  [ RTEMS_RECORD_USER_158 ] = "USER_158",
+  [ RTEMS_RECORD_USER_159 ] = "USER_159",
+  [ RTEMS_RECORD_USER_160 ] = "USER_160",
+  [ RTEMS_RECORD_USER_161 ] = "USER_161",
+  [ RTEMS_RECORD_USER_162 ] = "USER_162",
+  [ RTEMS_RECORD_USER_163 ] = "USER_163",
+  [ RTEMS_RECORD_USER_164 ] = "USER_164",
+  [ RTEMS_RECORD_USER_165 ] = "USER_165",
+  [ RTEMS_RECORD_USER_166 ] = "USER_166",
+  [ RTEMS_RECORD_USER_167 ] = "USER_167",
+  [ RTEMS_RECORD_USER_168 ] = "USER_168",
+  [ RTEMS_RECORD_USER_169 ] = "USER_169",
+  [ RTEMS_RECORD_USER_170 ] = "USER_170",
+  [ RTEMS_RECORD_USER_171 ] = "USER_171",
+  [ RTEMS_RECORD_USER_172 ] = "USER_172",
+  [ RTEMS_RECORD_USER_173 ] = "USER_173",
+  [ RTEMS_RECORD_USER_174 ] = "USER_174",
+  [ RTEMS_RECORD_USER_175 ] = "USER_175",
+  [ RTEMS_RECORD_USER_176 ] = "USER_176",
+  [ RTEMS_RECORD_USER_177 ] = "USER_177",
+  [ RTEMS_RECORD_USER_178 ] = "USER_178",
+  [ RTEMS_RECORD_USER_179 ] = "USER_179",
+  [ RTEMS_RECORD_USER_180 ] = "USER_180",
+  [ RTEMS_RECORD_USER_181 ] = "USER_181",
+  [ RTEMS_RECORD_USER_182 ] = "USER_182",
+  [ RTEMS_RECORD_USER_183 ] = "USER_183",
+  [ RTEMS_RECORD_USER_184 ] = "USER_184",
+  [ RTEMS_RECORD_USER_185 ] = "USER_185",
+  [ RTEMS_RECORD_USER_186 ] = "USER_186",
+  [ RTEMS_RECORD_USER_187 ] = "USER_187",
+  [ RTEMS_RECORD_USER_188 ] = "USER_188",
+  [ RTEMS_RECORD_USER_189 ] = "USER_189",
+  [ RTEMS_RECORD_USER_190 ] = "USER_190",
+  [ RTEMS_RECORD_USER_191 ] = "USER_191",
+  [ RTEMS_RECORD_USER_192 ] = "USER_192",
+  [ RTEMS_RECORD_USER_193 ] = "USER_193",
+  [ RTEMS_RECORD_USER_194 ] = "USER_194",
+  [ RTEMS_RECORD_USER_195 ] = "USER_195",
+  [ RTEMS_RECORD_USER_196 ] = "USER_196",
+  [ RTEMS_RECORD_USER_197 ] = "USER_197",
+  [ RTEMS_RECORD_USER_198 ] = "USER_198",
+  [ RTEMS_RECORD_USER_199 ] = "USER_199",
+  [ RTEMS_RECORD_USER_200 ] = "USER_200",
+  [ RTEMS_RECORD_USER_201 ] = "USER_201",
+  [ RTEMS_RECORD_USER_202 ] = "USER_202",
+  [ RTEMS_RECORD_USER_203 ] = "USER_203",
+  [ RTEMS_RECORD_USER_204 ] = "USER_204",
+  [ RTEMS_RECORD_USER_205 ] = "USER_205",
+  [ RTEMS_RECORD_USER_206 ] = "USER_206",
+  [ RTEMS_RECORD_USER_207 ] = "USER_207",
+  [ RTEMS_RECORD_USER_208 ] = "USER_208",
+  [ RTEMS_RECORD_USER_209 ] = "USER_209",
+  [ RTEMS_RECORD_USER_210 ] = "USER_210",
+  [ RTEMS_RECORD_USER_211 ] = "USER_211",
+  [ RTEMS_RECORD_USER_212 ] = "USER_212",
+  [ RTEMS_RECORD_USER_213 ] = "USER_213",
+  [ RTEMS_RECORD_USER_214 ] = "USER_214",
+  [ RTEMS_RECORD_USER_215 ] = "USER_215",
+  [ RTEMS_RECORD_USER_216 ] = "USER_216",
+  [ RTEMS_RECORD_USER_217 ] = "USER_217",
+  [ RTEMS_RECORD_USER_218 ] = "USER_218",
+  [ RTEMS_RECORD_USER_219 ] = "USER_219",
+  [ RTEMS_RECORD_USER_220 ] = "USER_220",
+  [ RTEMS_RECORD_USER_221 ] = "USER_221",
+  [ RTEMS_RECORD_USER_222 ] = "USER_222",
+  [ RTEMS_RECORD_USER_223 ] = "USER_223",
+  [ RTEMS_RECORD_USER_224 ] = "USER_224",
+  [ RTEMS_RECORD_USER_225 ] = "USER_225",
+  [ RTEMS_RECORD_USER_226 ] = "USER_226",
+  [ RTEMS_RECORD_USER_227 ] = "USER_227",
+  [ RTEMS_RECORD_USER_228 ] = "USER_228",
+  [ RTEMS_RECORD_USER_229 ] = "USER_229",
+  [ RTEMS_RECORD_USER_230 ] = "USER_230",
+  [ RTEMS_RECORD_USER_231 ] = "USER_231",
+  [ RTEMS_RECORD_USER_232 ] = "USER_232",
+  [ RTEMS_RECORD_USER_233 ] = "USER_233",
+  [ RTEMS_RECORD_USER_234 ] = "USER_234",
+  [ RTEMS_RECORD_USER_235 ] = "USER_235",
+  [ RTEMS_RECORD_USER_236 ] = "USER_236",
+  [ RTEMS_RECORD_USER_237 ] = "USER_237",
+  [ RTEMS_RECORD_USER_238 ] = "USER_238",
+  [ RTEMS_RECORD_USER_239 ] = "USER_239",
+  [ RTEMS_RECORD_USER_240 ] = "USER_240",
+  [ RTEMS_RECORD_USER_241 ] = "USER_241",
+  [ RTEMS_RECORD_USER_242 ] = "USER_242",
+  [ RTEMS_RECORD_USER_243 ] = "USER_243",
+  [ RTEMS_RECORD_USER_244 ] = "USER_244",
+  [ RTEMS_RECORD_USER_245 ] = "USER_245",
+  [ RTEMS_RECORD_USER_246 ] = "USER_246",
+  [ RTEMS_RECORD_USER_247 ] = "USER_247",
+  [ RTEMS_RECORD_USER_248 ] = "USER_248",
+  [ RTEMS_RECORD_USER_249 ] = "USER_249",
+  [ RTEMS_RECORD_USER_250 ] = "USER_250",
+  [ RTEMS_RECORD_USER_251 ] = "USER_251",
+  [ RTEMS_RECORD_USER_252 ] = "USER_252",
+  [ RTEMS_RECORD_USER_253 ] = "USER_253",
+  [ RTEMS_RECORD_USER_254 ] = "USER_254",
+  [ RTEMS_RECORD_USER_255 ] = "USER_255",
+  [ RTEMS_RECORD_USER_256 ] = "USER_256",
+  [ RTEMS_RECORD_USER_257 ] = "USER_257",
+  [ RTEMS_RECORD_USER_258 ] = "USER_258",
+  [ RTEMS_RECORD_USER_259 ] = "USER_259",
+  [ RTEMS_RECORD_USER_260 ] = "USER_260",
+  [ RTEMS_RECORD_USER_261 ] = "USER_261",
+  [ RTEMS_RECORD_USER_262 ] = "USER_262",
+  [ RTEMS_RECORD_USER_263 ] = "USER_263",
+  [ RTEMS_RECORD_USER_264 ] = "USER_264",
+  [ RTEMS_RECORD_USER_265 ] = "USER_265",
+  [ RTEMS_RECORD_USER_266 ] = "USER_266",
+  [ RTEMS_RECORD_USER_267 ] = "USER_267",
+  [ RTEMS_RECORD_USER_268 ] = "USER_268",
+  [ RTEMS_RECORD_USER_269 ] = "USER_269",
+  [ RTEMS_RECORD_USER_270 ] = "USER_270",
+  [ RTEMS_RECORD_USER_271 ] = "USER_271",
+  [ RTEMS_RECORD_USER_272 ] = "USER_272",
+  [ RTEMS_RECORD_USER_273 ] = "USER_273",
+  [ RTEMS_RECORD_USER_274 ] = "USER_274",
+  [ RTEMS_RECORD_USER_275 ] = "USER_275",
+  [ RTEMS_RECORD_USER_276 ] = "USER_276",
+  [ RTEMS_RECORD_USER_277 ] = "USER_277",
+  [ RTEMS_RECORD_USER_278 ] = "USER_278",
+  [ RTEMS_RECORD_USER_279 ] = "USER_279",
+  [ RTEMS_RECORD_USER_280 ] = "USER_280",
+  [ RTEMS_RECORD_USER_281 ] = "USER_281",
+  [ RTEMS_RECORD_USER_282 ] = "USER_282",
+  [ RTEMS_RECORD_USER_283 ] = "USER_283",
+  [ RTEMS_RECORD_USER_284 ] = "USER_284",
+  [ RTEMS_RECORD_USER_285 ] = "USER_285",
+  [ RTEMS_RECORD_USER_286 ] = "USER_286",
+  [ RTEMS_RECORD_USER_287 ] = "USER_287",
+  [ RTEMS_RECORD_USER_288 ] = "USER_288",
+  [ RTEMS_RECORD_USER_289 ] = "USER_289",
+  [ RTEMS_RECORD_USER_290 ] = "USER_290",
+  [ RTEMS_RECORD_USER_291 ] = "USER_291",
+  [ RTEMS_RECORD_USER_292 ] = "USER_292",
+  [ RTEMS_RECORD_USER_293 ] = "USER_293",
+  [ RTEMS_RECORD_USER_294 ] = "USER_294",
+  [ RTEMS_RECORD_USER_295 ] = "USER_295",
+  [ RTEMS_RECORD_USER_296 ] = "USER_296",
+  [ RTEMS_RECORD_USER_297 ] = "USER_297",
+  [ RTEMS_RECORD_USER_298 ] = "USER_298",
+  [ RTEMS_RECORD_USER_299 ] = "USER_299",
+  [ RTEMS_RECORD_USER_300 ] = "USER_300",
+  [ RTEMS_RECORD_USER_301 ] = "USER_301",
+  [ RTEMS_RECORD_USER_302 ] = "USER_302",
+  [ RTEMS_RECORD_USER_303 ] = "USER_303",
+  [ RTEMS_RECORD_USER_304 ] = "USER_304",
+  [ RTEMS_RECORD_USER_305 ] = "USER_305",
+  [ RTEMS_RECORD_USER_306 ] = "USER_306",
+  [ RTEMS_RECORD_USER_307 ] = "USER_307",
+  [ RTEMS_RECORD_USER_308 ] = "USER_308",
+  [ RTEMS_RECORD_USER_309 ] = "USER_309",
+  [ RTEMS_RECORD_USER_310 ] = "USER_310",
+  [ RTEMS_RECORD_USER_311 ] = "USER_311",
+  [ RTEMS_RECORD_USER_312 ] = "USER_312",
+  [ RTEMS_RECORD_USER_313 ] = "USER_313",
+  [ RTEMS_RECORD_USER_314 ] = "USER_314",
+  [ RTEMS_RECORD_USER_315 ] = "USER_315",
+  [ RTEMS_RECORD_USER_316 ] = "USER_316",
+  [ RTEMS_RECORD_USER_317 ] = "USER_317",
+  [ RTEMS_RECORD_USER_318 ] = "USER_318",
+  [ RTEMS_RECORD_USER_319 ] = "USER_319",
+  [ RTEMS_RECORD_USER_320 ] = "USER_320",
+  [ RTEMS_RECORD_USER_321 ] = "USER_321",
+  [ RTEMS_RECORD_USER_322 ] = "USER_322",
+  [ RTEMS_RECORD_USER_323 ] = "USER_323",
+  [ RTEMS_RECORD_USER_324 ] = "USER_324",
+  [ RTEMS_RECORD_USER_325 ] = "USER_325",
+  [ RTEMS_RECORD_USER_326 ] = "USER_326",
+  [ RTEMS_RECORD_USER_327 ] = "USER_327",
+  [ RTEMS_RECORD_USER_328 ] = "USER_328",
+  [ RTEMS_RECORD_USER_329 ] = "USER_329",
+  [ RTEMS_RECORD_USER_330 ] = "USER_330",
+  [ RTEMS_RECORD_USER_331 ] = "USER_331",
+  [ RTEMS_RECORD_USER_332 ] = "USER_332",
+  [ RTEMS_RECORD_USER_333 ] = "USER_333",
+  [ RTEMS_RECORD_USER_334 ] = "USER_334",
+  [ RTEMS_RECORD_USER_335 ] = "USER_335",
+  [ RTEMS_RECORD_USER_336 ] = "USER_336",
+  [ RTEMS_RECORD_USER_337 ] = "USER_337",
+  [ RTEMS_RECORD_USER_338 ] = "USER_338",
+  [ RTEMS_RECORD_USER_339 ] = "USER_339",
+  [ RTEMS_RECORD_USER_340 ] = "USER_340",
+  [ RTEMS_RECORD_USER_341 ] = "USER_341",
+  [ RTEMS_RECORD_USER_342 ] = "USER_342",
+  [ RTEMS_RECORD_USER_343 ] = "USER_343",
+  [ RTEMS_RECORD_USER_344 ] = "USER_344",
+  [ RTEMS_RECORD_USER_345 ] = "USER_345",
+  [ RTEMS_RECORD_USER_346 ] = "USER_346",
+  [ RTEMS_RECORD_USER_347 ] = "USER_347",
+  [ RTEMS_RECORD_USER_348 ] = "USER_348",
+  [ RTEMS_RECORD_USER_349 ] = "USER_349",
+  [ RTEMS_RECORD_USER_350 ] = "USER_350",
+  [ RTEMS_RECORD_USER_351 ] = "USER_351",
+  [ RTEMS_RECORD_USER_352 ] = "USER_352",
+  [ RTEMS_RECORD_USER_353 ] = "USER_353",
+  [ RTEMS_RECORD_USER_354 ] = "USER_354",
+  [ RTEMS_RECORD_USER_355 ] = "USER_355",
+  [ RTEMS_RECORD_USER_356 ] = "USER_356",
+  [ RTEMS_RECORD_USER_357 ] = "USER_357",
+  [ RTEMS_RECORD_USER_358 ] = "USER_358",
+  [ RTEMS_RECORD_USER_359 ] = "USER_359",
+  [ RTEMS_RECORD_USER_360 ] = "USER_360",
+  [ RTEMS_RECORD_USER_361 ] = "USER_361",
+  [ RTEMS_RECORD_USER_362 ] = "USER_362",
+  [ RTEMS_RECORD_USER_363 ] = "USER_363",
+  [ RTEMS_RECORD_USER_364 ] = "USER_364",
+  [ RTEMS_RECORD_USER_365 ] = "USER_365",
+  [ RTEMS_RECORD_USER_366 ] = "USER_366",
+  [ RTEMS_RECORD_USER_367 ] = "USER_367",
+  [ RTEMS_RECORD_USER_368 ] = "USER_368",
+  [ RTEMS_RECORD_USER_369 ] = "USER_369",
+  [ RTEMS_RECORD_USER_370 ] = "USER_370",
+  [ RTEMS_RECORD_USER_371 ] = "USER_371",
+  [ RTEMS_RECORD_USER_372 ] = "USER_372",
+  [ RTEMS_RECORD_USER_373 ] = "USER_373",
+  [ RTEMS_RECORD_USER_374 ] = "USER_374",
+  [ RTEMS_RECORD_USER_375 ] = "USER_375",
+  [ RTEMS_RECORD_USER_376 ] = "USER_376",
+  [ RTEMS_RECORD_USER_377 ] = "USER_377",
+  [ RTEMS_RECORD_USER_378 ] = "USER_378",
+  [ RTEMS_RECORD_USER_379 ] = "USER_379",
+  [ RTEMS_RECORD_USER_380 ] = "USER_380",
+  [ RTEMS_RECORD_USER_381 ] = "USER_381",
+  [ RTEMS_RECORD_USER_382 ] = "USER_382",
+  [ RTEMS_RECORD_USER_383 ] = "USER_383",
+  [ RTEMS_RECORD_USER_384 ] = "USER_384",
+  [ RTEMS_RECORD_USER_385 ] = "USER_385",
+  [ RTEMS_RECORD_USER_386 ] = "USER_386",
+  [ RTEMS_RECORD_USER_387 ] = "USER_387",
+  [ RTEMS_RECORD_USER_388 ] = "USER_388",
+  [ RTEMS_RECORD_USER_389 ] = "USER_389",
+  [ RTEMS_RECORD_USER_390 ] = "USER_390",
+  [ RTEMS_RECORD_USER_391 ] = "USER_391",
+  [ RTEMS_RECORD_USER_392 ] = "USER_392",
+  [ RTEMS_RECORD_USER_393 ] = "USER_393",
+  [ RTEMS_RECORD_USER_394 ] = "USER_394",
+  [ RTEMS_RECORD_USER_395 ] = "USER_395",
+  [ RTEMS_RECORD_USER_396 ] = "USER_396",
+  [ RTEMS_RECORD_USER_397 ] = "USER_397",
+  [ RTEMS_RECORD_USER_398 ] = "USER_398",
+  [ RTEMS_RECORD_USER_399 ] = "USER_399",
+  [ RTEMS_RECORD_USER_400 ] = "USER_400",
+  [ RTEMS_RECORD_USER_401 ] = "USER_401",
+  [ RTEMS_RECORD_USER_402 ] = "USER_402",
+  [ RTEMS_RECORD_USER_403 ] = "USER_403",
+  [ RTEMS_RECORD_USER_404 ] = "USER_404",
+  [ RTEMS_RECORD_USER_405 ] = "USER_405",
+  [ RTEMS_RECORD_USER_406 ] = "USER_406",
+  [ RTEMS_RECORD_USER_407 ] = "USER_407",
+  [ RTEMS_RECORD_USER_408 ] = "USER_408",
+  [ RTEMS_RECORD_USER_409 ] = "USER_409",
+  [ RTEMS_RECORD_USER_410 ] = "USER_410",
+  [ RTEMS_RECORD_USER_411 ] = "USER_411",
+  [ RTEMS_RECORD_USER_412 ] = "USER_412",
+  [ RTEMS_RECORD_USER_413 ] = "USER_413",
+  [ RTEMS_RECORD_USER_414 ] = "USER_414",
+  [ RTEMS_RECORD_USER_415 ] = "USER_415",
+  [ RTEMS_RECORD_USER_416 ] = "USER_416",
+  [ RTEMS_RECORD_USER_417 ] = "USER_417",
+  [ RTEMS_RECORD_USER_418 ] = "USER_418",
+  [ RTEMS_RECORD_USER_419 ] = "USER_419",
+  [ RTEMS_RECORD_USER_420 ] = "USER_420",
+  [ RTEMS_RECORD_USER_421 ] = "USER_421",
+  [ RTEMS_RECORD_USER_422 ] = "USER_422",
+  [ RTEMS_RECORD_USER_423 ] = "USER_423",
+  [ RTEMS_RECORD_USER_424 ] = "USER_424",
+  [ RTEMS_RECORD_USER_425 ] = "USER_425",
+  [ RTEMS_RECORD_USER_426 ] = "USER_426",
+  [ RTEMS_RECORD_USER_427 ] = "USER_427",
+  [ RTEMS_RECORD_USER_428 ] = "USER_428",
+  [ RTEMS_RECORD_USER_429 ] = "USER_429",
+  [ RTEMS_RECORD_USER_430 ] = "USER_430",
+  [ RTEMS_RECORD_USER_431 ] = "USER_431",
+  [ RTEMS_RECORD_USER_432 ] = "USER_432",
+  [ RTEMS_RECORD_USER_433 ] = "USER_433",
+  [ RTEMS_RECORD_USER_434 ] = "USER_434",
+  [ RTEMS_RECORD_USER_435 ] = "USER_435",
+  [ RTEMS_RECORD_USER_436 ] = "USER_436",
+  [ RTEMS_RECORD_USER_437 ] = "USER_437",
+  [ RTEMS_RECORD_USER_438 ] = "USER_438",
+  [ RTEMS_RECORD_USER_439 ] = "USER_439",
+  [ RTEMS_RECORD_USER_440 ] = "USER_440",
+  [ RTEMS_RECORD_USER_441 ] = "USER_441",
+  [ RTEMS_RECORD_USER_442 ] = "USER_442",
+  [ RTEMS_RECORD_USER_443 ] = "USER_443",
+  [ RTEMS_RECORD_USER_444 ] = "USER_444",
+  [ RTEMS_RECORD_USER_445 ] = "USER_445",
+  [ RTEMS_RECORD_USER_446 ] = "USER_446",
+  [ RTEMS_RECORD_USER_447 ] = "USER_447",
+  [ RTEMS_RECORD_USER_448 ] = "USER_448",
+  [ RTEMS_RECORD_USER_449 ] = "USER_449",
+  [ RTEMS_RECORD_USER_450 ] = "USER_450",
+  [ RTEMS_RECORD_USER_451 ] = "USER_451",
+  [ RTEMS_RECORD_USER_452 ] = "USER_452",
+  [ RTEMS_RECORD_USER_453 ] = "USER_453",
+  [ RTEMS_RECORD_USER_454 ] = "USER_454",
+  [ RTEMS_RECORD_USER_455 ] = "USER_455",
+  [ RTEMS_RECORD_USER_456 ] = "USER_456",
+  [ RTEMS_RECORD_USER_457 ] = "USER_457",
+  [ RTEMS_RECORD_USER_458 ] = "USER_458",
+  [ RTEMS_RECORD_USER_459 ] = "USER_459",
+  [ RTEMS_RECORD_USER_460 ] = "USER_460",
+  [ RTEMS_RECORD_USER_461 ] = "USER_461",
+  [ RTEMS_RECORD_USER_462 ] = "USER_462",
+  [ RTEMS_RECORD_USER_463 ] = "USER_463",
+  [ RTEMS_RECORD_USER_464 ] = "USER_464",
+  [ RTEMS_RECORD_USER_465 ] = "USER_465",
+  [ RTEMS_RECORD_USER_466 ] = "USER_466",
+  [ RTEMS_RECORD_USER_467 ] = "USER_467",
+  [ RTEMS_RECORD_USER_468 ] = "USER_468",
+  [ RTEMS_RECORD_USER_469 ] = "USER_469",
+  [ RTEMS_RECORD_USER_470 ] = "USER_470",
+  [ RTEMS_RECORD_USER_471 ] = "USER_471",
+  [ RTEMS_RECORD_USER_472 ] = "USER_472",
+  [ RTEMS_RECORD_USER_473 ] = "USER_473",
+  [ RTEMS_RECORD_USER_474 ] = "USER_474",
+  [ RTEMS_RECORD_USER_475 ] = "USER_475",
+  [ RTEMS_RECORD_USER_476 ] = "USER_476",
+  [ RTEMS_RECORD_USER_477 ] = "USER_477",
+  [ RTEMS_RECORD_USER_478 ] = "USER_478",
+  [ RTEMS_RECORD_USER_479 ] = "USER_479",
+  [ RTEMS_RECORD_USER_480 ] = "USER_480",
+  [ RTEMS_RECORD_USER_481 ] = "USER_481",
+  [ RTEMS_RECORD_USER_482 ] = "USER_482",
+  [ RTEMS_RECORD_USER_483 ] = "USER_483",
+  [ RTEMS_RECORD_USER_484 ] = "USER_484",
+  [ RTEMS_RECORD_USER_485 ] = "USER_485",
+  [ RTEMS_RECORD_USER_486 ] = "USER_486",
+  [ RTEMS_RECORD_USER_487 ] = "USER_487",
+  [ RTEMS_RECORD_USER_488 ] = "USER_488",
+  [ RTEMS_RECORD_USER_489 ] = "USER_489",
+  [ RTEMS_RECORD_USER_490 ] = "USER_490",
+  [ RTEMS_RECORD_USER_491 ] = "USER_491",
+  [ RTEMS_RECORD_USER_492 ] = "USER_492",
+  [ RTEMS_RECORD_USER_493 ] = "USER_493",
+  [ RTEMS_RECORD_USER_494 ] = "USER_494",
+  [ RTEMS_RECORD_USER_495 ] = "USER_495",
+  [ RTEMS_RECORD_USER_496 ] = "USER_496",
+  [ RTEMS_RECORD_USER_497 ] = "USER_497",
+  [ RTEMS_RECORD_USER_498 ] = "USER_498",
+  [ RTEMS_RECORD_USER_499 ] = "USER_499",
+  [ RTEMS_RECORD_USER_500 ] = "USER_500",
+  [ RTEMS_RECORD_USER_501 ] = "USER_501",
+  [ RTEMS_RECORD_USER_502 ] = "USER_502",
+  [ RTEMS_RECORD_USER_503 ] = "USER_503",
+  [ RTEMS_RECORD_USER_504 ] = "USER_504",
+  [ RTEMS_RECORD_USER_505 ] = "USER_505",
+  [ RTEMS_RECORD_USER_506 ] = "USER_506",
+  [ RTEMS_RECORD_USER_507 ] = "USER_507",
+  [ RTEMS_RECORD_USER_508 ] = "USER_508",
+  [ RTEMS_RECORD_USER_509 ] = "USER_509",
+  [ RTEMS_RECORD_USER_510 ] = "USER_510",
+  [ RTEMS_RECORD_USER_511 ] = "USER_511"
+};
+
+const char *rtems_record_event_text( rtems_record_event event )
+{
+  return event_text[ event ];
+}
diff --git a/trace/record/rtems/recordclient.h b/trace/record/rtems/recordclient.h
new file mode 100644
index 0000000..61ef967
--- /dev/null
+++ b/trace/record/rtems/recordclient.h
@@ -0,0 +1,139 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * 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.
+ */
+
+/*
+ * This file must be compatible to general purpose POSIX system, e.g. Linux,
+ * FreeBSD.  It may be used for utility programs.
+ */
+
+#ifndef _RTEMS_RECORDCLIENT_H
+#define _RTEMS_RECORDCLIENT_H
+
+#include "recorddata.h"
+
+#include <stddef.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @addtogroup RTEMSRecord
+ *
+ * @{
+ */
+
+#define RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT 32
+
+typedef enum {
+  RTEMS_RECORD_CLIENT_SUCCESS,
+  RTEMS_RECORD_CLIENT_ERROR_INVALID_MAGIC,
+  RTEMS_RECORD_CLIENT_ERROR_UNKNOWN_FORMAT,
+  RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_VERSION,
+  RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU
+} rtems_record_client_status;
+
+typedef rtems_record_client_status ( *rtems_record_client_handler )(
+  uint32_t            seconds,
+  uint32_t            nanoseconds,
+  uint32_t            cpu,
+  rtems_record_event  event,
+  uint64_t            data,
+  void               *arg
+);
+
+typedef struct {
+  struct {
+    uint64_t bt;
+    uint32_t time_at_bt;
+    uint32_t time_last;
+    uint32_t time_accumulated;
+  } uptime;
+  uint32_t tail[ 2 ];
+  uint32_t head[ 2 ];
+  size_t index;
+} rtems_record_client_per_cpu;
+
+typedef struct rtems_record_client_context {
+  uint64_t to_bt_scaler;
+  rtems_record_client_per_cpu per_cpu[ RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT ];
+  uint64_t data;
+  uint32_t cpu;
+  uint32_t event;
+  uint32_t count;
+  union {
+    rtems_record_item_32 format_32;
+    rtems_record_item_64 format_64;
+  } item;
+  size_t todo;
+  void *pos;
+  rtems_record_client_status ( *consume )(
+    struct rtems_record_client_context *,
+    const void *,
+    size_t
+  );
+  rtems_record_client_handler handler;
+  void *handler_arg;
+  uint32_t header[ 2 ];
+} rtems_record_client_context;
+
+/**
+ * @brief Initializes a record client.
+ *
+ * The record client consumes a record item stream produces by the record
+ * server.
+ *
+ * @param ctx The record client context to initialize.
+ * @param handler The handler is invoked for each received record item.
+ * @param arg The handler argument.
+ */
+void rtems_record_client_init(
+  rtems_record_client_context *ctx,
+  rtems_record_client_handler  handler,
+  void                        *arg
+);
+
+/**
+ * @brief Runs the record client to consume new stream data.
+ *
+ * @param ctx The record client context.
+ * @param buf The buffer with new stream data.
+ * @param n The size of the buffer.
+ */
+rtems_record_client_status rtems_record_client_run(
+  rtems_record_client_context *ctx,
+  const void                  *buf,
+  size_t                       n
+);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_RECORDCLIENT_H */
diff --git a/trace/record/rtems/recorddata.h b/trace/record/rtems/recorddata.h
new file mode 100644
index 0000000..607955c
--- /dev/null
+++ b/trace/record/rtems/recorddata.h
@@ -0,0 +1,1204 @@
+/*
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (C) 2018, 2019 embedded brains GmbH
+ *
+ * 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.
+ */
+
+/*
+ * This file must be compatible to general purpose POSIX system, e.g. Linux,
+ * FreeBSD.  It may be used for utility programs.
+ */
+
+#ifndef _RTEMS_RECORDDATA_H
+#define _RTEMS_RECORDDATA_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * @defgroup RTEMSRecord Event Recording
+ *
+ * @ingroup RTEMSAPITracing
+ *
+ * @brief Low-level event recording support.
+ *
+ * @{
+ */
+
+/**
+ * @brief The record version.
+ *
+ * The record version reflects the record event definitions.  It is reported by
+ * the RTEMS_RECORD_VERSION event.
+ */
+#define RTEMS_RECORD_THE_VERSION 5
+
+/**
+ * @brief The items are in 32-bit little-endian format.
+ */
+#define RTEMS_RECORD_FORMAT_LE_32 0x11111111
+
+/**
+ * @brief The items are in 64-bit little-endian format.
+ */
+#define RTEMS_RECORD_FORMAT_LE_64 0x22222222
+
+/**
+ * @brief The items are in 32-bit big-endian format.
+ */
+#define RTEMS_RECORD_FORMAT_BE_32 0x33333333
+
+/**
+ * @brief The items are in 64-bit big-endian format.
+ */
+#define RTEMS_RECORD_FORMAT_BE_64 0x44444444
+
+/**
+ * @brief Magic number to identify a record item stream.
+ *
+ * This is a random number.
+ */
+#define RTEMS_RECORD_MAGIC 0x82e14ec1
+
+/**
+ * @brief The record events.
+ */
+typedef enum {
+  /* There are 512 events reserved for the system */
+  RTEMS_RECORD_EMPTY,
+  RTEMS_RECORD_VERSION,
+
+  /*
+   * Keep the following system events in lexicographical order, increment
+   * RTEMS_RECORD_THE_VERSION after each change.
+   */
+  RTEMS_RECORD_ACCEPT_ENTRY,
+  RTEMS_RECORD_ACCEPT_EXIT,
+  RTEMS_RECORD_BIND_ENTRY,
+  RTEMS_RECORD_BIND_EXIT,
+  RTEMS_RECORD_BUFFER,
+  RTEMS_RECORD_CHOWN_ENTRY,
+  RTEMS_RECORD_CHOWN_EXIT,
+  RTEMS_RECORD_CLOSE_ENTRY,
+  RTEMS_RECORD_CLOSE_EXIT,
+  RTEMS_RECORD_CONNECT_ENTRY,
+  RTEMS_RECORD_CONNECT_EXIT,
+  RTEMS_RECORD_ETHER_INPUT,
+  RTEMS_RECORD_ETHER_OUTPUT,
+  RTEMS_RECORD_FCHMOD_ENTRY,
+  RTEMS_RECORD_FCHMOD_EXIT,
+  RTEMS_RECORD_FCNTL_ENTRY,
+  RTEMS_RECORD_FCNTL_EXIT,
+  RTEMS_RECORD_FDATASYNC_ENTRY,
+  RTEMS_RECORD_FDATASYNC_EXIT,
+  RTEMS_RECORD_FREQUENCY,
+  RTEMS_RECORD_FSTAT_ENTRY,
+  RTEMS_RECORD_FSTAT_EXIT,
+  RTEMS_RECORD_FSYNC_ENTRY,
+  RTEMS_RECORD_FSYNC_EXIT,
+  RTEMS_RECORD_FTRUNCATE_ENTRY,
+  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,
+  RTEMS_RECORD_HEAP_USAGE,
+  RTEMS_RECORD_INTERRUPT_ENTRY,
+  RTEMS_RECORD_INTERRUPT_EXIT,
+  RTEMS_RECORD_INTERRUPT_INSTALL,
+  RTEMS_RECORD_INTERRUPT_REMOVE,
+  RTEMS_RECORD_INTERRUPT_SERVER_ENTRY,
+  RTEMS_RECORD_INTERRUPT_SERVER_EXIT,
+  RTEMS_RECORD_INTERRUPT_SERVER_INSTALL,
+  RTEMS_RECORD_INTERRUPT_SERVER_MOVE,
+  RTEMS_RECORD_INTERRUPT_SERVER_REMOVE,
+  RTEMS_RECORD_INTERRUPT_SERVER_TRIGGER,
+  RTEMS_RECORD_IOCTL_ENTRY,
+  RTEMS_RECORD_IOCTL_EXIT,
+  RTEMS_RECORD_IP6_INPUT,
+  RTEMS_RECORD_IP6_OUTPUT,
+  RTEMS_RECORD_IP_INPUT,
+  RTEMS_RECORD_IP_OUTPUT,
+  RTEMS_RECORD_KEVENT_ENTRY,
+  RTEMS_RECORD_KEVENT_EXIT,
+  RTEMS_RECORD_KQUEUE_ENTRY,
+  RTEMS_RECORD_KQUEUE_EXIT,
+  RTEMS_RECORD_LENGTH,
+  RTEMS_RECORD_LINK_ENTRY,
+  RTEMS_RECORD_LINK_EXIT,
+  RTEMS_RECORD_LISTEN_ENTRY,
+  RTEMS_RECORD_LISTEN_EXIT,
+  RTEMS_RECORD_LSEEK_ENTRY,
+  RTEMS_RECORD_LSEEK_EXIT,
+  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_OPEN_ENTRY,
+  RTEMS_RECORD_OPEN_EXIT,
+  RTEMS_RECORD_PAGE_ALLOC,
+  RTEMS_RECORD_PAGE_FREE,
+  RTEMS_RECORD_PER_CPU_COUNT,
+  RTEMS_RECORD_PER_CPU_HEAD,
+  RTEMS_RECORD_PER_CPU_OVERFLOW,
+  RTEMS_RECORD_PER_CPU_TAIL,
+  RTEMS_RECORD_POLL_ENTRY,
+  RTEMS_RECORD_POLL_EXIT,
+  RTEMS_RECORD_PROCESSOR,
+  RTEMS_RECORD_PROCESSOR_MAXIMUM,
+  RTEMS_RECORD_READ_ENTRY,
+  RTEMS_RECORD_READ_EXIT,
+  RTEMS_RECORD_READLINK_ENTRY,
+  RTEMS_RECORD_READLINK_EXIT,
+  RTEMS_RECORD_READV_ENTRY,
+  RTEMS_RECORD_READV_EXIT,
+  RTEMS_RECORD_RECV_ENTRY,
+  RTEMS_RECORD_RECV_EXIT,
+  RTEMS_RECORD_RECVFROM_ENTRY,
+  RTEMS_RECORD_RECVFROM_EXIT,
+  RTEMS_RECORD_RECVMSG_ENTRY,
+  RTEMS_RECORD_RECVMSG_EXIT,
+  RTEMS_RECORD_RENAME_ENTRY,
+  RTEMS_RECORD_RENAME_EXIT,
+  RTEMS_RECORD_RTEMS_BARRIER_CREATE,
+  RTEMS_RECORD_RTEMS_BARRIER_DELETE,
+  RTEMS_RECORD_RTEMS_BARRIER_RELEASE,
+  RTEMS_RECORD_RTEMS_BARRIER_WAIT,
+  RTEMS_RECORD_RTEMS_EVENT_RECEIVE,
+  RTEMS_RECORD_RTEMS_EVENT_SEND,
+  RTEMS_RECORD_RTEMS_EVENT_SYSTEM_RECEIVE,
+  RTEMS_RECORD_RTEMS_EVENT_SYSTEM_SEND,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_BROADCAST,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_CREATE,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_DELETE,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_FLUSH,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_RECEIVE,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_SEND,
+  RTEMS_RECORD_RTEMS_MESSAGE_QUEUE_URGENT,
+  RTEMS_RECORD_RTEMS_PARTITION_CREATE,
+  RTEMS_RECORD_RTEMS_PARTITION_DELETE,
+  RTEMS_RECORD_RTEMS_PARTITION_GET_BUFFER,
+  RTEMS_RECORD_RTEMS_PARTITION_RETURN_BUFFER,
+  RTEMS_RECORD_RTEMS_RATE_MONOTONIC_CANCEL,
+  RTEMS_RECORD_RTEMS_RATE_MONOTONIC_CREATE,
+  RTEMS_RECORD_RTEMS_RATE_MONOTONIC_DELETE,
+  RTEMS_RECORD_RTEMS_RATE_MONOTONIC_PERIOD,
+  RTEMS_RECORD_RTEMS_SEMAPHORE_CREATE,
+  RTEMS_RECORD_RTEMS_SEMAPHORE_DELETE,
+  RTEMS_RECORD_RTEMS_SEMAPHORE_FLUSH,
+  RTEMS_RECORD_RTEMS_SEMAPHORE_OBTAIN,
+  RTEMS_RECORD_RTEMS_SEMAPHORE_RELEASE,
+  RTEMS_RECORD_RTEMS_TIMER_CANCEL,
+  RTEMS_RECORD_RTEMS_TIMER_CREATE,
+  RTEMS_RECORD_RTEMS_TIMER_DELETE,
+  RTEMS_RECORD_RTEMS_TIMER_FIRE_AFTER,
+  RTEMS_RECORD_RTEMS_TIMER_FIRE_WHEN,
+  RTEMS_RECORD_RTEMS_TIMER_RESET,
+  RTEMS_RECORD_RTEMS_TIMER_SERVER_FIRE_AFTER,
+  RTEMS_RECORD_RTEMS_TIMER_SERVER_FIRE_WHEN,
+  RTEMS_RECORD_SBWAIT_ENTRY,
+  RTEMS_RECORD_SBWAIT_EXIT,
+  RTEMS_RECORD_SBWAKEUP_ENTRY,
+  RTEMS_RECORD_SBWAKEUP_EXIT,
+  RTEMS_RECORD_SELECT_ENTRY,
+  RTEMS_RECORD_SELECT_EXIT,
+  RTEMS_RECORD_SEND_ENTRY,
+  RTEMS_RECORD_SEND_EXIT,
+  RTEMS_RECORD_SENDMSG_ENTRY,
+  RTEMS_RECORD_SENDMSG_EXIT,
+  RTEMS_RECORD_SENDTO_ENTRY,
+  RTEMS_RECORD_SENDTO_EXIT,
+  RTEMS_RECORD_SETSOCKOPT_ENTRY,
+  RTEMS_RECORD_SETSOCKOPT_EXIT,
+  RTEMS_RECORD_SHUTDOWN_ENTRY,
+  RTEMS_RECORD_SHUTDOWN_EXIT,
+  RTEMS_RECORD_SOABORT_ENTRY,
+  RTEMS_RECORD_SOABORT_EXIT,
+  RTEMS_RECORD_SOACCEPT_ENTRY,
+  RTEMS_RECORD_SOACCEPT_EXIT,
+  RTEMS_RECORD_SOALLOC_ENTRY,
+  RTEMS_RECORD_SOALLOC_EXIT,
+  RTEMS_RECORD_SOBINDAT_ENTRY,
+  RTEMS_RECORD_SOBINDAT_EXIT,
+  RTEMS_RECORD_SOBIND_ENTRY,
+  RTEMS_RECORD_SOBIND_EXIT,
+  RTEMS_RECORD_SOCKET_ENTRY,
+  RTEMS_RECORD_SOCKET_EXIT,
+  RTEMS_RECORD_SOCLOSE_ENTRY,
+  RTEMS_RECORD_SOCLOSE_EXIT,
+  RTEMS_RECORD_SOCONNECT2_ENTRY,
+  RTEMS_RECORD_SOCONNECT2_EXIT,
+  RTEMS_RECORD_SOCONNECTAT_ENTRY,
+  RTEMS_RECORD_SOCONNECTAT_EXIT,
+  RTEMS_RECORD_SOCREATE_ENTRY,
+  RTEMS_RECORD_SOCREATE_EXIT,
+  RTEMS_RECORD_SODEALLOC_ENTRY,
+  RTEMS_RECORD_SODEALLOC_EXIT,
+  RTEMS_RECORD_SODISCONNECT_ENTRY,
+  RTEMS_RECORD_SODISCONNECT_EXIT,
+  RTEMS_RECORD_SOFREE_ENTRY,
+  RTEMS_RECORD_SOFREE_EXIT,
+  RTEMS_RECORD_SOLISTEN_ENTRY,
+  RTEMS_RECORD_SOLISTEN_EXIT,
+  RTEMS_RECORD_SONEWCONN_ENTRY,
+  RTEMS_RECORD_SONEWCONN_EXIT,
+  RTEMS_RECORD_SORECEIVE_ENTRY,
+  RTEMS_RECORD_SORECEIVE_EXIT,
+  RTEMS_RECORD_SORFLUSH_ENTRY,
+  RTEMS_RECORD_SORFLUSH_EXIT,
+  RTEMS_RECORD_SOSEND_ENTRY,
+  RTEMS_RECORD_SOSEND_EXIT,
+  RTEMS_RECORD_SOSHUTDOWN_ENTRY,
+  RTEMS_RECORD_SOSHUTDOWN_EXIT,
+  RTEMS_RECORD_STATVFS_ENTRY,
+  RTEMS_RECORD_STATVFS_EXIT,
+  RTEMS_RECORD_SYMLINK_ENTRY,
+  RTEMS_RECORD_SYMLINK_EXIT,
+  RTEMS_RECORD_TCP_CLOSE,
+  RTEMS_RECORD_TCP_INPUT,
+  RTEMS_RECORD_TCP_OUTPUT,
+  RTEMS_RECORD_THREAD_BEGIN,
+  RTEMS_RECORD_THREAD_CREATE,
+  RTEMS_RECORD_THREAD_DELETE,
+  RTEMS_RECORD_THREAD_EXIT,
+  RTEMS_RECORD_THREAD_EXITTED,
+  RTEMS_RECORD_THREAD_ID,
+  RTEMS_RECORD_THREAD_NAME,
+  RTEMS_RECORD_THREAD_PRIO_CURRENT_HIGH,
+  RTEMS_RECORD_THREAD_PRIO_CURRENT_LOW,
+  RTEMS_RECORD_THREAD_PRIO_REAL_HIGH,
+  RTEMS_RECORD_THREAD_PRIO_REAL_LOW,
+  RTEMS_RECORD_THREAD_QUEUE_ENQUEUE,
+  RTEMS_RECORD_THREAD_QUEUE_ENQUEUE_STICKY,
+  RTEMS_RECORD_THREAD_QUEUE_EXTRACT,
+  RTEMS_RECORD_THREAD_QUEUE_SURRENDER,
+  RTEMS_RECORD_THREAD_QUEUE_SURRENDER_STICKY,
+  RTEMS_RECORD_THREAD_RESOURCE_OBTAIN,
+  RTEMS_RECORD_THREAD_RESOURCE_RELEASE,
+  RTEMS_RECORD_THREAD_RESTART,
+  RTEMS_RECORD_THREAD_STACK_CURRENT,
+  RTEMS_RECORD_THREAD_STACK_SIZE,
+  RTEMS_RECORD_THREAD_STACK_USAGE,
+  RTEMS_RECORD_THREAD_START,
+  RTEMS_RECORD_THREAD_STATE_CLEAR,
+  RTEMS_RECORD_THREAD_STATE_SET,
+  RTEMS_RECORD_THREAD_SWITCH_IN,
+  RTEMS_RECORD_THREAD_SWITCH_OUT,
+  RTEMS_RECORD_THREAD_TERMINATE,
+  RTEMS_RECORD_UDP_INPUT,
+  RTEMS_RECORD_UDP_OUTPUT,
+  RTEMS_RECORD_UMA_ALLOC_PTR,
+  RTEMS_RECORD_UMA_ALLOC_ZONE,
+  RTEMS_RECORD_UMA_FREE_PTR,
+  RTEMS_RECORD_UMA_FREE_ZONE,
+  RTEMS_RECORD_UNLINK_ENTRY,
+  RTEMS_RECORD_UNLINK_EXIT,
+  RTEMS_RECORD_UNMOUNT_ENTRY,
+  RTEMS_RECORD_UNMOUNT_EXIT,
+  RTEMS_RECORD_UPTIME_HIGH,
+  RTEMS_RECORD_UPTIME_LOW,
+  RTEMS_RECORD_WORKSPACE_ALLOC,
+  RTEMS_RECORD_WORKSPACE_FREE,
+  RTEMS_RECORD_WORKSPACE_SIZE,
+  RTEMS_RECORD_WORKSPACE_USAGE,
+  RTEMS_RECORD_WRITE_ENTRY,
+  RTEMS_RECORD_WRITE_EXIT,
+  RTEMS_RECORD_WRITEV_ENTRY,
+  RTEMS_RECORD_WRITEV_EXIT,
+
+  /* Unused system events */
+  RTEMS_RECORD_SYSTEM_238,
+  RTEMS_RECORD_SYSTEM_239,
+  RTEMS_RECORD_SYSTEM_240,
+  RTEMS_RECORD_SYSTEM_241,
+  RTEMS_RECORD_SYSTEM_242,
+  RTEMS_RECORD_SYSTEM_243,
+  RTEMS_RECORD_SYSTEM_244,
+  RTEMS_RECORD_SYSTEM_245,
+  RTEMS_RECORD_SYSTEM_246,
+  RTEMS_RECORD_SYSTEM_247,
+  RTEMS_RECORD_SYSTEM_248,
+  RTEMS_RECORD_SYSTEM_249,
+  RTEMS_RECORD_SYSTEM_250,
+  RTEMS_RECORD_SYSTEM_251,
+  RTEMS_RECORD_SYSTEM_252,
+  RTEMS_RECORD_SYSTEM_253,
+  RTEMS_RECORD_SYSTEM_254,
+  RTEMS_RECORD_SYSTEM_255,
+  RTEMS_RECORD_SYSTEM_256,
+  RTEMS_RECORD_SYSTEM_257,
+  RTEMS_RECORD_SYSTEM_258,
+  RTEMS_RECORD_SYSTEM_259,
+  RTEMS_RECORD_SYSTEM_260,
+  RTEMS_RECORD_SYSTEM_261,
+  RTEMS_RECORD_SYSTEM_262,
+  RTEMS_RECORD_SYSTEM_263,
+  RTEMS_RECORD_SYSTEM_264,
+  RTEMS_RECORD_SYSTEM_265,
+  RTEMS_RECORD_SYSTEM_266,
+  RTEMS_RECORD_SYSTEM_267,
+  RTEMS_RECORD_SYSTEM_268,
+  RTEMS_RECORD_SYSTEM_269,
+  RTEMS_RECORD_SYSTEM_270,
+  RTEMS_RECORD_SYSTEM_271,
+  RTEMS_RECORD_SYSTEM_272,
+  RTEMS_RECORD_SYSTEM_273,
+  RTEMS_RECORD_SYSTEM_274,
+  RTEMS_RECORD_SYSTEM_275,
+  RTEMS_RECORD_SYSTEM_276,
+  RTEMS_RECORD_SYSTEM_277,
+  RTEMS_RECORD_SYSTEM_278,
+  RTEMS_RECORD_SYSTEM_279,
+  RTEMS_RECORD_SYSTEM_280,
+  RTEMS_RECORD_SYSTEM_281,
+  RTEMS_RECORD_SYSTEM_282,
+  RTEMS_RECORD_SYSTEM_283,
+  RTEMS_RECORD_SYSTEM_284,
+  RTEMS_RECORD_SYSTEM_285,
+  RTEMS_RECORD_SYSTEM_286,
+  RTEMS_RECORD_SYSTEM_287,
+  RTEMS_RECORD_SYSTEM_288,
+  RTEMS_RECORD_SYSTEM_289,
+  RTEMS_RECORD_SYSTEM_290,
+  RTEMS_RECORD_SYSTEM_291,
+  RTEMS_RECORD_SYSTEM_292,
+  RTEMS_RECORD_SYSTEM_293,
+  RTEMS_RECORD_SYSTEM_294,
+  RTEMS_RECORD_SYSTEM_295,
+  RTEMS_RECORD_SYSTEM_296,
+  RTEMS_RECORD_SYSTEM_297,
+  RTEMS_RECORD_SYSTEM_298,
+  RTEMS_RECORD_SYSTEM_299,
+  RTEMS_RECORD_SYSTEM_300,
+  RTEMS_RECORD_SYSTEM_301,
+  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,
+  RTEMS_RECORD_SYSTEM_313,
+  RTEMS_RECORD_SYSTEM_314,
+  RTEMS_RECORD_SYSTEM_315,
+  RTEMS_RECORD_SYSTEM_316,
+  RTEMS_RECORD_SYSTEM_317,
+  RTEMS_RECORD_SYSTEM_318,
+  RTEMS_RECORD_SYSTEM_319,
+  RTEMS_RECORD_SYSTEM_320,
+  RTEMS_RECORD_SYSTEM_321,
+  RTEMS_RECORD_SYSTEM_322,
+  RTEMS_RECORD_SYSTEM_323,
+  RTEMS_RECORD_SYSTEM_324,
+  RTEMS_RECORD_SYSTEM_325,
+  RTEMS_RECORD_SYSTEM_326,
+  RTEMS_RECORD_SYSTEM_327,
+  RTEMS_RECORD_SYSTEM_328,
+  RTEMS_RECORD_SYSTEM_329,
+  RTEMS_RECORD_SYSTEM_330,
+  RTEMS_RECORD_SYSTEM_331,
+  RTEMS_RECORD_SYSTEM_332,
+  RTEMS_RECORD_SYSTEM_333,
+  RTEMS_RECORD_SYSTEM_334,
+  RTEMS_RECORD_SYSTEM_335,
+  RTEMS_RECORD_SYSTEM_336,
+  RTEMS_RECORD_SYSTEM_337,
+  RTEMS_RECORD_SYSTEM_338,
+  RTEMS_RECORD_SYSTEM_339,
+  RTEMS_RECORD_SYSTEM_340,
+  RTEMS_RECORD_SYSTEM_341,
+  RTEMS_RECORD_SYSTEM_342,
+  RTEMS_RECORD_SYSTEM_343,
+  RTEMS_RECORD_SYSTEM_344,
+  RTEMS_RECORD_SYSTEM_345,
+  RTEMS_RECORD_SYSTEM_346,
+  RTEMS_RECORD_SYSTEM_347,
+  RTEMS_RECORD_SYSTEM_348,
+  RTEMS_RECORD_SYSTEM_349,
+  RTEMS_RECORD_SYSTEM_350,
+  RTEMS_RECORD_SYSTEM_351,
+  RTEMS_RECORD_SYSTEM_352,
+  RTEMS_RECORD_SYSTEM_353,
+  RTEMS_RECORD_SYSTEM_354,
+  RTEMS_RECORD_SYSTEM_355,
+  RTEMS_RECORD_SYSTEM_356,
+  RTEMS_RECORD_SYSTEM_357,
+  RTEMS_RECORD_SYSTEM_358,
+  RTEMS_RECORD_SYSTEM_359,
+  RTEMS_RECORD_SYSTEM_360,
+  RTEMS_RECORD_SYSTEM_361,
+  RTEMS_RECORD_SYSTEM_362,
+  RTEMS_RECORD_SYSTEM_363,
+  RTEMS_RECORD_SYSTEM_364,
+  RTEMS_RECORD_SYSTEM_365,
+  RTEMS_RECORD_SYSTEM_366,
+  RTEMS_RECORD_SYSTEM_367,
+  RTEMS_RECORD_SYSTEM_368,
+  RTEMS_RECORD_SYSTEM_369,
+  RTEMS_RECORD_SYSTEM_370,
+  RTEMS_RECORD_SYSTEM_371,
+  RTEMS_RECORD_SYSTEM_372,
+  RTEMS_RECORD_SYSTEM_373,
+  RTEMS_RECORD_SYSTEM_374,
+  RTEMS_RECORD_SYSTEM_375,
+  RTEMS_RECORD_SYSTEM_376,
+  RTEMS_RECORD_SYSTEM_377,
+  RTEMS_RECORD_SYSTEM_378,
+  RTEMS_RECORD_SYSTEM_379,
+  RTEMS_RECORD_SYSTEM_380,
+  RTEMS_RECORD_SYSTEM_381,
+  RTEMS_RECORD_SYSTEM_382,
+  RTEMS_RECORD_SYSTEM_383,
+  RTEMS_RECORD_SYSTEM_384,
+  RTEMS_RECORD_SYSTEM_385,
+  RTEMS_RECORD_SYSTEM_386,
+  RTEMS_RECORD_SYSTEM_387,
+  RTEMS_RECORD_SYSTEM_388,
+  RTEMS_RECORD_SYSTEM_389,
+  RTEMS_RECORD_SYSTEM_390,
+  RTEMS_RECORD_SYSTEM_391,
+  RTEMS_RECORD_SYSTEM_392,
+  RTEMS_RECORD_SYSTEM_393,
+  RTEMS_RECORD_SYSTEM_394,
+  RTEMS_RECORD_SYSTEM_395,
+  RTEMS_RECORD_SYSTEM_396,
+  RTEMS_RECORD_SYSTEM_397,
+  RTEMS_RECORD_SYSTEM_398,
+  RTEMS_RECORD_SYSTEM_399,
+  RTEMS_RECORD_SYSTEM_400,
+  RTEMS_RECORD_SYSTEM_401,
+  RTEMS_RECORD_SYSTEM_402,
+  RTEMS_RECORD_SYSTEM_403,
+  RTEMS_RECORD_SYSTEM_404,
+  RTEMS_RECORD_SYSTEM_405,
+  RTEMS_RECORD_SYSTEM_406,
+  RTEMS_RECORD_SYSTEM_407,
+  RTEMS_RECORD_SYSTEM_408,
+  RTEMS_RECORD_SYSTEM_409,
+  RTEMS_RECORD_SYSTEM_410,
+  RTEMS_RECORD_SYSTEM_411,
+  RTEMS_RECORD_SYSTEM_412,
+  RTEMS_RECORD_SYSTEM_413,
+  RTEMS_RECORD_SYSTEM_414,
+  RTEMS_RECORD_SYSTEM_415,
+  RTEMS_RECORD_SYSTEM_416,
+  RTEMS_RECORD_SYSTEM_417,
+  RTEMS_RECORD_SYSTEM_418,
+  RTEMS_RECORD_SYSTEM_419,
+  RTEMS_RECORD_SYSTEM_420,
+  RTEMS_RECORD_SYSTEM_421,
+  RTEMS_RECORD_SYSTEM_422,
+  RTEMS_RECORD_SYSTEM_423,
+  RTEMS_RECORD_SYSTEM_424,
+  RTEMS_RECORD_SYSTEM_425,
+  RTEMS_RECORD_SYSTEM_426,
+  RTEMS_RECORD_SYSTEM_427,
+  RTEMS_RECORD_SYSTEM_428,
+  RTEMS_RECORD_SYSTEM_429,
+  RTEMS_RECORD_SYSTEM_430,
+  RTEMS_RECORD_SYSTEM_431,
+  RTEMS_RECORD_SYSTEM_432,
+  RTEMS_RECORD_SYSTEM_433,
+  RTEMS_RECORD_SYSTEM_434,
+  RTEMS_RECORD_SYSTEM_435,
+  RTEMS_RECORD_SYSTEM_436,
+  RTEMS_RECORD_SYSTEM_437,
+  RTEMS_RECORD_SYSTEM_438,
+  RTEMS_RECORD_SYSTEM_439,
+  RTEMS_RECORD_SYSTEM_440,
+  RTEMS_RECORD_SYSTEM_441,
+  RTEMS_RECORD_SYSTEM_442,
+  RTEMS_RECORD_SYSTEM_443,
+  RTEMS_RECORD_SYSTEM_444,
+  RTEMS_RECORD_SYSTEM_445,
+  RTEMS_RECORD_SYSTEM_446,
+  RTEMS_RECORD_SYSTEM_447,
+  RTEMS_RECORD_SYSTEM_448,
+  RTEMS_RECORD_SYSTEM_449,
+  RTEMS_RECORD_SYSTEM_450,
+  RTEMS_RECORD_SYSTEM_451,
+  RTEMS_RECORD_SYSTEM_452,
+  RTEMS_RECORD_SYSTEM_453,
+  RTEMS_RECORD_SYSTEM_454,
+  RTEMS_RECORD_SYSTEM_455,
+  RTEMS_RECORD_SYSTEM_456,
+  RTEMS_RECORD_SYSTEM_457,
+  RTEMS_RECORD_SYSTEM_458,
+  RTEMS_RECORD_SYSTEM_459,
+  RTEMS_RECORD_SYSTEM_460,
+  RTEMS_RECORD_SYSTEM_461,
+  RTEMS_RECORD_SYSTEM_462,
+  RTEMS_RECORD_SYSTEM_463,
+  RTEMS_RECORD_SYSTEM_464,
+  RTEMS_RECORD_SYSTEM_465,
+  RTEMS_RECORD_SYSTEM_466,
+  RTEMS_RECORD_SYSTEM_467,
+  RTEMS_RECORD_SYSTEM_468,
+  RTEMS_RECORD_SYSTEM_469,
+  RTEMS_RECORD_SYSTEM_470,
+  RTEMS_RECORD_SYSTEM_471,
+  RTEMS_RECORD_SYSTEM_472,
+  RTEMS_RECORD_SYSTEM_473,
+  RTEMS_RECORD_SYSTEM_474,
+  RTEMS_RECORD_SYSTEM_475,
+  RTEMS_RECORD_SYSTEM_476,
+  RTEMS_RECORD_SYSTEM_477,
+  RTEMS_RECORD_SYSTEM_478,
+  RTEMS_RECORD_SYSTEM_479,
+  RTEMS_RECORD_SYSTEM_480,
+  RTEMS_RECORD_SYSTEM_481,
+  RTEMS_RECORD_SYSTEM_482,
+  RTEMS_RECORD_SYSTEM_483,
+  RTEMS_RECORD_SYSTEM_484,
+  RTEMS_RECORD_SYSTEM_485,
+  RTEMS_RECORD_SYSTEM_486,
+  RTEMS_RECORD_SYSTEM_487,
+  RTEMS_RECORD_SYSTEM_488,
+  RTEMS_RECORD_SYSTEM_489,
+  RTEMS_RECORD_SYSTEM_490,
+  RTEMS_RECORD_SYSTEM_491,
+  RTEMS_RECORD_SYSTEM_492,
+  RTEMS_RECORD_SYSTEM_493,
+  RTEMS_RECORD_SYSTEM_494,
+  RTEMS_RECORD_SYSTEM_495,
+  RTEMS_RECORD_SYSTEM_496,
+  RTEMS_RECORD_SYSTEM_497,
+  RTEMS_RECORD_SYSTEM_498,
+  RTEMS_RECORD_SYSTEM_499,
+  RTEMS_RECORD_SYSTEM_500,
+  RTEMS_RECORD_SYSTEM_501,
+  RTEMS_RECORD_SYSTEM_502,
+  RTEMS_RECORD_SYSTEM_503,
+  RTEMS_RECORD_SYSTEM_504,
+  RTEMS_RECORD_SYSTEM_505,
+  RTEMS_RECORD_SYSTEM_506,
+  RTEMS_RECORD_SYSTEM_507,
+  RTEMS_RECORD_SYSTEM_508,
+  RTEMS_RECORD_SYSTEM_509,
+  RTEMS_RECORD_SYSTEM_510,
+
+  /* There are 512 events reserved for the user */
+  RTEMS_RECORD_USER_0,
+  RTEMS_RECORD_USER_1,
+  RTEMS_RECORD_USER_2,
+  RTEMS_RECORD_USER_3,
+  RTEMS_RECORD_USER_4,
+  RTEMS_RECORD_USER_5,
+  RTEMS_RECORD_USER_6,
+  RTEMS_RECORD_USER_7,
+  RTEMS_RECORD_USER_8,
+  RTEMS_RECORD_USER_9,
+  RTEMS_RECORD_USER_10,
+  RTEMS_RECORD_USER_11,
+  RTEMS_RECORD_USER_12,
+  RTEMS_RECORD_USER_13,
+  RTEMS_RECORD_USER_14,
+  RTEMS_RECORD_USER_15,
+  RTEMS_RECORD_USER_16,
+  RTEMS_RECORD_USER_17,
+  RTEMS_RECORD_USER_18,
+  RTEMS_RECORD_USER_19,
+  RTEMS_RECORD_USER_20,
+  RTEMS_RECORD_USER_21,
+  RTEMS_RECORD_USER_22,
+  RTEMS_RECORD_USER_23,
+  RTEMS_RECORD_USER_24,
+  RTEMS_RECORD_USER_25,
+  RTEMS_RECORD_USER_26,
+  RTEMS_RECORD_USER_27,
+  RTEMS_RECORD_USER_28,
+  RTEMS_RECORD_USER_29,
+  RTEMS_RECORD_USER_30,
+  RTEMS_RECORD_USER_31,
+  RTEMS_RECORD_USER_32,
+  RTEMS_RECORD_USER_33,
+  RTEMS_RECORD_USER_34,
+  RTEMS_RECORD_USER_35,
+  RTEMS_RECORD_USER_36,
+  RTEMS_RECORD_USER_37,
+  RTEMS_RECORD_USER_38,
+  RTEMS_RECORD_USER_39,
+  RTEMS_RECORD_USER_40,
+  RTEMS_RECORD_USER_41,
+  RTEMS_RECORD_USER_42,
+  RTEMS_RECORD_USER_43,
+  RTEMS_RECORD_USER_44,
+  RTEMS_RECORD_USER_45,
+  RTEMS_RECORD_USER_46,
+  RTEMS_RECORD_USER_47,
+  RTEMS_RECORD_USER_48,
+  RTEMS_RECORD_USER_49,
+  RTEMS_RECORD_USER_50,
+  RTEMS_RECORD_USER_51,
+  RTEMS_RECORD_USER_52,
+  RTEMS_RECORD_USER_53,
+  RTEMS_RECORD_USER_54,
+  RTEMS_RECORD_USER_55,
+  RTEMS_RECORD_USER_56,
+  RTEMS_RECORD_USER_57,
+  RTEMS_RECORD_USER_58,
+  RTEMS_RECORD_USER_59,
+  RTEMS_RECORD_USER_60,
+  RTEMS_RECORD_USER_61,
+  RTEMS_RECORD_USER_62,
+  RTEMS_RECORD_USER_63,
+  RTEMS_RECORD_USER_64,
+  RTEMS_RECORD_USER_65,
+  RTEMS_RECORD_USER_66,
+  RTEMS_RECORD_USER_67,
+  RTEMS_RECORD_USER_68,
+  RTEMS_RECORD_USER_69,
+  RTEMS_RECORD_USER_70,
+  RTEMS_RECORD_USER_71,
+  RTEMS_RECORD_USER_72,
+  RTEMS_RECORD_USER_73,
+  RTEMS_RECORD_USER_74,
+  RTEMS_RECORD_USER_75,
+  RTEMS_RECORD_USER_76,
+  RTEMS_RECORD_USER_77,
+  RTEMS_RECORD_USER_78,
+  RTEMS_RECORD_USER_79,
+  RTEMS_RECORD_USER_80,
+  RTEMS_RECORD_USER_81,
+  RTEMS_RECORD_USER_82,
+  RTEMS_RECORD_USER_83,
+  RTEMS_RECORD_USER_84,
+  RTEMS_RECORD_USER_85,
+  RTEMS_RECORD_USER_86,
+  RTEMS_RECORD_USER_87,
+  RTEMS_RECORD_USER_88,
+  RTEMS_RECORD_USER_89,
+  RTEMS_RECORD_USER_90,
+  RTEMS_RECORD_USER_91,
+  RTEMS_RECORD_USER_92,
+  RTEMS_RECORD_USER_93,
+  RTEMS_RECORD_USER_94,
+  RTEMS_RECORD_USER_95,
+  RTEMS_RECORD_USER_96,
+  RTEMS_RECORD_USER_97,
+  RTEMS_RECORD_USER_98,
+  RTEMS_RECORD_USER_99,
+  RTEMS_RECORD_USER_100,
+  RTEMS_RECORD_USER_101,
+  RTEMS_RECORD_USER_102,
+  RTEMS_RECORD_USER_103,
+  RTEMS_RECORD_USER_104,
+  RTEMS_RECORD_USER_105,
+  RTEMS_RECORD_USER_106,
+  RTEMS_RECORD_USER_107,
+  RTEMS_RECORD_USER_108,
+  RTEMS_RECORD_USER_109,
+  RTEMS_RECORD_USER_110,
+  RTEMS_RECORD_USER_111,
+  RTEMS_RECORD_USER_112,
+  RTEMS_RECORD_USER_113,
+  RTEMS_RECORD_USER_114,
+  RTEMS_RECORD_USER_115,
+  RTEMS_RECORD_USER_116,
+  RTEMS_RECORD_USER_117,
+  RTEMS_RECORD_USER_118,
+  RTEMS_RECORD_USER_119,
+  RTEMS_RECORD_USER_120,
+  RTEMS_RECORD_USER_121,
+  RTEMS_RECORD_USER_122,
+  RTEMS_RECORD_USER_123,
+  RTEMS_RECORD_USER_124,
+  RTEMS_RECORD_USER_125,
+  RTEMS_RECORD_USER_126,
+  RTEMS_RECORD_USER_127,
+  RTEMS_RECORD_USER_128,
+  RTEMS_RECORD_USER_129,
+  RTEMS_RECORD_USER_130,
+  RTEMS_RECORD_USER_131,
+  RTEMS_RECORD_USER_132,
+  RTEMS_RECORD_USER_133,
+  RTEMS_RECORD_USER_134,
+  RTEMS_RECORD_USER_135,
+  RTEMS_RECORD_USER_136,
+  RTEMS_RECORD_USER_137,
+  RTEMS_RECORD_USER_138,
+  RTEMS_RECORD_USER_139,
+  RTEMS_RECORD_USER_140,
+  RTEMS_RECORD_USER_141,
+  RTEMS_RECORD_USER_142,
+  RTEMS_RECORD_USER_143,
+  RTEMS_RECORD_USER_144,
+  RTEMS_RECORD_USER_145,
+  RTEMS_RECORD_USER_146,
+  RTEMS_RECORD_USER_147,
+  RTEMS_RECORD_USER_148,
+  RTEMS_RECORD_USER_149,
+  RTEMS_RECORD_USER_150,
+  RTEMS_RECORD_USER_151,
+  RTEMS_RECORD_USER_152,
+  RTEMS_RECORD_USER_153,
+  RTEMS_RECORD_USER_154,
+  RTEMS_RECORD_USER_155,
+  RTEMS_RECORD_USER_156,
+  RTEMS_RECORD_USER_157,
+  RTEMS_RECORD_USER_158,
+  RTEMS_RECORD_USER_159,
+  RTEMS_RECORD_USER_160,
+  RTEMS_RECORD_USER_161,
+  RTEMS_RECORD_USER_162,
+  RTEMS_RECORD_USER_163,
+  RTEMS_RECORD_USER_164,
+  RTEMS_RECORD_USER_165,
+  RTEMS_RECORD_USER_166,
+  RTEMS_RECORD_USER_167,
+  RTEMS_RECORD_USER_168,
+  RTEMS_RECORD_USER_169,
+  RTEMS_RECORD_USER_170,
+  RTEMS_RECORD_USER_171,
+  RTEMS_RECORD_USER_172,
+  RTEMS_RECORD_USER_173,
+  RTEMS_RECORD_USER_174,
+  RTEMS_RECORD_USER_175,
+  RTEMS_RECORD_USER_176,
+  RTEMS_RECORD_USER_177,
+  RTEMS_RECORD_USER_178,
+  RTEMS_RECORD_USER_179,
+  RTEMS_RECORD_USER_180,
+  RTEMS_RECORD_USER_181,
+  RTEMS_RECORD_USER_182,
+  RTEMS_RECORD_USER_183,
+  RTEMS_RECORD_USER_184,
+  RTEMS_RECORD_USER_185,
+  RTEMS_RECORD_USER_186,
+  RTEMS_RECORD_USER_187,
+  RTEMS_RECORD_USER_188,
+  RTEMS_RECORD_USER_189,
+  RTEMS_RECORD_USER_190,
+  RTEMS_RECORD_USER_191,
+  RTEMS_RECORD_USER_192,
+  RTEMS_RECORD_USER_193,
+  RTEMS_RECORD_USER_194,
+  RTEMS_RECORD_USER_195,
+  RTEMS_RECORD_USER_196,
+  RTEMS_RECORD_USER_197,
+  RTEMS_RECORD_USER_198,
+  RTEMS_RECORD_USER_199,
+  RTEMS_RECORD_USER_200,
+  RTEMS_RECORD_USER_201,
+  RTEMS_RECORD_USER_202,
+  RTEMS_RECORD_USER_203,
+  RTEMS_RECORD_USER_204,
+  RTEMS_RECORD_USER_205,
+  RTEMS_RECORD_USER_206,
+  RTEMS_RECORD_USER_207,
+  RTEMS_RECORD_USER_208,
+  RTEMS_RECORD_USER_209,
+  RTEMS_RECORD_USER_210,
+  RTEMS_RECORD_USER_211,
+  RTEMS_RECORD_USER_212,
+  RTEMS_RECORD_USER_213,
+  RTEMS_RECORD_USER_214,
+  RTEMS_RECORD_USER_215,
+  RTEMS_RECORD_USER_216,
+  RTEMS_RECORD_USER_217,
+  RTEMS_RECORD_USER_218,
+  RTEMS_RECORD_USER_219,
+  RTEMS_RECORD_USER_220,
+  RTEMS_RECORD_USER_221,
+  RTEMS_RECORD_USER_222,
+  RTEMS_RECORD_USER_223,
+  RTEMS_RECORD_USER_224,
+  RTEMS_RECORD_USER_225,
+  RTEMS_RECORD_USER_226,
+  RTEMS_RECORD_USER_227,
+  RTEMS_RECORD_USER_228,
+  RTEMS_RECORD_USER_229,
+  RTEMS_RECORD_USER_230,
+  RTEMS_RECORD_USER_231,
+  RTEMS_RECORD_USER_232,
+  RTEMS_RECORD_USER_233,
+  RTEMS_RECORD_USER_234,
+  RTEMS_RECORD_USER_235,
+  RTEMS_RECORD_USER_236,
+  RTEMS_RECORD_USER_237,
+  RTEMS_RECORD_USER_238,
+  RTEMS_RECORD_USER_239,
+  RTEMS_RECORD_USER_240,
+  RTEMS_RECORD_USER_241,
+  RTEMS_RECORD_USER_242,
+  RTEMS_RECORD_USER_243,
+  RTEMS_RECORD_USER_244,
+  RTEMS_RECORD_USER_245,
+  RTEMS_RECORD_USER_246,
+  RTEMS_RECORD_USER_247,
+  RTEMS_RECORD_USER_248,
+  RTEMS_RECORD_USER_249,
+  RTEMS_RECORD_USER_250,
+  RTEMS_RECORD_USER_251,
+  RTEMS_RECORD_USER_252,
+  RTEMS_RECORD_USER_253,
+  RTEMS_RECORD_USER_254,
+  RTEMS_RECORD_USER_255,
+  RTEMS_RECORD_USER_256,
+  RTEMS_RECORD_USER_257,
+  RTEMS_RECORD_USER_258,
+  RTEMS_RECORD_USER_259,
+  RTEMS_RECORD_USER_260,
+  RTEMS_RECORD_USER_261,
+  RTEMS_RECORD_USER_262,
+  RTEMS_RECORD_USER_263,
+  RTEMS_RECORD_USER_264,
+  RTEMS_RECORD_USER_265,
+  RTEMS_RECORD_USER_266,
+  RTEMS_RECORD_USER_267,
+  RTEMS_RECORD_USER_268,
+  RTEMS_RECORD_USER_269,
+  RTEMS_RECORD_USER_270,
+  RTEMS_RECORD_USER_271,
+  RTEMS_RECORD_USER_272,
+  RTEMS_RECORD_USER_273,
+  RTEMS_RECORD_USER_274,
+  RTEMS_RECORD_USER_275,
+  RTEMS_RECORD_USER_276,
+  RTEMS_RECORD_USER_277,
+  RTEMS_RECORD_USER_278,
+  RTEMS_RECORD_USER_279,
+  RTEMS_RECORD_USER_280,
+  RTEMS_RECORD_USER_281,
+  RTEMS_RECORD_USER_282,
+  RTEMS_RECORD_USER_283,
+  RTEMS_RECORD_USER_284,
+  RTEMS_RECORD_USER_285,
+  RTEMS_RECORD_USER_286,
+  RTEMS_RECORD_USER_287,
+  RTEMS_RECORD_USER_288,
+  RTEMS_RECORD_USER_289,
+  RTEMS_RECORD_USER_290,
+  RTEMS_RECORD_USER_291,
+  RTEMS_RECORD_USER_292,
+  RTEMS_RECORD_USER_293,
+  RTEMS_RECORD_USER_294,
+  RTEMS_RECORD_USER_295,
+  RTEMS_RECORD_USER_296,
+  RTEMS_RECORD_USER_297,
+  RTEMS_RECORD_USER_298,
+  RTEMS_RECORD_USER_299,
+  RTEMS_RECORD_USER_300,
+  RTEMS_RECORD_USER_301,
+  RTEMS_RECORD_USER_302,
+  RTEMS_RECORD_USER_303,
+  RTEMS_RECORD_USER_304,
+  RTEMS_RECORD_USER_305,
+  RTEMS_RECORD_USER_306,
+  RTEMS_RECORD_USER_307,
+  RTEMS_RECORD_USER_308,
+  RTEMS_RECORD_USER_309,
+  RTEMS_RECORD_USER_310,
+  RTEMS_RECORD_USER_311,
+  RTEMS_RECORD_USER_312,
+  RTEMS_RECORD_USER_313,
+  RTEMS_RECORD_USER_314,
+  RTEMS_RECORD_USER_315,
+  RTEMS_RECORD_USER_316,
+  RTEMS_RECORD_USER_317,
+  RTEMS_RECORD_USER_318,
+  RTEMS_RECORD_USER_319,
+  RTEMS_RECORD_USER_320,
+  RTEMS_RECORD_USER_321,
+  RTEMS_RECORD_USER_322,
+  RTEMS_RECORD_USER_323,
+  RTEMS_RECORD_USER_324,
+  RTEMS_RECORD_USER_325,
+  RTEMS_RECORD_USER_326,
+  RTEMS_RECORD_USER_327,
+  RTEMS_RECORD_USER_328,
+  RTEMS_RECORD_USER_329,
+  RTEMS_RECORD_USER_330,
+  RTEMS_RECORD_USER_331,
+  RTEMS_RECORD_USER_332,
+  RTEMS_RECORD_USER_333,
+  RTEMS_RECORD_USER_334,
+  RTEMS_RECORD_USER_335,
+  RTEMS_RECORD_USER_336,
+  RTEMS_RECORD_USER_337,
+  RTEMS_RECORD_USER_338,
+  RTEMS_RECORD_USER_339,
+  RTEMS_RECORD_USER_340,
+  RTEMS_RECORD_USER_341,
+  RTEMS_RECORD_USER_342,
+  RTEMS_RECORD_USER_343,
+  RTEMS_RECORD_USER_344,
+  RTEMS_RECORD_USER_345,
+  RTEMS_RECORD_USER_346,
+  RTEMS_RECORD_USER_347,
+  RTEMS_RECORD_USER_348,
+  RTEMS_RECORD_USER_349,
+  RTEMS_RECORD_USER_350,
+  RTEMS_RECORD_USER_351,
+  RTEMS_RECORD_USER_352,
+  RTEMS_RECORD_USER_353,
+  RTEMS_RECORD_USER_354,
+  RTEMS_RECORD_USER_355,
+  RTEMS_RECORD_USER_356,
+  RTEMS_RECORD_USER_357,
+  RTEMS_RECORD_USER_358,
+  RTEMS_RECORD_USER_359,
+  RTEMS_RECORD_USER_360,
+  RTEMS_RECORD_USER_361,
+  RTEMS_RECORD_USER_362,
+  RTEMS_RECORD_USER_363,
+  RTEMS_RECORD_USER_364,
+  RTEMS_RECORD_USER_365,
+  RTEMS_RECORD_USER_366,
+  RTEMS_RECORD_USER_367,
+  RTEMS_RECORD_USER_368,
+  RTEMS_RECORD_USER_369,
+  RTEMS_RECORD_USER_370,
+  RTEMS_RECORD_USER_371,
+  RTEMS_RECORD_USER_372,
+  RTEMS_RECORD_USER_373,
+  RTEMS_RECORD_USER_374,
+  RTEMS_RECORD_USER_375,
+  RTEMS_RECORD_USER_376,
+  RTEMS_RECORD_USER_377,
+  RTEMS_RECORD_USER_378,
+  RTEMS_RECORD_USER_379,
+  RTEMS_RECORD_USER_380,
+  RTEMS_RECORD_USER_381,
+  RTEMS_RECORD_USER_382,
+  RTEMS_RECORD_USER_383,
+  RTEMS_RECORD_USER_384,
+  RTEMS_RECORD_USER_385,
+  RTEMS_RECORD_USER_386,
+  RTEMS_RECORD_USER_387,
+  RTEMS_RECORD_USER_388,
+  RTEMS_RECORD_USER_389,
+  RTEMS_RECORD_USER_390,
+  RTEMS_RECORD_USER_391,
+  RTEMS_RECORD_USER_392,
+  RTEMS_RECORD_USER_393,
+  RTEMS_RECORD_USER_394,
+  RTEMS_RECORD_USER_395,
+  RTEMS_RECORD_USER_396,
+  RTEMS_RECORD_USER_397,
+  RTEMS_RECORD_USER_398,
+  RTEMS_RECORD_USER_399,
+  RTEMS_RECORD_USER_400,
+  RTEMS_RECORD_USER_401,
+  RTEMS_RECORD_USER_402,
+  RTEMS_RECORD_USER_403,
+  RTEMS_RECORD_USER_404,
+  RTEMS_RECORD_USER_405,
+  RTEMS_RECORD_USER_406,
+  RTEMS_RECORD_USER_407,
+  RTEMS_RECORD_USER_408,
+  RTEMS_RECORD_USER_409,
+  RTEMS_RECORD_USER_410,
+  RTEMS_RECORD_USER_411,
+  RTEMS_RECORD_USER_412,
+  RTEMS_RECORD_USER_413,
+  RTEMS_RECORD_USER_414,
+  RTEMS_RECORD_USER_415,
+  RTEMS_RECORD_USER_416,
+  RTEMS_RECORD_USER_417,
+  RTEMS_RECORD_USER_418,
+  RTEMS_RECORD_USER_419,
+  RTEMS_RECORD_USER_420,
+  RTEMS_RECORD_USER_421,
+  RTEMS_RECORD_USER_422,
+  RTEMS_RECORD_USER_423,
+  RTEMS_RECORD_USER_424,
+  RTEMS_RECORD_USER_425,
+  RTEMS_RECORD_USER_426,
+  RTEMS_RECORD_USER_427,
+  RTEMS_RECORD_USER_428,
+  RTEMS_RECORD_USER_429,
+  RTEMS_RECORD_USER_430,
+  RTEMS_RECORD_USER_431,
+  RTEMS_RECORD_USER_432,
+  RTEMS_RECORD_USER_433,
+  RTEMS_RECORD_USER_434,
+  RTEMS_RECORD_USER_435,
+  RTEMS_RECORD_USER_436,
+  RTEMS_RECORD_USER_437,
+  RTEMS_RECORD_USER_438,
+  RTEMS_RECORD_USER_439,
+  RTEMS_RECORD_USER_440,
+  RTEMS_RECORD_USER_441,
+  RTEMS_RECORD_USER_442,
+  RTEMS_RECORD_USER_443,
+  RTEMS_RECORD_USER_444,
+  RTEMS_RECORD_USER_445,
+  RTEMS_RECORD_USER_446,
+  RTEMS_RECORD_USER_447,
+  RTEMS_RECORD_USER_448,
+  RTEMS_RECORD_USER_449,
+  RTEMS_RECORD_USER_450,
+  RTEMS_RECORD_USER_451,
+  RTEMS_RECORD_USER_452,
+  RTEMS_RECORD_USER_453,
+  RTEMS_RECORD_USER_454,
+  RTEMS_RECORD_USER_455,
+  RTEMS_RECORD_USER_456,
+  RTEMS_RECORD_USER_457,
+  RTEMS_RECORD_USER_458,
+  RTEMS_RECORD_USER_459,
+  RTEMS_RECORD_USER_460,
+  RTEMS_RECORD_USER_461,
+  RTEMS_RECORD_USER_462,
+  RTEMS_RECORD_USER_463,
+  RTEMS_RECORD_USER_464,
+  RTEMS_RECORD_USER_465,
+  RTEMS_RECORD_USER_466,
+  RTEMS_RECORD_USER_467,
+  RTEMS_RECORD_USER_468,
+  RTEMS_RECORD_USER_469,
+  RTEMS_RECORD_USER_470,
+  RTEMS_RECORD_USER_471,
+  RTEMS_RECORD_USER_472,
+  RTEMS_RECORD_USER_473,
+  RTEMS_RECORD_USER_474,
+  RTEMS_RECORD_USER_475,
+  RTEMS_RECORD_USER_476,
+  RTEMS_RECORD_USER_477,
+  RTEMS_RECORD_USER_478,
+  RTEMS_RECORD_USER_479,
+  RTEMS_RECORD_USER_480,
+  RTEMS_RECORD_USER_481,
+  RTEMS_RECORD_USER_482,
+  RTEMS_RECORD_USER_483,
+  RTEMS_RECORD_USER_484,
+  RTEMS_RECORD_USER_485,
+  RTEMS_RECORD_USER_486,
+  RTEMS_RECORD_USER_487,
+  RTEMS_RECORD_USER_488,
+  RTEMS_RECORD_USER_489,
+  RTEMS_RECORD_USER_490,
+  RTEMS_RECORD_USER_491,
+  RTEMS_RECORD_USER_492,
+  RTEMS_RECORD_USER_493,
+  RTEMS_RECORD_USER_494,
+  RTEMS_RECORD_USER_495,
+  RTEMS_RECORD_USER_496,
+  RTEMS_RECORD_USER_497,
+  RTEMS_RECORD_USER_498,
+  RTEMS_RECORD_USER_499,
+  RTEMS_RECORD_USER_500,
+  RTEMS_RECORD_USER_501,
+  RTEMS_RECORD_USER_502,
+  RTEMS_RECORD_USER_503,
+  RTEMS_RECORD_USER_504,
+  RTEMS_RECORD_USER_505,
+  RTEMS_RECORD_USER_506,
+  RTEMS_RECORD_USER_507,
+  RTEMS_RECORD_USER_508,
+  RTEMS_RECORD_USER_509,
+  RTEMS_RECORD_USER_510,
+  RTEMS_RECORD_USER_511
+} rtems_record_event;
+
+#define RTEMS_RECORD_LAST RTEMS_RECORD_USER_511
+
+#define RTEMS_RECORD_USER( index ) ( RTEMS_RECORD_USER_0 + ( index ) )
+
+/**
+ * @brief Bits in the record item event member reserved for the actual event.
+ */
+#define RTEMS_RECORD_EVENT_BITS 10
+
+/**
+ * @brief Bits in the record item event member reserved for the time of the
+ * event.
+ */
+#define RTEMS_RECORD_TIME_BITS 22
+
+/**
+ * @brief Builds a time event for the specified time stamp and event.
+ *
+ * The events are stored in the record item with a time stamp.  There are 22
+ * bits allocated to the time stamp and 10 bits allocated to the event.  The 22
+ * bits are enough to get reliable time stamps on a system with a 4GHz CPU
+ * counter and a 1000Hz clock tick.
+ */
+#define RTEMS_RECORD_TIME_EVENT( time, event ) \
+  ( ( ( time ) << RTEMS_RECORD_EVENT_BITS ) | ( event ) )
+
+/**
+ * @brief Gets the time of a time event.
+ */
+#define RTEMS_RECORD_GET_TIME( time_event ) \
+  ( ( time_event ) >> RTEMS_RECORD_EVENT_BITS )
+
+/**
+ * @brief Gets the event of a time event.
+ */
+#define RTEMS_RECORD_GET_EVENT( time_event ) \
+  ( ( time_event ) & ( ( 1U << RTEMS_RECORD_EVENT_BITS ) - 1U ) )
+
+/**
+ * @brief The record data integer type.
+ *
+ * It is big enough to store 32-bit integers and pointers.
+ */
+typedef unsigned long rtems_record_data;
+
+/**
+ * @brief The native record item.
+ */
+typedef struct __attribute__((__packed__)) {
+  uint32_t          event;
+  rtems_record_data data;
+} rtems_record_item;
+
+/**
+ * @brief The 32-bit format record item.
+ */
+typedef struct {
+  uint32_t event;
+  uint32_t data;
+} rtems_record_item_32;
+
+/**
+ * @brief The 64-bit format record item.
+ */
+typedef struct __attribute__((__packed__)) {
+  uint32_t event;
+  uint64_t data;
+} rtems_record_item_64;
+
+const char *rtems_record_event_text( rtems_record_event event );
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* _RTEMS_RECORDDATA_H */
diff --git a/trace/record/tree.h b/trace/record/tree.h
new file mode 100644
index 0000000..f4167c4
--- /dev/null
+++ b/trace/record/tree.h
@@ -0,0 +1,801 @@
+/*	$NetBSD: tree.h,v 1.8 2004/03/28 19:38:30 provos Exp $	*/
+/*	$OpenBSD: tree.h,v 1.7 2002/10/17 21:51:54 art Exp $	*/
+/* $FreeBSD$ */
+
+/*-
+ * Copyright 2002 Niels Provos <provos at citi.umich.edu>
+ * All rights reserved.
+ *
+ * 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 AUTHOR ``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 AUTHOR 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	_SYS_TREE_H_
+#define	_SYS_TREE_H_
+
+#include <sys/cdefs.h>
+
+/*
+ * This file defines data structures for different types of trees:
+ * splay trees and red-black trees.
+ *
+ * A splay tree is a self-organizing data structure.  Every operation
+ * on the tree causes a splay to happen.  The splay moves the requested
+ * node to the root of the tree and partly rebalances it.
+ *
+ * This has the benefit that request locality causes faster lookups as
+ * the requested nodes move to the top of the tree.  On the other hand,
+ * every lookup causes memory writes.
+ *
+ * The Balance Theorem bounds the total access time for m operations
+ * and n inserts on an initially empty tree as O((m + n)lg n).  The
+ * amortized cost for a sequence of m accesses to a splay tree is O(lg n);
+ *
+ * A red-black tree is a binary search tree with the node color as an
+ * extra attribute.  It fulfills a set of conditions:
+ *	- every search path from the root to a leaf consists of the
+ *	  same number of black nodes,
+ *	- each red node (except for the root) has a black parent,
+ *	- each leaf node is black.
+ *
+ * Every operation on a red-black tree is bounded as O(lg n).
+ * The maximum height of a red-black tree is 2lg (n+1).
+ */
+
+#define SPLAY_HEAD(name, type)						\
+struct name {								\
+	struct type *sph_root; /* root of the tree */			\
+}
+
+#define SPLAY_INITIALIZER(root)						\
+	{ NULL }
+
+#define SPLAY_INIT(root) do {						\
+	(root)->sph_root = NULL;					\
+} while (/*CONSTCOND*/ 0)
+
+#define SPLAY_ENTRY(type)						\
+struct {								\
+	struct type *spe_left; /* left element */			\
+	struct type *spe_right; /* right element */			\
+}
+
+#define SPLAY_LEFT(elm, field)		(elm)->field.spe_left
+#define SPLAY_RIGHT(elm, field)		(elm)->field.spe_right
+#define SPLAY_ROOT(head)		(head)->sph_root
+#define SPLAY_EMPTY(head)		(SPLAY_ROOT(head) == NULL)
+
+/* SPLAY_ROTATE_{LEFT,RIGHT} expect that tmp hold SPLAY_{RIGHT,LEFT} */
+#define SPLAY_ROTATE_RIGHT(head, tmp, field) do {			\
+	SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(tmp, field);	\
+	SPLAY_RIGHT(tmp, field) = (head)->sph_root;			\
+	(head)->sph_root = tmp;						\
+} while (/*CONSTCOND*/ 0)
+
+#define SPLAY_ROTATE_LEFT(head, tmp, field) do {			\
+	SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(tmp, field);	\
+	SPLAY_LEFT(tmp, field) = (head)->sph_root;			\
+	(head)->sph_root = tmp;						\
+} while (/*CONSTCOND*/ 0)
+
+#define SPLAY_LINKLEFT(head, tmp, field) do {				\
+	SPLAY_LEFT(tmp, field) = (head)->sph_root;			\
+	tmp = (head)->sph_root;						\
+	(head)->sph_root = SPLAY_LEFT((head)->sph_root, field);		\
+} while (/*CONSTCOND*/ 0)
+
+#define SPLAY_LINKRIGHT(head, tmp, field) do {				\
+	SPLAY_RIGHT(tmp, field) = (head)->sph_root;			\
+	tmp = (head)->sph_root;						\
+	(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);	\
+} while (/*CONSTCOND*/ 0)
+
+#define SPLAY_ASSEMBLE(head, node, left, right, field) do {		\
+	SPLAY_RIGHT(left, field) = SPLAY_LEFT((head)->sph_root, field);	\
+	SPLAY_LEFT(right, field) = SPLAY_RIGHT((head)->sph_root, field);\
+	SPLAY_LEFT((head)->sph_root, field) = SPLAY_RIGHT(node, field);	\
+	SPLAY_RIGHT((head)->sph_root, field) = SPLAY_LEFT(node, field);	\
+} while (/*CONSTCOND*/ 0)
+
+/* Generates prototypes and inline functions */
+
+#define SPLAY_PROTOTYPE(name, type, field, cmp)				\
+void name##_SPLAY(struct name *, struct type *);			\
+void name##_SPLAY_MINMAX(struct name *, int);				\
+struct type *name##_SPLAY_INSERT(struct name *, struct type *);		\
+struct type *name##_SPLAY_REMOVE(struct name *, struct type *);		\
+									\
+/* Finds the node with the same key as elm */				\
+static __inline struct type *						\
+name##_SPLAY_FIND(struct name *head, struct type *elm)			\
+{									\
+	if (SPLAY_EMPTY(head))						\
+		return(NULL);						\
+	name##_SPLAY(head, elm);					\
+	if ((cmp)(elm, (head)->sph_root) == 0)				\
+		return (head->sph_root);				\
+	return (NULL);							\
+}									\
+									\
+static __inline struct type *						\
+name##_SPLAY_NEXT(struct name *head, struct type *elm)			\
+{									\
+	name##_SPLAY(head, elm);					\
+	if (SPLAY_RIGHT(elm, field) != NULL) {				\
+		elm = SPLAY_RIGHT(elm, field);				\
+		while (SPLAY_LEFT(elm, field) != NULL) {		\
+			elm = SPLAY_LEFT(elm, field);			\
+		}							\
+	} else								\
+		elm = NULL;						\
+	return (elm);							\
+}									\
+									\
+static __inline struct type *						\
+name##_SPLAY_MIN_MAX(struct name *head, int val)			\
+{									\
+	name##_SPLAY_MINMAX(head, val);					\
+        return (SPLAY_ROOT(head));					\
+}
+
+/* Main splay operation.
+ * Moves node close to the key of elm to top
+ */
+#define SPLAY_GENERATE(name, type, field, cmp)				\
+struct type *								\
+name##_SPLAY_INSERT(struct name *head, struct type *elm)		\
+{									\
+    if (SPLAY_EMPTY(head)) {						\
+	    SPLAY_LEFT(elm, field) = SPLAY_RIGHT(elm, field) = NULL;	\
+    } else {								\
+	    int __comp;							\
+	    name##_SPLAY(head, elm);					\
+	    __comp = (cmp)(elm, (head)->sph_root);			\
+	    if(__comp < 0) {						\
+		    SPLAY_LEFT(elm, field) = SPLAY_LEFT((head)->sph_root, field);\
+		    SPLAY_RIGHT(elm, field) = (head)->sph_root;		\
+		    SPLAY_LEFT((head)->sph_root, field) = NULL;		\
+	    } else if (__comp > 0) {					\
+		    SPLAY_RIGHT(elm, field) = SPLAY_RIGHT((head)->sph_root, field);\
+		    SPLAY_LEFT(elm, field) = (head)->sph_root;		\
+		    SPLAY_RIGHT((head)->sph_root, field) = NULL;	\
+	    } else							\
+		    return ((head)->sph_root);				\
+    }									\
+    (head)->sph_root = (elm);						\
+    return (NULL);							\
+}									\
+									\
+struct type *								\
+name##_SPLAY_REMOVE(struct name *head, struct type *elm)		\
+{									\
+	struct type *__tmp;						\
+	if (SPLAY_EMPTY(head))						\
+		return (NULL);						\
+	name##_SPLAY(head, elm);					\
+	if ((cmp)(elm, (head)->sph_root) == 0) {			\
+		if (SPLAY_LEFT((head)->sph_root, field) == NULL) {	\
+			(head)->sph_root = SPLAY_RIGHT((head)->sph_root, field);\
+		} else {						\
+			__tmp = SPLAY_RIGHT((head)->sph_root, field);	\
+			(head)->sph_root = SPLAY_LEFT((head)->sph_root, field);\
+			name##_SPLAY(head, elm);			\
+			SPLAY_RIGHT((head)->sph_root, field) = __tmp;	\
+		}							\
+		return (elm);						\
+	}								\
+	return (NULL);							\
+}									\
+									\
+void									\
+name##_SPLAY(struct name *head, struct type *elm)			\
+{									\
+	struct type __node, *__left, *__right, *__tmp;			\
+	int __comp;							\
+\
+	SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
+	__left = __right = &__node;					\
+\
+	while ((__comp = (cmp)(elm, (head)->sph_root)) != 0) {		\
+		if (__comp < 0) {					\
+			__tmp = SPLAY_LEFT((head)->sph_root, field);	\
+			if (__tmp == NULL)				\
+				break;					\
+			if ((cmp)(elm, __tmp) < 0){			\
+				SPLAY_ROTATE_RIGHT(head, __tmp, field);	\
+				if (SPLAY_LEFT((head)->sph_root, field) == NULL)\
+					break;				\
+			}						\
+			SPLAY_LINKLEFT(head, __right, field);		\
+		} else if (__comp > 0) {				\
+			__tmp = SPLAY_RIGHT((head)->sph_root, field);	\
+			if (__tmp == NULL)				\
+				break;					\
+			if ((cmp)(elm, __tmp) > 0){			\
+				SPLAY_ROTATE_LEFT(head, __tmp, field);	\
+				if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\
+					break;				\
+			}						\
+			SPLAY_LINKRIGHT(head, __left, field);		\
+		}							\
+	}								\
+	SPLAY_ASSEMBLE(head, &__node, __left, __right, field);		\
+}									\
+									\
+/* Splay with either the minimum or the maximum element			\
+ * Used to find minimum or maximum element in tree.			\
+ */									\
+void name##_SPLAY_MINMAX(struct name *head, int __comp) \
+{									\
+	struct type __node, *__left, *__right, *__tmp;			\
+\
+	SPLAY_LEFT(&__node, field) = SPLAY_RIGHT(&__node, field) = NULL;\
+	__left = __right = &__node;					\
+\
+	while (1) {							\
+		if (__comp < 0) {					\
+			__tmp = SPLAY_LEFT((head)->sph_root, field);	\
+			if (__tmp == NULL)				\
+				break;					\
+			if (__comp < 0){				\
+				SPLAY_ROTATE_RIGHT(head, __tmp, field);	\
+				if (SPLAY_LEFT((head)->sph_root, field) == NULL)\
+					break;				\
+			}						\
+			SPLAY_LINKLEFT(head, __right, field);		\
+		} else if (__comp > 0) {				\
+			__tmp = SPLAY_RIGHT((head)->sph_root, field);	\
+			if (__tmp == NULL)				\
+				break;					\
+			if (__comp > 0) {				\
+				SPLAY_ROTATE_LEFT(head, __tmp, field);	\
+				if (SPLAY_RIGHT((head)->sph_root, field) == NULL)\
+					break;				\
+			}						\
+			SPLAY_LINKRIGHT(head, __left, field);		\
+		}							\
+	}								\
+	SPLAY_ASSEMBLE(head, &__node, __left, __right, field);		\
+}
+
+#define SPLAY_NEGINF	-1
+#define SPLAY_INF	1
+
+#define SPLAY_INSERT(name, x, y)	name##_SPLAY_INSERT(x, y)
+#define SPLAY_REMOVE(name, x, y)	name##_SPLAY_REMOVE(x, y)
+#define SPLAY_FIND(name, x, y)		name##_SPLAY_FIND(x, y)
+#define SPLAY_NEXT(name, x, y)		name##_SPLAY_NEXT(x, y)
+#define SPLAY_MIN(name, x)		(SPLAY_EMPTY(x) ? NULL	\
+					: name##_SPLAY_MIN_MAX(x, SPLAY_NEGINF))
+#define SPLAY_MAX(name, x)		(SPLAY_EMPTY(x) ? NULL	\
+					: name##_SPLAY_MIN_MAX(x, SPLAY_INF))
+
+#define SPLAY_FOREACH(x, name, head)					\
+	for ((x) = SPLAY_MIN(name, head);				\
+	     (x) != NULL;						\
+	     (x) = SPLAY_NEXT(name, head, x))
+
+/* Macros that define a red-black tree */
+#define RB_HEAD(name, type)						\
+struct name {								\
+	struct type *rbh_root; /* root of the tree */			\
+}
+
+#define RB_INITIALIZER(root)						\
+	{ NULL }
+
+#define RB_INIT(root) do {						\
+	(root)->rbh_root = NULL;					\
+} while (/*CONSTCOND*/ 0)
+
+#define RB_BLACK	0
+#define RB_RED		1
+#define RB_ENTRY(type)							\
+struct {								\
+	struct type *rbe_left;		/* left element */		\
+	struct type *rbe_right;		/* right element */		\
+	struct type *rbe_parent;	/* parent element */		\
+	int rbe_color;			/* node color */		\
+}
+
+#define RB_LEFT(elm, field)		(elm)->field.rbe_left
+#define RB_RIGHT(elm, field)		(elm)->field.rbe_right
+#define RB_PARENT(elm, field)		(elm)->field.rbe_parent
+#define RB_COLOR(elm, field)		(elm)->field.rbe_color
+#define RB_ROOT(head)			(head)->rbh_root
+#define RB_EMPTY(head)			(RB_ROOT(head) == NULL)
+
+#define RB_SET(elm, parent, field) do {					\
+	RB_PARENT(elm, field) = parent;					\
+	RB_LEFT(elm, field) = RB_RIGHT(elm, field) = NULL;		\
+	RB_COLOR(elm, field) = RB_RED;					\
+} while (/*CONSTCOND*/ 0)
+
+#define RB_SET_BLACKRED(black, red, field) do {				\
+	RB_COLOR(black, field) = RB_BLACK;				\
+	RB_COLOR(red, field) = RB_RED;					\
+} while (/*CONSTCOND*/ 0)
+
+#ifndef RB_AUGMENT
+#define RB_AUGMENT(x)	do {} while (0)
+#endif
+
+#define RB_ROTATE_LEFT(head, elm, tmp, field) do {			\
+	(tmp) = RB_RIGHT(elm, field);					\
+	if ((RB_RIGHT(elm, field) = RB_LEFT(tmp, field)) != NULL) {	\
+		RB_PARENT(RB_LEFT(tmp, field), field) = (elm);		\
+	}								\
+	RB_AUGMENT(elm);						\
+	if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) {	\
+		if ((elm) == RB_LEFT(RB_PARENT(elm, field), field))	\
+			RB_LEFT(RB_PARENT(elm, field), field) = (tmp);	\
+		else							\
+			RB_RIGHT(RB_PARENT(elm, field), field) = (tmp);	\
+	} else								\
+		(head)->rbh_root = (tmp);				\
+	RB_LEFT(tmp, field) = (elm);					\
+	RB_PARENT(elm, field) = (tmp);					\
+	RB_AUGMENT(tmp);						\
+	if ((RB_PARENT(tmp, field)))					\
+		RB_AUGMENT(RB_PARENT(tmp, field));			\
+} while (/*CONSTCOND*/ 0)
+
+#define RB_ROTATE_RIGHT(head, elm, tmp, field) do {			\
+	(tmp) = RB_LEFT(elm, field);					\
+	if ((RB_LEFT(elm, field) = RB_RIGHT(tmp, field)) != NULL) {	\
+		RB_PARENT(RB_RIGHT(tmp, field), field) = (elm);		\
+	}								\
+	RB_AUGMENT(elm);						\
+	if ((RB_PARENT(tmp, field) = RB_PARENT(elm, field)) != NULL) {	\
+		if ((elm) == RB_LEFT(RB_PARENT(elm, field), field))	\
+			RB_LEFT(RB_PARENT(elm, field), field) = (tmp);	\
+		else							\
+			RB_RIGHT(RB_PARENT(elm, field), field) = (tmp);	\
+	} else								\
+		(head)->rbh_root = (tmp);				\
+	RB_RIGHT(tmp, field) = (elm);					\
+	RB_PARENT(elm, field) = (tmp);					\
+	RB_AUGMENT(tmp);						\
+	if ((RB_PARENT(tmp, field)))					\
+		RB_AUGMENT(RB_PARENT(tmp, field));			\
+} while (/*CONSTCOND*/ 0)
+
+/* Generates prototypes and inline functions */
+#define	RB_PROTOTYPE(name, type, field, cmp)				\
+	RB_PROTOTYPE_INTERNAL(name, type, field, cmp,)
+#define	RB_PROTOTYPE_STATIC(name, type, field, cmp)			\
+	RB_PROTOTYPE_INTERNAL(name, type, field, cmp, __unused static)
+#define RB_PROTOTYPE_INTERNAL(name, type, field, cmp, attr)		\
+	RB_PROTOTYPE_INSERT_COLOR(name, type, attr);			\
+	RB_PROTOTYPE_REMOVE_COLOR(name, type, attr);			\
+	RB_PROTOTYPE_INSERT(name, type, attr);				\
+	RB_PROTOTYPE_REMOVE(name, type, attr);				\
+	RB_PROTOTYPE_FIND(name, type, attr);				\
+	RB_PROTOTYPE_NFIND(name, type, attr);				\
+	RB_PROTOTYPE_NEXT(name, type, attr);				\
+	RB_PROTOTYPE_PREV(name, type, attr);				\
+	RB_PROTOTYPE_MINMAX(name, type, attr);
+#define RB_PROTOTYPE_INSERT_COLOR(name, type, attr)			\
+	attr void name##_RB_INSERT_COLOR(struct name *, struct type *)
+#define RB_PROTOTYPE_REMOVE_COLOR(name, type, attr)			\
+	attr void name##_RB_REMOVE_COLOR(struct name *, struct type *, struct type *)
+#define RB_PROTOTYPE_REMOVE(name, type, attr)				\
+	attr struct type *name##_RB_REMOVE(struct name *, struct type *)
+#define RB_PROTOTYPE_INSERT(name, type, attr)				\
+	attr struct type *name##_RB_INSERT(struct name *, struct type *)
+#define RB_PROTOTYPE_FIND(name, type, attr)				\
+	attr struct type *name##_RB_FIND(struct name *, struct type *)
+#define RB_PROTOTYPE_NFIND(name, type, attr)				\
+	attr struct type *name##_RB_NFIND(struct name *, struct type *)
+#define RB_PROTOTYPE_NEXT(name, type, attr)				\
+	attr struct type *name##_RB_NEXT(struct type *)
+#define RB_PROTOTYPE_PREV(name, type, attr)				\
+	attr struct type *name##_RB_PREV(struct type *)
+#define RB_PROTOTYPE_MINMAX(name, type, attr)				\
+	attr struct type *name##_RB_MINMAX(struct name *, int)
+
+/* Main rb operation.
+ * Moves node close to the key of elm to top
+ */
+#define	RB_GENERATE(name, type, field, cmp)				\
+	RB_GENERATE_INTERNAL(name, type, field, cmp,)
+#define	RB_GENERATE_STATIC(name, type, field, cmp)			\
+	RB_GENERATE_INTERNAL(name, type, field, cmp, __unused static)
+#define RB_GENERATE_INTERNAL(name, type, field, cmp, attr)		\
+	RB_GENERATE_INSERT_COLOR(name, type, field, attr)		\
+	RB_GENERATE_REMOVE_COLOR(name, type, field, attr)		\
+	RB_GENERATE_INSERT(name, type, field, cmp, attr)		\
+	RB_GENERATE_REMOVE(name, type, field, attr)			\
+	RB_GENERATE_FIND(name, type, field, cmp, attr)			\
+	RB_GENERATE_NFIND(name, type, field, cmp, attr)			\
+	RB_GENERATE_NEXT(name, type, field, attr)			\
+	RB_GENERATE_PREV(name, type, field, attr)			\
+	RB_GENERATE_MINMAX(name, type, field, attr)
+
+#define RB_GENERATE_INSERT_COLOR(name, type, field, attr)		\
+attr void								\
+name##_RB_INSERT_COLOR(struct name *head, struct type *elm)		\
+{									\
+	struct type *parent, *gparent, *tmp;				\
+	while ((parent = RB_PARENT(elm, field)) != NULL &&		\
+	    RB_COLOR(parent, field) == RB_RED) {			\
+		gparent = RB_PARENT(parent, field);			\
+		if (parent == RB_LEFT(gparent, field)) {		\
+			tmp = RB_RIGHT(gparent, field);			\
+			if (tmp && RB_COLOR(tmp, field) == RB_RED) {	\
+				RB_COLOR(tmp, field) = RB_BLACK;	\
+				RB_SET_BLACKRED(parent, gparent, field);\
+				elm = gparent;				\
+				continue;				\
+			}						\
+			if (RB_RIGHT(parent, field) == elm) {		\
+				RB_ROTATE_LEFT(head, parent, tmp, field);\
+				tmp = parent;				\
+				parent = elm;				\
+				elm = tmp;				\
+			}						\
+			RB_SET_BLACKRED(parent, gparent, field);	\
+			RB_ROTATE_RIGHT(head, gparent, tmp, field);	\
+		} else {						\
+			tmp = RB_LEFT(gparent, field);			\
+			if (tmp && RB_COLOR(tmp, field) == RB_RED) {	\
+				RB_COLOR(tmp, field) = RB_BLACK;	\
+				RB_SET_BLACKRED(parent, gparent, field);\
+				elm = gparent;				\
+				continue;				\
+			}						\
+			if (RB_LEFT(parent, field) == elm) {		\
+				RB_ROTATE_RIGHT(head, parent, tmp, field);\
+				tmp = parent;				\
+				parent = elm;				\
+				elm = tmp;				\
+			}						\
+			RB_SET_BLACKRED(parent, gparent, field);	\
+			RB_ROTATE_LEFT(head, gparent, tmp, field);	\
+		}							\
+	}								\
+	RB_COLOR(head->rbh_root, field) = RB_BLACK;			\
+}
+
+#define RB_GENERATE_REMOVE_COLOR(name, type, field, attr)		\
+attr void								\
+name##_RB_REMOVE_COLOR(struct name *head, struct type *parent, struct type *elm) \
+{									\
+	struct type *tmp;						\
+	while ((elm == NULL || RB_COLOR(elm, field) == RB_BLACK) &&	\
+	    elm != RB_ROOT(head)) {					\
+		if (RB_LEFT(parent, field) == elm) {			\
+			tmp = RB_RIGHT(parent, field);			\
+			if (RB_COLOR(tmp, field) == RB_RED) {		\
+				RB_SET_BLACKRED(tmp, parent, field);	\
+				RB_ROTATE_LEFT(head, parent, tmp, field);\
+				tmp = RB_RIGHT(parent, field);		\
+			}						\
+			if ((RB_LEFT(tmp, field) == NULL ||		\
+			    RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
+			    (RB_RIGHT(tmp, field) == NULL ||		\
+			    RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
+				RB_COLOR(tmp, field) = RB_RED;		\
+				elm = parent;				\
+				parent = RB_PARENT(elm, field);		\
+			} else {					\
+				if (RB_RIGHT(tmp, field) == NULL ||	\
+				    RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK) {\
+					struct type *oleft;		\
+					if ((oleft = RB_LEFT(tmp, field)) \
+					    != NULL)			\
+						RB_COLOR(oleft, field) = RB_BLACK;\
+					RB_COLOR(tmp, field) = RB_RED;	\
+					RB_ROTATE_RIGHT(head, tmp, oleft, field);\
+					tmp = RB_RIGHT(parent, field);	\
+				}					\
+				RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
+				RB_COLOR(parent, field) = RB_BLACK;	\
+				if (RB_RIGHT(tmp, field))		\
+					RB_COLOR(RB_RIGHT(tmp, field), field) = RB_BLACK;\
+				RB_ROTATE_LEFT(head, parent, tmp, field);\
+				elm = RB_ROOT(head);			\
+				break;					\
+			}						\
+		} else {						\
+			tmp = RB_LEFT(parent, field);			\
+			if (RB_COLOR(tmp, field) == RB_RED) {		\
+				RB_SET_BLACKRED(tmp, parent, field);	\
+				RB_ROTATE_RIGHT(head, parent, tmp, field);\
+				tmp = RB_LEFT(parent, field);		\
+			}						\
+			if ((RB_LEFT(tmp, field) == NULL ||		\
+			    RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) &&\
+			    (RB_RIGHT(tmp, field) == NULL ||		\
+			    RB_COLOR(RB_RIGHT(tmp, field), field) == RB_BLACK)) {\
+				RB_COLOR(tmp, field) = RB_RED;		\
+				elm = parent;				\
+				parent = RB_PARENT(elm, field);		\
+			} else {					\
+				if (RB_LEFT(tmp, field) == NULL ||	\
+				    RB_COLOR(RB_LEFT(tmp, field), field) == RB_BLACK) {\
+					struct type *oright;		\
+					if ((oright = RB_RIGHT(tmp, field)) \
+					    != NULL)			\
+						RB_COLOR(oright, field) = RB_BLACK;\
+					RB_COLOR(tmp, field) = RB_RED;	\
+					RB_ROTATE_LEFT(head, tmp, oright, field);\
+					tmp = RB_LEFT(parent, field);	\
+				}					\
+				RB_COLOR(tmp, field) = RB_COLOR(parent, field);\
+				RB_COLOR(parent, field) = RB_BLACK;	\
+				if (RB_LEFT(tmp, field))		\
+					RB_COLOR(RB_LEFT(tmp, field), field) = RB_BLACK;\
+				RB_ROTATE_RIGHT(head, parent, tmp, field);\
+				elm = RB_ROOT(head);			\
+				break;					\
+			}						\
+		}							\
+	}								\
+	if (elm)							\
+		RB_COLOR(elm, field) = RB_BLACK;			\
+}
+
+#define RB_GENERATE_REMOVE(name, type, field, attr)			\
+attr struct type *							\
+name##_RB_REMOVE(struct name *head, struct type *elm)			\
+{									\
+	struct type *child, *parent, *old = elm;			\
+	int color;							\
+	if (RB_LEFT(elm, field) == NULL)				\
+		child = RB_RIGHT(elm, field);				\
+	else if (RB_RIGHT(elm, field) == NULL)				\
+		child = RB_LEFT(elm, field);				\
+	else {								\
+		struct type *left;					\
+		elm = RB_RIGHT(elm, field);				\
+		while ((left = RB_LEFT(elm, field)) != NULL)		\
+			elm = left;					\
+		child = RB_RIGHT(elm, field);				\
+		parent = RB_PARENT(elm, field);				\
+		color = RB_COLOR(elm, field);				\
+		if (child)						\
+			RB_PARENT(child, field) = parent;		\
+		if (parent) {						\
+			if (RB_LEFT(parent, field) == elm)		\
+				RB_LEFT(parent, field) = child;		\
+			else						\
+				RB_RIGHT(parent, field) = child;	\
+			RB_AUGMENT(parent);				\
+		} else							\
+			RB_ROOT(head) = child;				\
+		if (RB_PARENT(elm, field) == old)			\
+			parent = elm;					\
+		(elm)->field = (old)->field;				\
+		if (RB_PARENT(old, field)) {				\
+			if (RB_LEFT(RB_PARENT(old, field), field) == old)\
+				RB_LEFT(RB_PARENT(old, field), field) = elm;\
+			else						\
+				RB_RIGHT(RB_PARENT(old, field), field) = elm;\
+			RB_AUGMENT(RB_PARENT(old, field));		\
+		} else							\
+			RB_ROOT(head) = elm;				\
+		RB_PARENT(RB_LEFT(old, field), field) = elm;		\
+		if (RB_RIGHT(old, field))				\
+			RB_PARENT(RB_RIGHT(old, field), field) = elm;	\
+		if (parent) {						\
+			left = parent;					\
+			do {						\
+				RB_AUGMENT(left);			\
+			} while ((left = RB_PARENT(left, field)) != NULL); \
+		}							\
+		goto color;						\
+	}								\
+	parent = RB_PARENT(elm, field);					\
+	color = RB_COLOR(elm, field);					\
+	if (child)							\
+		RB_PARENT(child, field) = parent;			\
+	if (parent) {							\
+		if (RB_LEFT(parent, field) == elm)			\
+			RB_LEFT(parent, field) = child;			\
+		else							\
+			RB_RIGHT(parent, field) = child;		\
+		RB_AUGMENT(parent);					\
+	} else								\
+		RB_ROOT(head) = child;					\
+color:									\
+	if (color == RB_BLACK)						\
+		name##_RB_REMOVE_COLOR(head, parent, child);		\
+	return (old);							\
+}									\
+
+#define RB_GENERATE_INSERT(name, type, field, cmp, attr)		\
+/* Inserts a node into the RB tree */					\
+attr struct type *							\
+name##_RB_INSERT(struct name *head, struct type *elm)			\
+{									\
+	struct type *tmp;						\
+	struct type *parent = NULL;					\
+	int comp = 0;							\
+	tmp = RB_ROOT(head);						\
+	while (tmp) {							\
+		parent = tmp;						\
+		comp = (cmp)(elm, parent);				\
+		if (comp < 0)						\
+			tmp = RB_LEFT(tmp, field);			\
+		else if (comp > 0)					\
+			tmp = RB_RIGHT(tmp, field);			\
+		else							\
+			return (tmp);					\
+	}								\
+	RB_SET(elm, parent, field);					\
+	if (parent != NULL) {						\
+		if (comp < 0)						\
+			RB_LEFT(parent, field) = elm;			\
+		else							\
+			RB_RIGHT(parent, field) = elm;			\
+		RB_AUGMENT(parent);					\
+	} else								\
+		RB_ROOT(head) = elm;					\
+	name##_RB_INSERT_COLOR(head, elm);				\
+	return (NULL);							\
+}
+
+#define RB_GENERATE_FIND(name, type, field, cmp, attr)			\
+/* Finds the node with the same key as elm */				\
+attr struct type *							\
+name##_RB_FIND(struct name *head, struct type *elm)			\
+{									\
+	struct type *tmp = RB_ROOT(head);				\
+	int comp;							\
+	while (tmp) {							\
+		comp = cmp(elm, tmp);					\
+		if (comp < 0)						\
+			tmp = RB_LEFT(tmp, field);			\
+		else if (comp > 0)					\
+			tmp = RB_RIGHT(tmp, field);			\
+		else							\
+			return (tmp);					\
+	}								\
+	return (NULL);							\
+}
+
+#define RB_GENERATE_NFIND(name, type, field, cmp, attr)			\
+/* Finds the first node greater than or equal to the search key */	\
+attr struct type *							\
+name##_RB_NFIND(struct name *head, struct type *elm)			\
+{									\
+	struct type *tmp = RB_ROOT(head);				\
+	struct type *res = NULL;					\
+	int comp;							\
+	while (tmp) {							\
+		comp = cmp(elm, tmp);					\
+		if (comp < 0) {						\
+			res = tmp;					\
+			tmp = RB_LEFT(tmp, field);			\
+		}							\
+		else if (comp > 0)					\
+			tmp = RB_RIGHT(tmp, field);			\
+		else							\
+			return (tmp);					\
+	}								\
+	return (res);							\
+}
+
+#define RB_GENERATE_NEXT(name, type, field, attr)			\
+/* ARGSUSED */								\
+attr struct type *							\
+name##_RB_NEXT(struct type *elm)					\
+{									\
+	if (RB_RIGHT(elm, field)) {					\
+		elm = RB_RIGHT(elm, field);				\
+		while (RB_LEFT(elm, field))				\
+			elm = RB_LEFT(elm, field);			\
+	} else {							\
+		if (RB_PARENT(elm, field) &&				\
+		    (elm == RB_LEFT(RB_PARENT(elm, field), field)))	\
+			elm = RB_PARENT(elm, field);			\
+		else {							\
+			while (RB_PARENT(elm, field) &&			\
+			    (elm == RB_RIGHT(RB_PARENT(elm, field), field)))\
+				elm = RB_PARENT(elm, field);		\
+			elm = RB_PARENT(elm, field);			\
+		}							\
+	}								\
+	return (elm);							\
+}
+
+#define RB_GENERATE_PREV(name, type, field, attr)			\
+/* ARGSUSED */								\
+attr struct type *							\
+name##_RB_PREV(struct type *elm)					\
+{									\
+	if (RB_LEFT(elm, field)) {					\
+		elm = RB_LEFT(elm, field);				\
+		while (RB_RIGHT(elm, field))				\
+			elm = RB_RIGHT(elm, field);			\
+	} else {							\
+		if (RB_PARENT(elm, field) &&				\
+		    (elm == RB_RIGHT(RB_PARENT(elm, field), field)))	\
+			elm = RB_PARENT(elm, field);			\
+		else {							\
+			while (RB_PARENT(elm, field) &&			\
+			    (elm == RB_LEFT(RB_PARENT(elm, field), field)))\
+				elm = RB_PARENT(elm, field);		\
+			elm = RB_PARENT(elm, field);			\
+		}							\
+	}								\
+	return (elm);							\
+}
+
+#define RB_GENERATE_MINMAX(name, type, field, attr)			\
+attr struct type *							\
+name##_RB_MINMAX(struct name *head, int val)				\
+{									\
+	struct type *tmp = RB_ROOT(head);				\
+	struct type *parent = NULL;					\
+	while (tmp) {							\
+		parent = tmp;						\
+		if (val < 0)						\
+			tmp = RB_LEFT(tmp, field);			\
+		else							\
+			tmp = RB_RIGHT(tmp, field);			\
+	}								\
+	return (parent);						\
+}
+
+#define RB_NEGINF	-1
+#define RB_INF	1
+
+#define RB_INSERT(name, x, y)	name##_RB_INSERT(x, y)
+#define RB_REMOVE(name, x, y)	name##_RB_REMOVE(x, y)
+#define RB_FIND(name, x, y)	name##_RB_FIND(x, y)
+#define RB_NFIND(name, x, y)	name##_RB_NFIND(x, y)
+#define RB_NEXT(name, x, y)	name##_RB_NEXT(y)
+#define RB_PREV(name, x, y)	name##_RB_PREV(y)
+#define RB_MIN(name, x)		name##_RB_MINMAX(x, RB_NEGINF)
+#define RB_MAX(name, x)		name##_RB_MINMAX(x, RB_INF)
+
+#define RB_FOREACH(x, name, head)					\
+	for ((x) = RB_MIN(name, head);					\
+	     (x) != NULL;						\
+	     (x) = name##_RB_NEXT(x))
+
+#define RB_FOREACH_FROM(x, name, y)					\
+	for ((x) = (y);							\
+	    ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL);	\
+	     (x) = (y))
+
+#define RB_FOREACH_SAFE(x, name, head, y)				\
+	for ((x) = RB_MIN(name, head);					\
+	    ((x) != NULL) && ((y) = name##_RB_NEXT(x), (x) != NULL);	\
+	     (x) = (y))
+
+#define RB_FOREACH_REVERSE(x, name, head)				\
+	for ((x) = RB_MAX(name, head);					\
+	     (x) != NULL;						\
+	     (x) = name##_RB_PREV(x))
+
+#define RB_FOREACH_REVERSE_FROM(x, name, y)				\
+	for ((x) = (y);							\
+	    ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL);	\
+	     (x) = (y))
+
+#define RB_FOREACH_REVERSE_SAFE(x, name, head, y)			\
+	for ((x) = RB_MAX(name, head);					\
+	    ((x) != NULL) && ((y) = name##_RB_PREV(x), (x) != NULL);	\
+	     (x) = (y))
+
+#endif	/* _SYS_TREE_H_ */
diff --git a/trace/wscript b/trace/wscript
new file mode 100644
index 0000000..f60927c
--- /dev/null
+++ b/trace/wscript
@@ -0,0 +1,62 @@
+#
+# RTEMS Tools Project (http://www.rtems.org/)
+# Copyright 2014-2016 Chris Johns (chrisj at rtems.org)
+# Copyright 2018 embedded brains GmbH
+# All rights reserved.
+#
+# This file is part of the RTEMS Tools package in 'rtems-tools'.
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+def init(ctx):
+    pass
+
+def options(opt):
+    opt.load('compiler_c')
+
+def configure(conf):
+    conf.load('compiler_c')
+
+def build(bld):
+    #
+    # The local configuration.
+    #
+    conf = {}
+
+    #
+    # Build flags.
+    #
+    conf['warningflags'] = ['-Wall', '-Wextra', '-pedantic']
+    conf['optflags'] = bld.env.C_OPTS
+    conf['cflags'] = ['-pipe', '-g'] + conf['optflags']
+    conf['linkflags'] = ['-g']
+
+    #
+    # The list of defines
+    #
+    defines = ['RTEMS_VERSION=\"%s\"' % (bld.env.RTEMS_VERSION),
+               'RTEMS_RELEASE=\"%s\"' % (bld.env.RTEMS_RELEASE)]
+
+    #
+    # Build rtems-record
+    #
+    bld.program(target = 'rtems-record',
+                source = ['record/record-client.c', 'record/record-main.c', 'record/record-text.c'],
+                includes = ['record'],
+                defines = defines,
+                cflags = conf['cflags'] + conf['warningflags'],
+                linkflags = conf['linkflags'])
+
+def tags(ctx):
+    ctx.exec_command('etags $(find . -name \*.[sSch])', shell = True)
diff --git a/wscript b/wscript
index f491d70..bd7c54d 100644
--- a/wscript
+++ b/wscript
@@ -37,7 +37,8 @@ subdirs = ['rtemstoolkit',
            'linkers',
            'misc',
            'tester',
-           'tools/gdb/python']
+           'tools/gdb/python',
+           'trace']
 
 def get_version(ctx):
     #
-- 
2.16.4





More information about the devel mailing list