diff options
Diffstat (limited to 'cpukit/libmisc/shell/main_mdump.c')
-rw-r--r-- | cpukit/libmisc/shell/main_mdump.c | 194 |
1 files changed, 160 insertions, 34 deletions
diff --git a/cpukit/libmisc/shell/main_mdump.c b/cpukit/libmisc/shell/main_mdump.c index d196711363..156a6f262e 100644 --- a/cpukit/libmisc/shell/main_mdump.c +++ b/cpukit/libmisc/shell/main_mdump.c @@ -5,11 +5,11 @@ * Work: fernando.ruiz@ctv.es * Home: correo@fernando-ruiz.com * + * Reworked by Ric Claus at SLAC.Stanford.edu + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. - * - * $Id$ */ #ifdef HAVE_CONFIG_H @@ -26,71 +26,197 @@ #include <rtems/stringto.h> #include "internal.h" +static int args_parse(int argc, char* argv[], void** addr, int* max, int* sz); + +static void mdumpB(void* addr, int m); +static void mdumpW(void* addr, int m); +static void mdumpL(void* addr, int m); + +int rtems_mdump(void* addr, int max, int sz); + int rtems_shell_main_mdump( int argc, char *argv[] ) { - unsigned char n; - unsigned char m; - int max; - int res; - void *addr = NULL; - unsigned char *pb; + void *addr; + int max; + int sz; + + if (args_parse(argc, argv, &addr, &max, &sz)) + return -1; + return rtems_mdump(addr, max, sz); +} + +int rtems_shell_main_wdump( + int argc, + char *argv[] +) +{ + void *addr; + int max; + int sz; + + if (args_parse(argc, argv, &addr, &max, &sz)) + return -1; + return rtems_mdump(addr, max, 2); +} + + +int rtems_shell_main_ldump( + int argc, + char *argv[] +) +{ + void *addr; + int max; + int sz; + + if (args_parse(argc, argv, &addr, &max, &sz)) + return -1; + return rtems_mdump(addr, max, 4); +} + + +int args_parse(int argc, + char* argv[], + void** addr, + int* max, + int* sz) +{ + *addr = NULL; + *max = 320; + *sz = 1; if (argc > 1) { - if ( rtems_string_to_pointer(argv[1], &addr, NULL) ) { + if ( rtems_string_to_pointer(argv[1], addr, NULL) ) { printf( "Address argument (%s) is not a number\n", argv[1] ); return -1; } - } + if (argc > 2) { + if ( rtems_string_to_int(argv[2], max, NULL, 0) ) { + printf( "Length argument (%s) is not a number\n", argv[2] ); + return -1; + } - if (argc > 2) { - if ( rtems_string_to_int(argv[1], &max, NULL, 0) ) { - printf( "Length argument (%s) is not a number\n", argv[1] ); - return -1; - } - if (max <= 0) { - max = 1; /* print 1 item if 0 or neg. */ - res = 0; - } else { - max--; - res = max & 0xf;/* num bytes in last row */ - max >>= 4; /* div by 16 */ - max++; /* num of rows to print */ - if (max > 20) { /* limit to 20 */ - max = 20; - res = 0xf; /* 16 bytes print in last row */ + if (argc > 3) { + if ( rtems_string_to_int(argv[3], sz, NULL, 0) ) { + printf( "Size argument (%s) is not a valid number\n", argv[3] ); + return -1; + } } } + } + return 0; +} + + +int rtems_mdump(void* addr, int max, int sz) +{ + unsigned char n; + unsigned char m; + volatile unsigned char *pb; + int res; + int cnt; + + if (!((sz == 1) || (sz == 2) || (sz == 4))) { + printf( "Size argument (%d) is not one of 1 (bytes), " + " 2 (words) or 4 (longwords)\n", sz); + return -1; + } + + if (max <= 0) { + max = 1; /* print 1 item if 0 or neg. */ + res = 0; } else { - max = 20; - res = 0xf; + max--; + res = max & 0xf; /* num bytes in last row */ + max >>= 4; /* div by 16 */ + max++; /* num of rows to print */ + if (max > 64) { /* limit to 64 lines */ + max = 64; + res = 0xf; /* 16 bytes print in last row */ + } } pb = addr; for (m=0; m<max; m++) { + cnt = m==(max-1)?res:0xf; printf("%10p ", pb); - for (n=0;n<=(m==(max-1)?res:0xf);n++) - printf("%02X%c",pb[n],n==7?'-':' '); - for (;n<=0xf;n++) - printf(" %c",n==7?'-':' '); - for (n=0;n<=(m==(max-1)?res:0xf);n++) { + if (sz == 1) mdumpB(pb, cnt); + else if (sz == 2) mdumpW(pb, cnt); + else if (sz == 4) mdumpL(pb, cnt); + for (n=0;n<=cnt;n++) { printf("%c", isprint(pb[n]) ? pb[n] : '.'); } printf("\n"); pb += 16; } + return 0; } + +void mdumpB(void* addr, int m) +{ + volatile unsigned char* pb = addr; + int n; + for (n=0;n<=m;n++) + printf("%02X%c",*pb++,n==7?'-':' '); + for (;n<=0xf;n++) + printf(" %c",n==7?'-':' '); +} + + +void mdumpW(void* addr, int m) +{ + volatile unsigned short* pb = addr; + int n; + for (n=0;n<=m;n+=2) + printf("%04X%c",*pb++,n==6?'-':' '); + for (;n<=0xf;n+=2) + printf(" %c", n==6?'-':' '); +} + + +void mdumpL(void* addr, int m) +{ + volatile unsigned int* pb = addr; + int n; + for (n=0;n<=m;n+=4) + printf("%08X%c",*pb++,n==4?'-':' '); + for (;n<=0xf;n+=4) + printf(" %c", n==4?'-':' '); +} + + rtems_shell_cmd_t rtems_shell_MDUMP_Command = { "mdump", /* name */ - "mdump [address [length]]", /* usage */ + "mdump [address [length [size]]]", /* usage */ "mem", /* topic */ rtems_shell_main_mdump, /* command */ NULL, /* alias */ NULL /* next */ }; + +rtems_shell_cmd_t rtems_shell_WDUMP_Command = { + "wdump", /* name */ + "wdump [address [length]]", /* usage */ + "mem", /* topic */ + rtems_shell_main_wdump, /* command */ + NULL, /* alias */ + NULL /* next */ +}; + + +rtems_shell_cmd_t rtems_shell_LDUMP_Command = { + "ldump", /* name */ + "ldump [address [length]]", /* usage */ + "mem", /* topic */ + rtems_shell_main_ldump, /* command */ + NULL, /* alias */ + NULL /* next */ +}; + |