summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/export/logf.h2
-rw-r--r--firmware/logf.c49
-rw-r--r--firmware/panic.c4
3 files changed, 55 insertions, 0 deletions
diff --git a/firmware/export/logf.h b/firmware/export/logf.h
index b57ae91872..e881e7e496 100644
--- a/firmware/export/logf.h
+++ b/firmware/export/logf.h
@@ -39,6 +39,8 @@ extern bool logfwrap;
39#define logf _logf 39#define logf _logf
40void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2); 40void _logf(const char *format, ...) ATTRIBUTE_PRINTF(1, 2);
41 41
42void logf_panic_dump(int *y);
43
42#else /* !ROCKBOX_HAS_LOGF */ 44#else /* !ROCKBOX_HAS_LOGF */
43 45
44/* built without logf() support enabled, replace logf() by DEBUGF() */ 46/* built without logf() support enabled, replace logf() by DEBUGF() */
diff --git a/firmware/logf.c b/firmware/logf.c
index fadfc9bb13..a24a635570 100644
--- a/firmware/logf.c
+++ b/firmware/logf.c
@@ -32,6 +32,7 @@
32#include "config.h" 32#include "config.h"
33#include "system.h" 33#include "system.h"
34#include "font.h" 34#include "font.h"
35#include "lcd.h"
35#ifdef HAVE_REMOTE_LCD 36#ifdef HAVE_REMOTE_LCD
36#include "lcd-remote.h" 37#include "lcd-remote.h"
37#endif 38#endif
@@ -254,6 +255,54 @@ void _logf(const char *fmt, ...)
254} 255}
255#endif 256#endif
256 257
258void logf_panic_dump(int *y)
259{
260 int i;
261 /* nothing to print ? */
262 if(logfindex == 0 && !logfwrap)
263 {
264 lcd_puts(1, (*y)++, "no logf data");
265 lcd_update();
266 return;
267 }
268
269 lcd_puts(1, (*y)++, "start of logf data");
270 lcd_update();
271 i = logfindex - 2; /* The last actual characer (i.e. not '\0') */
272
273 while(i >= 0)
274 {
275 while(logfbuffer[i] != 0 && i>=0)
276 {
277 i--;
278 }
279 if(strlen( &logfbuffer[i + 1]) > 0)
280 {
281 lcd_puts(1, (*y)++, &logfbuffer[i + 1]);
282 lcd_update();
283 }
284 i--;
285 }
286 if(logfwrap)
287 {
288 i = MAX_LOGF_SIZE - 1;
289 while(i >= logfindex)
290 {
291 while(logfbuffer[i] != 0 && i >= logfindex)
292 {
293 i--;
294 }
295 if(strlen( &logfbuffer[i + 1]) > 0)
296 {
297 lcd_putsf(1, (*y)++, "%*s", (MAX_LOGF_SIZE-i) &logfbuffer[i + 1]);
298 lcd_update();
299 }
300 }
301 i--;
302 }
303 lcd_puts(1, (*y)++, "end of logf data");
304 lcd_update();
305}
257#endif 306#endif
258 307
259#ifdef ROCKBOX_HAS_LOGDISKF 308#ifdef ROCKBOX_HAS_LOGDISKF
diff --git a/firmware/panic.c b/firmware/panic.c
index 0d49847a19..3f01689922 100644
--- a/firmware/panic.c
+++ b/firmware/panic.c
@@ -30,6 +30,7 @@
30#include "led.h" 30#include "led.h"
31#include "power.h" 31#include "power.h"
32#include "system.h" 32#include "system.h"
33#include "logf.h"
33 34
34#if defined(CPU_ARM) 35#if defined(CPU_ARM)
35#include "gcc_extensions.h" 36#include "gcc_extensions.h"
@@ -115,6 +116,9 @@ void panicf( const char *fmt, ...)
115#if defined(CPU_ARM) 116#if defined(CPU_ARM)
116 backtrace(pc, sp, &y); 117 backtrace(pc, sp, &y);
117#endif 118#endif
119#ifdef ROCKBOX_HAS_LOGF
120 logf_panic_dump(&y);
121#endif
118#else 122#else
119 /* no LCD */ 123 /* no LCD */
120#endif 124#endif