提交 f312deb4 编写于 作者: V Vinay Sridhar 提交者: Benjamin Herrenschmidt

powerpc/xmon: Add dl command to dump contents of __log_buf

Hello All,

Quite a while back Michael Ellerman had posted a patch to add support to xmon to print the contents of the console log pointed to by __log_buf.
Here's the link to that patch - http://ozlabs.org/pipermail/linuxppc64-dev/2005-March/003657.html
I've ported the patch in the above link to 2.6.30-rc5 and have tested it.

Thanks & regards,
Vinay

Signed-off-by: Michael Ellerman <michael at ellerman.id.au>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 2138422b
...@@ -110,6 +110,7 @@ static int bsesc(void); ...@@ -110,6 +110,7 @@ static int bsesc(void);
static void dump(void); static void dump(void);
static void prdump(unsigned long, long); static void prdump(unsigned long, long);
static int ppc_inst_dump(unsigned long, long, int); static int ppc_inst_dump(unsigned long, long, int);
static void dump_log_buf(void);
static void backtrace(struct pt_regs *); static void backtrace(struct pt_regs *);
static void excprint(struct pt_regs *); static void excprint(struct pt_regs *);
static void prregs(struct pt_regs *); static void prregs(struct pt_regs *);
...@@ -197,6 +198,7 @@ Commands:\n\ ...@@ -197,6 +198,7 @@ Commands:\n\
di dump instructions\n\ di dump instructions\n\
df dump float values\n\ df dump float values\n\
dd dump double values\n\ dd dump double values\n\
dl dump the kernel log buffer\n\
dr dump stream of raw bytes\n\ dr dump stream of raw bytes\n\
e print exception information\n\ e print exception information\n\
f flush cache\n\ f flush cache\n\
...@@ -2009,6 +2011,8 @@ dump(void) ...@@ -2009,6 +2011,8 @@ dump(void)
nidump = MAX_DUMP; nidump = MAX_DUMP;
adrs += ppc_inst_dump(adrs, nidump, 1); adrs += ppc_inst_dump(adrs, nidump, 1);
last_cmd = "di\n"; last_cmd = "di\n";
} else if (c == 'l') {
dump_log_buf();
} else if (c == 'r') { } else if (c == 'r') {
scanhex(&ndump); scanhex(&ndump);
if (ndump == 0) if (ndump == 0)
...@@ -2122,6 +2126,49 @@ print_address(unsigned long addr) ...@@ -2122,6 +2126,49 @@ print_address(unsigned long addr)
xmon_print_symbol(addr, "\t# ", ""); xmon_print_symbol(addr, "\t# ", "");
} }
void
dump_log_buf(void)
{
const unsigned long size = 128;
unsigned long i, end, addr;
unsigned char buf[size + 1];
addr = 0;
buf[size] = '\0';
if (setjmp(bus_error_jmp) != 0) {
printf("Unable to lookup symbol __log_buf!\n");
return;
}
catch_memory_errors = 1;
sync();
addr = kallsyms_lookup_name("__log_buf");
if (! addr)
printf("Symbol __log_buf not found!\n");
else {
end = addr + (1 << CONFIG_LOG_BUF_SHIFT);
while (addr < end) {
if (! mread(addr, buf, size)) {
printf("Can't read memory at address 0x%lx\n", addr);
break;
}
printf("%s", buf);
if (strlen(buf) < size)
break;
addr += size;
}
}
sync();
/* wait a little while to see if we get a machine check */
__delay(200);
catch_memory_errors = 0;
}
/* /*
* Memory operations - move, set, print differences * Memory operations - move, set, print differences
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册