[patch 1/1] Dump text for xmon

moilanen at austin.ibm.com moilanen at austin.ibm.com
Sat Jun 26 05:46:28 EST 2004


Here's a patch to dump text in xmon.  The 'dt' command works
just like any other dump command, it takes an address and an
optional number of lines.

All non-printable characters are printed w/ a '.' instead.

If no one has any objections, I'll push it to ames sometime
late next week.

Thanks,
Jake


---


diff -puN arch/ppc64/xmon/xmon.c~xmon-text-dump arch/ppc64/xmon/xmon.c
--- linux-2.6/arch/ppc64/xmon/xmon.c~xmon-text-dump	Wed Jun 23 11:29:27 2004
+++ linux-2.6-moilanen/arch/ppc64/xmon/xmon.c	Fri Jun 25 14:41:13 2004
@@ -48,6 +48,7 @@ static unsigned long adrs;
 static int size = 1;
 static unsigned long ndump = 64;
 static unsigned long nidump = 16;
+static unsigned long ntdump = 16;
 static unsigned long ncsum = 4096;
 static int termch;
 static char tmpstr[128];
@@ -81,6 +82,8 @@ static int bsesc(void);
 static void dump(void);
 static void prdump(unsigned long, long);
 static int ppc_inst_dump(unsigned long, long);
+static int ppc_txt_dump(unsigned long, long);
+
 void print_address(unsigned long);
 static void backtrace(struct pt_regs *);
 static void excprint(struct pt_regs *);
@@ -156,6 +159,7 @@ Commands:\n\
   di	dump instructions\n\
   df	dump float values\n\
   dd	dump double values\n\
+  dt	dump text\n\
   e	print exception information\n\
   f	flush cache\n\
   la	lookup symbol+offset of specified address\n\
@@ -1543,6 +1547,13 @@ dump()
 			nidump = 16;
 		adrs += ppc_inst_dump(adrs, nidump);
 		last_cmd = "di\n";
+	} else if ( c == 't' ){
+		scanhex(&ntdump);
+		if( ntdump == 0 ) {
+			ntdump = 16;
+		}
+		adrs += ppc_txt_dump(adrs, ntdump);
+		last_cmd = "dt\n";
 	} else {
 		scanhex(&ndump);
 		if( ndump == 0 )
@@ -1590,6 +1601,36 @@ prdump(unsigned long adrs, long ndump)
 		if( nr < r )
 			break;
 	}
+}
+
+static int
+ppc_txt_dump(unsigned long adr, long count)
+{
+	unsigned long first_adr;
+	char c;
+
+	if (!adr) {
+		printf("xmon BUG: %s, %d\n", __FILE__, __LINE__);
+		return 0;
+	}
+
+	for (first_adr = adr; count > 0; adr++) {
+		c = *(char *)adr;
+		if (c <= 31 || c >= 127) {
+			count--;
+
+			if (c != '\n') {
+				printf(".");
+				continue;
+			}
+		}
+
+		printf("%c", c);
+	}
+
+	printf("%.16lx ", adr);
+
+	return adr - first_adr;
 }

 int

_

** Sent via the linuxppc64-dev mail list. See http://lists.linuxppc.org/





More information about the Linuxppc64-dev mailing list