aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <michael@ellerman.id.au>2012-10-09 00:20:47 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-11-14 21:00:02 -0500
commitb2bb65f680a7b2faa5d6332c02752dca83a49cd6 (patch)
tree7aa08b554b4e9c265d54a955c3ea610339bcd276
parent0104cd6839bd575f0aa1af4125eb865dc0391aae (diff)
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>
-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)
111void xmon_printf(const char *format, ...) 111void xmon_printf(const char *format, ...)
112{ 112{
113 va_list args; 113 va_list args;
114 int n;
115 static char xmon_outbuf[1024]; 114 static char xmon_outbuf[1024];
115 int rc, n;
116 116
117 va_start(args, format); 117 va_start(args, format);
118 n = vsnprintf(xmon_outbuf, sizeof(xmon_outbuf), format, args); 118 n = vsnprintf(xmon_outbuf, sizeof(xmon_outbuf), format, args);
119 va_end(args); 119 va_end(args);
120 xmon_write(xmon_outbuf, n); 120
121 rc = xmon_write(xmon_outbuf, n);
122
123 if (n && rc == 0) {
124 /* No udbg hooks, fallback to printk() - dangerous */
125 printk(xmon_outbuf);
126 }
121} 127}
122 128
123void xmon_puts(const char *str) 129void xmon_puts(const char *str)