summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi/src/profilingiterate.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/sapi/src/profilingiterate.c')
-rw-r--r--cpukit/sapi/src/profilingiterate.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/cpukit/sapi/src/profilingiterate.c b/cpukit/sapi/src/profilingiterate.c
index e528932db9..28c06a4689 100644
--- a/cpukit/sapi/src/profilingiterate.c
+++ b/cpukit/sapi/src/profilingiterate.c
@@ -17,10 +17,71 @@
#endif
#include <rtems/profiling.h>
+#include <rtems/counter.h>
+#include <rtems.h>
+
+#include <string.h>
+
+static void per_cpu_stats_iterate(
+ rtems_profiling_visitor visitor,
+ void *visitor_arg,
+ rtems_profiling_data *data
+)
+{
+#ifdef RTEMS_PROFILING
+ uint32_t n = rtems_smp_get_processor_count();
+ uint32_t i;
+
+ memset(data, 0, sizeof(*data));
+ data->header.type = RTEMS_PROFILING_PER_CPU;
+ for (i = 0; i < n; ++i) {
+ const Per_CPU_Control *per_cpu = _Per_CPU_Get_by_index(i);
+ const Per_CPU_Stats *stats = &per_cpu->Stats;
+ rtems_profiling_per_cpu *per_cpu_data = &data->per_cpu;
+
+ per_cpu_data->processor_index = i;
+
+ per_cpu_data->max_thread_dispatch_disabled_time =
+ rtems_counter_ticks_to_nanoseconds(
+ stats->max_thread_dispatch_disabled_time
+ );
+
+ per_cpu_data->max_interrupt_time =
+ rtems_counter_ticks_to_nanoseconds(stats->max_interrupt_time);
+
+ per_cpu_data->max_interrupt_delay =
+ rtems_counter_ticks_to_nanoseconds(stats->max_interrupt_delay);
+
+ per_cpu_data->thread_dispatch_disabled_count =
+ stats->thread_dispatch_disabled_count;
+
+ per_cpu_data->total_thread_dispatch_disabled_time =
+ rtems_counter_ticks_to_nanoseconds(
+ stats->total_thread_dispatch_disabled_time
+ );
+
+ per_cpu_data->interrupt_count = stats->interrupt_count;
+
+ per_cpu_data->total_interrupt_time =
+ rtems_counter_ticks_to_nanoseconds(
+ stats->total_interrupt_time
+ );
+
+ (*visitor)(visitor_arg, data);
+ }
+#else
+ (void) visitor;
+ (void) visitor_arg;
+ (void) data;
+#endif
+}
void rtems_profiling_iterate(
rtems_profiling_visitor visitor,
void *visitor_arg
)
{
+ rtems_profiling_data data;
+
+ per_cpu_stats_iterate(visitor, visitor_arg, &data);
}