diff options
Diffstat (limited to 'cpukit/libmisc/capture/rtems-trace-buffer-vars.c')
-rw-r--r-- | cpukit/libmisc/capture/rtems-trace-buffer-vars.c | 178 |
1 files changed, 178 insertions, 0 deletions
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 <chrisj@rtems.org> + * + * 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 <rtems.h> + +#include <rtems/trace/rtems-trace-buffer-vars.h> + +/** + * 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); +} |