diff options
| author | Michael Ellerman <michael@ellerman.id.au> | 2012-08-23 22:09:12 +0000 | 
|---|---|---|
| committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2012-08-24 20:26:03 +1000 | 
| commit | ca5dd3954a62dc14c2afff1c34b3b5d8dc74f777 (patch) | |
| tree | edce5dae9849df95314a4eab763c769c043c9049 /arch/powerpc | |
| parent | 1267643dc311e860e728dbd09a97c2e0a773bfdb (diff) | |
| download | linux-ca5dd3954a62dc14c2afff1c34b3b5d8dc74f777.tar.bz2 | |
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>
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/xmon/xmon.c | 36 | 
1 files changed, 10 insertions, 26 deletions
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index eab3492a45c5..013f28668781 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c @@ -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 */  |