summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/xmon/nonstdio.c
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2012-10-09 06:20:47 +0200
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-11-15 03:00:02 +0100
commitb2bb65f680a7b2faa5d6332c02752dca83a49cd6 (patch)
tree7aa08b554b4e9c265d54a955c3ea610339bcd276 /arch/powerpc/xmon/nonstdio.c
parentpowerpc/xmon: Fiddle xmon_depth_to_print logic in xmon_show_stack() (diff)
downloadlinux-b2bb65f680a7b2faa5d6332c02752dca83a49cd6.tar.xz
linux-b2bb65f680a7b2faa5d6332c02752dca83a49cd6.zip
powerpc/xmon: Fallback to printk() in xmon_printf() if udbg is not setup
It is possible to configure a kernel which has xmon enabled, but has no udbg backend to provide IO. This can make xmon rather confusing, as it produces no output, blocks for two seconds, and then returns. As a last resort we can instead try to printk(), which may deadlock or otherwise crash, but tries quite hard not to. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/xmon/nonstdio.c')
-rw-r--r--arch/powerpc/xmon/nonstdio.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/powerpc/xmon/nonstdio.c b/arch/powerpc/xmon/nonstdio.c
index 942d0f6b1874..bce3dcfe5058 100644
--- a/arch/powerpc/xmon/nonstdio.c
+++ b/arch/powerpc/xmon/nonstdio.c
@@ -111,13 +111,19 @@ char *xmon_gets(char *str, int nb)
void xmon_printf(const char *format, ...)
{
va_list args;
- int n;
static char xmon_outbuf[1024];
+ int rc, n;
va_start(args, format);
n = vsnprintf(xmon_outbuf, sizeof(xmon_outbuf), format, args);
va_end(args);
- xmon_write(xmon_outbuf, n);
+
+ rc = xmon_write(xmon_outbuf, n);
+
+ if (n && rc == 0) {
+ /* No udbg hooks, fallback to printk() - dangerous */
+ printk(xmon_outbuf);
+ }
}
void xmon_puts(const char *str)