diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-04-12 07:31:01 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-31 10:10:36 +0200 |
commit | 01cb5540bd7b391f9a19c79b284fdfc4385afc06 (patch) | |
tree | 8ede13cd3006ac9d24990e8a5b6baffc5e324dfb /cpukit/libmisc/cpuuse/cpuinforeport.c | |
parent | cpuuse: Hide implementation details (diff) | |
download | rtems-01cb5540bd7b391f9a19c79b284fdfc4385afc06.tar.bz2 |
shell: Add CPUINFO command
Update #2723.
Diffstat (limited to '')
-rw-r--r-- | cpukit/libmisc/cpuuse/cpuinforeport.c | 86 |
1 files changed, 86 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; +} |