summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@oarcorp.com>2012-02-02 15:02:16 -0600
committerJoel Sherrill <joel.sherrill@oarcorp.com>2012-02-02 15:02:16 -0600
commit6d1a1d3ebb1bd842ed1f3887064f481cda166e42 (patch)
treee34c6818e58b23fd764bc2b17475eb40c5dd65db /cpukit
parentPR 1962/bsps - MVME162 Console Corrections and Improvements (diff)
downloadrtems-6d1a1d3ebb1bd842ed1f3887064f481cda166e42.tar.bz2
PR 2012 - mdump/wdump shell cmds handle length arg incorrectly; add ldump cmd
* libmisc/shell/main_mdump.c: Reworked to fix bugs in handling of the length argument and to provide an "ldump" command. This file now also supports the "wdump" command. In addition, an RTEMS API function called rtems_mdump() is provided to allow easy dumping from application code. * libmisc/shell/main_mwdump.c: Obsolete file. * libmisc/Makefile.am: Removed main_mwdump.c * libmisc/shell/shellconfig.h: Added "ldump" command. * shell/memory.t: Added documentation for the "ldump" command Signed-off-by: Ric Claus <claus@SLAC.Stanford.edu>
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/libmisc/Makefile.am3
-rw-r--r--cpukit/libmisc/shell/main_mdump.c194
-rw-r--r--cpukit/libmisc/shell/main_mwdump.c95
-rw-r--r--cpukit/libmisc/shell/shellconfig.h10
4 files changed, 168 insertions, 134 deletions
diff --git a/cpukit/libmisc/Makefile.am b/cpukit/libmisc/Makefile.am
index 26b7e4d918..e468dd13a0 100644
--- a/cpukit/libmisc/Makefile.am
+++ b/cpukit/libmisc/Makefile.am
@@ -1,5 +1,4 @@
##
-## $Id$
##
include $(top_srcdir)/automake/compile.am
@@ -83,7 +82,7 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \
shell/main_mallocinfo.c shell/main_mdump.c shell/main_medit.c \
shell/main_mfill.c shell/main_mkdir.c shell/main_mount.c \
shell/main_mmove.c shell/main_msdosfmt.c \
- shell/main_mv.c shell/main_mwdump.c shell/main_perioduse.c \
+ shell/main_mv.c shell/main_perioduse.c \
shell/main_pwd.c shell/main_rm.c shell/main_rmdir.c shell/main_sleep.c \
shell/main_stackuse.c shell/main_tty.c shell/main_umask.c \
shell/main_unmount.c shell/main_blksync.c shell/main_whoami.c \
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 */
+};
+
diff --git a/cpukit/libmisc/shell/main_mwdump.c b/cpukit/libmisc/shell/main_mwdump.c
deleted file mode 100644
index b2b184a1db..0000000000
--- a/cpukit/libmisc/shell/main_mwdump.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * MWDUMP Shell Command Implmentation
- *
- * Author: Fernando RUIZ CASAS
- * Work: fernando.ruiz@ctv.es
- * Home: correo@fernando-ruiz.com
- *
- * 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
-#include "config.h"
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-#include <inttypes.h>
-
-#include <rtems.h>
-#include <rtems/shell.h>
-#include <rtems/stringto.h>
-#include "internal.h"
-
-static int rtems_shell_main_mwdump(
- int argc,
- char *argv[]
-)
-{
- unsigned char n;
- unsigned char m;
- int max;
- int res;
- void *addr = 0;
- unsigned char *pb;
-
- if ( argc > 1 ) {
- 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( "Address 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 */
- }
- }
- } else {
- max = 20;
- res = 0xf;
- }
-
- pb = addr;
- for (m=0;m<max;m++) {
- printf("%10p ", pb);
- for (n=0;n<=(m==(max-1)?res:0xf);n+=2)
- printf("%04X%c",*((unsigned short*)(pb+n)),n==6?'-':' ');
- for (;n<=0xf;n+=2)
- printf(" %c", n==6?'-':' ');
- for (n=0;n<=(m==(max-1)?res:0xf);n++) {
- printf("%c", isprint(pb[n]) ? pb[n] : '.');
- }
- printf("\n");
- pb += 16;
- }
- return 0;
-}
-
-rtems_shell_cmd_t rtems_shell_WDUMP_Command = {
- "wdump", /* name */
- "wdump [address [length]]", /* usage */
- "mem", /* topic */
- rtems_shell_main_mwdump, /* command */
- NULL, /* alias */
- NULL /* next */
-};
diff --git a/cpukit/libmisc/shell/shellconfig.h b/cpukit/libmisc/shell/shellconfig.h
index 8e0b38ca4c..971df25b22 100644
--- a/cpukit/libmisc/shell/shellconfig.h
+++ b/cpukit/libmisc/shell/shellconfig.h
@@ -5,14 +5,12 @@
*/
/*
- * COPYRIGHT (c) 1989-2011.
+ * COPYRIGHT (c) 1989-2012.
* On-Line Applications Research Corporation (OAR).
*
* 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$
*/
#ifndef _RTEMS_SHELL_CONFIG_h
@@ -33,6 +31,7 @@ extern rtems_shell_cmd_t rtems_shell_UNSETENV_Command;
extern rtems_shell_cmd_t rtems_shell_MDUMP_Command;
extern rtems_shell_cmd_t rtems_shell_WDUMP_Command;
+extern rtems_shell_cmd_t rtems_shell_LDUMP_Command;
extern rtems_shell_cmd_t rtems_shell_MEDIT_Command;
extern rtems_shell_cmd_t rtems_shell_MFILL_Command;
extern rtems_shell_cmd_t rtems_shell_MMOVE_Command;
@@ -225,6 +224,11 @@ extern rtems_shell_alias_t *rtems_shell_Initial_aliases[];
&rtems_shell_WDUMP_Command,
#endif
#if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
+ !defined(CONFIGURE_SHELL_NO_COMMAND_LDUMP)) || \
+ defined(CONFIGURE_SHELL_COMMAND_LDUMP)
+ &rtems_shell_LDUMP_Command,
+ #endif
+ #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \
!defined(CONFIGURE_SHELL_NO_COMMAND_MEDIT)) || \
defined(CONFIGURE_SHELL_COMMAND_MEDIT)
&rtems_shell_MEDIT_Command,