Along with CForth commit 1a604a37e340da67419a1df5d840ee319090b619
provides a dump of the kernel log buffer on serial port after a
watchdog restart.  Intended for when the kernel serial driver is
disabled.

The kernel patch creates an aligned structure with pointers to the
kernel log buffer, and a pointer for calculating the offset from
virtual to physical addresses.

Harmless if used without the CForth change present.

Not intended for upstream.
---
 arch/arm/mach-mmp/olpc-xo-1-75.c |   19 +++++++++++++++++++
 include/linux/printk.h           |    5 +++++
 kernel/printk.c                  |    7 +++++++
 3 files changed, 31 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-mmp/olpc-xo-1-75.c b/arch/arm/mach-mmp/olpc-xo-1-75.c
index e0db8a8..adb1f15 100644
--- a/arch/arm/mach-mmp/olpc-xo-1-75.c
+++ b/arch/arm/mach-mmp/olpc-xo-1-75.c
@@ -548,10 +548,29 @@ static void __init olpc_init_early(void)
 }
 extern struct olpc_platform_t olpc_platform_info;
 
+struct epitaph {
+       u32     magic_1;
+       u32     magic_2;
+       u32     myself;
+       u32     log_buf_len;
+       u32     log_buf;
+       u32     log_end;
+};
+
+static struct epitaph epitaph __attribute__((aligned(4096))) = {
+       .magic_1 = 0x2163666f,
+       .magic_2 = 0x72746821
+};
+
 static void __init olpc_xo_1_75_init(void)
 {
        u32 twsi6_lcr;
 
+       log_buf_olpc_setup(&epitaph.log_buf_len,
+                          &epitaph.log_buf,
+                          &epitaph.log_end);
+       epitaph.myself = (u32) &epitaph;
+
        pm_power_off = olpc_xo_1_75_poweroff;
        arm_pm_restart = olpc_xo_1_75_restart;
 
diff --git a/include/linux/printk.h b/include/linux/printk.h
index 0101d55..795ed5a 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -115,6 +115,7 @@ extern int dmesg_restrict;
 extern int kptr_restrict;
 
 void log_buf_kexec_setup(void);
+void log_buf_olpc_setup(u32 *len, u32 *buf, u32 *end);
 void __init setup_log_buf(int early);
 #else
 static inline __attribute__ ((format (printf, 1, 0)))
@@ -141,6 +142,10 @@ static inline void log_buf_kexec_setup(void)
 {
 }
 
+static inline void log_buf_olpc_setup(u32 *len, u32 *buf, u32 *end)
+{
+}
+
 static inline void setup_log_buf(int early)
 {
 }
diff --git a/kernel/printk.c b/kernel/printk.c
index 084982f..4cc9c00 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -168,6 +168,13 @@ void log_buf_kexec_setup(void)
 }
 #endif
 
+void log_buf_olpc_setup(u32 *len, u32 *buf, u32 *end)
+{
+       *len = log_buf_len;
+       *buf = (u32) log_buf;
+       *end = (u32) &log_end;
+}
+
 /* requested log_buf_len from kernel cmdline */
 static unsigned long __initdata new_log_buf_len;
 
-- 
1.7.5.4


-- 
James Cameron
http://quozl.linux.org.au/
_______________________________________________
Devel mailing list
Devel@lists.laptop.org
http://lists.laptop.org/listinfo/devel

Reply via email to