summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/cpuuse
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-04-12 07:31:01 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-31 10:10:36 +0200
commit01cb5540bd7b391f9a19c79b284fdfc4385afc06 (patch)
tree8ede13cd3006ac9d24990e8a5b6baffc5e324dfb /cpukit/libmisc/cpuuse
parentcpuuse: Hide implementation details (diff)
downloadrtems-01cb5540bd7b391f9a19c79b284fdfc4385afc06.tar.bz2
shell: Add CPUINFO command
Update #2723.
Diffstat (limited to 'cpukit/libmisc/cpuuse')
-rw-r--r--cpukit/libmisc/cpuuse/cpuinforeport.c86
-rw-r--r--cpukit/libmisc/cpuuse/cpuuse.h7
2 files changed, 93 insertions, 0 deletions
diff --git a/cpukit/libmisc/cpuuse/cpuinforeport.c b/cpukit/libmisc/cpuuse/cpuinforeport.c
new file mode 100644
index 0000000000..389a26c174
--- /dev/null
+++ b/cpukit/libmisc/cpuuse/cpuinforeport.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * 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.
+ */
+
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <rtems/cpuuse.h>
+#include <rtems/print.h>
+
+#include <ctype.h>
+#include <inttypes.h>
+
+#include <rtems/score/schedulerimpl.h>
+
+static char bits_to_char( uint8_t bits )
+{
+ return isprint( bits ) ? (char) bits : '?';
+}
+
+static void name_to_str( uint32_t name, char str[ 5 ] )
+{
+ str[ 0 ] = bits_to_char( (uint8_t) ( name >> 24 ) );
+ str[ 1 ] = bits_to_char( (uint8_t) ( name >> 16 ) );
+ str[ 2 ] = bits_to_char( (uint8_t) ( name >> 8 ) );
+ str[ 3 ] = bits_to_char( (uint8_t) ( name >> 0 ) );
+ str[ 4 ] = '\0';
+}
+
+int rtems_cpu_info_report( const rtems_printer *printer )
+{
+ uint32_t cpu_max;
+ uint32_t cpu_index;
+ int n;
+
+ cpu_max = rtems_configuration_get_maximum_processors();
+
+ n = rtems_printf(
+ printer,
+ "-------------------------------------------------------------------------------\n"
+ " PER PROCESSOR INFORMATION\n"
+ "-------+--------+--------------+-----------------------------------------------\n"
+ " INDEX | ONLINE | SCHEDULER ID | SCHEDULER NAME\n"
+ "-------+--------+--------------+-----------------------------------------------\n"
+ );
+
+ for ( cpu_index = 0; cpu_index < cpu_max; ++cpu_index ) {
+ const Per_CPU_Control *cpu;
+ const Scheduler_Control *scheduler;
+ char scheduler_str[ 5 ];
+ uint32_t scheduler_id;
+
+ cpu = _Per_CPU_Get_by_index( cpu_index );
+ scheduler = _Scheduler_Get_by_CPU( cpu );
+
+ if ( scheduler != NULL ) {
+ scheduler_id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
+ name_to_str( scheduler->name, scheduler_str );
+ } else {
+ scheduler_id = 0;
+ scheduler_str[ 0 ] = '\0';
+ }
+
+ n += rtems_printf(
+ printer,
+ " %5" PRIu32 " | %6i | 0x%08" PRIx32 " | %s\n",
+ cpu_index,
+ _Per_CPU_Is_processor_online( cpu ),
+ scheduler_id,
+ &scheduler_str[ 0 ]
+ );
+ }
+
+ return n;
+}
diff --git a/cpukit/libmisc/cpuuse/cpuuse.h b/cpukit/libmisc/cpuuse/cpuuse.h
index 55777186f8..23f58faf1b 100644
--- a/cpukit/libmisc/cpuuse/cpuuse.h
+++ b/cpukit/libmisc/cpuuse/cpuuse.h
@@ -73,6 +73,13 @@ void rtems_cpu_usage_top( void );
void rtems_cpu_usage_reset( void );
+/**
+ * @brief Reports per-processor information.
+ *
+ * @return The number of characters printed.
+ */
+int rtems_cpu_info_report( const rtems_printer *printer );
+
#ifdef __cplusplus
}
#endif