summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorFrank Gevaerts <frank@gevaerts.be>2014-01-05 22:20:26 +0100
committerFrank Gevaerts <frank@gevaerts.be>2014-01-11 11:37:18 +0100
commit25e50ed8f1361ef3295aeb298a3edf2214f5b3b3 (patch)
treea4b5516cb23e2915666eb0f36ef7462e6b5228c3 /firmware
parentfe73d75e7485019a6206c4aa7e414a93bc70c05f (diff)
downloadrockbox-25e50ed8f1361ef3295aeb298a3edf2214f5b3b3.tar.gz
rockbox-25e50ed8f1361ef3295aeb298a3edf2214f5b3b3.zip
Print `last logf lines on panic().
If logf is enabled, panic() will print the last lines. On small screens this is more or less useless, but on large screens it can be very useful for debugging. Change-Id: I26dfc76e9ac4a2ddc2def8db1616a04f943dbba3 Reviewed-on: http://gerrit.rockbox.org/709 Reviewed-by: Thomas Martitz <kugel@rockbox.org> Reviewed-by: Frank Gevaerts <frank@gevaerts.be> Tested: Frank Gevaerts <frank@gevaerts.be>
Diffstat (limited to 'firmware')
-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