--- diff -puN arch/ppc64/xmon/xmon.c~xmon-text-dump arch/ppc64/xmon/xmon.c --- linux-2.6-bk/arch/ppc64/xmon/xmon.c~xmon-text-dump Fri Sep 10 13:49:02 2004 +++ linux-2.6-bk-moilanen/arch/ppc64/xmon/xmon.c Fri Sep 10 13:49:02 2004 @@ -51,6 +51,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]; @@ -99,6 +100,7 @@ static int bsesc(void); static void dump(void); static void prdump(unsigned long, long); static int ppc_inst_dump(unsigned long, long, int); +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 *); @@ -179,6 +181,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\ @@ -2003,6 +2006,13 @@ dump() nidump = 16; adrs += ppc_inst_dump(adrs, nidump, 1); 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 ) @@ -2052,6 +2062,37 @@ prdump(unsigned long adrs, long ndump) if (nr < r) break; } +} + +static int +ppc_txt_dump(unsigned long adr, long count) +{ + unsigned long first_adr; + long nr; + char c; + + for (first_adr = adr; count > 0; adr++) { + + nr = mread(adr, &c, 1); + + if (!nr) + break; + + if (c <= 31 || c >= 127) { + count--; + + if (c != '\n') { + printf("."); + continue; + } + } + + printf("%c", c); + } + + printf("%.16lx ", adr); + + return adr - first_adr; } int _