powerpc: Fix xmon dl command for new printk implementation

Since the printk internals were reworked the xmon 'dl' command which
dumps the content of __log_buf has stopped working.

It is now a structured buffer, so just dumping it doesn't really work.

Use the helpers added for kgdb to print out the content.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Michael Ellerman 2012-08-23 22:09:12 +00:00 committed by Benjamin Herrenschmidt
parent 1267643dc3
commit ca5dd3954a

View File

@ -17,6 +17,7 @@
#include <linux/reboot.h>
#include <linux/delay.h>
#include <linux/kallsyms.h>
#include <linux/kmsg_dump.h>
#include <linux/cpumask.h>
#include <linux/export.h>
#include <linux/sysrq.h>
@ -2148,40 +2149,23 @@ print_address(unsigned long addr)
void
dump_log_buf(void)
{
const unsigned long size = 128;
unsigned long end, addr;
unsigned char buf[size + 1];
addr = 0;
buf[size] = '\0';
struct kmsg_dumper dumper = { .active = 1 };
unsigned char buf[128];
size_t len;
if (setjmp(bus_error_jmp) != 0) {
printf("Unable to lookup symbol __log_buf!\n");
printf("Error dumping printk buffer!\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;
}
}
kmsg_dump_rewind_nolock(&dumper);
while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) {
buf[len] = '\0';
printf("%s", buf);
}
sync();
/* wait a little while to see if we get a machine check */