From a300920de12ed9c14f2637961285588413cab6fb Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Mon, 30 Mar 2015 22:19:17 +1100 Subject: libmisc/shell: Add the rtrace command for buffered tracing support. The rtrace command interfaces to the RTEMS Trace Linker's trace buffering data allowing users to capture and report trace data. --- cpukit/libmisc/capture/rtems-trace-buffer-vars.c | 178 +++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 cpukit/libmisc/capture/rtems-trace-buffer-vars.c (limited to 'cpukit/libmisc/capture/rtems-trace-buffer-vars.c') diff --git a/cpukit/libmisc/capture/rtems-trace-buffer-vars.c b/cpukit/libmisc/capture/rtems-trace-buffer-vars.c new file mode 100644 index 0000000000..ef958c58f7 --- /dev/null +++ b/cpukit/libmisc/capture/rtems-trace-buffer-vars.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2015 Chris Johns + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#include + +#include + +/** + * External Trace Linker and TBG data. We provide weak versions to allow us to + * link and be present in an application that has not been trace linked. + */ + +/* + * Trace linker data. + */ +uint32_t __rtld_trace_names_size __attribute__ ((weak)); +const char const* __rtld_trace_names[1] __attribute__ ((weak)); +uint32_t __rtld_trace_enables_size __attribute__ ((weak)); +const uint32_t __rtld_trace_enables[1] __attribute__ ((weak)); +uint32_t __rtld_trace_triggers_size __attribute__ ((weak)); +const uint32_t __rtld_trace_triggers[1] __attribute__ ((weak)); +const __rtld_trace_sig __rtld_trace_signatures[1] __attribute__ ((weak)); + +/* + * Trace buffer generator data. + */ +const bool __rtld_tbg_present __attribute__ ((weak)); +const uint32_t __rtld_tbg_mode __attribute__ ((weak)); +const uint32_t __rtld_tbg_buffer_size __attribute__ ((weak)); +uint32_t __rtld_tbg_buffer[1] __attribute__ ((weak)); +volatile uint32_t __rtld_tbg_buffer_in __attribute__ ((weak)); +volatile bool __rtld_tbg_finished __attribute__ ((weak)); +volatile bool __rtld_tbg_triggered __attribute__ ((weak)); + +uint32_t +rtems_trace_names_size (void) +{ + return __rtld_trace_names_size; +} + +const char* +rtems_trace_names (const uint32_t index) +{ + return __rtld_trace_names[index]; +} + +uint32_t +rtems_trace_enables_size (void) +{ + return __rtld_trace_enables_size; +} + +uint32_t +rtems_trace_enables (const uint32_t index) +{ + return __rtld_trace_enables[index]; +} + +uint32_t +rtems_trace_triggers_size (void) +{ + return __rtld_trace_triggers_size; +} + +uint32_t +rtems_trace_triggers (const uint32_t index) +{ + return __rtld_trace_triggers[index]; +} + +const rtems_trace_sig* +rtems_trace_signatures (const uint32_t index) +{ + return &__rtld_trace_signatures[index]; +} + +bool +rtems_trace_enable_set(const uint32_t index) +{ + return (__rtld_trace_enables[index / 32] & (1 << (index & (32 - 1)))) != 0 ? true : false; +} + +bool +rtems_trace_trigger_set(const uint32_t index) +{ + return (__rtld_trace_triggers[index / 32] & (1 << (index & (32 - 1)))) != 0 ? true : false; +} + +bool +rtems_trace_buffering_present (void) +{ + return __rtld_tbg_present; +} + +uint32_t +rtems_trace_buffering_mode (void) +{ + return __rtld_tbg_mode; +} + +uint32_t +rtems_trace_buffering_buffer_size (void) +{ + return __rtld_tbg_buffer_size; +} + +uint32_t* +rtems_trace_buffering_buffer (void) +{ + return &__rtld_tbg_buffer[0]; +} + +uint32_t +rtems_trace_buffering_buffer_in (void) +{ + rtems_interrupt_lock_context lcontext; + uint32_t in; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + in = __rtld_tbg_buffer_in; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); + return in; +} + +bool +rtems_trace_buffering_finished (void) +{ + rtems_interrupt_lock_context lcontext; + bool finished; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + finished = __rtld_tbg_finished; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); + return finished; +} + +bool +rtems_trace_buffering_triggered (void) +{ + rtems_interrupt_lock_context lcontext; + bool triggered; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + triggered = __rtld_tbg_triggered; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); + return triggered; +} + +void +rtems_trace_buffering_start (void) +{ + rtems_interrupt_lock_context lcontext; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + __rtld_tbg_triggered = false; + __rtld_tbg_buffer_in = 0; + __rtld_tbg_finished = false; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); +} + +void +rtems_trace_buffering_stop (void) +{ + rtems_interrupt_lock_context lcontext; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + __rtld_tbg_finished = true; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); +} + +void +rtems_trace_buffering_resume (void) +{ + rtems_interrupt_lock_context lcontext; + rtems_interrupt_lock_acquire(&__rtld_tbg_lock, &lcontext); + __rtld_tbg_finished = false; + rtems_interrupt_lock_release(&__rtld_tbg_lock, &lcontext); +} -- cgit v1.2.3